use crate::{ components::group_table::Group, infra::{ common_component::{CommonComponent, CommonComponentParts}, modal::Modal, }, }; use anyhow::{Error, Result}; use graphql_client::GraphQLQuery; use yew::prelude::*; #[derive(GraphQLQuery)] #[graphql( schema_path = "../schema.graphql", query_path = "queries/delete_group.graphql", response_derives = "Debug", custom_scalars_module = "crate::infra::graphql" )] pub struct DeleteGroupQuery; pub struct DeleteGroup { common: CommonComponentParts, node_ref: NodeRef, modal: Option, } #[derive(yew::Properties, Clone, PartialEq, Debug)] pub struct DeleteGroupProps { pub group: Group, pub on_group_deleted: Callback, pub on_error: Callback, } pub enum Msg { ClickedDeleteGroup, ConfirmDeleteGroup, DismissModal, DeleteGroupResponse(Result), } impl CommonComponent for DeleteGroup { fn handle_msg( &mut self, ctx: &Context, msg: ::Message, ) -> Result { match msg { Msg::ClickedDeleteGroup => { self.modal.as_ref().expect("modal not initialized").show(); } Msg::ConfirmDeleteGroup => { self.update(ctx, Msg::DismissModal); self.common.call_graphql::( ctx, delete_group_query::Variables { group_id: ctx.props().group.id, }, Msg::DeleteGroupResponse, "Error trying to delete group", ); } Msg::DismissModal => { self.modal.as_ref().expect("modal not initialized").hide(); } Msg::DeleteGroupResponse(response) => { response?; ctx.props().on_group_deleted.emit(ctx.props().group.id); } } Ok(true) } fn mut_common(&mut self) -> &mut CommonComponentParts { &mut self.common } } impl Component for DeleteGroup { type Message = Msg; type Properties = DeleteGroupProps; fn create(_: &Context) -> Self { Self { common: CommonComponentParts::::create(), node_ref: NodeRef::default(), modal: None, } } fn rendered(&mut self, _: &Context, first_render: bool) { if first_render { self.modal = Some(Modal::new( self.node_ref .cast::() .expect("Modal node is not an element"), )); } } fn update(&mut self, ctx: &Context, msg: Self::Message) -> bool { CommonComponentParts::::update_and_report_error( self, ctx, msg, ctx.props().on_error.clone(), ) } fn view(&self, ctx: &Context) -> Html { let link = &ctx.link(); html! { <> {self.show_modal(ctx)} } } } impl DeleteGroup { fn show_modal(&self, ctx: &Context) -> Html { let link = &ctx.link(); html! { } } }