"use client"; import { useState } from "react"; import { useI18n } from "@/translations/provider"; import { type CheckDiscountResult, useValidateDiscountMutation, } from "@/hooks/marriage/use-validate-discount"; export interface DiscountWidgetProps { objectId: number | string; service?: string; onDiscountApplied?: (result: CheckDiscountResult) => void; onDiscountCleared?: () => void; className?: string; } export function DiscountWidget({ objectId, service = "marriagesubscriptionplan", onDiscountApplied, onDiscountCleared, className = "", }: DiscountWidgetProps) { const { dictionary: t } = useI18n(); const [isExpanded, setIsExpanded] = useState(false); const [code, setCode] = useState(""); const [discountStatus, setDiscountStatus] = useState< "initial" | "empty" | "loading" | "success" | "failed" >("initial"); const [discountResult, setDiscountResult] = useState(null); const [errorMessage, setErrorMessage] = useState(null); const validateMutation = useValidateDiscountMutation(); const handleApply = async () => { const trimmed = code.trim(); if (!trimmed) { setDiscountStatus("empty"); setErrorMessage(t["This field is required"] || "This field is required"); return; } setDiscountStatus("loading"); setErrorMessage(null); try { const result = await validateMutation.mutateAsync({ code: trimmed, objectId, service, }); if (result.valid) { setDiscountStatus("success"); setDiscountResult(result); setErrorMessage(null); onDiscountApplied?.(result); } else { setDiscountStatus("failed"); setDiscountResult(null); setErrorMessage(result.message || "Invalid discount code"); } } catch (err: any) { setDiscountStatus("failed"); setDiscountResult(null); setErrorMessage( err?.response?.data?.detail || err?.message || "Invalid discount code", ); } }; const handleClear = () => { setCode(""); setDiscountStatus("initial"); setDiscountResult(null); setErrorMessage(null); onDiscountCleared?.(); }; const getBorderAndRing = () => { switch (discountStatus) { case "success": return "border-[#00AC78] ring-1 ring-[#00AC78]"; case "failed": case "empty": return "border-[#F0445B] ring-1 ring-[#F0445B]"; default: return "border-[#D0D5DD] hover:border-[#98A2B3] focus-within:border-[#F0445B] focus-within:ring-1 focus-within:ring-[#F0445B]"; } }; return (
{/* ── Collapsible Header ── */} {/* ── Expanded Form Body ── */} {isExpanded && (
{ setCode(e.target.value); if (discountStatus !== "initial") { setDiscountStatus("initial"); setErrorMessage(null); } }} onKeyDown={(e) => { if (e.key === "Enter" && discountResult === null) { e.preventDefault(); handleApply(); } }} placeholder={ t["Enter discount code..."] || "Enter discount code..." } className="h-full flex-1 bg-transparent text-[15px] font-medium text-[#181818] outline-none placeholder:text-[#98A2B3] disabled:opacity-70 min-w-0" /> {discountStatus === "loading" ? (
) : discountResult !== null ? ( ) : ( )}
{/* Status Message */} {errorMessage && (

{errorMessage}

)} {discountStatus === "success" && discountResult?.message && (

{discountResult.message}

)}
)}
); }