import { Modal, ModalContent, ModalHeader, ModalBody, Button, useDisclosure, Spinner, Table, TableBody, TableCell, TableColumn, TableHeader, TableRow, Chip, } from '@nextui-org/react'; import { QRCodeSVG } from 'qrcode.react'; import { toast } from 'sonner'; import { PlusIcon } from '@web/components/PlusIcon'; import dayjs from 'dayjs'; import { StatusDropdown } from '@web/components/StatusDropdown'; import { trpc } from '@web/utils/trpc'; import { statusMap } from '@web/constants'; const AccountPage = () => { const { isOpen, onOpen, onClose, onOpenChange } = useDisclosure(); const { refetch, data, isFetching } = trpc.account.list.useQuery({}); const { mutateAsync: updateAccount } = trpc.account.edit.useMutation({}); const { mutateAsync: deleteAccount } = trpc.account.delete.useMutation({}); const { mutateAsync: addAccount } = trpc.account.add.useMutation({}); const { mutateAsync, data: loginData } = trpc.platform.createLoginUrl.useMutation(); trpc.platform.getLoginResult.useQuery( { id: loginData?.uuid ?? '', }, { refetchInterval: (data) => { if (data?.message === 'waiting') { return 2000; } return false; }, refetchIntervalInBackground: true, enabled: !!loginData?.uuid, async onSuccess(data) { if (data.message === 'success') { const name = data.username!; if (data.vid && data.token) { await addAccount({ id: `${data.vid}`, name, token: data.token }); onClose(); toast.success('添加成功', { description: `用户名:${name}(${data.vid})`, }); refetch(); } } }, }, ); return (
共{data?.items.length || 0}个账号
ID 用户名 状态 更新时间 操作 暂无数据} isLoading={isFetching} loadingContent={} > {data?.items.map((item) => { const isBlocked = data?.blocks.includes(item.id); return ( {item.id} {item.name} {isBlocked ? ( 今日小黑屋 ) : ( {statusMap[item.status].label} )} {dayjs(item.updatedAt).format('YYYY-MM-DD')} { updateAccount({ id: item.id, data: { status: value }, }).then(() => { toast.success('更新成功!'); refetch(); }); }} > ); }) || []}
{() => ( <> 添加读书账号
{loginData ? (
微信扫码登录
) : (
loading...
)}
)}
); }; export default AccountPage;