"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,
})}
/>
);
}