diff --git a/front/src/components/list_groups.rs b/front/src/components/list_groups.rs index e84f6c7..b92a433 100644 --- a/front/src/components/list_groups.rs +++ b/front/src/components/list_groups.rs @@ -1,23 +1,37 @@ use gloo_net::http::Request; use gloo_net::Error; +use gloo_storage::errors::StorageError; +use gloo_storage::{LocalStorage, Storage}; + use patternfly_yew::{ - Button, Card, Flex, FlexModifier, Gallery, Icon, Modal, ModalVariant, Title, ToFlexItems, - ToastViewer, Variant, WithBreakpointExt, + ActionGroup, Button, Card, Color, Flex, FlexModifier, Form, FormGroup, FormGroupValidated, Gallery, Icon, Label, Modal, ModalVariant, TextInput, Title, ToFlexItems, + ToastViewer, Validator, ValidationContext, ValidationResult, Variant, WithBreakpointExt, }; use yew::prelude::*; -use crate::components::{Group, Home, TestMessage, ToastFields, ToastType}; #[derive(Default)] pub struct ListGroups { + /// Id de l'utilisateur connecté id_user: String, + /// Ses groupes groups: Vec, + /// Les groupes où il n'y est pas free_groups: Vec, + /// Nombre de groupes à afficher nb_show: usize, + /// Groupe choisi dans la fenetre "rejoindre" selected_group: usize, - quit_group: Option, - /// Which modal we must show + /// Quel fenetre modal on affiche modal: ModalGroup, + /// Le groupe à créer + new_group: Option, + /// Nom du nouveau groupe + new_name: String, + /// Nom du jeu + form_game: String, + /// Jeu pour le nouveau groupe. + new_game: Option, } #[derive(PartialEq, Properties)] @@ -25,7 +39,7 @@ pub struct PropGroups { pub id: String, } -/// Which modal we show +/// Quel modal il faut afficher enum ModalGroup { None, Create, @@ -38,7 +52,7 @@ impl Default for ModalGroup { } } -#[derive(PartialEq)] +#[derive(Eq, PartialEq)] pub enum MsgListGroups { /// Rafraichi la page Refresh, @@ -62,16 +76,60 @@ pub enum MsgListGroups { /// Lorsque l'utilisateur clique sur un groupe, on l'enregistre au vu de /// son ajout futur SelectGroup(usize), + /// Update the name for the new group + OnChangeName(String), /// Sélection du nouveau groupe faite, envoie d'un requete en back SendJoin, - /// Requete en back fini - FinishJoin, + /// Envoie de la requete pour la création de groupe + SendCreate, + /// Requete en back finie + Finish(TypeFinish), /// Popup d'informations Info(String, String), /// Popup d'erreur Error(String, String), } +/// Type de retour du back +#[derive(Eq, PartialEq)] +enum TypeFinish { + Join, + Create, +} + +impl ListGroups { + /// Appelé lorsque le champs `name` est changé. + fn on_change_name(&mut self, name: String) { + self.new_name = name; + } + + /// Appelé lorsque le champs `name` est changé. + fn on_change_game(&mut self, game: String) { + + } + + /// Check si le groupe est vide ou pas. Si oui, en créer un avec l'utilisateur actuel en + /// capitaine. + fn check_group(&mut self) { + if self.new_group.is_none() { + let mut group = Group::default(); + let user: Result = LocalStorage::get("auth"); + if let Ok(user) = user { + group.captain = user.id; + } + + self.new_group = Some(group); + } + } + + fn update_group(&mut self) { + if let Some(group) = &mut self.new_group { + group.name = self.new_name.clone(); + //group.game = Groups::; + } + } +} + impl Component for ListGroups { type Message = MsgListGroups; type Properties = PropGroups; @@ -147,14 +205,27 @@ impl Component for ListGroups { let more = ctx.link().callback(|_| MsgListGroups::More); let join = ctx.link().callback(|_| MsgListGroups::ToggleJoin); let create = ctx.link().callback(|_| MsgListGroups::ToggleCreate); - let cancel_join = ctx.link().callback(|_| MsgListGroups::CloseModal); + let close_modal = ctx.link().callback(|_| MsgListGroups::CloseModal); let finish_join = ctx.link().callback(|_| MsgListGroups::SendJoin); + let change_name = ctx.link().callback(|name: String| MsgListGroups::OnChangeName(name)); - let groups: Vec = self.groups[..self.nb_show].iter().enumerate().map(|(id, group)| { html!{ + let groups: Vec = self.groups[..self.nb_show].iter().enumerate().map(|(id, group)| { + html!{

