'use client' import { useState } from 'react' import { useQuery } from '@tanstack/react-query' import { Button } from '@/components/ui/button' import { Input } from '@/components/ui/input' import { Header } from '@/components/layout/header' import { WxUserDetailDialog } from '@/components/wx-users/wx-user-detail-dialog' import { Spinner } from '@/components/ui/spinner' import { WxUser, WxUserWithProgress } from '@/types' import { apiFetch } from '@/lib/api' import { Search } from 'lucide-react' interface UsersResponse { users: WxUser[] meta: { total: number; page: number; limit: number; totalPages: number } } export default function WxUsersPage() { const [search, setSearch] = useState('') const [selectedUser, setSelectedUser] = useState(null) const [isDialogOpen, setIsDialogOpen] = useState(false) const { data, isLoading, error } = useQuery({ queryKey: ['wx-users', search], queryFn: async () => { const res = await apiFetch(`/api/wx-users?search=${encodeURIComponent(search)}`) if (!res.ok) throw new Error('Failed to fetch wx users') return res.json() }, }) const { data: userDetails } = useQuery({ queryKey: ['wx-users', selectedUser?.id], queryFn: async () => { const res = await apiFetch(`/api/wx-users/${selectedUser?.id}`) if (!res.ok) throw new Error('Failed to fetch wx user details') return res.json() }, enabled: !!selectedUser && isDialogOpen, }) const handleUserClick = (user: WxUser) => { setSelectedUser(user) setIsDialogOpen(true) } const handleDialogOpenChange = (open: boolean) => { setIsDialogOpen(open) if (!open) { setSelectedUser(null) } } const formatDate = (date: Date | string) => { return new Date(date).toLocaleDateString('zh-CN', { year: 'numeric', month: '2-digit', day: '2-digit', hour: '2-digit', minute: '2-digit', }) } if (isLoading) { return (
) } if (error) { return (

加载失败

) } return (

小程序账户

共 {data?.meta?.total || 0} 个账户

setSearch(e.target.value)} className="pl-10" />
{data?.users?.map((user) => ( handleUserClick(user)} > ))} {data?.users?.length === 0 && ( )}
用户 OpenID 积分 注册时间
{user.avatarUrl ? ( {user.nickname ) : (
{user.nickname?.[0]?.toUpperCase() || 'U'}
)} {user.nickname || '匿名用户'}
{user.openid} {user.points} {formatDate(user.createdAt)}
暂无账户数据
) }