From 77f94a9fad873261810e11ed44360db5d3f23347 Mon Sep 17 00:00:00 2001 From: rick Date: Fri, 28 Oct 2022 18:57:08 +0200 Subject: [PATCH] move components in separate files --- front/src/components/home.rs | 151 +++++++++++++ front/src/components/list_groups.rs | 136 ++++++++++++ front/src/components/mod.rs | 54 +++++ front/src/main.rs | 333 +--------------------------- 4 files changed, 345 insertions(+), 329 deletions(-) create mode 100644 front/src/components/home.rs create mode 100644 front/src/components/list_groups.rs create mode 100644 front/src/components/mod.rs diff --git a/front/src/components/home.rs b/front/src/components/home.rs new file mode 100644 index 0000000..8c9295a --- /dev/null +++ b/front/src/components/home.rs @@ -0,0 +1,151 @@ +use gloo_net::http::Request; +use gloo_net::Error; +use gloo_storage::errors::StorageError; +use gloo_storage::{LocalStorage, Storage}; +use patternfly_yew::{Toast, ToastDispatcher, ToastViewer, Type}; +use yew::prelude::*; + +use crate::components::{ListGroups, User}; + +pub struct Home { + user: Option, +} + +#[derive(PartialEq)] +pub enum TestMessage { + Toast(ToastType), + ConnexionOk(User), +} + +#[derive(PartialEq)] +pub struct ToastFields { + pub title: String, + pub body: String, +} + +#[derive(PartialEq)] +pub enum ToastType { + Info(ToastFields), + Error(ToastFields), +} + +impl Component for Home { + type Message = TestMessage; + type Properties = (); + + fn create(_ctx: &Context) -> Self { + Self { + user: None, + } + } + + fn view(&self, ctx: &Context) -> Html { + let user: Result = LocalStorage::get("auth"); + if let Ok(user) = user { + if let None = self.user { + ctx.link().send_message(TestMessage::ConnexionOk(user)); + } + } else { + ctx.link().send_future_batch(async { + match Request::get("/api/users/current").send().await { + Ok(resp) => { + if resp.ok() { + let json: Result = resp.json().await; + match json { + Ok(json) => { + let user = json.clone(); + match LocalStorage::set("auth", json) { + Ok(_) => vec![ + TestMessage::Toast(ToastType::Info(ToastFields { + title: String::from("Connexion réussie !"), + body: String::new(), + })), + TestMessage::ConnexionOk(user), + ], + Err(err) => vec![TestMessage::Toast(ToastType::Error( + ToastFields { + title: String::from("Error from the promise"), + body: err.to_string(), + }, + ))], + } + } + Err(err) => { + LocalStorage::delete("auth"); + vec![TestMessage::Toast(ToastType::Error(ToastFields { + title: String::from("Error from the promise"), + body: err.to_string(), + }))] + } + } + } else { + vec![TestMessage::Toast(ToastType::Error(ToastFields { + title: String::from("Error from the promise"), + body: String::from("L'API ne retourne pas un code 200."), + }))] + } + } + Err(err) => vec![TestMessage::Toast(ToastType::Error(ToastFields { + title: String::from("Error from the promise"), + body: err.to_string(), + }))], + } + }); + } + + //let onclick = ctx.link().callback(|_| TestMessage::Test); + + html! { + <> + + if let Some(user) = &self.user { +

{ format!("Bienvenue {} !", user.discordname) }

+ if user.discordid.is_empty() { +

{ "SE CONNECTER VIA DISCORD ICI" }

+ } + + if user.steamid.is_empty() { +

{ "SE CONNECTER VIA STEAM ICI" }

+ } +
+ +
+ } else { +

{ "SE CONNECTER VIA DISCORD ICI" }

+

{ "SE CONNECTER VIA STEAM ICI" }

+ } + // + + } + } + + fn update(&mut self, _ctx: &Context, msg: Self::Message) -> bool { + match msg { + TestMessage::ConnexionOk(user) => { + self.user = Some(user); + return true; + } + TestMessage::Toast(toast) => match toast { + ToastType::Info(infos) => ToastDispatcher::new().toast(Toast { + title: infos.title, + r#type: Type::Info, + ..Default::default() + }), + ToastType::Error(infos) => ToastDispatcher::new().toast(Toast { + title: infos.title, + r#type: Type::Danger, + body: html! {

