use crate::components::{self, participant}; use crate::util::surrealdb::schemas; use futures::stream::ForEach; use leptos::*; /// Renders the home page of your application. #[component] pub fn Groups() -> impl IntoView { let group_hour = create_rw_signal("A"); let group_lane = create_rw_signal("1"); let participants_context = use_context::().unwrap(); let participants_filtered: Memo> = create_memo(move |_| { participants_context .get() .into_iter() .filter(|participant| { participant.value.get().group == group_hour.get().to_owned() + group_lane.get() }) .collect() }); let (participants_lifesaver, participants_hindernis, participants_popduiken) = sort_by_events(participants_filtered); let lifesaver_best = create_memo(move |_| match participants_lifesaver.get().get(0) { Some(p) => match p.value.get().events { Some(e) => e.lifesaver.unwrap_or(0), None => 6_000_000, }, None => 6_000_000, }); let hindernis_best = create_memo(move |_| match participants_hindernis.get().get(0) { Some(p) => match p.value.get().events { Some(e) => e.hindernis.unwrap_or(0), None => 6_000_000, }, None => 6_000_000, }); let popduiken_best = create_memo(move |_| match participants_popduiken.get().get(0) { Some(p) => match p.value.get().events { Some(e) => e.popduiken.unwrap_or(0), None => 6_000_000, }, None => 6_000_000, }); let total_score_participants = sort_by_total_score( participants_filtered, lifesaver_best, hindernis_best, popduiken_best, ); view! {

"Groups"

"A"
"B"
"C"
"D"
"Z"
"1"
"2"
"3"
"4"
"5"
"6"

"Algemene score"

"Lifesaver"

"Hindernis"

"Popduiken"

} } fn sort_by_total_score( participants_filtered: Memo>, lifesaver_best: Memo, popduiken_best: Memo, hindernis_best: Memo, ) -> Memo> { let total_score_participants: Memo> = create_memo(move |_| { let mut all_participants: Vec<(usize, schemas::ParticipantSignal)> = participants_filtered .get() .into_iter() .enumerate() .collect(); let lifesaver_best = lifesaver_best.get(); let popduiken_best = popduiken_best.get(); let hindernis_best = hindernis_best.get(); all_participants.sort_by(|(_, a), (_, b)| { let part_a = match a.value.get().events { Some(events) => { ((events.lifesaver.unwrap_or(6_000_000) * 100) / lifesaver_best) + ((events.hindernis.unwrap_or(6_000_000) * 100) / hindernis_best) + ((events.popduiken.unwrap_or(6_000_000) * 100) / popduiken_best) } None => 1000, }; let part_b = match b.value.get().events { Some(events) => { ((events.lifesaver.unwrap_or(6_000_000) * 100) / lifesaver_best) + ((events.hindernis.unwrap_or(6_000_000) * 100) / hindernis_best) + ((events.popduiken.unwrap_or(6_000_000) * 100) / popduiken_best) } None => 1000, }; part_a.cmp(&part_b) }); all_participants .into_iter() .map(|(_, value)| value) .collect() }); total_score_participants } fn sort_by_events( participants_filtered: Memo>, ) -> ( Memo>, Memo>, Memo>, ) { let lifesaver: Memo> = create_memo(move |_| { let mut participants: Vec<(usize, schemas::ParticipantSignal)> = participants_filtered .get() .into_iter() .enumerate() .collect(); participants.sort_by(|(_, a), (_, b)| { let event_a = match a.value.get().events { Some(events) => events.lifesaver.unwrap_or(6_000_000), None => 6_000_000, }; let event_b = match b.value.get().events { Some(events) => events.lifesaver.unwrap_or(5_999_100), None => 6_000_000, }; event_a.cmp(&event_b) }); participants.into_iter().map(|(_, value)| value).collect() }); let hindernis: Memo> = create_memo(move |_| { let mut participants: Vec<(usize, schemas::ParticipantSignal)> = participants_filtered .get() .into_iter() .enumerate() .collect(); participants.sort_by(|(_, a), (_, b)| { let event_a = match a.value.get().events { Some(events) => events.hindernis.unwrap_or(6_000_000), None => 6_000_000, }; let event_b = match b.value.get().events { Some(events) => events.hindernis.unwrap_or(6_000_000), None => 6_000_000, }; event_a.cmp(&event_b) }); participants.into_iter().map(|(_, value)| value).collect() }); let popduiken: Memo> = create_memo(move |_| { let mut participants: Vec<(usize, schemas::ParticipantSignal)> = participants_filtered .get() .into_iter() .enumerate() .collect(); participants.sort_by(|(_, a), (_, b)| { let event_a = match a.value.get().events { Some(events) => events.popduiken.unwrap_or(6_000_000), None => 6_000_000, }; let event_b = match b.value.get().events { Some(events) => events.popduiken.unwrap_or(6_000_000), None => 6_000_000, }; event_a.cmp(&event_b) }); participants.into_iter().map(|(_, value)| value).collect() }); (lifesaver, hindernis, popduiken) }