use crate::{ components::router::AppRoute, infra::common_component::{CommonComponent, CommonComponentParts}, }; use anyhow::{bail, Result}; use gloo_console::log; use graphql_client::GraphQLQuery; use validator_derive::Validate; use yew::prelude::*; use yew_form_derive::Model; use yew_router::{prelude::History, scope_ext::RouterScopeExt}; #[derive(GraphQLQuery)] #[graphql( schema_path = "../schema.graphql", query_path = "queries/create_group.graphql", response_derives = "Debug", custom_scalars_module = "crate::infra::graphql" )] pub struct CreateGroup; pub struct CreateGroupForm { common: CommonComponentParts, form: yew_form::Form, } #[derive(Model, Validate, PartialEq, Eq, Clone, Default)] pub struct CreateGroupModel { #[validate(length(min = 1, message = "Groupname is required"))] groupname: String, } pub enum Msg { Update, SubmitForm, CreateGroupResponse(Result), } impl CommonComponent for CreateGroupForm { fn handle_msg( &mut self, ctx: &Context, msg: ::Message, ) -> Result { match msg { Msg::Update => Ok(true), Msg::SubmitForm => { if !self.form.validate() { bail!("Check the form for errors"); } let model = self.form.model(); let req = create_group::Variables { name: model.groupname, }; self.common.call_graphql::( ctx, req, Msg::CreateGroupResponse, "Error trying to create group", ); Ok(true) } Msg::CreateGroupResponse(response) => { log!(&format!( "Created group '{}'", &response?.create_group.display_name )); ctx.link().history().unwrap().push(AppRoute::ListGroups); Ok(true) } } } fn mut_common(&mut self) -> &mut CommonComponentParts { &mut self.common } } impl Component for CreateGroupForm { type Message = Msg; type Properties = (); fn create(_: &Context) -> Self { Self { common: CommonComponentParts::::create(), form: yew_form::Form::::new(CreateGroupModel::default()), } } fn update(&mut self, ctx: &Context, msg: Self::Message) -> bool { CommonComponentParts::::update(self, ctx, msg) } fn view(&self, ctx: &Context) -> Html { let link = ctx.link(); type Field = yew_form::Field; html! {
{"Create a group"}
{&self.form.field_message("groupname")}
{ if let Some(e) = &self.common.error { html! {
{e.to_string() }
} } else { html! {} } }
} } }