"use client"; import { useState, useEffect, useCallback, useRef } from "react"; import { FileText, Loader2, Check, RefreshCw } from "lucide-react"; import { Button } from "@/shared/components/ui/button"; import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger, } from "@/shared/components/ui/tooltip"; import { cn } from "@/shared/lib/utils"; import type { EpaySessionStatus } from "./epay-connect"; /* ------------------------------------------------------------------ */ /* Props */ /* ------------------------------------------------------------------ */ type Props = { nrCadastral: string; siruta: string; judetName: string; uatName: string; /** Custom label for the button (e.g. "Actualizeaza" for expired extracts) */ label?: string; /** Custom tooltip text */ tooltipText?: string; }; /* ------------------------------------------------------------------ */ /* Component */ /* ------------------------------------------------------------------ */ export function EpayOrderButton({ nrCadastral, siruta, judetName, uatName, label, tooltipText, }: Props) { const [ordering, setOrdering] = useState(false); const [ordered, setOrdered] = useState(false); const [error, setError] = useState(""); const [epayStatus, setEpayStatus] = useState({ connected: false, }); const mountedRef = useRef(true); useEffect(() => { return () => { mountedRef.current = false; }; }, []); // Check ePay status and whether an extract exists useEffect(() => { let cancelled = false; const check = async () => { try { // Check session const sRes = await fetch("/api/ancpi/session"); const sData = (await sRes.json()) as EpaySessionStatus; if (!cancelled) setEpayStatus(sData); // Check if a completed extract already exists const oRes = await fetch( `/api/ancpi/orders?nrCadastral=${encodeURIComponent(nrCadastral)}&status=completed&limit=1`, ); const oData = (await oRes.json()) as { orders?: unknown[]; total?: number }; if (!cancelled && oData.total && oData.total > 0) { setOrdered(true); } } catch { /* silent */ } }; void check(); return () => { cancelled = true; }; }, [nrCadastral]); const handleOrder = useCallback(async () => { setOrdering(true); setError(""); try { const res = await fetch("/api/ancpi/order", { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ parcels: [ { nrCadastral, siruta, judetIndex: 0, // server resolves from SIRUTA judetName, uatId: 0, // server resolves from SIRUTA uatName, }, ], }), }); const data = (await res.json()) as { orders?: unknown[]; error?: string }; if (!res.ok || data.error) { if (mountedRef.current) setError(data.error ?? "Eroare comanda"); } else { if (mountedRef.current) setOrdered(true); } } catch { if (mountedRef.current) setError("Eroare retea"); } finally { if (mountedRef.current) setOrdering(false); } }, [nrCadastral, siruta, judetName, uatName]); const disabled = !epayStatus.connected || (epayStatus.credits != null && epayStatus.credits < 1) || ordering; const isRenew = !!label; // "Actualizeaza" mode for expired extracts const Icon = isRenew ? RefreshCw : FileText; const resolveTooltip = (): string => { if (error) return error; if (ordering) return "Se comanda..."; if (ordered) return "Extras CF valid"; if (!epayStatus.connected) return "ePay neconectat"; if (epayStatus.credits != null && epayStatus.credits < 1) return "Credite insuficiente"; return tooltipText ?? "Comanda extras CF (1 credit)"; }; if (ordered) { return ( Extras CF comandat cu succes ); } if (label) { // Render as a compact text button with label (for "Actualizeaza" etc.) return ( {resolveTooltip()} ); } // Default: icon-only button return ( {resolveTooltip()} ); }