{ group.name.clone() }

{ group.game.clone() }

- + if self.id_user == group.captain { +
}}).collect::>(); @@ -165,7 +236,7 @@ impl Component for ListGroups { let modal = match self.modal { ModalGroup::Join => html! { - +
{ self.free_groups.iter().enumerate().map(|(id, group)| { @@ -191,7 +262,7 @@ impl Component for ListGroups { <> { "Vos groupes" } - + { modal } @@ -248,13 +319,10 @@ impl Component for ListGroups { let len = groups.len(); self.groups = groups; self.nb_show = if len < 3 { len } else { 3 }; - true } MsgListGroups::DoneFree(groups) => { - let len = groups.len(); self.free_groups = groups; - true } MsgListGroups::ToggleJoin => { @@ -291,7 +359,7 @@ impl Component for ListGroups { { Ok(resp) => { if resp.ok() { - MsgListGroups::FinishJoin + MsgListGroups::Finish(TypeFinish::Join) } else { MsgListGroups::Error( String::from("Erreur"), @@ -313,13 +381,50 @@ impl Component for ListGroups { false } - MsgListGroups::FinishJoin => { - self.groups - .push(self.free_groups.remove(self.selected_group)); - if self.nb_show < 3 { - self.nb_show += 1; + MsgListGroups::SendCreate => { + return false; + + 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/{}/create", id)) + .send() + .await + { + Ok(resp) => { + if resp.ok() { + MsgListGroups::Finish(TypeFinish::Join) + } 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."), + )); } - true + + false + } + MsgListGroups::Finish(t) => match t { + TypeFinish::Join => { + self.groups + .push(self.free_groups.remove(self.selected_group)); + if self.nb_show < 3 { + self.nb_show += 1; + } + true + } + TypeFinish::Create => false, } MsgListGroups::FinishLeave(id) => { let group = self.groups.remove(id); @@ -371,6 +476,10 @@ impl Component for ListGroups { false } MsgListGroups::Refresh => true, + MsgListGroups::OnChangeName(name) => { + self.on_change_name(name); + true + } MsgListGroups::More => { self.nb_show += 3; if self.nb_show > self.groups.len() { diff --git a/front/src/components/mod.rs b/front/src/components/mod.rs index 7c59979..f97fb25 100644 --- a/front/src/components/mod.rs +++ b/front/src/components/mod.rs @@ -22,19 +22,21 @@ pub struct User { discordname: String, } -#[derive(Deserialize, Serialize)] +#[derive(Default, Deserialize, Serialize)] struct Game { name: String, } -#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)] +#[derive(Clone, Debug, Default, Deserialize, Eq, PartialEq, Serialize)] pub struct Group { pub id: String, + pub captain: String, pub name: String, pub game: String, } impl Group { + /// Change le champs `game` pour son nom et non son ID. pub async fn get_game_name(&mut self) { match Request::get(&format!("/api/games/{}", self.game)) .send() @@ -52,4 +54,13 @@ impl Group { Err(_) => (), } } + + /// Retourne l'id en BDD d'un jeu. None si le jeu n'existe pas. + pub async fn get_id_from_name(game: String) -> Option { + match Request::get(&format!("/api/games/id?name={}", game)).send().await { + _ => () + + } + None + } }