Refactor todo example (#3788)

This commit is contained in:
Edwin Amsler 2025-02-18 18:03:00 -05:00 committed by GitHub
parent 69e3b5f814
commit b71e9987f5
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 25 additions and 47 deletions

View File

@ -33,11 +33,7 @@ impl Component for App {
fn create(_ctx: &Context<Self>) -> Self {
let entries = LocalStorage::get(KEY).unwrap_or_else(|_| Vec::new());
let state = State {
entries,
filter: Filter::All,
edit_value: "".into(),
};
let state = State::new(entries);
let focus_ref = NodeRef::default();
Self { state, focus_ref }
}
@ -79,10 +75,10 @@ impl Component for App {
}
Msg::ToggleAll => {
let status = !self.state.is_all_completed();
self.state.toggle_all(status);
self.state.set_completed(status);
}
Msg::Toggle(idx) => {
self.state.toggle(idx);
self.state.toggle_completed(idx);
}
Msg::ClearCompleted => {
self.state.clear_completed();
@ -120,7 +116,14 @@ impl Component for App {
/>
<label for="toggle-all" />
<ul class="todo-list">
{ for self.state.entries.iter().filter(|e| self.state.filter.fits(e)).enumerate().map(|e| self.view_entry(e, ctx.link())) }
{ for self
.state
.entries
.iter()
.enumerate()
.filter(|(_, entry)| self.state.filter.fits(entry))
.map(|(i, e)| self.view_entry((i, e), ctx.link()))
}
</ul>
</section>
<footer class={classes!("footer", hidden_class)}>

View File

@ -11,6 +11,14 @@ pub struct State {
}
impl State {
pub fn new(entries: Vec<Entry>) -> Self {
Self {
entries,
filter: Filter::All,
edit_value: "".into(),
}
}
pub fn total(&self) -> usize {
self.entries.len()
}
@ -37,26 +45,15 @@ impl State {
}
pub fn clear_completed(&mut self) {
let entries = self
.entries
.drain(..)
.filter(|e| Filter::Active.fits(e))
.collect();
self.entries = entries;
self.entries.retain(|e| Filter::Active.fits(e));
}
pub fn toggle(&mut self, idx: usize) {
let filter = self.filter;
let entry = self
.entries
.iter_mut()
.filter(|e| filter.fits(e))
.nth(idx)
.unwrap();
pub fn toggle_completed(&mut self, idx: usize) {
let entry = self.entries.get_mut(idx).unwrap();
entry.completed = !entry.completed;
}
pub fn toggle_all(&mut self, value: bool) {
pub fn set_completed(&mut self, value: bool) {
for entry in &mut self.entries {
if self.filter.fits(entry) {
entry.completed = value;
@ -65,13 +62,7 @@ impl State {
}
pub fn toggle_edit(&mut self, idx: usize) {
let filter = self.filter;
let entry = self
.entries
.iter_mut()
.filter(|e| filter.fits(e))
.nth(idx)
.unwrap();
let entry = self.entries.get_mut(idx).unwrap();
entry.editing = !entry.editing;
}
@ -85,29 +76,13 @@ impl State {
if val.is_empty() {
self.remove(idx);
} else {
let filter = self.filter;
let entry = self
.entries
.iter_mut()
.filter(|e| filter.fits(e))
.nth(idx)
.unwrap();
let entry = self.entries.get_mut(idx).unwrap();
entry.description = val;
entry.editing = !entry.editing;
}
}
pub fn remove(&mut self, idx: usize) {
let idx = {
let entries = self
.entries
.iter()
.enumerate()
.filter(|&(_, e)| self.filter.fits(e))
.collect::<Vec<_>>();
let &(idx, _) = entries.get(idx).unwrap();
idx
};
self.entries.remove(idx);
}
}