From ba72e622c2f1c1045493a0e51108d606d9f37edf Mon Sep 17 00:00:00 2001 From: Valentin Tolmer Date: Fri, 29 Oct 2021 12:32:52 +0900 Subject: [PATCH] app: Migrate group_details to CommonComponent --- app/src/components/group_details.rs | 105 +++++++++++++--------------- 1 file changed, 49 insertions(+), 56 deletions(-) diff --git a/app/src/components/group_details.rs b/app/src/components/group_details.rs index b6328cb..9fd85ee 100644 --- a/app/src/components/group_details.rs +++ b/app/src/components/group_details.rs @@ -4,13 +4,16 @@ use crate::{ remove_user_from_group::RemoveUserFromGroupComponent, router::{AppRoute, Link}, }, - infra::api::HostService, + infra::{ + common_component::{CommonComponent, CommonComponentParts}, + api::HostService, + } }; use anyhow::{bail, Error, Result}; use graphql_client::GraphQLQuery; use yew::{ prelude::*, - services::{fetch::FetchTask, ConsoleService}, + services::ConsoleService, }; #[derive(GraphQLQuery)] @@ -27,15 +30,10 @@ pub type User = get_group_details::GetGroupDetailsGroupUsers; pub type AddGroupMemberUser = add_group_member::User; pub struct GroupDetails { - link: ComponentLink, - props: Props, + common: CommonComponentParts, /// The group info. If none, the error is in `error`. If `error` is None, then we haven't /// received the server response yet. group: Option, - /// Error message displayed to the user. - error: Option, - // Used to keep the request alive long enough. - _task: Option, } /// State machine describing the possible transitions of the component state. @@ -55,11 +53,11 @@ pub struct Props { impl GroupDetails { fn get_group_details(&mut self) { - self._task = HostService::graphql_query::( + self.common.task = HostService::graphql_query::( get_group_details::Variables { - id: self.props.group_id, + id: self.common.group_id, }, - self.link.callback(Msg::GroupDetailsResponse), + self.common.link.callback(Msg::GroupDetailsResponse), "Error trying to fetch group details", ) .map_err(|e| { @@ -69,33 +67,6 @@ impl GroupDetails { .ok(); } - fn handle_msg(&mut self, msg: ::Message) -> Result { - match msg { - Msg::GroupDetailsResponse(response) => match response { - Ok(group) => self.group = Some(group.group), - Err(e) => { - self.group = None; - bail!("Error getting user details: {}", e); - } - }, - Msg::OnError(e) => return Err(e), - Msg::OnUserAddedToGroup(user) => { - self.group.as_mut().unwrap().users.push(User { - id: user.id, - display_name: user.display_name, - }); - } - Msg::OnUserRemovedFromGroup((user_id, _)) => { - self.group - .as_mut() - .unwrap() - .users - .retain(|u| u.id != user_id); - } - } - Ok(true) - } - fn view_messages(&self, error: &Option) -> Html { if let Some(e) = error { html! { @@ -124,8 +95,8 @@ impl GroupDetails { + on_user_removed_from_group=self.common.link.callback(Msg::OnUserRemovedFromGroup) + on_error=self.common.link.callback(Msg::OnError)/> } @@ -174,38 +145,60 @@ impl GroupDetails { + on_error=self.common.link.callback(Msg::OnError) + on_user_added_to_group=self.common.link.callback(Msg::OnUserAddedToGroup)/> } } } +impl CommonComponent for GroupDetails { + fn handle_msg(&mut self, msg: ::Message) -> Result { + match msg { + Msg::GroupDetailsResponse(response) => match response { + Ok(group) => self.group = Some(group.group), + Err(e) => { + self.group = None; + bail!("Error getting user details: {}", e); + } + }, + Msg::OnError(e) => return Err(e), + Msg::OnUserAddedToGroup(user) => { + self.group.as_mut().unwrap().users.push(User { + id: user.id, + display_name: user.display_name, + }); + } + Msg::OnUserRemovedFromGroup((user_id, _)) => { + self.group + .as_mut() + .unwrap() + .users + .retain(|u| u.id != user_id); + } + } + Ok(true) + } + + fn mut_common(&mut self) -> &mut CommonComponentParts { + &mut self.common + } +} + impl Component for GroupDetails { type Message = Msg; type Properties = Props; fn create(props: Self::Properties, link: ComponentLink) -> Self { let mut table = Self { - link, - props, - _task: None, + common: CommonComponentParts::::create(props, link), group: None, - error: None, }; table.get_group_details(); table } fn update(&mut self, msg: Self::Message) -> ShouldRender { - self.error = None; - match self.handle_msg(msg) { - Err(e) => { - ConsoleService::error(&e.to_string()); - self.error = Some(e); - true - } - Ok(b) => b, - } + CommonComponentParts::::update(self, msg) } fn change(&mut self, _: Self::Properties) -> ShouldRender { @@ -213,7 +206,7 @@ impl Component for GroupDetails { } fn view(&self) -> Html { - match (&self.group, &self.error) { + match (&self.group, &self.common.error) { (None, None) => html! {{"Loading..."}}, (None, Some(e)) => html! {
{"Error: "}{e.to_string()}
}, (Some(u), error) => {