import { useEffect, useRef, useState } from 'react'; import { Button, Modal } from 'react-bootstrap'; import { PendingQr, dismissQr } from '../../../types'; import { formatDateString } from '../Utils'; import ConfirmModal from './modals/ConfirmModal'; type Props = { pendingQrs?: PendingQr[]; login?: string; // Zavolá se po úspěšném potvrzení platby, aby si rodič mohl znovu načíst data onDismissed?: () => void | Promise; }; // Sekce "Nevyřízené platby" – zobrazí QR kódy neuhrazených plateb přihlášeného uživatele // včetně tlačítka "Zaplatil jsem" a potvrzovacího dialogu. Sdíleno hlavní stránkou i stránkou objednávek. // Při příchodu nových nevyřízených plateb se navíc automaticky otevře modální dialog, // aby si uživatel QR kódů určitě všiml (často si jich nevšimnou, protože sekce je dole na stránce). export default function PendingPayments({ pendingQrs, login, onDismissed }: Readonly) { const [dismissQrId, setDismissQrId] = useState(null); const [modalOpen, setModalOpen] = useState(false); // ID QR kódů, pro které už byl v rámci tohoto načtení stránky automaticky zobrazen // modální dialog. Drží se jen v paměti (ne v sessionStorage), takže se při každém // ručním přenačtení stránky vynuluje a dialog se znovu otevře, dokud uživatel platby // neuhradí. Zároveň se nepřekrývá při pouhém obnovení dat či příchodu už zobrazeného QR. const autoShownQrIds = useRef>(new Set()); const qrIdsKey = (pendingQrs ?? []).map(qr => qr.id).join(','); // Automaticky otevřeme modální dialog, jakmile přijdou nové (dosud nezobrazené) platby. useEffect(() => { const ids = (pendingQrs ?? []).map(qr => qr.id); if (ids.length === 0) return; const unseen = ids.filter(id => !autoShownQrIds.current.has(id)); if (unseen.length > 0) { setModalOpen(true); unseen.forEach(id => autoShownQrIds.current.add(id)); } }, [qrIdsKey, pendingQrs]); if (!pendingQrs || pendingQrs.length === 0) return null; // Vykreslení jednoho QR kódu i s tlačítkem "Zaplatil jsem" – sdíleno sekcí i modálem. const renderQr = (qr: PendingQr) => (

{formatDateString(qr.date)} — {qr.creator} ({qr.totalPrice / 100} Kč) {qr.purpose && <>
{qr.purpose}}

QR kód
); return ( <>

Nevyřízené platby

Máte neuhrazené platby.{' '}

{pendingQrs.map(renderQr)}
setModalOpen(false)} centered scrollable> Nevyřízené platby

Máte neuhrazené platby. Naskenujte QR kód pro zaplacení.

{pendingQrs.map(renderQr)}
setDismissQrId(null)} onConfirm={async () => { if (!dismissQrId) return; const id = dismissQrId; setDismissQrId(null); await dismissQr({ body: { id } }); await onDismissed?.(); }} /> ); }