import React, { useState } from 'react'; import { Stepper, Step, StepLabel, StepIconProps, Typography, Menu, MenuItem } from '@mui/material'; import AirplanemodeActiveIcon from '@mui/icons-material/AirplanemodeActive'; import StoreIcon from '@mui/icons-material/Store'; import RecycleIcon from '@mui/icons-material/Restore'; import { Dewar, DewarsService } from "../../openapi"; import { DewarStatus, getStatusStepIndex, determineIconColor } from './statusUtils'; // Utilities moved to a new file const ICON_STYLE = { width: 24, height: 24 }; // Inline SVG Component const BottleIcon: React.FC<{ fill: string }> = ({ fill }) => ( ); // Define types for icons mapping. const ICONS: { [key: number]: React.ReactElement } = { 0: , 1: , 2: , 3: , 4: , 5: , }; interface StepIconContainerProps extends React.HTMLAttributes { color: string; } const StepIconContainer: React.FC = ({ color, children, ...rest }) => (
{children}
); type StepIconComponentProps = { icon: number; dewar: Dewar; isSelected: boolean; refreshShipments: () => void; } & StepIconProps; const StepIconComponent = ({ icon, dewar, isSelected, refreshShipments, ...props }: StepIconComponentProps) => { const [anchorEl, setAnchorEl] = useState(null); const handleIconEnter = (event: React.MouseEvent) => { if (isSelected && icon === 0) { setAnchorEl(event.currentTarget); } }; const handleIconLeave = () => { setAnchorEl(null); }; const handleStatusChange = async (status: DewarStatus) => { try { const today = new Date().toISOString().split('T')[0]; const payload = { dewar_id: dewar.id, dewar_name: dewar.dewar_name, tracking_number: dewar.tracking_number, number_of_pucks: dewar.number_of_pucks, number_of_samples: dewar.number_of_samples, status: status, ready_date: status === 'Ready for Shipping' ? today : null, shipping_date: dewar.shipping_date, arrival_date: dewar.arrival_date, returning_date: dewar.returning_date, qrcode: dewar.qrcode, return_address_id: dewar.return_address_id, contact_person_id: dewar.contact_person_id, }; await DewarsService.updateDewarDewarsDewarIdPut(dewar.id || '', payload); setAnchorEl(null); refreshShipments(); // Refresh shipments after status update } catch (error) { console.error('Failed to update dewar status:', error); alert('Failed to update dewar status. Please try again.'); } }; const { iconIndex, color } = getIconProperties(icon, dewar); const IconComponent = ICONS[iconIndex]; const iconProps = iconIndex === 0 ? { fill: color } : {}; return (
{IconComponent ? React.cloneElement(IconComponent, iconProps) : Invalid icon } setAnchorEl(anchorEl), onMouseLeave: handleIconLeave, }} > {['In Preparation', 'Ready for Shipping'].map((status) => ( handleStatusChange(status as DewarStatus)}> {status} ))}
); }; const getIconProperties = (icon: number, dewar: Dewar) => { const status = dewar.status as DewarStatus; const iconIndex = status === 'Delayed' && icon === 1 ? 5 : icon; const color = determineIconColor(icon, status); const fill = status === 'In Preparation' ? color : undefined; return { iconIndex, color, fill }; }; const steps = ['In-House', 'Transit', 'At SLS', 'Returned']; type CustomStepperProps = { dewar: Dewar; selectedDewarId: string | null; refreshShipments: () => void; // Add refreshShipments prop } const CustomStepper = ({ dewar, selectedDewarId, refreshShipments }: CustomStepperProps) => { const activeStep = getStatusStepIndex(dewar.status as DewarStatus); const isSelected = dewar.id === selectedDewarId; return (
{steps.map((label, index) => ( } > {label} {index === 0 ? dewar.ready_date : index === 1 ? dewar.shipping_date : index === 2 ? dewar.arrival_date : index === 3 ? dewar.returning_date : ''} ))}
); }; export default CustomStepper;