"use client"; import { Box, VStack, Heading, Text, Flex, Card, Button, Spinner, HStack, Textarea, } from "@chakra-ui/react"; import { useTranslations } from "next-intl"; import { useColorModeValue } from "@/components/ui/color-mode"; import { useMySubscription, useCancelSubscription, } from "@/lib/api/subscriptions/use-hooks"; import { PlanBadge } from "./plan-badge"; import { useSession } from "next-auth/react"; import { useState } from "react"; import { LuCalendar, LuTriangleAlert, LuX, LuCheck } from "react-icons/lu"; import { useRouter } from "@/i18n/navigation"; /** * Subscription info card for the Profile page. * Shows current plan, billing dates, cancel option. */ export function SubscriptionCard() { const t = useTranslations("subscription"); const tCommon = useTranslations("common"); const { data: session } = useSession(); const { data: subData, isLoading } = useMySubscription(!!session); const router = useRouter(); const cardBg = useColorModeValue("white", "gray.800"); const borderColor = useColorModeValue("gray.100", "gray.700"); const [showCancelForm, setShowCancelForm] = useState(false); const [cancelReason, setCancelReason] = useState(""); const cancelMutation = useCancelSubscription(); const subscription = subData?.data ?? null; const plan = subscription?.plan ?? session?.user?.subscriptionPlan ?? "free"; const isFree = plan === "free"; const handleCancel = async () => { await cancelMutation.mutateAsync({ reason: cancelReason || undefined }); setShowCancelForm(false); setCancelReason(""); }; if (isLoading) { return ( ); } return ( {t("title")} {/* Subscription Details */} {subscription && !isFree && ( <> {subscription.currentPeriodEnd && ( {t("next-billing")} {new Date( subscription.currentPeriodEnd, ).toLocaleDateString()} )} {subscription.cancelEffectiveDate && ( {t("cancelled-info", { date: new Date( subscription.cancelEffectiveDate, ).toLocaleDateString(), })} )} )} {/* Actions */} {isFree ? ( ) : ( <> {!subscription?.cancelEffectiveDate && ( )} )} {/* Cancel Confirmation */} {showCancelForm && ( {t("cancel-confirm-title")} {t("cancel-confirm-message")}