import { Link } from "@tanstack/react-router"; import { Badge } from "@workspace/ui/components/badge"; import { Button } from "@workspace/ui/components/button"; import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuTrigger, } from "@workspace/ui/components/dropdown-menu"; import { ConfirmButton } from "@workspace/ui/composed/confirm-button"; import { ProTable, type ProTableActions, } from "@workspace/ui/composed/pro-table/pro-table"; import { createUserSubscribe, deleteUserSubscribe, getUserSubscribe, resetUserSubscribeToken, stopUserSubscribe, updateUserSubscribe, } from "@workspace/ui/services/admin/user"; import { useRef, useState } from "react"; import { useTranslation } from "react-i18next"; import { toast } from "sonner"; import { Display } from "@/components/display"; import { useGlobalStore } from "@/stores/global"; import { formatDate } from "@/utils/common"; import { SubscriptionDetail } from "./subscription-detail"; import { SubscriptionForm } from "./subscription-form"; export default function UserSubscription({ userId }: { userId: number }) { const { t } = useTranslation("user"); const [loading, setLoading] = useState(false); const ref = useRef(null); const { getUserSubscribe: getUserSubscribeUrls } = useGlobalStore(); return ( > action={ref} actions={{ render: (row) => [ { setLoading(true); await updateUserSubscribe({ user_id: Number(userId), user_subscribe_id: row.id, ...values, }); toast.success(t("updateSuccess", "Updated successfully")); ref.current?.refresh(); setLoading(false); return true; }} title={t("editSubscription", "Edit Subscription")} trigger={t("edit", "Edit")} />, , { 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={ } />, { await stopUserSubscribe({ user_subscribe_id: row.id }); toast.success( t("stopSubscribeSuccess", "Subscription stopped successfully") ); ref.current?.refresh(); }} title={t("confirmStopSubscribe", "Confirm Stop Subscription")} trigger={ } />, { await deleteUserSubscribe({ user_subscribe_id: row.id }); toast.success(t("deleteSuccess", "Deleted successfully")); ref.current?.refresh(); }} title={t("confirmDelete", "Confirm Delete")} trigger={ } />, , ], }} columns={[ { accessorKey: "id", header: "ID", }, { accessorKey: "name", 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 ( {statusInfo.label} ); }, }, { accessorKey: "upload", header: t("upload", "Upload"), cell: ({ row }) => ( ), }, { accessorKey: "download", header: t("download", "Download"), cell: ({ row }) => ( ), }, { accessorKey: "traffic", header: t("totalTraffic", "Total Traffic"), cell: ({ row }) => ( ), }, { accessorKey: "speed_limit", header: t("speedLimit", "Speed Limit"), cell: ({ row }) => { const speed = row.original?.subscribe?.speed_limit; return ; }, }, { accessorKey: "device_limit", header: t("deviceLimit", "Device Limit"), cell: ({ row }) => { const limit = row.original?.subscribe?.device_limit; return ; }, }, { accessorKey: "reset_time", header: t("resetTime", "Reset Time"), cell: ({ row }) => ( ), }, { accessorKey: "expire_time", header: t("expireTime", "Expire Time"), cell: ({ row }) => row.getValue("expire_time") ? formatDate(row.getValue("expire_time")) : t("permanent", "Permanent"), }, { accessorKey: "created_at", header: t("createdAt", "Created At"), cell: ({ row }) => formatDate(row.getValue("created_at")), }, ]} header={{ title: t("subscriptionList", "Subscription List"), toolbar: ( { setLoading(true); await createUserSubscribe({ user_id: Number(userId), ...values, }); toast.success(t("createSuccess", "Created successfully")); ref.current?.refresh(); setLoading(false); return true; }} title={t("createSubscription", "Create Subscription")} trigger={t("add", "Add")} /> ), }} request={async (pagination) => { const { data } = await getUserSubscribe({ user_id: userId, ...pagination, }); return { list: data.data?.list || [], total: data.data?.total || 0, }; }} /> ); } function RowMoreActions({ userId, subId }: { userId: number; subId: number }) { const triggerRef = useRef(null); const { t } = useTranslation("user"); return (
{t("subscriptionLogs", "Subscription Logs")} {t("resetLogs", "Reset Logs")} {t("trafficStats", "Traffic Stats")} {t("trafficDetails", "Traffic Details")} { e.preventDefault(); triggerRef.current?.click(); }} > {t("onlineDevices", "Online Devices")} } userId={userId} />
); }