feat: use Dioxus query for fetching data
This commit is contained in:
@ -1,39 +1,158 @@
|
||||
use crate::components::bottom_panel::BottomPanel;
|
||||
use crate::components::create_task_button::CreateTaskButton;
|
||||
use crate::components::navigation::Navigation;
|
||||
use crate::components::sticky_bottom::StickyBottom;
|
||||
use crate::components::task_form::TaskForm;
|
||||
use crate::components::task_list::TaskList;
|
||||
use crate::models::category::Category;
|
||||
use crate::models::task::Task;
|
||||
use crate::route::Route;
|
||||
use crate::schema::tasks::category;
|
||||
use crate::server::tasks::get_tasks_in_category;
|
||||
use chrono::{Local, NaiveDate};
|
||||
use dioxus::core_macro::rsx;
|
||||
use dioxus::dioxus_core::Element;
|
||||
use crate::query::tasks::use_tasks_in_category_query;
|
||||
use crate::query::QueryValue;
|
||||
use chrono::{Local, Locale};
|
||||
use dioxus::prelude::*;
|
||||
use dioxus_query::prelude::QueryResult;
|
||||
|
||||
#[component]
|
||||
pub(crate) fn CategoryTodayPage() -> Element {
|
||||
let tasks = use_server_future(
|
||||
move || get_tasks_in_category(Category::Calendar {
|
||||
date: NaiveDate::default(),
|
||||
reoccurrence: None,
|
||||
time: None,
|
||||
})
|
||||
)?.unwrap().unwrap().iter().filter(|task| {
|
||||
if let Category::Calendar { date, .. } = task.category() {
|
||||
*date == Local::now().date_naive()
|
||||
} else {
|
||||
panic!("Unexpected category.");
|
||||
}
|
||||
}).cloned().collect::<Vec<Task>>();
|
||||
let today_date = Local::now().date_naive();
|
||||
|
||||
let calendar_tasks_query = use_tasks_in_category_query(Category::Calendar {
|
||||
date: today_date,
|
||||
reoccurrence: None,
|
||||
time: None,
|
||||
});
|
||||
let calendar_tasks_query_result = calendar_tasks_query.result();
|
||||
|
||||
let long_term_tasks_query = use_tasks_in_category_query(Category::LongTerm);
|
||||
let long_term_tasks_query_result = long_term_tasks_query.result();
|
||||
|
||||
rsx! {
|
||||
TaskList {
|
||||
tasks: tasks,
|
||||
class: "pb-36"
|
||||
div {
|
||||
class: "pt-4 flex flex-col gap-8",
|
||||
match long_term_tasks_query_result.value() {
|
||||
QueryResult::Ok(QueryValue::Tasks(tasks))
|
||||
| QueryResult::Loading(Some(QueryValue::Tasks(tasks))) => rsx! {
|
||||
div {
|
||||
class: "flex flex-col gap-4",
|
||||
div {
|
||||
class: "px-8 flex flex-row items-center gap-2 font-bold",
|
||||
i {
|
||||
class: "fa-solid fa-water text-xl"
|
||||
}
|
||||
div {
|
||||
class: "mt-1",
|
||||
"Long-term"
|
||||
}
|
||||
}
|
||||
div {
|
||||
for task in tasks {
|
||||
div {
|
||||
key: "{task.id()}",
|
||||
class: format!(
|
||||
"px-8 pt-5 {} flex flex-row gap-4",
|
||||
if task.deadline().is_some() {
|
||||
"pb-0.5"
|
||||
} else {
|
||||
"pb-5"
|
||||
}
|
||||
),
|
||||
div {
|
||||
class: "flex flex-col",
|
||||
div {
|
||||
class: "mt grow font-medium",
|
||||
{task.title()}
|
||||
},
|
||||
div {
|
||||
class: "flex flex-row gap-3",
|
||||
if let Some(deadline) = task.deadline() {
|
||||
div {
|
||||
class: "text-sm text-zinc-400",
|
||||
i {
|
||||
class: "fa-solid fa-bomb"
|
||||
},
|
||||
{deadline.format(" %m. %d.").to_string()}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
QueryResult::Loading(None) => rsx! {
|
||||
// TODO: Add a loading indicator.
|
||||
},
|
||||
QueryResult::Err(errors) => rsx! {
|
||||
div {
|
||||
"Errors occurred: {errors:?}"
|
||||
}
|
||||
}
|
||||
}
|
||||
match calendar_tasks_query_result.value() {
|
||||
QueryResult::Ok(QueryValue::Tasks(tasks))
|
||||
| QueryResult::Loading(Some(QueryValue::Tasks(tasks))) => {
|
||||
let today_tasks = tasks.iter().filter(|task| {
|
||||
if let Category::Calendar { date, .. } = task.category() {
|
||||
*date == today_date
|
||||
} else {
|
||||
panic!("Unexpected category.");
|
||||
}
|
||||
}).cloned().collect::<Vec<Task>>();
|
||||
let overdue_tasks = tasks.iter().filter(|task| {
|
||||
if let Category::Calendar { date, .. } = task.category() {
|
||||
*date < today_date
|
||||
} else {
|
||||
panic!("Unexpected category.");
|
||||
}
|
||||
}).cloned().collect::<Vec<Task>>();
|
||||
|
||||
rsx! {
|
||||
if !overdue_tasks.is_empty() {
|
||||
div {
|
||||
class: "flex flex-col gap-4",
|
||||
div {
|
||||
class: "px-8 flex flex-row items-center gap-2 font-bold",
|
||||
i {
|
||||
class: "fa-solid fa-calendar-xmark text-xl"
|
||||
}
|
||||
div {
|
||||
class: "mt-1",
|
||||
"Overdue"
|
||||
}
|
||||
}
|
||||
TaskList {
|
||||
tasks: overdue_tasks,
|
||||
class: "pb-3"
|
||||
}
|
||||
}
|
||||
}
|
||||
div {
|
||||
class: "flex flex-col gap-4",
|
||||
div {
|
||||
class: "px-8 flex flex-row items-center gap-2 font-bold",
|
||||
i {
|
||||
class: "fa-solid fa-calendar-check text-xl"
|
||||
}
|
||||
div {
|
||||
class: "mt-1",
|
||||
{
|
||||
today_date
|
||||
.format_localized("Today, %A %-d. %B", Locale::en_US)
|
||||
.to_string()
|
||||
}
|
||||
}
|
||||
}
|
||||
TaskList {
|
||||
tasks: today_tasks
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
QueryResult::Loading(None) => rsx! {
|
||||
// TODO: Add a loading indicator.
|
||||
},
|
||||
QueryResult::Err(errors) => rsx! {
|
||||
div {
|
||||
"Errors occurred: {errors:?}"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user