refactor: group achievements mod
This commit is contained in:
parent
100535ab9d
commit
05139b19bc
@ -1,13 +1,8 @@
|
|||||||
use crate::services::confirm::ConfirmService;
|
|
||||||
use crate::services::rest::RestService;
|
use crate::services::rest::RestService;
|
||||||
use common::Achievement;
|
use common::Achievement;
|
||||||
use common::DeleteAchievement;
|
|
||||||
use common::ToggleAchievement;
|
|
||||||
use common::UpdateAchievementTimeOfReveal;
|
use common::UpdateAchievementTimeOfReveal;
|
||||||
use std::ops::Deref;
|
|
||||||
use wasm_bindgen::JsCast;
|
use wasm_bindgen::JsCast;
|
||||||
use wasm_bindgen_futures::spawn_local;
|
use wasm_bindgen_futures::spawn_local;
|
||||||
use yew::classes;
|
|
||||||
use yew::function_component;
|
use yew::function_component;
|
||||||
use yew::html;
|
use yew::html;
|
||||||
use yew::use_state;
|
use yew::use_state;
|
||||||
|
@ -1,7 +1,6 @@
|
|||||||
use crate::components::achievement::AchievementComponent;
|
use crate::components::achievement::AchievementComponent;
|
||||||
use crate::components::milestone::MilestoneComponent;
|
use crate::components::milestone::MilestoneComponent;
|
||||||
use chrono::NaiveTime;
|
use crate::util::group_achievements::group_achievements;
|
||||||
use common::Achievement;
|
|
||||||
use yew::functional::*;
|
use yew::functional::*;
|
||||||
use yew::prelude::*;
|
use yew::prelude::*;
|
||||||
use yew_router::prelude::*;
|
use yew_router::prelude::*;
|
||||||
@ -101,139 +100,3 @@ pub fn Root() -> Html {
|
|||||||
</>
|
</>
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn group_achievements(mut achievements: Vec<Achievement>) -> Vec<(Option<NaiveTime>, Vec<Achievement>)> {
|
|
||||||
// Sort the achievements by time_of_reveal.
|
|
||||||
achievements.sort_by_key(|a| a.time_of_reveal);
|
|
||||||
|
|
||||||
let mut grouped_achievements: Vec<(Option<NaiveTime>, Vec<Achievement>)> = Vec::new();
|
|
||||||
let mut current_time_of_reveal: Option<NaiveTime> = None;
|
|
||||||
let mut current_group: Vec<Achievement> = 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);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
@ -17,6 +17,7 @@ use yew_router::Switch;
|
|||||||
mod components;
|
mod components;
|
||||||
pub mod event_bus;
|
pub mod event_bus;
|
||||||
mod services;
|
mod services;
|
||||||
|
pub mod util;
|
||||||
|
|
||||||
#[derive(Debug, Clone, Copy, PartialEq, Routable)]
|
#[derive(Debug, Clone, Copy, PartialEq, Routable)]
|
||||||
enum Route {
|
enum Route {
|
||||||
|
138
crates/frontend/src/util/group_achievements.rs
Normal file
138
crates/frontend/src/util/group_achievements.rs
Normal file
@ -0,0 +1,138 @@
|
|||||||
|
use chrono::NaiveTime;
|
||||||
|
use common::Achievement;
|
||||||
|
|
||||||
|
pub fn group_achievements(mut achievements: Vec<Achievement>) -> Vec<(Option<NaiveTime>, Vec<Achievement>)> {
|
||||||
|
// Sort the achievements by time_of_reveal.
|
||||||
|
achievements.sort_by_key(|a| a.time_of_reveal);
|
||||||
|
|
||||||
|
let mut grouped_achievements: Vec<(Option<NaiveTime>, Vec<Achievement>)> = Vec::new();
|
||||||
|
let mut current_time_of_reveal: Option<NaiveTime> = None;
|
||||||
|
let mut current_group: Vec<Achievement> = 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);
|
||||||
|
}
|
||||||
|
}
|
1
crates/frontend/src/util/mod.rs
Normal file
1
crates/frontend/src/util/mod.rs
Normal file
@ -0,0 +1 @@
|
|||||||
|
pub mod group_achievements;
|
Loading…
x
Reference in New Issue
Block a user