import { Copy } from "lucide-react"; import { useCallback, useEffect, useState } from "react"; import { Badge } from "@/components/ui/badge"; import { Button } from "@/components/ui/button"; import { Card, CardContent } from "@/components/ui/card"; import { Dialog, DialogContent, DialogHeader, DialogTitle, DialogTrigger, } from "@/components/ui/dialog"; import { Input } from "@/components/ui/input"; import { Label } from "@/components/ui/label"; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue, } from "@/components/ui/select"; import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow, } from "@/components/ui/table"; import { useAuth } from "@/context/AuthContext"; import { apiGet, apiPatch, apiPost } from "@/lib/api"; import type { DiscountCode } from "@/lib/types"; function copy(s: string) { void navigator.clipboard.writeText(s); } export function DiscountCodesPage() { const { canManageCodes } = useAuth(); const [rows, setRows] = useState([]); const [open, setOpen] = useState(false); const [custom, setCustom] = useState(""); const [generate, setGenerate] = useState(true); const [value, setValue] = useState("10"); const [dtype, setDtype] = useState<"percent" | "fixed_amount">("percent"); const load = useCallback(() => { apiGet<{ data: DiscountCode[] }>("/discount-codes").then((r) => setRows(r.data) ); }, []); useEffect(() => { load(); }, [load]); async function create(e: React.FormEvent) { e.preventDefault(); await apiPost("/discount-codes", { generate, code: generate ? undefined : custom, discountType: dtype, value: Number(value), }); setOpen(false); load(); } async function toggle(dc: DiscountCode) { if (!canManageCodes) return; await apiPatch(`/discount-codes/${dc.id}`, { isActive: !dc.isActive }); load(); } return (

Discount codes

{canManageCodes && ( New discount code
setGenerate(e.target.checked)} id="gen" />
{!generate && (
setCustom(e.target.value)} />
)}
setValue(e.target.value)} />
)}
Code Type Value Redemptions Active {rows.map((d) => ( {d.code} {d.discountType} {d.discountType === "percent" ? `${d.value}%` : d.value} {d.redemptionCount} {d.maxRedemptions != null && ` / ${d.maxRedemptions}`} {d.isActive ? "Active" : "Off"} {canManageCodes && ( )} ))}
); }