From f31dd3c4d23fe65316e4c6926a0235e01d535e32 Mon Sep 17 00:00:00 2001 From: Franklin Date: Tue, 25 Apr 2023 18:41:40 -0400 Subject: [PATCH] Finished agent update & Creation --- src/api/backend/mod.rs | 14 +++++- src/pages/admin/fields/agent.rs | 78 ++++++++++++++++++++++++++++++--- 2 files changed, 86 insertions(+), 6 deletions(-) diff --git a/src/api/backend/mod.rs b/src/api/backend/mod.rs index c78f562..366c872 100644 --- a/src/api/backend/mod.rs +++ b/src/api/backend/mod.rs @@ -9,7 +9,7 @@ use jl_types::{ payloads::{ contact::ContactPayload, location::NewLocationPayload, - project::{NewProjectPayload, UpdateProjectPayload}, unit::UpdateUnitPayload, agent::UpdateAgentPayload, + project::{NewProjectPayload, UpdateProjectPayload}, unit::UpdateUnitPayload, agent::{UpdateAgentPayload, NewAgentPayload}, }, project_card::ProjectCardDto, }, @@ -201,6 +201,18 @@ pub async fn get_location_with_city_and_district( .await } +pub async fn create_new_agent(agent: NewAgentPayload) -> Result { + perform_request_without_client( + BASE_URL.into(), + Method::POST, + format!("admin/agent"), + Some(agent), + 200, + Vec::new(), + None, + ) + .await +} pub async fn create_new_project(project: NewProjectPayload) -> Result { perform_request_without_client( BASE_URL.into(), diff --git a/src/pages/admin/fields/agent.rs b/src/pages/admin/fields/agent.rs index 533e3f8..bb2feb4 100644 --- a/src/pages/admin/fields/agent.rs +++ b/src/pages/admin/fields/agent.rs @@ -1,8 +1,8 @@ -use jl_types::domain::{agent::Agent, credential::CredentialType}; +use jl_types::{domain::{agent::Agent, credential::CredentialType}, dto::payloads::agent::{NewAgentPayload, UpdateAgentPayload}}; use yew::prelude::*; use yew_router::prelude::use_navigator; -use crate::{pages::admin::edit::{EditType}, components::{textfield::TextField, dropdown::DropDown, single_media_picker::SingleMediaPicker}, }; +use crate::{pages::admin::edit::{EditType}, components::{textfield::TextField, dropdown::DropDown, single_media_picker::SingleMediaPicker}, api::backend::{update_agent, create_new_agent}, routes::main_router::Route, }; #[derive(Properties, PartialEq, Clone)] pub struct AgentFieldsProps { @@ -12,7 +12,7 @@ pub struct AgentFieldsProps { #[function_component(AgentFields)] pub fn agent_fields(props: &AgentFieldsProps) -> Html { - let _navigator = use_navigator().unwrap(); + let navigator = use_navigator().unwrap(); let user_typed = use_state(|| false); let agent_opt = props.agent.clone(); @@ -34,7 +34,7 @@ pub fn agent_fields(props: &AgentFieldsProps) -> Html { let agent_shortcode_handle = use_state_eq(|| String::new()); let profile_picture_url_handle = use_state_eq(|| String::new()); let credential_handle = use_state_eq(|| String::new()); - let credential_type = use_state_eq(|| Some(CredentialType::PhoneNumber)); + let credential_type = use_state_eq(|| None); // Fields definition & Update on value recieved if !*user_typed { @@ -62,8 +62,76 @@ pub fn agent_fields(props: &AgentFieldsProps) -> Html { }); } let update_button_onclick = { + let navigator = navigator.clone(); + let edit_type = props.edittype.clone(); + + // Fields to be sent to the backend + let agent_name_handle = agent_name_handle.clone(); + let agent_shortcode_handle = agent_shortcode_handle.clone(); + let profile_picture_url_handle = profile_picture_url_handle.clone(); + let credential_handle = credential_handle.clone(); + let credential_type = credential_type.clone(); Callback::from(move |_: MouseEvent| { - + let navigator = navigator.clone(); + let edit_type = edit_type.clone(); + + // Fields to be sent to the backend + let agent_name_handle = agent_name_handle.clone(); + + let profile_picture_url_handle = profile_picture_url_handle.clone(); + let credential_handle = credential_handle.clone(); + let credential_type_handle = credential_type.clone(); + wasm_bindgen_futures::spawn_local(async move { + if (*agent_name_handle).clone().is_empty() { + log::error!("Missing field agent_name"); + return; + } + if (*profile_picture_url_handle).clone().is_empty() { + log::error!("Missing field profile_picture_url"); + return; + } + if (*credential_handle).clone().is_empty() { + log::error!("Missing field credential"); + return; + } + let agent_name = (*agent_name_handle).clone(); + let profile_picture_url = (*profile_picture_url_handle).clone(); + let credential = (*credential_handle).clone(); + let credential_type = if let Some(credential_type) = (*credential_type_handle).clone(){ + credential_type + } else { + log::error!("Missing field credential_type"); + return; + }; + match edit_type { + EditType::New => { + let agent = NewAgentPayload { + credential, + credential_type, + full_name: agent_name, + profile_picture_url + }; + match create_new_agent(agent).await { + Ok(_) => navigator.push(&Route::AdminAgents), + Err(error) => log::error!("Error updating agent: {error}") + }; + }, + EditType::Existing(id) => { + let agent = UpdateAgentPayload { + id, + credential: Some(credential), + credential_type: Some(credential_type), + full_name: Some(agent_name), + profile_picture_url: Some(profile_picture_url) + }; + match update_agent(agent).await { + Ok(_) => navigator.push(&Route::AdminAgents), + Err(error) => log::error!("Error updating agent: {error}") + }; + } + }; + + }); }) }; html! {