"use client"; import { useTranslations } from "next-intl"; import { useState } from "react"; import { createVoucher, deleteVoucher } from "@/actions/admin-vouchers"; import { ConfirmDialog } from "@/components/admin/confirm-dialog"; import { StatusCard } from "@/components/admin/dashboard"; import { CurrencyIcon } from "@/components/shared/currency-icon"; import { Button } from "@/components/ui/button"; import { useServerAction } from "@/hooks/use-server-action"; import { formatDate } from "@/lib/format-date"; export type VoucherRow = { id: string; code: string; amount: number; maxUses: number; useCount: number; expiresAt: string | null; createdAt: string | null; status: "active" | "expired" | "usedUp"; }; export function VouchersClient({ vouchers, canEdit, stats, }: { vouchers: VoucherRow[]; canEdit: boolean; stats: { total: number; active: number; usedUp: number; expired: number }; }) { const t = useTranslations("pages.admin.vouchers"); const { run, isPending } = useServerAction(); const [pendingDelete, setPendingDelete] = useState(null); const [code, setCode] = useState(""); const [amount, setAmount] = useState(""); const [maxUses, setMaxUses] = useState("1"); const [expiresAt, setExpiresAt] = useState(""); function handleCreate(e: React.FormEvent) { e.preventDefault(); if (!canEdit) return; run( () => createVoucher({ code, amount: Number(amount), maxUses: Number(maxUses), expiresAt: expiresAt || undefined, }), { successMessage: t("created"), errorMessage: t("createError"), onSuccess: () => { setCode(""); setAmount(""); setMaxUses("1"); setExpiresAt(""); }, }, ); } function handleConfirmDelete() { if (!pendingDelete) return; const id = pendingDelete.id; run(() => deleteVoucher({ id }), { successMessage: t("deleted"), errorMessage: t("deleteError"), onSuccess: () => setPendingDelete(null), }); } return (
0 ? "ok" : "neutral"} icon="✅" /> 0 ? "warn" : "neutral"} icon="📉" /> 0 ? "danger" : "neutral"} icon="⏰" />
{canEdit && (

{t("newVoucher")}

)}

{t("title")} ({vouchers.length})

{vouchers.length === 0 ? (
{t("noVouchers")}
) : ( {canEdit && } {vouchers.map((v) => ( {canEdit && ( )} ))}
{t("colCode")} {t("colAmount")} {t("colUses")} {t("colStatus")} {t("colExpires")} {t("colCreated")}{t("colActions")}
{v.code} {v.amount} {v.useCount} / {v.maxUses} {v.status === "expired" ? ( {t("statusExpired")} ) : v.status === "usedUp" ? ( {t("statusUsedUp")} ) : ( {t("statusActive")} )} {formatDate(v.expiresAt ? new Date(v.expiresAt) : null)} {formatDate(v.createdAt ? new Date(v.createdAt) : null)}
)}
{ if (!open) setPendingDelete(null); }} title={t("confirmDeleteTitle")} description={ pendingDelete ? t("confirmDelete", { code: pendingDelete.code }) : "" } confirmLabel={t("delete")} cancelLabel={t("form.cancel")} loading={isPending} onConfirm={handleConfirmDelete} />
); }