import { useState } from "react"; import { Modal, Button, Form, Alert } from "react-bootstrap"; import { generateMockOrders } from "../../../../types"; type Props = { isOpen: boolean; onClose: () => void; /** Příznak, zda je pro dnešní den založena alespoň jedna skupina objednávky. */ hasGroups: boolean; /** Příznak, zda je nadefinován alespoň jeden obchod (bez něj nelze generovat). */ hasStores: boolean; }; const DEFAULT_COUNT = '3'; const DEFAULT_MIN_AMOUNT = '100'; const DEFAULT_MAX_AMOUNT = '1000'; /** Vybere český tvar slova podle počtu (1 osoba / 2 osoby / 5 osob). */ function plural(count: number, one: string, few: string, many: string): string { if (count === 1) return one; if (count >= 2 && count <= 4) return few; return many; } /** Modální dialog pro generování mock dat sekce Objednání (pouze DEV). */ export default function GenerateMockOrdersModal({ isOpen, onClose, hasGroups, hasStores }: Readonly) { const [count, setCount] = useState(DEFAULT_COUNT); const [minAmount, setMinAmount] = useState(DEFAULT_MIN_AMOUNT); const [maxAmount, setMaxAmount] = useState(DEFAULT_MAX_AMOUNT); const [loading, setLoading] = useState(false); const [error, setError] = useState(null); const [success, setSuccess] = useState(null); const handleGenerate = async () => { setError(null); const countNum = parseInt(count, 10); if (isNaN(countNum) || countNum < 1 || countNum > 50) { setError('Počet osob musí být číslo mezi 1 a 50'); return; } const minNum = parseInt(minAmount, 10); const maxNum = parseInt(maxAmount, 10); if (isNaN(minNum) || isNaN(maxNum) || minNum < 0 || maxNum < minNum) { setError('Zadejte platný rozsah částek (od ≤ do)'); return; } setLoading(true); try { const response = await generateMockOrders({ body: { count: countNum, minAmount: minNum, maxAmount: maxNum }, }); if (response.error) { setError((response.error as any).error || 'Nastala chyba při generování dat'); } else { const groups = response.data?.groups ?? []; const total = response.data?.count ?? 0; const created = groups.find(g => g.created); setSuccess( `Doplněno: ${total} ${plural(total, 'osoba', 'osoby', 'osob')}` + ` / ${groups.length} ${plural(groups.length, 'skupina', 'skupiny', 'skupin')}` + (created ? ` (skupina „${created.name}“ byla nově založena).` : '.') ); setTimeout(() => { onClose(); setSuccess(null); }, 2000); } } catch (e: any) { setError(e.message || 'Nastala chyba při generování dat'); } finally { setLoading(false); } }; const handleClose = () => { setError(null); setSuccess(null); onClose(); }; return (

Generovat mock objednávky

{success ? ( {success} ) : ( <> DEV režim - Tato funkce je dostupná pouze ve vývojovém prostředí. Data se generují vždy jen pro aktuální den. {error && ( setError(null)} dismissible> {error} )} {hasStores ? ( <> Počet osob setCount(e.target.value)} min={1} max={50} onKeyDown={e => e.stopPropagation()} /> {hasGroups ? 'Zadaný počet osob se doplní do každé existující skupiny.' : 'Není založena žádná skupina — jedna se založí z náhodně vybraného obchodu a doplní se do ní zadaný počet osob.'} Rozsah částek (Kč)
setMinAmount(e.target.value)} min={0} onKeyDown={e => e.stopPropagation()} /> — setMaxAmount(e.target.value)} min={0} onKeyDown={e => e.stopPropagation()} />
Každé osobě se nastaví náhodná částka z tohoto rozmezí a do poznámky náhodné jídlo.
) : (

Není nadefinován žádný obchod — mock objednávky nelze vygenerovat. Nejprve přidejte obchod ve správě obchodů.

)} )}
{!success && ( <> )} {success && ( )}
); }