{ infos.body }

}, + ..Default::default() + }), + }, + //_ => ToastDispatcher::new().toast(html! {}), + _ => ToastDispatcher::new().toast(Toast { + title: String::from("Un callback n'a pas été implémenté !"), + r#type: Type::Warning, + ..Default::default() + }), + } + + false + } +} diff --git a/front/src/components/list_groups.rs b/front/src/components/list_groups.rs new file mode 100644 index 0000000..4b15ccf --- /dev/null +++ b/front/src/components/list_groups.rs @@ -0,0 +1,136 @@ +use gloo_net::http::Request; +use gloo_net::Error; +use patternfly_yew::ToastViewer; +use yew::prelude::*; + +use crate::components::{Group, Home, TestMessage, ToastFields, ToastType}; + +pub struct ListGroups { + idUser: String, + groups: Vec, + nb_show: usize, +} + +#[derive(PartialEq, Properties)] +pub struct PropGroups { + pub id: String, +} + +#[derive(PartialEq)] +pub enum MsgListGroups { + Done(Vec), + Info(String, String), + Error(String, String), + More, +} + +impl Component for ListGroups { + type Message = MsgListGroups; + type Properties = PropGroups; + + fn create(ctx: &Context) -> Self { + Self { + idUser: ctx.props().id.clone(), + groups: Vec::new(), + nb_show: 0, + } + } + + fn view(&self, ctx: &Context) -> Html { + if self.groups.len() == 0 { + let id = self.idUser.clone(); + ctx.link().send_future(async move { + match Request::get(&format!("/api/users/{}/groups", id)) + .send() + .await + { + Ok(resp) => { + if resp.ok() { + let json: Result, Error> = resp.json().await; + match json { + Ok(mut json) => { + for item in json.iter_mut() { + item.get_game_name().await; + } + return MsgListGroups::Done(json); + } + Err(err) => { + log::info!("{}", err.to_string()); + () + } + } + } + } + Err(_) => (), + }; + MsgListGroups::Info(String::from("Ok"), String::new()) + }); + } + + let onclick = ctx.link().callback(|_| MsgListGroups::More); + + html! { + <> + + if self.groups.len() > 0 { + { + self.groups[..self.nb_show].iter().map(|group| { html!{ +

{ group.name.clone() }

+ } }).collect::() + } + + if self.nb_show < self.groups.len() { + + } + } else { +

{ "Vous n'êtes dans aucun groupe." }

+ } + //

{ "coucou" }

