From 3be7ac3336aec2bbd843367d55e34f93e2589cb1 Mon Sep 17 00:00:00 2001 From: rick Date: Sat, 29 Oct 2022 23:14:51 +0200 Subject: [PATCH] feat(group): add leave and join --- front/src/components/list_groups.rs | 125 ++++++++++++++++++++++++---- 1 file changed, 108 insertions(+), 17 deletions(-) diff --git a/front/src/components/list_groups.rs b/front/src/components/list_groups.rs index 26c38b7..8bfc3c0 100644 --- a/front/src/components/list_groups.rs +++ b/front/src/components/list_groups.rs @@ -1,6 +1,6 @@ use gloo_net::http::Request; use gloo_net::Error; -use patternfly_yew::{Button, Card, Flex, FlexModifier, Icon, Modal, ModalVariant, Title, ToastViewer, ToFlexItems, Variant, WithBreakpointExt}; use yew::prelude::*; +use patternfly_yew::{Button, Card, Flex, FlexModifier, Gallery, Icon, Modal, ModalVariant, Title, ToastViewer, ToFlexItems, Variant, WithBreakpointExt}; use yew::prelude::*; use crate::components::{Group, Home, TestMessage, ToastFields, ToastType}; @@ -11,6 +11,7 @@ pub struct ListGroups { free_groups: Vec, nb_show: usize, selected_group: usize, + quit_group: Option, join: bool, } @@ -21,20 +22,29 @@ pub struct PropGroups { #[derive(PartialEq)] pub enum MsgListGroups { + /// Rafraichi la page + Refresh, /// Tous les groupes ont été récupéré Done(Vec), /// Tous les groupes sans l'utilisateur ont été récupéré DoneFree(Vec), + /// Quitte un groupe + Leave(usize), + FinishLeave(usize), + /// Confirmation du retrait du groupe + //ConfirmLeave, /// Afficher plus de groupes More, /// Afficher ou cacher la fenetre pour rejoindre des groupes ToggleJoin, /// Annuler la sélection de nouveaux groupes CancelJoin, - /// Lorsque l'utilisateur clique sur un groupe, on l'enregistre au vu de + /// Lorsque l'utilisateur clique sur un groupe, on l'enregistre au vu de /// son ajout futur SelectGroup(usize), /// Sélection du nouveau groupe faite, envoie d'un requete en back + SendJoin, + /// Requete en back fini FinishJoin, /// Popup d'informations Info(String, String), @@ -117,13 +127,14 @@ impl Component for ListGroups { let more = ctx.link().callback(|_| MsgListGroups::More); let join = ctx.link().callback(|_| MsgListGroups::ToggleJoin); let cancel_join = ctx.link().callback(|_| MsgListGroups::CancelJoin); - let finish_join = ctx.link().callback(|_| MsgListGroups::FinishJoin); + let finish_join = ctx.link().callback(|_| MsgListGroups::SendJoin); - let groups: Vec = self.groups[..self.nb_show].iter().map(|group| { html!{ -
+ let groups: Vec = self.groups[..self.nb_show].iter().enumerate().map(|(id, group)| { html!{ +

{ group.name.clone() }

{ group.game.clone() }

-
+ + }}).collect::>(); let mut groups_final: Vec = Vec::new(); @@ -138,8 +149,10 @@ impl Component for ListGroups { if self.join { +
+ { self.free_groups.iter().enumerate().map(|(id, group)| { - html! { + html! { } - }).collect::() } - + }).collect::>() } + +
} @@ -186,6 +200,8 @@ impl Component for ListGroups { body, }))) } + + false } MsgListGroups::Error(title, body) => { if let Some(parent) = ctx.link().get_parent() { @@ -196,6 +212,8 @@ impl Component for ListGroups { body, }))) } + + false } MsgListGroups::Done(groups) => { let len = groups.len(); @@ -206,37 +224,110 @@ impl Component for ListGroups { 3 }; - return true; + true } MsgListGroups::DoneFree(groups) => { let len = groups.len(); self.free_groups = groups; - return true; + true } MsgListGroups::ToggleJoin => { self.join = !self.join; - return true; + true } MsgListGroups::CancelJoin => { self.join = false; - return true; + true + } + MsgListGroups::SendJoin => { + if let Some(group) = self.free_groups.get(self.selected_group) { + let id = group.id.clone(); + ctx.link().send_future(async move { + match Request::put(&format!("/api/groups/{}/join", id)).send().await { + Ok(resp) => { + if resp.ok() { + MsgListGroups::FinishJoin + } else { + MsgListGroups::Error( + String::from("Erreur"), + String::from("Pas de réponse 200") + ) + } + } + Err(_) => { + MsgListGroups::Error( + String::from("Erreur"), + String::from("Bruh") + ) + } + } + }); + } else { + ctx.link().send_message(MsgListGroups::Error( + String::from("Erreur"), + String::from("Contactez nous si vous êtes tombés sur cette erreur.") + )); + } + + false } MsgListGroups::FinishJoin => { - return false; + self.groups.push(self.free_groups.remove(self.selected_group)); + if self.nb_show < 3 { + self.nb_show += 1; + } + true + }MsgListGroups::FinishLeave(id) => { + self.free_groups.push(self.groups.remove(id)); + if self.nb_show > 0 && id <= self.nb_show { + self.nb_show -= 1; + } + true } MsgListGroups::SelectGroup(id) => { self.selected_group = id; - return true; + true } + MsgListGroups::Leave(id_group) => { + if let Some(group) = self.groups.get(id_group) { + let id = group.id.clone(); + ctx.link().send_future(async move { + match Request::put(&format!("/api/groups/{}/leave", id)).send().await { + Ok(resp) => { + if resp.ok() { + MsgListGroups::FinishLeave(id_group) + } else { + MsgListGroups::Error( + String::from("Erreur"), + String::from("Pas de réponse 200") + ) + } + } + Err(_) => { + MsgListGroups::Error( + String::from("Erreur"), + String::from("Bruh") + ) + } + } + }); + } else { + ctx.link().send_message(MsgListGroups::Error( + String::from("Erreur"), + String::from("Contactez nous si vous êtes tombés sur cette erreur.") + )); + } + false + } + MsgListGroups::Refresh => return true, MsgListGroups::More => { self.nb_show += 3; if self.nb_show > self.groups.len() { self.nb_show -= self.nb_show - self.groups.len(); } - return true; + true } } - false } }