import * as React from 'react'; import Alert from '@mui/material/Alert'; import Box from '@mui/material/Box'; import Button from '@mui/material/Button'; import CircularProgress from '@mui/material/CircularProgress'; import Divider from '@mui/material/Divider'; import Grid from '@mui/material/Grid'; import Paper from '@mui/material/Paper'; import Stack from '@mui/material/Stack'; import Typography from '@mui/material/Typography'; import EditIcon from '@mui/icons-material/Edit'; import DeleteIcon from '@mui/icons-material/Delete'; import ArrowBackIcon from '@mui/icons-material/ArrowBack'; import { useNavigate, useParams } from 'react-router'; import dayjs from 'dayjs'; import { useDialogs } from '../hooks/useDialogs/useDialogs'; import useNotifications from '../hooks/useNotifications/useNotifications'; import { deleteOne as deleteEmployee, getOne as getEmployee, type Employee, } from '../data/employees'; import PageContainer from './PageContainer'; export default function EmployeeShow() { const { employeeId } = useParams(); const navigate = useNavigate(); const dialogs = useDialogs(); const notifications = useNotifications(); const [employee, setEmployee] = React.useState(null); const [isLoading, setIsLoading] = React.useState(true); const [error, setError] = React.useState(null); const loadData = React.useCallback(async () => { setError(null); setIsLoading(true); try { const showData = await getEmployee(Number(employeeId)); setEmployee(showData); } catch (showDataError) { setError(showDataError as Error); } setIsLoading(false); }, [employeeId]); React.useEffect(() => { loadData(); }, [loadData]); const handleEmployeeEdit = React.useCallback(() => { navigate(`/employees/${employeeId}/edit`); }, [navigate, employeeId]); const handleEmployeeDelete = React.useCallback(async () => { if (!employee) { return; } const confirmed = await dialogs.confirm( `Do you wish to delete ${employee.name}?`, { title: `Delete employee?`, severity: 'error', okText: 'Delete', cancelText: 'Cancel', }, ); if (confirmed) { setIsLoading(true); try { await deleteEmployee(Number(employeeId)); navigate('/employees'); notifications.show('Employee deleted successfully.', { severity: 'success', autoHideDuration: 3000, }); } catch (deleteError) { notifications.show( `Failed to delete employee. Reason:' ${(deleteError as Error).message}`, { severity: 'error', autoHideDuration: 3000, }, ); } setIsLoading(false); } }, [employee, dialogs, employeeId, navigate, notifications]); const handleBack = React.useCallback(() => { navigate('/employees'); }, [navigate]); const renderShow = React.useMemo(() => { if (isLoading) { return ( ); } if (error) { return ( {error.message} ); } return employee ? ( Name {employee.name} Age {employee.age} Join date {dayjs(employee.joinDate).format('MMMM D, YYYY')} Department {employee.role} Full-time {employee.isFullTime ? 'Yes' : 'No'} ) : null; }, [ isLoading, error, employee, handleBack, handleEmployeeEdit, handleEmployeeDelete, ]); const pageTitle = `Employee ${employeeId}`; return ( {renderShow} ); }