'use client' import { useState } from 'react' import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query' import { Button } from '@/components/ui/button' import { Header } from '@/components/layout/header' import { UserDialog } from '@/components/users/user-dialog' import { Spinner } from '@/components/ui/spinner' import { User, UserFormData } from '@/types' import { Plus, Pencil, Trash2 } from 'lucide-react' export default function UsersPage() { const queryClient = useQueryClient() const [isDialogOpen, setIsDialogOpen] = useState(false) const [editingUser, setEditingUser] = useState(null) const [deleteConfirmId, setDeleteConfirmId] = useState(null) // Fetch users const { data: users, isLoading, error } = useQuery({ queryKey: ['users'], queryFn: async () => { const res = await fetch('/api/users') if (!res.ok) throw new Error('Failed to fetch users') return res.json() }, }) // Create user mutation const createMutation = useMutation({ mutationFn: async (data: UserFormData) => { const res = await fetch('/api/users', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(data), }) if (!res.ok) { const error = await res.json() throw new Error(error.error || 'Failed to create user') } return res.json() }, onSuccess: () => { queryClient.invalidateQueries({ queryKey: ['users'] }) }, }) // Update user mutation const updateMutation = useMutation({ mutationFn: async ({ id, data }: { id: string; data: UserFormData }) => { const res = await fetch('/api/users', { method: 'PUT', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ id, ...data }), }) if (!res.ok) { const error = await res.json() throw new Error(error.error || 'Failed to update user') } return res.json() }, onSuccess: () => { queryClient.invalidateQueries({ queryKey: ['users'] }) }, }) // Delete user mutation const deleteMutation = useMutation({ mutationFn: async (id: string) => { const res = await fetch(`/api/users?id=${id}`, { method: 'DELETE', }) if (!res.ok) { const error = await res.json() throw new Error(error.error || 'Failed to delete user') } return res.json() }, onSuccess: () => { queryClient.invalidateQueries({ queryKey: ['users'] }) setDeleteConfirmId(null) }, }) const handleOpenCreate = () => { setEditingUser(null) setIsDialogOpen(true) } const handleOpenEdit = (user: User) => { setEditingUser(user) setIsDialogOpen(true) } const handleDelete = (id: string) => { if (deleteConfirmId === id) { deleteMutation.mutate(id) } else { setDeleteConfirmId(id) // Reset after 3 seconds setTimeout(() => setDeleteConfirmId(null), 3000) } } const handleSubmit = async (data: UserFormData) => { if (editingUser) { await updateMutation.mutateAsync({ id: editingUser.id, data }) } else { await createMutation.mutateAsync(data) } } 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 (

用户管理

共 {users?.length || 0} 个用户

{users?.map((user) => ( ))} {users?.length === 0 && ( )}
用户 邮箱 创建时间 操作
{user.email[0]?.toUpperCase() || 'U'}
{user.name || '未设置'}
{user.email}
{formatDate(user.createdAt)}
暂无用户数据
) }