import { Add, Close, Delete, Inventory2, Remove } from '@mui/icons-material'; import { Button, Checkbox, Dialog, DialogActions, DialogContent, DialogContentText, DialogTitle, IconButton, Stack, Typography, useMediaQuery, } from '@mui/material'; import { alpha, useTheme } from '@mui/material/styles'; import type React from 'react'; import { useState } from 'react'; import { PickItem } from '../models/PickItem'; import { Product } from '../models/Product'; interface PickItemRowProps { item: PickItem; product?: Product | null; onIncrementQuantity: () => void; onDecrementQuantity: () => void; onToggleCarton: () => void; onStatusChange: (status: PickItem['status']) => void; onDelete: () => void; } export const PickItemRow = ({ item, product, onIncrementQuantity, onDecrementQuantity, onToggleCarton, onStatusChange, onDelete, }: PickItemRowProps) => { const theme = useTheme(); const [isConfirmOpen, setIsConfirmOpen] = useState(false); const [isControlsOpen, setIsControlsOpen] = useState(false); const isNarrowScreen = useMediaQuery(theme.breakpoints.down('sm')); const packagingLabel = item.is_carton ? product?.bulk_name ?? 'Carton' : product?.unit_type ?? 'Unit'; const toggleStatus = (checked: boolean) => { onStatusChange(checked ? 'picked' : 'pending'); }; const handleConfirmDelete = () => { onDelete(); setIsConfirmOpen(false); }; const handleRowClick = () => { if (isNarrowScreen) { setIsControlsOpen(true); } }; const handleRowKeyDown = (event: React.KeyboardEvent) => { if (!isNarrowScreen) return; if (event.key === 'Enter' || event.key === ' ') { event.preventDefault(); setIsControlsOpen(true); } }; const stopPropagation = (event: React.SyntheticEvent) => { event.stopPropagation(); }; return ( toggleStatus(event.target.checked)} inputProps={{ 'aria-label': 'Toggle picked status' }} onClick={(event) => event.stopPropagation()} /> {product?.name ?? 'Unknown product'} {item.quantity} {packagingLabel} {isNarrowScreen && ( Tap to adjust quantity and packaging )} {!isNarrowScreen && ( { stopPropagation(event); onToggleCarton(); }} sx={{ boxShadow: item.is_carton ? (theme) => `0 0 0 8px ${alpha(theme.palette.primary.main, 0.15)}` : 'none', }} > { stopPropagation(event); onDecrementQuantity(); }} > { stopPropagation(event); onIncrementQuantity(); }} > { stopPropagation(event); setIsConfirmOpen(true); }} aria-label="Delete item" > )} {isNarrowScreen && ( setIsControlsOpen(false)} fullWidth maxWidth="xs" aria-labelledby="item-controls-title" > {product?.name ?? 'Unknown product'} { stopPropagation(event); setIsControlsOpen(false); }} > Quantity: {item.quantity} {packagingLabel} { stopPropagation(event); onToggleCarton(); }} sx={{ boxShadow: item.is_carton ? (theme) => `0 0 0 8px ${alpha(theme.palette.primary.main, 0.15)}` : 'none', }} > { stopPropagation(event); onDecrementQuantity(); }} > { stopPropagation(event); onIncrementQuantity(); }} > { stopPropagation(event); setIsConfirmOpen(true); }} aria-label="Delete item" > )} setIsConfirmOpen(false)} aria-labelledby="confirm-delete-title" aria-describedby="confirm-delete-description" > Delete item {`Are you sure you want to delete ${product?.name ?? 'this product'} from the pick list?`} ); };