+ + } + } + + fn update(&mut self, ctx: &Context, msg: Self::Message) -> bool { + match msg { + MsgListGroups::Info(title, body) => { + if let Some(parent) = ctx.link().get_parent() { + (parent.clone()) + .downcast::() + .send_message(TestMessage::Toast(ToastType::Info(ToastFields { + title, + body, + }))) + } + } + MsgListGroups::Error(title, body) => { + if let Some(parent) = ctx.link().get_parent() { + (parent.clone()) + .downcast::() + .send_message(TestMessage::Toast(ToastType::Error(ToastFields { + title, + body, + }))) + } + } + MsgListGroups::Done(groups) => { + let len = groups.len(); + self.groups = groups; + self.nb_show = if len < 3 { + len + } else { + 3 + }; + + 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; + } + } + false + } +} diff --git a/front/src/components/mod.rs b/front/src/components/mod.rs new file mode 100644 index 0000000..908c6a4 --- /dev/null +++ b/front/src/components/mod.rs @@ -0,0 +1,54 @@ +mod home; +mod list_groups; + +pub use home::*; +use list_groups::ListGroups; + +use gloo_net::Error; +use gloo_net::http::Request; +use serde::{Deserialize, Serialize}; + +#[derive(Clone, Deserialize, PartialEq, Serialize)] +pub struct User { + id: String, + banned: bool, + blacklisted: bool, + experience: u32, + level: u32, + money: u32, + moneylimit: u32, + steamid: String, + discordid: String, + discordname: String, +} + +#[derive(Deserialize, Serialize)] +struct Game { + name: String, +} + +#[derive(Clone, Debug, Deserialize, PartialEq, Serialize)] +pub struct Group { + pub name: String, + pub game: String, +} + +impl Group { + pub async fn get_game_name(&mut self) { + match Request::get(&format!("/api/games/{}", self.game)) + .send() + .await + { + Ok(resp) => { + if resp.ok() { + let json: Result = resp.json().await; + match json { + Ok(json) => self.game = json.name, + Err(err) => log::info!("{}", err.to_string()), + } + } + } + Err(_) => (), + } + } +} diff --git a/front/src/main.rs b/front/src/main.rs index a65d826..ff603b6 100644 --- a/front/src/main.rs +++ b/front/src/main.rs @@ -1,26 +1,12 @@ +mod components; + +use components::*; + use gloo_net::http::Request; -use gloo_net::Error; -use gloo_storage::errors::StorageError; use gloo_storage::{LocalStorage, Storage}; -use patternfly_yew::{Toast, ToastDispatcher, ToastViewer, Type}; -use serde::{Deserialize, Serialize}; use yew::prelude::*; use yew_router::prelude::*; -#[derive(Clone, Deserialize, PartialEq, Serialize)] -struct User { - id: String, - banned: bool, - blacklisted: bool, - experience: u32, - level: u32, - money: u32, - moneylimit: u32, - steamid: String, - discordid: String, - discordname: String, -} - #[derive(Clone, Routable, PartialEq)] enum Route { #[at("/")] @@ -45,317 +31,6 @@ fn about() -> Html { } } -struct Home { - value: String, - user: Option, -} - -#[derive(PartialEq)] -enum TestMessage { - Test, - Toast(ToastType), - ConnexionOk(User), -} - -#[derive(PartialEq)] -struct ToastFields { - pub title: String, - pub body: String, -} - -#[derive(PartialEq)] -enum ToastType { - Info(ToastFields), - Error(ToastFields), -} - -impl Component for Home { - type Message = TestMessage; - type Properties = (); - - fn create(_ctx: &Context) -> Self { - Self { - value: String::from("coucou"), - user: None, - } - } - - fn view(&self, ctx: &Context) -> Html { - let user: Result = LocalStorage::get("auth"); - if let Ok(user) = user { - if let None = self.user { - ctx.link().send_message(TestMessage::ConnexionOk(user)); - } - } else { - ctx.link().send_future_batch(async { - match Request::get("/api/users/current").send().await { - Ok(resp) => { - if resp.ok() { - let json: Result = resp.json().await; - match json { - Ok(json) => { - let user = json.clone(); - match LocalStorage::set("auth", json) { - Ok(_) => vec![ - TestMessage::Toast(ToastType::Info(ToastFields { - title: String::from("Connexion réussie !"), - body: String::new(), - })), - TestMessage::ConnexionOk(user), - ], - Err(err) => vec![TestMessage::Toast(ToastType::Error( - ToastFields { - title: String::from("Error from the promise"), - body: err.to_string(), - }, - ))], - } - } - Err(err) => { - LocalStorage::delete("auth"); - vec![TestMessage::Toast(ToastType::Error(ToastFields { - title: String::from("Error from the promise"), - body: err.to_string(), - }))] - } - } - } else { - vec![TestMessage::Toast(ToastType::Error(ToastFields { - title: String::from("Error from the promise"), - body: String::from("L'API ne retourne pas un code 200."), - }))] - } - } - Err(err) => vec![TestMessage::Toast(ToastType::Error(ToastFields { - title: String::from("Error from the promise"), - body: err.to_string(), - }))], - } - }); - } - - //let onclick = ctx.link().callback(|_| TestMessage::Test); - - html! { - <> - - if let Some(user) = &self.user { -

{ format!("Bienvenue {} !", user.discordname) }

