"use client"; import { zodResolver } from "@hookform/resolvers/zod"; import { useState } from "react"; import { SubmitHandler, useForm } from "react-hook-form"; import { z } from "zod"; import { FormTextarea } from "../../../../../components"; import { Button, Dialog, DialogContent, DialogDescription, DialogHeader, DialogTitle, Form, } from "../../../../../shadcnui"; import { formatDate } from "../../../components/utils"; import { StripeSubscriptionInterface, StripeSubscriptionService } from "../../data"; type CancelSubscriptionDialogProps = { subscription: StripeSubscriptionInterface; open: boolean; onOpenChange: (open: boolean) => void; onSuccess: () => void; }; const formSchema = z.object({ reason: z.string().optional(), }); export function CancelSubscriptionDialog({ subscription, open, onOpenChange, onSuccess, }: CancelSubscriptionDialogProps) { const [isSubmitting, setIsSubmitting] = useState(false); const form = useForm>({ resolver: zodResolver(formSchema), defaultValues: { reason: "", }, }); const onSubmit: SubmitHandler> = async (_values) => { setIsSubmitting(true); try { await StripeSubscriptionService.cancelSubscription({ id: subscription.id, cancelImmediately: false, }); onSuccess(); onOpenChange(false); } catch (error) { console.error("[CancelSubscriptionDialog] Failed to cancel subscription:", error); } finally { setIsSubmitting(false); } }; const periodEndDate = formatDate(subscription.currentPeriodEnd); return ( Cancel Subscription Are you sure you want to cancel this subscription? This action cannot be undone.
Your subscription will remain active until {periodEndDate}. You can continue using the service until then.
); }