"use client"; import { useQuery } from "@tanstack/react-query"; import { Badge } from "@workspace/ui/components/badge"; import { Sheet, SheetContent, SheetHeader, SheetTitle, SheetTrigger, } from "@workspace/ui/components/sheet"; import { ProTable } from "@workspace/ui/composed/pro-table/pro-table"; import { getUserSubscribeById } from "@workspace/ui/services/admin/user"; import { formatBytes } from "@workspace/ui/utils/formatting"; import { Users } from "lucide-react"; import { useState } from "react"; import { useTranslation } from "react-i18next"; import { IpLink } from "@/components/ip-link"; import { UserDetail } from "@/sections/user/user-detail"; import { formatDate } from "@/utils/common"; function UserSubscribeInfo({ subscribeId, open, type, expiredText, unlimitedText, }: { subscribeId: number; open: boolean; type: | "account" | "subscribeName" | "subscribeId" | "trafficUsage" | "expireTime"; expiredText: string; unlimitedText: string; }) { const { data } = useQuery({ enabled: subscribeId !== 0 && open, queryKey: ["getUserSubscribeById", subscribeId], queryFn: async () => { const { data } = await getUserSubscribeById({ id: subscribeId }); return data.data; }, }); if (!data) return --; switch (type) { case "account": if (!data.user_id) return --; return ; case "subscribeName": if (!data.subscribe?.name) return --; return {data.subscribe.name}; case "subscribeId": if (!data.id) return --; return {data.id}; case "trafficUsage": { const usedTraffic = data.upload + data.download; const totalTraffic = data.traffic || 0; return (
{formatBytes(usedTraffic)} /{" "} {totalTraffic > 0 ? formatBytes(totalTraffic) : unlimitedText}
); } case "expireTime": { if (!data.expire_time) return --; const isExpired = data.expire_time < Date.now() / 1000; return (
{formatDate(data.expire_time)} {isExpired && ( {expiredText} )}
); } default: return --; } } export default function OnlineUsersCell({ status, }: { status?: API.ServerStatus; }) { const { t } = useTranslation("servers"); const [open, setOpen] = useState(false); return ( {t("onlineUsers", "Online Users")}
> columns={[ { accessorKey: "ip", header: t("ipAddresses", "IP Addresses"), cell: ({ row }) => { const ips = row.original.ip; return (
{ips.map((item) => (
{item.protocol}
))}
); }, }, { accessorKey: "user", header: t("user", "User"), cell: ({ row }) => ( ), }, { accessorKey: "subscription", header: t("subscription", "Subscription"), cell: ({ row }) => ( ), }, { accessorKey: "subscribeId", header: t("subscribeId", "Subscribe ID"), cell: ({ row }) => ( ), }, { accessorKey: "traffic", header: t("traffic", "Traffic"), cell: ({ row }) => ( ), }, { accessorKey: "expireTime", header: t("expireTime", "Expire Time"), cell: ({ row }) => ( ), }, ]} header={{ hidden: true }} request={async () => ({ list: status?.online || [], total: status?.online?.length || 0, })} />
); }