todolist.rs 1.4 KB

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