Files
todo-baggins/src/hooks/mod.rs
Matouš Volf dc3effe640
All checks were successful
actionlint check / actionlint check (pull_request) Successful in 6s
conventional pull request title check / conventional pull request title check (pull_request) Successful in 3s
conventional commit messages check / conventional commit messages check (pull_request) Successful in 7s
dotenv-linter check / dotenv-linter check (pull_request) Successful in 7s
GitLeaks check / GitLeaks check (pull_request) Successful in 10s
hadolint check / hadolint check (pull_request) Successful in 11s
htmlhint check / htmlhint check (pull_request) Successful in 44s
markdownlint check / markdownlint check (pull_request) Successful in 40s
Prettier check / Prettier check (pull_request) Successful in 36s
checkov check / checkov check (pull_request) Successful in 1m22s
ShellCheck check / ShellCheck check (pull_request) Successful in 29s
Stylelint check / Stylelint check (pull_request) Successful in 31s
yamllint check / yamllint check (pull_request) Successful in 29s
Rust check / Rust check (pull_request) Successful in 11m42s
fix: task sorting
2025-12-19 20:01:22 +01:00

74 lines
2.2 KiB
Rust

use dioxus::{
CapturedError,
fullstack::{Loader, Loading, WebSocketOptions, use_websocket},
prelude::*,
};
use serde::{Serialize, de::DeserializeOwned};
use crate::{
models::{category::Category, project::Project, subtask::Subtask, task::TaskWithSubtasks},
server::{
projects::get_projects, subtasks::get_subtasks_of_task,
tasks::get_tasks_with_subtasks_in_category, updates::subscribe_to_updates,
},
};
#[allow(clippy::result_large_err)]
fn sort_loader_result<T: Ord + Clone>(
result: Result<Loader<Vec<T>>, Loading>,
) -> Result<Vec<T>, Loading> {
result.map(|loader| {
let mut items_sorted = loader();
items_sorted.sort();
items_sorted
})
}
#[allow(clippy::result_large_err)]
fn use_loader_with_update_subscription<F, T, E>(
mut future: impl FnMut() -> F + 'static,
) -> Result<Loader<T>, Loading>
where
F: Future<Output = Result<T, E>> + 'static,
T: 'static + PartialEq + Serialize + DeserializeOwned,
E: Into<CapturedError> + 'static,
{
let mut refresh_tick = use_signal(|| 0u64);
let loader = use_loader(move || {
let _ = refresh_tick(); // Read => dependency.
future()
});
let mut socket = use_websocket(|| subscribe_to_updates(WebSocketOptions::default()));
use_future(move || async move {
while socket.recv().await.is_ok() {
refresh_tick += 1;
}
});
loader
}
#[allow(clippy::result_large_err)]
pub(crate) fn use_projects() -> Result<Vec<Project>, Loading> {
let result = use_loader_with_update_subscription(get_projects);
sort_loader_result(result)
}
#[allow(clippy::result_large_err)]
pub(crate) fn use_tasks_with_subtasks_in_category(
filtered_category: Category,
) -> Result<Vec<TaskWithSubtasks>, Loading> {
let result = use_loader_with_update_subscription(move || {
get_tasks_with_subtasks_in_category(filtered_category.clone())
});
sort_loader_result(result)
}
#[allow(clippy::result_large_err)]
pub(crate) fn use_subtasks_of_task(task_id: i32) -> Result<Vec<Subtask>, Loading> {
let result = use_loader_with_update_subscription(move || get_subtasks_of_task(task_id));
sort_loader_result(result)
}