import { useEffect, useState } from "react" import { Save } from "lucide-react" import { toast } from "sonner" import { updateSubscriptionPlan } from "../../../api/subscription-plans.api" import { Badge } from "../../../components/ui/badge" import { Button } from "../../../components/ui/button" import { Dialog, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle, } from "../../../components/ui/dialog" import { Input } from "../../../components/ui/input" import { Select } from "../../../components/ui/select" import { SpinnerIcon } from "../../../components/ui/spinner-icon" import { Textarea } from "../../../components/ui/textarea" import { cn } from "../../../lib/utils" import { formatPlanCategory, SUBSCRIPTION_CURRENCIES, SUBSCRIPTION_DURATION_UNITS, } from "../../../lib/subscriptionPlans" import type { SubscriptionPlan, SubscriptionPlanDurationUnit, UpdateSubscriptionPlanPayload, } from "../../../types/subscription.types" interface EditDraft { name: string description: string duration_value: string duration_unit: SubscriptionPlanDurationUnit price: string currency: string is_active: boolean } function planToDraft(plan: SubscriptionPlan): EditDraft { return { name: plan.name, description: plan.description, duration_value: String(plan.duration_value), duration_unit: plan.duration_unit, price: String(plan.price), currency: plan.currency, is_active: plan.is_active, } } function draftToPayload(draft: EditDraft): UpdateSubscriptionPlanPayload | null { const name = draft.name.trim() const description = draft.description.trim() const duration_value = Number(draft.duration_value) const price = Number(draft.price) if (!name) return null if (!description) return null if (!Number.isFinite(duration_value) || duration_value < 1) return null if (!Number.isFinite(price) || price < 0) return null return { name, description, duration_value, duration_unit: draft.duration_unit, price, currency: draft.currency, is_active: draft.is_active, } } type EditSubscriptionPlanDialogProps = { plan: SubscriptionPlan | null open: boolean onOpenChange: (open: boolean) => void onUpdated: (plan: SubscriptionPlan) => void } export function EditSubscriptionPlanDialog({ plan, open, onOpenChange, onUpdated, }: EditSubscriptionPlanDialogProps) { const [draft, setDraft] = useState(null) const [saving, setSaving] = useState(false) useEffect(() => { if (open && plan) { setDraft(planToDraft(plan)) setSaving(false) } if (!open) { setDraft(null) setSaving(false) } }, [open, plan]) const handleSubmit = async (e: React.FormEvent) => { e.preventDefault() if (!plan || !draft) return const payload = draftToPayload(draft) if (!payload) { toast.error("Please fill in all required fields with valid values.") return } setSaving(true) try { const res = await updateSubscriptionPlan(plan.id, payload) if (!res.data) { toast.error("Plan was updated but the response could not be read.") return } toast.success(res.message || "Subscription plan updated successfully") onUpdated({ ...res.data, category: res.data.category || plan.category, created_at: res.data.created_at || plan.created_at, }) onOpenChange(false) } catch { toast.error("Failed to update subscription plan.") } finally { setSaving(false) } } return (
Edit subscription package Update pricing, duration, and visibility for this plan. {draft && plan ? (

Category

Category cannot be changed after creation

{formatPlanCategory(plan.category)}
setDraft((d) => d && { ...d, name: e.target.value })} className="rounded-[6px]" required />