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,
} 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);
}
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.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'}
}
onClick={handleBack}
>
Back
}
onClick={handleEmployeeEdit}
>
Edit
}
onClick={handleEmployeeDelete}
>
Delete
) : null;
}, [
isLoading,
error,
employee,
handleBack,
handleEmployeeEdit,
handleEmployeeDelete,
]);
const pageTitle = `Employee ${employeeId}`;
return (
{renderShow}
);
}