import { useState } from "react"; import { Modal, Button, Form, Alert, Badge } from "react-bootstrap"; import { OrderGroup, simulateBoltTracking, advanceBoltTracking, setBoltTrackingState, pollBoltTracking, stopBoltTrackingSimulation, } from "../../../../types"; type Props = { isOpen: boolean; onClose: () => void; group: OrderGroup; }; /** Nabídka stavů pro ruční nastavení (odpovídá mapování v OrderProgress). */ const STATE_OPTIONS: { key: string; label: string; order_state: string; courier_state?: string }[] = [ { key: 'accepted', label: 'Přijato', order_state: 'accepted' }, { key: 'preparing', label: 'Příprava', order_state: 'preparing' }, { key: 'waiting_delivery', label: 'Příprava (čeká na vyzvednutí)', order_state: 'waiting_delivery' }, { key: 'pickup', label: 'Vyzvedávání', order_state: 'waiting_delivery', courier_state: 'arrived_to_provider' }, { key: 'in_delivery', label: 'Na cestě', order_state: 'in_delivery', courier_state: 'heading_to_client' }, { key: 'delivered', label: 'Doručeno', order_state: 'delivered' }, { key: 'cancelled', label: 'Zrušeno', order_state: 'cancelled' }, ]; /** Modální dialog pro simulaci sledování Bolt objednávky (pouze DEV). */ export default function BoltSimulationModal({ isOpen, onClose, group }: Readonly) { const [loading, setLoading] = useState(false); const [error, setError] = useState(null); const [info, setInfo] = useState(null); const [manualKey, setManualKey] = useState('preparing'); const running = !!group.trackingCode; /** Obecný runner — spustí akci, ošetří chybu a krátce zobrazí výsledek. */ const run = async (action: () => Promise<{ error?: unknown }>, okMsg: string) => { setError(null); setInfo(null); setLoading(true); try { const response = await action(); if (response.error) { setError((response.error as any)?.error || 'Akce simulace selhala'); } else { setInfo(okMsg); } } catch (e: any) { setError(e?.message || 'Akce simulace selhala'); } finally { setLoading(false); } }; const handleStart = () => run( () => simulateBoltTracking({ body: { groupId: group.id } }), 'Simulace spuštěna — objednávka přijata.', ); const handleAdvance = () => run( () => advanceBoltTracking({ body: { groupId: group.id } }), 'Posunuto na další krok.', ); const handleSetState = () => { const opt = STATE_OPTIONS.find(o => o.key === manualKey); if (!opt) return; return run( () => setBoltTrackingState({ body: { groupId: group.id, order_state: opt.order_state, courier_state: opt.courier_state, }, }), `Stav nastaven na „${opt.label}".`, ); }; const handlePoll = () => run( () => pollBoltTracking(), 'Scheduler spuštěn (poll proběhl).', ); const handleStop = () => run( () => stopBoltTrackingSimulation({ body: { groupId: group.id } }), 'Simulace ukončena.', ); const handleClose = () => { setError(null); setInfo(null); onClose(); }; return (

Simulace sledování Bolt

DEV režim – simuluje sledování objednávky Bolt pro skupinu{' '} {group.name} bez reálné objednávky. {error && ( setError(null)} dismissible> {error} )} {info && ( setInfo(null)} dismissible> {info} )}

Stav simulace:{' '} {running ? běží{group.trackingOrderState ? ` — ${group.trackingOrderState}` : ''} : neběží}

{!running ? (

Spuštěním se skupina přepne do stavu „Objednáno", přiřadí se simulovaný sledovací token a provede se první poll (stav „Přijato").

) : ( <>

Krokuj objednávku tlačítkem Další krok (Přijato → Příprava → Vyzvedávání → Na cestě → Doručeno) nebo nastav konkrétní stav ručně:

Konkrétní stav setManualKey(e.target.value)} > {STATE_OPTIONS.map(o => ( ))}
)}
{!running ? ( ) : ( <> )}
); }