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 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;
|
||||
|
@ -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<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;
|
||||
pub mod event_bus;
|
||||
mod services;
|
||||
pub mod util;
|
||||
|
||||
#[derive(Debug, Clone, Copy, PartialEq, Routable)]
|
||||
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