todolist.rs 1.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849
  1. use super::state::{FilterState, TodoItem, FILTER, TODOS};
  2. use crate::filtertoggles::FilterToggles;
  3. use crate::recoil::use_atom;
  4. use crate::todoitem::TodoEntry;
  5. use dioxus_core::prelude::*;
  6. pub fn TodoList(ctx: Context, props: &()) -> DomTree {
  7. let (entry, set_entry) = use_state(&ctx, || "".to_string());
  8. let todos: &Vec<TodoItem> = todo!();
  9. let filter = use_atom(&ctx, &FILTER);
  10. let list = todos
  11. .iter()
  12. .filter(|f| match filter {
  13. FilterState::All => true,
  14. FilterState::Active => !f.checked,
  15. FilterState::Completed => f.checked,
  16. })
  17. .map(|item| {
  18. rsx!(TodoEntry {
  19. key: "{order}",
  20. id: item.id,
  21. })
  22. });
  23. ctx.render(rsx! {
  24. div {
  25. // header
  26. header {
  27. class: "header"
  28. h1 {"todos"}
  29. input {
  30. class: "new-todo"
  31. placeholder: "What needs to be done?"
  32. value: "{entry}"
  33. oninput: move |evt| set_entry(evt.value)
  34. }
  35. }
  36. // list
  37. {list}
  38. // filter toggle (show only if the list isn't empty)
  39. {(!todos.is_empty()).then(||
  40. rsx!{ FilterToggles {}
  41. })}
  42. }
  43. })
  44. }