- if user.discordid.is_empty() { -

{ "SE CONNECTER VIA DISCORD ICI" }

- } - - if user.steamid.is_empty() { -

{ "SE CONNECTER VIA STEAM ICI" }

- } -
- -
- } else { -

{ "SE CONNECTER VIA DISCORD ICI" }

-

{ "SE CONNECTER VIA STEAM ICI" }

- } - // - - } - } - - fn update(&mut self, _ctx: &Context, msg: Self::Message) -> bool { - match msg { - TestMessage::ConnexionOk(user) => { - self.user = Some(user); - return true; - } - TestMessage::Toast(toast) => match toast { - ToastType::Info(infos) => ToastDispatcher::new().toast(Toast { - title: infos.title, - r#type: Type::Info, - ..Default::default() - }), - ToastType::Error(infos) => ToastDispatcher::new().toast(Toast { - title: infos.title, - r#type: Type::Danger, - body: html! {

{ infos.body }

}, - ..Default::default() - }), - }, - //_ => ToastDispatcher::new().toast(html! {}), - _ => ToastDispatcher::new().toast(Toast { - title: String::from("Un callback n'a pas été implémenté !"), - r#type: Type::Warning, - ..Default::default() - }), - } - - false - /* - if msg == TestMessage::Test { - self.value = String::from("nouveau"); - true - } else if let TestMessage::StatusConnection(_) = msg { - self.value = String::from("yes ça marche"); - true - } else { - false - } - */ - } -} - -#[derive(Deserialize, Serialize)] -struct Game { - name: String, -} - -#[derive(Clone, Debug, Deserialize, PartialEq, Serialize)] -struct Group { - pub name: String, - pub game: String, -} - -impl Group { - pub async fn get_game_name(&mut self) { - match Request::get(&format!("/api/games/{}", self.game)) - .send() - .await - { - Ok(resp) => { - if resp.ok() { - let json: Result = resp.json().await; - match json { - Ok(json) => self.game = json.name, - Err(err) => log::info!("{}", err.to_string()), - } - } - } - Err(err) => (), - } - } -} - -struct ListGroups { - idUser: String, - groups: Vec, - nb_show: usize, -} - -#[derive(PartialEq, Properties)] -struct PropGroups { - id: String, -} - -#[derive(PartialEq)] -enum MsgListGroups { - Done(Vec), - Info(String, String), - Error(String, String), - More, -} - -impl Component for ListGroups { - type Message = MsgListGroups; - type Properties = PropGroups; - - fn create(ctx: &Context) -> Self { - Self { - idUser: ctx.props().id.clone(), - groups: Vec::new(), - nb_show: 0, - } - } - - fn view(&self, ctx: &Context) -> Html { - if self.groups.len() == 0 { - let id = self.idUser.clone(); - ctx.link().send_future(async move { - match Request::get(&format!("/api/users/{}/groups", id)) - .send() - .await - { - Ok(resp) => { - if resp.ok() { - let json: Result, Error> = resp.json().await; - match json { - Ok(mut json) => { - for item in json.iter_mut() { - item.get_game_name().await; - } - return MsgListGroups::Done(json); - } - Err(err) => { - log::info!("{}", err.to_string()); - () - } - } - } - } - Err(err) => (), - }; - MsgListGroups::Info(String::from("Ok"), String::new()) - }); - } - - let onclick = ctx.link().callback(|_| MsgListGroups::More); - - html! { - <> - - if self.groups.len() > 0 { - { - self.groups[..self.nb_show].iter().map(|group| { html!{ -

{ group.name.clone() }

- } }).collect::() - } - - if self.nb_show < self.groups.len() { - - } - } else { -

{ "Vous n'êtes dans aucun groupe." }

- } - //

{ "coucou" }

- - } - } - - fn update(&mut self, ctx: &Context, msg: Self::Message) -> bool { - match msg { - MsgListGroups::Info(title, body) => { - if let Some(parent) = ctx.link().get_parent() { - (parent.clone()) - .downcast::() - .send_message(TestMessage::Toast(ToastType::Info(ToastFields { - title, - body, - }))) - } - } - MsgListGroups::Error(title, body) => { - if let Some(parent) = ctx.link().get_parent() { - (parent.clone()) - .downcast::() - .send_message(TestMessage::Toast(ToastType::Error(ToastFields { - title, - body, - }))) - } - } - MsgListGroups::Done(groups) => { - self.groups = groups; - 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; - } - } - false - } -} - fn switch(route: &Route) -> Html { match route { Route::Home => html! { },