"use client"; import { useEffect, useState } from "react"; import { Plus, Pencil, X, CheckCircle2 } from "lucide-react"; import { api } from "@/lib/api"; import { inr } from "@/lib/utils"; type PlanForm = { _id?: string; name: string; price: number; product_limit: number | null; user_limit: number | null; storage_gb: number; grace_days: number; archive_years: number; features: string; enabled: boolean; }; const empty: PlanForm = { name: "", price: 0, product_limit: 100, user_limit: 3, storage_gb: 10, grace_days: 30, archive_years: 1, features: "", enabled: true, }; export default function Plans() { const [plans, setPlans] = useState([]); const [form, setForm] = useState(null); const [toast, setToast] = useState(""); function load() { api("/admin/plans").then(setPlans).catch(() => {}); } useEffect(() => { load(); }, []); function openEdit(p: any) { setForm({ _id: p.id, name: p.name, price: p.price, product_limit: p.product_limit, user_limit: p.user_limit, storage_gb: p.storage_gb, grace_days: p.grace_days ?? 30, archive_years: p.archive_years ?? 1, features: (p.features ?? []).join("\n"), enabled: p.enabled }); } async function save() { if (!form) return; const { _id, features, ...rest } = form; const payload = { ...rest, features: features.split("\n").map((s) => s.trim()).filter(Boolean) }; if (_id) await api(`/admin/plans/${_id}`, { method: "PUT", body: JSON.stringify(payload) }); else await api("/admin/plans", { method: "POST", body: JSON.stringify(payload) }); setForm(null); setToast("Plan saved"); setTimeout(() => setToast(""), 2000); load(); } return (
{toast &&
{toast}
}

Plans & Pricing

{plans.map((p) => (

{p.name}

{p.price ? inr(p.price) : "Free"}{p.price > 0 && /mo}
  • Products: {p.product_limit ?? "∞"}
  • Users: {p.user_limit ?? "∞"}
  • Storage: {p.storage_gb} GB
{!p.enabled && DISABLED}
))}

System Configuration

Grace period and archive/preservation windows are configured per plan above. Changes to plan prices do not affect active subscriptions until renewal.

{form && (
setForm(null)}>
e.stopPropagation()}>

{form._id ? "Edit Plan" : "Add Plan"}

setForm({ ...form, name: x })} full /> setForm({ ...form, price: Number(x) })} /> setForm({ ...form, storage_gb: Number(x) })} /> setForm({ ...form, product_limit: x })} /> setForm({ ...form, user_limit: x })} /> setForm({ ...form, grace_days: Number(x) })} /> setForm({ ...form, archive_years: Number(x) })} />