Some checks failed
No response / noResponse (push) Has been cancelled
CI / Continuous releases (push) Has been cancelled
CI / test-dev (macos-latest) (push) Has been cancelled
CI / test-dev (ubuntu-latest) (push) Has been cancelled
CI / test-dev (windows-latest) (push) Has been cancelled
Maintenance / main (push) Has been cancelled
Scorecards supply-chain security / Scorecards analysis (push) Has been cancelled
CodeQL / Analyze (push) Has been cancelled
119 lines
3.2 KiB
TypeScript
119 lines
3.2 KiB
TypeScript
import * as React from 'react';
|
|
import { useNavigate } from 'react-router';
|
|
import useNotifications from '../hooks/useNotifications/useNotifications';
|
|
import {
|
|
createOne as createEmployee,
|
|
validate as validateEmployee,
|
|
type Employee,
|
|
} from '../data/employees';
|
|
import EmployeeForm, {
|
|
type FormFieldValue,
|
|
type EmployeeFormState,
|
|
} from './EmployeeForm';
|
|
import PageContainer from './PageContainer';
|
|
|
|
const INITIAL_FORM_VALUES: Partial<EmployeeFormState['values']> = {
|
|
role: 'Market',
|
|
isFullTime: true,
|
|
};
|
|
|
|
export default function EmployeeCreate() {
|
|
const navigate = useNavigate();
|
|
|
|
const notifications = useNotifications();
|
|
|
|
const [formState, setFormState] = React.useState<EmployeeFormState>(() => ({
|
|
values: INITIAL_FORM_VALUES,
|
|
errors: {},
|
|
}));
|
|
const formValues = formState.values;
|
|
const formErrors = formState.errors;
|
|
|
|
const setFormValues = React.useCallback(
|
|
(newFormValues: Partial<EmployeeFormState['values']>) => {
|
|
setFormState((previousState) => ({
|
|
...previousState,
|
|
values: newFormValues,
|
|
}));
|
|
},
|
|
[],
|
|
);
|
|
|
|
const setFormErrors = React.useCallback(
|
|
(newFormErrors: Partial<EmployeeFormState['errors']>) => {
|
|
setFormState((previousState) => ({
|
|
...previousState,
|
|
errors: newFormErrors,
|
|
}));
|
|
},
|
|
[],
|
|
);
|
|
|
|
const handleFormFieldChange = React.useCallback(
|
|
(name: keyof EmployeeFormState['values'], value: FormFieldValue) => {
|
|
const validateField = async (values: Partial<EmployeeFormState['values']>) => {
|
|
const { issues } = validateEmployee(values);
|
|
setFormErrors({
|
|
...formErrors,
|
|
[name]: issues?.find((issue) => issue.path?.[0] === name)?.message,
|
|
});
|
|
};
|
|
|
|
const newFormValues = { ...formValues, [name]: value };
|
|
|
|
setFormValues(newFormValues);
|
|
validateField(newFormValues);
|
|
},
|
|
[formValues, formErrors, setFormErrors, setFormValues],
|
|
);
|
|
|
|
const handleFormReset = React.useCallback(() => {
|
|
setFormValues(INITIAL_FORM_VALUES);
|
|
}, [setFormValues]);
|
|
|
|
const handleFormSubmit = React.useCallback(async () => {
|
|
const { issues } = validateEmployee(formValues);
|
|
if (issues && issues.length > 0) {
|
|
setFormErrors(
|
|
Object.fromEntries(issues.map((issue) => [issue.path?.[0], issue.message])),
|
|
);
|
|
return;
|
|
}
|
|
setFormErrors({});
|
|
|
|
try {
|
|
await createEmployee(formValues as Omit<Employee, 'id'>);
|
|
notifications.show('Employee created successfully.', {
|
|
severity: 'success',
|
|
autoHideDuration: 3000,
|
|
});
|
|
|
|
navigate('/employees');
|
|
} catch (createError) {
|
|
notifications.show(
|
|
`Failed to create employee. Reason: ${(createError as Error).message}`,
|
|
{
|
|
severity: 'error',
|
|
autoHideDuration: 3000,
|
|
},
|
|
);
|
|
throw createError;
|
|
}
|
|
}, [formValues, navigate, notifications, setFormErrors]);
|
|
|
|
return (
|
|
<PageContainer
|
|
title="New Employee"
|
|
breadcrumbs={[{ title: 'Employees', path: '/employees' }, { title: 'New' }]}
|
|
>
|
|
<EmployeeForm
|
|
formState={formState}
|
|
onFieldChange={handleFormFieldChange}
|
|
onSubmit={handleFormSubmit}
|
|
onReset={handleFormReset}
|
|
submitButtonLabel="Create"
|
|
/>
|
|
</PageContainer>
|
|
);
|
|
}
|