feat: Added reset and pause subscription functionality, and updated the status display.

This commit is contained in:
web@ppanel 2025-12-29 05:51:24 +00:00
parent b27b9287be
commit bc451eea16
3 changed files with 120 additions and 0 deletions

View File

@ -71,6 +71,21 @@
"remove": "Remove",
"resetLogs": "Reset Logs",
"resetTime": "Reset Time",
"resetToken": "Reset Subscription Address",
"resetTokenDescription": "This will reset the subscription address and regenerate a new token.",
"resetTokenSuccess": "Subscription address reset successfully",
"confirmResetToken": "Confirm Reset Subscription Address",
"stopSubscribe": "Stop Subscription",
"stopSubscribeDescription": "This will stop the subscription temporarily. User will not be able to use it.",
"stopSubscribeSuccess": "Subscription stopped successfully",
"confirmStopSubscribe": "Confirm Stop Subscription",
"status": "Status",
"statusPending": "Pending",
"statusActive": "Active",
"statusFinished": "Finished",
"statusExpired": "Expired",
"statusDeducted": "Deducted",
"statusStopped": "Stopped",
"save": "Save",
"speedLimit": "Speed Limit",
"startTime": "startTime",

View File

@ -71,6 +71,21 @@
"remove": "移除",
"resetLogs": "重置日志",
"resetTime": "重置时间",
"resetToken": "重置订阅地址",
"resetTokenDescription": "这将重置订阅地址并重新生成新的令牌。",
"resetTokenSuccess": "订阅地址重置成功",
"confirmResetToken": "确认重置订阅地址",
"stopSubscribe": "暂停订阅",
"stopSubscribeDescription": "这将暂时停止订阅。用户将无法使用。",
"stopSubscribeSuccess": "订阅已暂停",
"confirmStopSubscribe": "确认暂停订阅",
"status": "状态",
"statusPending": "待处理",
"statusActive": "活跃",
"statusFinished": "已完成",
"statusExpired": "已过期",
"statusDeducted": "已扣除",
"statusStopped": "已停止",
"save": "保存",
"speedLimit": "速度限制",
"startTime": "开始时间",

View File

@ -1,4 +1,5 @@
import { Link } from "@tanstack/react-router";
import { Badge } from "@workspace/ui/components/badge";
import { Button } from "@workspace/ui/components/button";
import {
DropdownMenu,
@ -15,6 +16,8 @@ import {
createUserSubscribe,
deleteUserSubscribe,
getUserSubscribe,
resetUserSubscribeToken,
stopUserSubscribe,
updateUserSubscribe,
} from "@workspace/ui/services/admin/user";
import { useRef, useState } from "react";
@ -68,6 +71,53 @@ export default function UserSubscription({ userId }: { userId: number }) {
>
{t("copySubscription", "Copy Subscription")}
</Button>,
<ConfirmButton
cancelText={t("cancel", "Cancel")}
confirmText={t("confirm", "Confirm")}
description={t(
"resetTokenDescription",
"This will reset the subscription address and regenerate a new token."
)}
key="resetToken"
onConfirm={async () => {
await resetUserSubscribeToken({ user_subscribe_id: row.id });
toast.success(
t(
"resetTokenSuccess",
"Subscription address reset successfully"
)
);
ref.current?.refresh();
}}
title={t("confirmResetToken", "Confirm Reset Subscription Address")}
trigger={
<Button variant="outline">
{t("resetToken", "Reset Subscription Address")}
</Button>
}
/>,
<ConfirmButton
cancelText={t("cancel", "Cancel")}
confirmText={t("confirm", "Confirm")}
description={t(
"stopSubscribeDescription",
"This will stop the subscription temporarily. User will not be able to use it."
)}
key="stop"
onConfirm={async () => {
await stopUserSubscribe({ user_subscribe_id: row.id });
toast.success(
t("stopSubscribeSuccess", "Subscription stopped successfully")
);
ref.current?.refresh();
}}
title={t("confirmStopSubscribe", "Confirm Stop Subscription")}
trigger={
<Button variant="secondary">
{t("stopSubscribe", "Stop Subscription")}
</Button>
}
/>,
<ConfirmButton
cancelText={t("cancel", "Cancel")}
confirmText={t("confirm", "Confirm")}
@ -99,6 +149,46 @@ export default function UserSubscription({ userId }: { userId: number }) {
header: t("subscriptionName", "Subscription Name"),
cell: ({ row }) => row.original.subscribe.name,
},
{
accessorKey: "status",
header: t("status", "Status"),
cell: ({ row }) => {
const status = row.getValue("status") as number;
const statusMap: Record<
number,
{
label: string;
variant: "default" | "secondary" | "destructive" | "outline";
}
> = {
0: { label: t("statusPending", "Pending"), variant: "outline" },
1: { label: t("statusActive", "Active"), variant: "default" },
2: {
label: t("statusFinished", "Finished"),
variant: "secondary",
},
3: {
label: t("statusExpired", "Expired"),
variant: "destructive",
},
4: {
label: t("statusDeducted", "Deducted"),
variant: "secondary",
},
5: {
label: t("statusStopped", "Stopped"),
variant: "destructive",
},
};
const statusInfo = statusMap[status] || {
label: "Unknown",
variant: "outline",
};
return (
<Badge variant={statusInfo.variant}>{statusInfo.label}</Badge>
);
},
},
{
accessorKey: "upload",
header: t("upload", "Upload"),