import { useQuery } from "@tanstack/react-query"; import { Avatar, AvatarFallback, AvatarImage, } from "@workspace/ui/components/avatar"; import { Badge } from "@workspace/ui/components/badge"; import { Sheet, SheetContent, SheetHeader, SheetTitle, } from "@workspace/ui/components/sheet"; import { Skeleton } from "@workspace/ui/components/skeleton"; import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow, } from "@workspace/ui/components/table"; import { getAdminUserInviteList, getAdminUserInviteStats, } from "@workspace/ui/services/admin/user"; import { useState } from "react"; import { useTranslation } from "react-i18next"; import { Display } from "@/components/display"; import { formatDate } from "@/utils/common"; interface UserInviteStatsSheetProps { userId: number; open: boolean; onOpenChange: (open: boolean) => void; } export function UserInviteStatsSheet({ userId, open, onOpenChange, }: UserInviteStatsSheetProps) { const { t } = useTranslation("user"); const [page, setPage] = useState(1); const pageSize = 200; const { data: stats, isLoading: statsLoading } = useQuery({ queryKey: ["adminUserInviteStats", userId], queryFn: async () => { const { data } = await getAdminUserInviteStats({ user_id: userId }); return data.data; }, enabled: open && !!userId, }); const { data: listResult, isLoading: listLoading } = useQuery({ queryKey: ["adminUserInviteList", userId, page], queryFn: async () => { const { data } = await getAdminUserInviteList({ user_id: userId, page, size: pageSize, }); return data.data; }, enabled: open && !!userId, }); const inviteList = listResult?.list ?? []; const total = listResult?.total ?? 0; const totalPages = Math.ceil(total / pageSize); return ( {t("inviteStats", "Invite Statistics")} {/* 概览卡片 */}
{stats?.invite_count ?? 0} {stats?.referral_percentage ? `${stats.referral_percentage}%` : t("globalDefault", "Global Default")} {stats?.only_first_purchase && ( ({t("firstPurchaseOnly", "First purchase only")}) )}
{/* 邀请用户列表 */}

{t("invitedUsers", "Invited Users")} ({total})

{listLoading ? (
{Array.from({ length: 5 }).map((_, i) => ( ))}
) : inviteList.length === 0 ? (

{t("noInvitedUsers", "No invited users yet")}

) : ( <> {t("user", "User")} {t("status", "Status")} {t("registeredAt", "Registered At")} {inviteList.map((user) => (
{user.identifier?.charAt(0)?.toUpperCase() ?? "U"} {user.identifier || `#${user.id}`}
{user.enable ? t("enabled", "Enabled") : t("disabled", "Disabled")} {formatDate(user.created_at)}
))}
{/* 分页 */} {totalPages > 1 && (
{page} / {totalPages}
)} )}
); } function StatCard({ label, loading, children, }: { label: string; loading: boolean; children: React.ReactNode; }) { return (

{label}

{loading ? ( ) : (
{children}
)}
); }