Files
J-Board-Lite/src/app/(admin)/admin/subscriptions/subscription-actions.tsx
2026-04-29 05:16:29 +10:00

89 lines
2.4 KiB
TypeScript

"use client";
import { Button } from "@/components/ui/button";
import { ConfirmActionButton } from "@/components/shared/confirm-action-button";
import { getErrorMessage } from "@/lib/errors";
import {
activateSubscription,
deleteSubscriptionPermanently,
suspendSubscription,
} from "@/actions/admin/subscriptions";
import { toast } from "sonner";
import {
StreamingSlotDialog,
type StreamingServiceOption,
} from "./streaming-slot-dialog";
export function AdminSubscriptionActions({
subscriptionId,
status,
type,
streamingServices,
}: {
subscriptionId: string;
status: "ACTIVE" | "EXPIRED" | "CANCELLED" | "SUSPENDED";
type: "PROXY" | "STREAMING";
streamingServices: StreamingServiceOption[];
}) {
return (
<div className="flex flex-wrap gap-2">
{type === "STREAMING" && streamingServices.length > 0 && (
<StreamingSlotDialog
subscriptionId={subscriptionId}
services={streamingServices}
/>
)}
{status === "ACTIVE" && (
<Button
size="sm"
variant="outline"
onClick={() => {
void (async () => {
try {
await suspendSubscription(subscriptionId);
toast.success("订阅已暂停");
} catch (error) {
toast.error(getErrorMessage(error, "暂停失败"));
}
})();
}}
>
</Button>
)}
{status === "SUSPENDED" && (
<Button
size="sm"
onClick={() => {
void (async () => {
try {
await activateSubscription(subscriptionId);
toast.success("订阅已恢复");
} catch (error) {
toast.error(getErrorMessage(error, "恢复失败"));
}
})();
}}
>
</Button>
)}
<ConfirmActionButton
size="sm"
variant="destructive"
title="彻底删除这个订阅?"
description="会同步删除远端客户端,并清理本地记录与相关订单。此操作无法恢复。"
confirmLabel="删除订阅"
successMessage="订阅已删除"
errorMessage="删除失败"
onConfirm={() => deleteSubscriptionPermanently(subscriptionId)}
>
</ConfirmActionButton>
</div>
);
}