From cbbaf039db5fb96ca2a7ea33a18f34e9b785d67a Mon Sep 17 00:00:00 2001 From: Nishit Suwal <81785002+NSUWAL123@users.noreply.github.com> Date: Fri, 16 Feb 2024 12:38:15 +0545 Subject: [PATCH] feat (frontend): approve organization api integration (#1215) * fix managProject: UI fix * feat manageOrganization: redirect to approveOrganization on org click on To Be Verified tab org list * fix rejectOrganization: service for rejectOrganization add * feat organizationApproval: state management to show approving/rejecting status, redirect to manage-org after approval success --- src/frontend/src/api/OrganisationService.ts | 44 +++++++++++- .../ApproveOrganization/OrganizationForm.tsx | 67 +++++++++++++++++-- .../src/store/slices/organisationSlice.ts | 14 ++++ src/frontend/src/views/ManageProject.tsx | 2 +- src/frontend/src/views/Organisation.tsx | 19 ++++-- 5 files changed, 130 insertions(+), 16 deletions(-) diff --git a/src/frontend/src/api/OrganisationService.ts b/src/frontend/src/api/OrganisationService.ts index 5453826222..ed4683d630 100644 --- a/src/frontend/src/api/OrganisationService.ts +++ b/src/frontend/src/api/OrganisationService.ts @@ -158,11 +158,12 @@ export const PatchOrganizationDataService: Function = (url: string, payload: any }; }; -export const ApproveOrganizationService: Function = (url: string, organizationId: string) => { +export const ApproveOrganizationService: Function = (url: string) => { return async (dispatch) => { - const approveOrganization = async (url) => { + const approveOrganization = async (url: string) => { try { - await axios.post(url, organizationId); + dispatch(OrganisationAction.SetOrganizationApproving(true)); + await axios.post(url); dispatch( CommonActions.SetSnackBar({ open: true, @@ -171,7 +172,11 @@ export const ApproveOrganizationService: Function = (url: string, organizationId duration: 2000, }), ); + dispatch(OrganisationAction.SetOrganizationApproving(false)); + dispatch(OrganisationAction.SetOrganisationFormData({})); + dispatch(OrganisationAction.SetOrganizationApprovalStatus(true)); } catch (error) { + dispatch(OrganisationAction.SetOrganizationApproving(false)); dispatch( CommonActions.SetSnackBar({ open: true, @@ -185,3 +190,36 @@ export const ApproveOrganizationService: Function = (url: string, organizationId await approveOrganization(url); }; }; + +export const RejectOrganizationService: Function = (url: string) => { + return async (dispatch) => { + const rejectOrganization = async (url: string) => { + try { + dispatch(OrganisationAction.SetOrganizationRejecting(true)); + await axios.delete(url); + dispatch( + CommonActions.SetSnackBar({ + open: true, + message: 'Organization rejected successfully.', + variant: 'success', + duration: 2000, + }), + ); + dispatch(OrganisationAction.SetOrganizationRejecting(false)); + dispatch(OrganisationAction.SetOrganisationFormData({})); + dispatch(OrganisationAction.SetOrganizationApprovalStatus(true)); + } catch (error) { + dispatch(OrganisationAction.SetOrganizationRejecting(false)); + dispatch( + CommonActions.SetSnackBar({ + open: true, + message: 'Failed to reject organization.', + variant: 'error', + duration: 2000, + }), + ); + } + }; + await rejectOrganization(url); + }; +}; diff --git a/src/frontend/src/components/ApproveOrganization/OrganizationForm.tsx b/src/frontend/src/components/ApproveOrganization/OrganizationForm.tsx index 22d226431d..ecca4a8432 100644 --- a/src/frontend/src/components/ApproveOrganization/OrganizationForm.tsx +++ b/src/frontend/src/components/ApproveOrganization/OrganizationForm.tsx @@ -1,17 +1,32 @@ import React, { useEffect } from 'react'; import { useDispatch } from 'react-redux'; -import { useParams } from 'react-router-dom'; +import { useNavigate, useParams } from 'react-router-dom'; import InputTextField from '@/components/common/InputTextField'; import TextArea from '@/components/common/TextArea'; import Button from '@/components/common/Button'; -import { ApproveOrganizationService, GetIndividualOrganizationService } from '@/api/OrganisationService'; +import { + ApproveOrganizationService, + GetIndividualOrganizationService, + RejectOrganizationService, +} from '@/api/OrganisationService'; import CoreModules from '@/shared/CoreModules'; +import { OrganisationAction } from '@/store/slices/organisationSlice'; const OrganizationForm = () => { const dispatch = useDispatch(); const params = useParams(); + const navigate = useNavigate(); const organizationId = params.id; const organisationFormData: any = CoreModules.useAppSelector((state) => state.organisation.organisationFormData); + const organizationApproving: any = CoreModules.useAppSelector( + (state) => state.organisation.organizationApprovalStatus.organizationApproving, + ); + const organizationRejecting: any = CoreModules.useAppSelector( + (state) => state.organisation.organizationApprovalStatus.organizationRejecting, + ); + const organizationApprovalSuccess: any = CoreModules.useAppSelector( + (state) => state.organisation.organizationApprovalStatus.isSuccess, + ); useEffect(() => { if (organizationId) { @@ -20,11 +35,27 @@ const OrganizationForm = () => { }, [organizationId]); const approveOrganization = () => { - dispatch( - ApproveOrganizationService(`${import.meta.env.VITE_API_URL}/organisation/approve`, { org_id: organizationId }), - ); + if (organizationId) { + dispatch( + ApproveOrganizationService( + `${import.meta.env.VITE_API_URL}/organisation/approve/?org_id=${parseInt(organizationId)}`, + ), + ); + } + }; + + const rejectOrganization = () => { + dispatch(RejectOrganizationService(`${import.meta.env.VITE_API_URL}/organisation/${organizationId}`)); }; + // redirect to manage-organization page after approve/reject success + useEffect(() => { + if (organizationApprovalSuccess) { + dispatch(OrganisationAction.SetOrganizationApprovalStatus(false)); + navigate('/organisation'); + } + }, [organizationApprovalSuccess]); + return (