import { FC } from 'react'; import { Box, Paper, styled } from '@mui/material'; import Timeline from '@mui/lab/Timeline'; import TimelineItem, { timelineItemClasses } from '@mui/lab/TimelineItem'; import TimelineSeparator from '@mui/lab/TimelineSeparator'; import TimelineDot from '@mui/lab/TimelineDot'; import TimelineConnector from '@mui/lab/TimelineConnector'; import TimelineContent from '@mui/lab/TimelineContent'; import { ChangeRequestState } from '../../changeRequest.types'; interface ISuggestChangeTimelineProps { state: ChangeRequestState; } const StyledPaper = styled(Paper)(({ theme }) => ({ marginTop: theme.spacing(2), borderRadius: `${theme.shape.borderRadiusLarge}px`, })); const StyledBox = styled(Box)(({ theme }) => ({ padding: theme.spacing(2), marginBottom: `-${theme.spacing(4)}`, })); const StyledTimeline = styled(Timeline)(() => ({ [`& .${timelineItemClasses.root}:before`]: { flex: 0, padding: 0, }, })); const steps: ChangeRequestState[] = [ 'Draft', 'In review', 'Approved', 'Applied', ]; const rejectedSteps: ChangeRequestState[] = ['Draft', 'In review', 'Rejected']; export const determineColor = ( changeRequestState: ChangeRequestState, changeRequestStateIndex: number, displayStage: ChangeRequestState, displayStageIndex: number, ) => { if (changeRequestState === 'Cancelled') return 'grey'; if (changeRequestState === 'Rejected') return displayStage === 'Rejected' ? 'error' : 'success'; if ( changeRequestStateIndex !== -1 && changeRequestStateIndex >= displayStageIndex ) return 'success'; if (changeRequestStateIndex + 1 === displayStageIndex) return 'primary'; return 'grey'; }; export const ChangeRequestTimeline: FC = ({ state, }) => { const data = state === 'Rejected' ? rejectedSteps : steps; const activeIndex = data.findIndex((item) => item === state); return ( {data.map((title, index) => { const color = determineColor( state, activeIndex, title, index, ); let timelineDotProps = {}; // Only add the outlined variant if it's the next step after the active one, but not for 'Draft' in 'Cancelled' state if ( activeIndex + 1 === index && !(state === 'Cancelled' && title === 'Draft') ) { timelineDotProps = { variant: 'outlined' }; } return createTimelineItem( color, title, index < data.length - 1, timelineDotProps, ); })} ); }; const createTimelineItem = ( color: 'primary' | 'success' | 'grey' | 'error', title: string, shouldConnectToNextItem: boolean, timelineDotProps: { [key: string]: string | undefined } = {}, ) => ( {shouldConnectToNextItem && } {title} );