'use client' import { useState, useEffect } from 'react' import Image from 'next/image' import { WxUserWithProgress } from '@/types' import { Dialog, DialogContent, DialogHeader, DialogTitle, DialogDescription, } from '@/components/ui/dialog' import { Button } from '@/components/ui/button' interface WxUserDetailDialogProps { open: boolean onOpenChange: (open: boolean) => void user: WxUserWithProgress | null | undefined onDeleted?: () => void } export function WxUserDetailDialog({ open, onOpenChange, user, onDeleted, }: WxUserDetailDialogProps) { const [selectedIds, setSelectedIds] = useState>(new Set()) const [isDeleting, setIsDeleting] = useState(false) useEffect(() => { if (!open) { setSelectedIds(new Set()) } }, [open]) if (!user) return null const handleSelectAll = (checked: boolean) => { if (checked) { setSelectedIds(new Set(user.levelProgress.map((p) => p.id))) } else { setSelectedIds(new Set()) } } const handleSelectOne = (id: string, checked: boolean) => { const newSelected = new Set(selectedIds) if (checked) { newSelected.add(id) } else { newSelected.delete(id) } setSelectedIds(newSelected) } const handleBatchDelete = async () => { if (selectedIds.size === 0) return setIsDeleting(true) try { const res = await fetch('/api/wx-users/level-progress', { method: 'DELETE', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ ids: Array.from(selectedIds) }), }) if (res.ok) { setSelectedIds(new Set()) onDeleted?.() } } finally { setIsDeleting(false) } } const allSelected = user.levelProgress.length > 0 && selectedIds.size === user.levelProgress.length return ( 用户详情 完整信息及关卡进度
{user.avatarUrl ? ( {user.nickname ) : (
{user.nickname?.[0]?.toUpperCase() || 'U'}
)}

{user.nickname || '匿名用户'}

注册时间:{new Date(user.createdAt).toLocaleDateString('zh-CN')}

积分

{user.points}

已通关关卡

{user.levelProgress.length}

OpenID

{user.openid}
{user.levelProgress.length > 0 && (

关卡进度

{selectedIds.size > 0 && ( )}
{user.levelProgress.map((progress) => ( ))}
handleSelectAll(e.target.checked)} className="rounded border-gray-300" /> 关卡ID 关卡答案 通关时间
handleSelectOne(progress.id, e.target.checked)} className="rounded border-gray-300" /> {progress.levelId} {progress.level?.answer || '-'} {new Date(progress.completedAt).toLocaleDateString('zh-CN')}
)}
) }