import { useEffect, useState } from 'react' import { createPortal } from 'react-dom' import { X } from 'lucide-react' import { useToast } from '../context/ToastContext' import { ApiError } from '../lib/api' import { updateOrder, type Order } from '../services/orderService' import type { OrderProcessStep } from '../services/settingsService' import { defaultStepColorForId, normalizeStepColor, stepBadgeStyle } from '../utils/stepColors' import modalStyles from './VariationsModal.module.css' import styles from './OrderStepModal.module.css' interface OrderStepModalProps { open: boolean order: Order | null steps: OrderProcessStep[] onClose: () => void onSaved?: (order: Order) => void } const ANIMATION_MS = 220 export function OrderStepModal({ open, order, steps, onClose, onSaved, }: OrderStepModalProps) { const { showToast } = useToast() const [mounted, setMounted] = useState(open) const [closing, setClosing] = useState(false) const [savingStepId, setSavingStepId] = useState(null) const [error, setError] = useState('') useEffect(() => { if (open && order) { setMounted(true) setClosing(false) setError('') setSavingStepId(null) } else if (mounted) { setClosing(true) const timer = setTimeout(() => { setMounted(false) setClosing(false) }, ANIMATION_MS) return () => clearTimeout(timer) } }, [open, mounted, order]) useEffect(() => { if (!mounted || closing) return const onKey = (e: KeyboardEvent) => { if (e.key === 'Escape' && !savingStepId) onClose() } document.addEventListener('keydown', onKey) return () => document.removeEventListener('keydown', onKey) }, [mounted, closing, onClose, savingStepId]) async function handleSelectStep(stepId: string) { if (!order || savingStepId) return if (stepId === order.processStepId) { onClose() return } setSavingStepId(stepId) setError('') try { const result = await updateOrder(order.id, { processStepId: stepId }) showToast(`Order ${order.orderNumber} step updated.`, 'success') onSaved?.(result.order) onClose() } catch (err) { setError(err instanceof ApiError ? err.message : 'Unable to update order step.') } finally { setSavingStepId(null) } } if (!mounted || !order) return null const currentLabel = order.processStepLabel?.trim() || steps.find((step) => step.id === order.processStepId)?.label || order.processStepId return createPortal(
{ if (!savingStepId) onClose() }} >
e.stopPropagation()} role="dialog" aria-modal="true" aria-labelledby="order-step-title" >

Change order step

{order.orderNumber} ยท Current: {currentLabel}

{error && (
{error}
)}
{steps.map((step, index) => { const selected = order.processStepId === step.id const saving = savingStepId === step.id const color = normalizeStepColor(step.color, defaultStepColorForId(step.id, index)) return ( ) })}
{!steps.length && (

No order steps configured. Add steps in Store settings first.

)}
, document.body, ) }