import { useEffect, useReducer } from 'react'; import { Alert, Button, Drawer, Grid, Icon, IconButton, IconName, TextField, Typography } from '@noahspan/noahspan-components'; import { useForm, Controller, FormProvider } from 'react-hook-form'; import { initialState, reducer } from './reducer'; import { ProjectFormProps } from './ProjectFormProps.interface'; import { FormMode } from '../../enums/formMode'; import { useIsAuthenticated } from '@azure/msal-react'; import { useAccessToken } from '../../hooks/accessToken/UseAccessToken'; import { useHttpClient } from '../../hooks/httpClient/UseHttpClient'; import { AxiosError, AxiosInstance, AxiosResponse } from 'axios'; const ProjectForm = ({ isDrawerOpen, mode, onOpenClose, projectId }: ProjectFormProps) => { const [state, dispatch] = useReducer(reducer, initialState); const httpClient: AxiosInstance = useHttpClient(); const { getAccessToken } = useAccessToken(); const isAuthenticated = useIsAuthenticated(); const defaultValues = { partitionKey: 'project', rowKey: '', title: '', subTitle: '', iconName: '', summary: '', repoName: '', siteUrl: '', order: '' } const methods = useForm({ defaultValues: defaultValues }); const watchRepoName = methods.watch(['repoName']) const onCancel = () => { methods.reset(defaultValues); dispatch({ type: 'SET_IS_DISABLED', payload: false }); onOpenClose(FormMode.CANCEL); }; const onSubmit = async (data: unknown) => { console.log(data) try { dispatch({ type: 'SET_IS_LOADING', payload: true }); const accessToken: string = await getAccessToken(); if (!projectId) { await httpClient.post(`api/projects`, data, { headers: { Authorization: accessToken } }); } else { await httpClient.put(`api/projects/project/${projectId}`, data, { headers: { Authorization: accessToken } }); } methods.reset(defaultValues); dispatch({ type: 'SET_IS_DISABLED', payload: false }); onOpenClose(FormMode.CANCEL); } catch (error) { const axiosError = error as AxiosError; dispatch({ type: 'SET_ERROR', payload: axiosError.message }); } finally { dispatch({ type: 'SET_IS_LOADING', payload: false }); } }; useEffect(() => { if (watchRepoName.length > 0) { methods.setValue('rowKey', watchRepoName[0]) } }, [watchRepoName]) useEffect(() => { if (mode === FormMode.VIEW) { dispatch({ type: 'SET_IS_DISABLED', payload: true }); } }, [mode]); useEffect(() => { const getProject = async () => { try { dispatch({ type: 'SET_IS_LOADING', payload: true }); const config = isAuthenticated ? { headers: { Authorization: await getAccessToken() } } : {}; const response: AxiosResponse = await httpClient.get( `api/projects/project/${projectId}`, config ); const entry = response.data; methods.reset(entry); } catch (error) { const axiosError = error as AxiosError; dispatch({ type: 'SET_ERROR', payload: axiosError.message }); } finally { dispatch({ type: 'SET_IS_LOADING', payload: false }); } }; if (projectId && isDrawerOpen) { getProject(); } }, [projectId]); return (
{`${mode.toString().toLowerCase().charAt(0).toUpperCase() + mode.toString().slice(1).toLowerCase()} Project`} {state.error && ( dispatch({ type: 'SET_ERROR', payload: undefined }) } severity="error" sx={{ width: '100%' }} > {state.error} )} Order ( )} /> Title ( )} /> Sub Title ( )} /> Icon Name ( )} /> Repo Name ( )} /> Site URL ( )} /> Summary ( )} /> {mode.toString() !== FormMode.VIEW && ( )}
) } export default ProjectForm;