import { useQuery } from "@tanstack/react-query"; import { Link, useSearch } 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 { ScrollArea } from "@workspace/ui/components/scroll-area"; import { Sheet, SheetContent, SheetHeader, SheetTitle, SheetTrigger, } from "@workspace/ui/components/sheet"; import { Switch } from "@workspace/ui/components/switch"; import { Tabs, TabsContent, TabsList, TabsTrigger, } from "@workspace/ui/components/tabs"; import { ConfirmButton } from "@workspace/ui/composed/confirm-button"; import { ProTable, type ProTableActions, } from "@workspace/ui/composed/pro-table/pro-table"; import { createUser, deleteUser, getUserDetail, getUserList, updateUserBasicInfo, } 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 { useSubscribe } from "@/stores/subscribe"; import { formatDate } from "@/utils/common"; import { UserDetail } from "./user-detail"; import UserForm from "./user-form"; import { AuthMethodsForm } from "./user-profile/auth-methods-form"; import { BasicInfoForm } from "./user-profile/basic-info-form"; import { NotifySettingsForm } from "./user-profile/notify-settings-form"; import UserSubscription from "./user-subscription"; export default function User() { const { t } = useTranslation("user"); const [loading, setLoading] = useState(false); const ref = useRef(null); const sp = useSearch({ strict: false }) as Record; const { subscribes } = useSubscribe(); const initialFilters = { search: sp.search || undefined, user_id: sp.user_id || undefined, subscribe_id: sp.subscribe_id || undefined, user_subscribe_id: sp.user_subscribe_id || undefined, }; return ( action={ref} actions={{ render: (row) => [ , , { await deleteUser({ id: row.id }); toast.success(t("deleteSuccess", "Deleted successfully")); ref.current?.refresh(); }} title={t("confirmDelete", "Confirm Delete")} trigger={ } />, {t("orderList", "Order List")} {t("loginLogs", "Login Logs")} {t("balanceLogs", "Balance Logs")} {t("commissionLogs", "Commission Logs")} {t("giftLogs", "Gift Logs")} , ], }} columns={[ { accessorKey: "enable", header: t("enable", "Enable"), cell: ({ row }) => ( { const { auth_methods: _auth_methods, user_devices: _user_devices, enable_balance_notify: _enable_balance_notify, enable_login_notify: _enable_login_notify, enable_subscribe_notify: _enable_subscribe_notify, enable_trade_notify: _enable_trade_notify, updated_at: _updated_at, created_at: _created_at, id, ...rest } = row.original; await updateUserBasicInfo({ user_id: id, ...rest, enable: checked, } as unknown as API.UpdateUserBasiceInfoRequest); toast.success(t("updateSuccess", "Updated successfully")); ref.current?.refresh(); }} /> ), }, { accessorKey: "id", header: "ID", }, { accessorKey: "deleted_at", header: t("isDeleted", "Deleted"), cell: ({ row }) => { const deletedAt = row.getValue("deleted_at") as number | undefined; return deletedAt ? ( {t("deleted", "Deleted")} ) : ( {t("normal", "Normal")} ); }, }, { accessorKey: "auth_methods", header: t("userName", "Username"), cell: ({ row }) => { const method = row.original.auth_methods?.[0]; return (
{method?.auth_type} {method?.auth_identifier}
); }, }, { accessorKey: "balance", header: t("balance", "Balance"), cell: ({ row }) => ( ), }, { accessorKey: "gift_amount", header: t("giftAmount", "Gift Amount"), cell: ({ row }) => ( ), }, { accessorKey: "commission", header: t("commission", "Commission"), cell: ({ row }) => ( ), }, { accessorKey: "refer_code", header: t("inviteCode", "Invite Code"), cell: ({ row }) => row.getValue("refer_code") || "--", }, { accessorKey: "referer_id", header: t("referer", "Referer"), cell: ({ row }) => , }, { accessorKey: "created_at", header: t("createdAt", "Created At"), cell: ({ row }) => formatDate(row.getValue("created_at")), }, ]} header={{ title: t("userList", "User List"), toolbar: ( key="create" loading={loading} onSubmit={async (values) => { setLoading(true); try { await createUser(values); toast.success(t("createSuccess", "Created successfully")); ref.current?.refresh(); setLoading(false); return true; } catch { setLoading(false); return false; } }} title={t("createUser", "Create User")} trigger={t("create", "Create")} /> ), }} initialFilters={initialFilters} key={initialFilters.user_id} params={[ { key: "subscribe_id", placeholder: t("subscription", "Subscription"), options: subscribes?.map((item) => ({ label: item.name!, value: String(item.id!), })), }, { key: "search", placeholder: "Search", }, { key: "user_id", placeholder: t("userId", "User ID"), }, { key: "user_subscribe_id", placeholder: t("subscriptionId", "Subscription ID"), }, ]} request={async (pagination, filter) => { const { data } = await getUserList({ ...pagination, ...filter, }); return { list: data.data?.list || [], total: data.data?.total || 0, }; }} /> ); } function ProfileSheet({ userId }: { userId: number }) { const { t } = useTranslation("user"); const [open, setOpen] = useState(false); const { data: user, refetch } = useQuery({ enabled: open, queryKey: ["user", userId], queryFn: async () => { const { data } = await getUserDetail({ id: userId }); return data.data as API.User; }, }); return ( {t("userProfile", "User Profile")} · ID: {userId} {user && ( {t("basicInfoTitle", "Basic Info")} {t("notifySettingsTitle", "Notify Settings")} {t("authMethodsTitle", "Auth Methods")} )} ); } function SubscriptionSheet({ userId }: { userId: number }) { const { t } = useTranslation("user"); const [open, setOpen] = useState(false); return ( {t("subscriptionList", "Subscription List")} · ID: {userId}
); }