Files
J-Board-Lite/src/app/(admin)/admin/plans/plan-actions.tsx
2026-04-30 21:48:59 +10:00

65 lines
1.7 KiB
TypeScript

"use client";
import { useRouter } from "next/navigation";
import { Button } from "@/components/ui/button";
import { ConfirmActionButton } from "@/components/shared/confirm-action-button";
import { deletePlanPermanently, togglePlan } from "@/actions/admin/plans";
import { toast } from "sonner";
import { getErrorMessage } from "@/lib/errors";
import {
PlanForm,
type PlanFormValue,
type StreamingServiceOption,
} from "./plan-form";
export function PlanActions({
plan,
isActive,
services,
}: {
plan: PlanFormValue;
isActive: boolean;
services: StreamingServiceOption[];
}) {
const router = useRouter();
return (
<div className="flex flex-wrap items-center gap-2">
<PlanForm
plan={plan}
services={services}
triggerLabel="编辑"
triggerVariant="outline"
/>
<Button
variant="outline"
size="sm"
onClick={async () => {
try {
await togglePlan(plan.id, !isActive);
toast.success(isActive ? "套餐已下架" : "套餐已上架");
router.refresh();
} catch (error) {
toast.error(getErrorMessage(error, "切换套餐上下架状态失败"));
}
}}
>
{isActive ? "下架" : "上架"}
</Button>
<ConfirmActionButton
variant="destructive"
size="sm"
title="彻底删除套餐?"
description="会清理关联订阅和订单,无法恢复。"
confirmLabel="删除套餐"
successMessage="套餐已删除"
errorMessage="删除失败"
onConfirm={() => deletePlanPermanently(plan.id)}
onSuccess={() => router.refresh()}
>
</ConfirmActionButton>
</div>
);
}