diff --git a/crates/frontend/src/components/achievement_reveal_time.rs b/crates/frontend/src/components/achievement_reveal_time.rs index 0152dc2..318d074 100644 --- a/crates/frontend/src/components/achievement_reveal_time.rs +++ b/crates/frontend/src/components/achievement_reveal_time.rs @@ -1,13 +1,8 @@ -use crate::services::confirm::ConfirmService; use crate::services::rest::RestService; use common::Achievement; -use common::DeleteAchievement; -use common::ToggleAchievement; use common::UpdateAchievementTimeOfReveal; -use std::ops::Deref; use wasm_bindgen::JsCast; use wasm_bindgen_futures::spawn_local; -use yew::classes; use yew::function_component; use yew::html; use yew::use_state; diff --git a/crates/frontend/src/components/root.rs b/crates/frontend/src/components/root.rs index 13709f8..050c161 100644 --- a/crates/frontend/src/components/root.rs +++ b/crates/frontend/src/components/root.rs @@ -1,7 +1,6 @@ use crate::components::achievement::AchievementComponent; use crate::components::milestone::MilestoneComponent; -use chrono::NaiveTime; -use common::Achievement; +use crate::util::group_achievements::group_achievements; use yew::functional::*; use yew::prelude::*; use yew_router::prelude::*; @@ -101,139 +100,3 @@ pub fn Root() -> Html { } } - -fn group_achievements(mut achievements: Vec) -> Vec<(Option, Vec)> { - // Sort the achievements by time_of_reveal. - achievements.sort_by_key(|a| a.time_of_reveal); - - let mut grouped_achievements: Vec<(Option, Vec)> = Vec::new(); - let mut current_time_of_reveal: Option = None; - let mut current_group: Vec = Vec::new(); - - for achievement in achievements { - if current_time_of_reveal == achievement.time_of_reveal { - current_group.push(achievement); - continue; - } - if !current_group.is_empty() { - grouped_achievements.push((current_time_of_reveal, current_group)); - } - current_time_of_reveal = achievement.time_of_reveal; - current_group = vec![achievement]; - } - - if !current_group.is_empty() { - grouped_achievements.push((current_time_of_reveal, current_group)); - } - - grouped_achievements -} - -#[cfg(test)] -mod tests { - use super::*; - use uuid::Uuid; - - #[test] - fn test_group_achievements() { - let time1 = NaiveTime::from_hms_opt(12, 0, 0).unwrap(); - let time2 = NaiveTime::from_hms_opt(13, 0, 0).unwrap(); - - let mut achievements = vec![ - Achievement { - goal: "Goal 1".to_string(), - completed: true, - uuid: Uuid::new_v4(), - time_of_reveal: Some(time1), - }, - Achievement { - goal: "Goal 2".to_string(), - completed: false, - uuid: Uuid::new_v4(), - time_of_reveal: Some(time1), - }, - Achievement { - goal: "Goal 3".to_string(), - completed: true, - uuid: Uuid::new_v4(), - time_of_reveal: Some(time2), - }, - ]; - - let grouped = group_achievements(achievements); - assert_eq!(grouped.len(), 2); - assert_eq!(grouped[0].0, Some(time1)); - assert_eq!(grouped[0].1.len(), 2); - assert_eq!(grouped[1].0, Some(time2)); - assert_eq!(grouped[1].1.len(), 1); - } - - #[test] - fn test_group_achievements_empty_vec() { - let achievements = vec![]; - let grouped = group_achievements(achievements); - assert_eq!(grouped.len(), 0); - } - - #[test] - fn test_group_achievements_group_none_values() { - let time1 = NaiveTime::from_hms_opt(12, 0, 0).unwrap(); - - let achievements = vec![ - Achievement { - goal: "Goal 1".to_string(), - completed: true, - uuid: Uuid::new_v4(), - time_of_reveal: Some(time1), - }, - Achievement { - goal: "Goal 2".to_string(), - completed: false, - uuid: Uuid::new_v4(), - time_of_reveal: None, - }, - Achievement { - goal: "Goal 3".to_string(), - completed: true, - uuid: Uuid::new_v4(), - time_of_reveal: None, - }, - ]; - - let grouped = group_achievements(achievements); - assert_eq!(grouped.len(), 2); - assert_eq!(grouped[0].0, None); - assert_eq!(grouped[0].1.len(), 2); - assert_eq!(grouped[1].0, Some(time1)); - assert_eq!(grouped[1].1.len(), 1); - } - - #[test] - fn test_group_achievements_all_none() { - let achievements = vec![ - Achievement { - goal: "Goal 1".to_string(), - completed: true, - uuid: Uuid::new_v4(), - time_of_reveal: None, - }, - Achievement { - goal: "Goal 2".to_string(), - completed: false, - uuid: Uuid::new_v4(), - time_of_reveal: None, - }, - Achievement { - goal: "Goal 3".to_string(), - completed: true, - uuid: Uuid::new_v4(), - time_of_reveal: None, - }, - ]; - - let grouped = group_achievements(achievements); - assert_eq!(grouped.len(), 1); - assert_eq!(grouped[0].0, None); - assert_eq!(grouped[0].1.len(), 3); - } -} diff --git a/crates/frontend/src/lib.rs b/crates/frontend/src/lib.rs index 022b7a4..9d278cd 100644 --- a/crates/frontend/src/lib.rs +++ b/crates/frontend/src/lib.rs @@ -17,6 +17,7 @@ use yew_router::Switch; mod components; pub mod event_bus; mod services; +pub mod util; #[derive(Debug, Clone, Copy, PartialEq, Routable)] enum Route { diff --git a/crates/frontend/src/util/group_achievements.rs b/crates/frontend/src/util/group_achievements.rs new file mode 100644 index 0000000..5c804f7 --- /dev/null +++ b/crates/frontend/src/util/group_achievements.rs @@ -0,0 +1,138 @@ +use chrono::NaiveTime; +use common::Achievement; + +pub fn group_achievements(mut achievements: Vec) -> Vec<(Option, Vec)> { + // Sort the achievements by time_of_reveal. + achievements.sort_by_key(|a| a.time_of_reveal); + + let mut grouped_achievements: Vec<(Option, Vec)> = Vec::new(); + let mut current_time_of_reveal: Option = None; + let mut current_group: Vec = Vec::new(); + + for achievement in achievements { + if current_time_of_reveal == achievement.time_of_reveal { + current_group.push(achievement); + continue; + } + if !current_group.is_empty() { + grouped_achievements.push((current_time_of_reveal, current_group)); + } + current_time_of_reveal = achievement.time_of_reveal; + current_group = vec![achievement]; + } + + if !current_group.is_empty() { + grouped_achievements.push((current_time_of_reveal, current_group)); + } + + grouped_achievements +} + +#[cfg(test)] +mod tests { + use super::*; + use uuid::Uuid; + + #[test] + fn test_group_achievements() { + let time1 = NaiveTime::from_hms_opt(12, 0, 0).unwrap(); + let time2 = NaiveTime::from_hms_opt(13, 0, 0).unwrap(); + + let mut achievements = vec![ + Achievement { + goal: "Goal 1".to_string(), + completed: true, + uuid: Uuid::new_v4(), + time_of_reveal: Some(time1), + }, + Achievement { + goal: "Goal 2".to_string(), + completed: false, + uuid: Uuid::new_v4(), + time_of_reveal: Some(time1), + }, + Achievement { + goal: "Goal 3".to_string(), + completed: true, + uuid: Uuid::new_v4(), + time_of_reveal: Some(time2), + }, + ]; + + let grouped = group_achievements(achievements); + assert_eq!(grouped.len(), 2); + assert_eq!(grouped[0].0, Some(time1)); + assert_eq!(grouped[0].1.len(), 2); + assert_eq!(grouped[1].0, Some(time2)); + assert_eq!(grouped[1].1.len(), 1); + } + + #[test] + fn test_group_achievements_empty_vec() { + let achievements = vec![]; + let grouped = group_achievements(achievements); + assert_eq!(grouped.len(), 0); + } + + #[test] + fn test_group_achievements_group_none_values() { + let time1 = NaiveTime::from_hms_opt(12, 0, 0).unwrap(); + + let achievements = vec![ + Achievement { + goal: "Goal 1".to_string(), + completed: true, + uuid: Uuid::new_v4(), + time_of_reveal: Some(time1), + }, + Achievement { + goal: "Goal 2".to_string(), + completed: false, + uuid: Uuid::new_v4(), + time_of_reveal: None, + }, + Achievement { + goal: "Goal 3".to_string(), + completed: true, + uuid: Uuid::new_v4(), + time_of_reveal: None, + }, + ]; + + let grouped = group_achievements(achievements); + assert_eq!(grouped.len(), 2); + assert_eq!(grouped[0].0, None); + assert_eq!(grouped[0].1.len(), 2); + assert_eq!(grouped[1].0, Some(time1)); + assert_eq!(grouped[1].1.len(), 1); + } + + #[test] + fn test_group_achievements_all_none() { + let achievements = vec![ + Achievement { + goal: "Goal 1".to_string(), + completed: true, + uuid: Uuid::new_v4(), + time_of_reveal: None, + }, + Achievement { + goal: "Goal 2".to_string(), + completed: false, + uuid: Uuid::new_v4(), + time_of_reveal: None, + }, + Achievement { + goal: "Goal 3".to_string(), + completed: true, + uuid: Uuid::new_v4(), + time_of_reveal: None, + }, + ]; + + let grouped = group_achievements(achievements); + assert_eq!(grouped.len(), 1); + assert_eq!(grouped[0].0, None); + assert_eq!(grouped[0].1.len(), 3); + } +} diff --git a/crates/frontend/src/util/mod.rs b/crates/frontend/src/util/mod.rs new file mode 100644 index 0000000..b5c425b --- /dev/null +++ b/crates/frontend/src/util/mod.rs @@ -0,0 +1 @@ +pub mod group_achievements; diff --git a/justfile b/justfile index b6a3174..3e54db9 100644 --- a/justfile +++ b/justfile @@ -57,4 +57,3 @@ deploy-nginx-conf: # List logs with journalctl logs-prod: ssh plul@ajb.dk journalctl -u achievements-backend -