"use client"; import { useState, useRef, useCallback } from "react"; import { motion, AnimatePresence } from "framer-motion"; import { X, Lock, Unlock, UserX, Flag, Crown, Loader2, } from "lucide-react"; import { UserProfile } from "@/types"; import { getAvatar, getAvatarBg } from "@/lib/avatars"; interface RoomManageModalProps { open: boolean; onClose: () => void; roomId: string; userId: string; users: string[]; locked: boolean; swipeCounts: Record; totalCards: number; userProfiles: Record; onToast: (msg: string) => void; } export default function RoomManageModal({ open, onClose, roomId, userId, users, locked, swipeCounts, totalCards, userProfiles, onToast, }: RoomManageModalProps) { const backdropRef = useRef(null); const [loading, setLoading] = useState(null); const [confirmKick, setConfirmKick] = useState(null); const [confirmEnd, setConfirmEnd] = useState(false); const handleBackdropClick = (e: React.MouseEvent) => { if (e.target === backdropRef.current) onClose(); }; const manage = useCallback( async (action: string, targetUserId?: string) => { setLoading(action + (targetUserId ?? "")); try { const res = await fetch(`/api/room/${roomId}/manage`, { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ userId, action, targetUserId }), }); if (!res.ok) { const data = await res.json().catch(() => ({})); onToast(data.error ?? "操作失败"); return; } switch (action) { case "lock": onToast("房间已锁定,其他人无法加入"); break; case "unlock": onToast("房间已解锁"); break; case "kick": onToast("已将该用户移出房间"); setConfirmKick(null); break; case "end_voting": onToast("已结束投票,正在结算结果"); setConfirmEnd(false); onClose(); break; } } catch { onToast("操作失败,请重试"); } finally { setLoading(null); } }, [roomId, userId, onToast, onClose], ); const otherUsers = users.filter((u) => u !== userId); return ( {open && (

房间管理

房间号 {roomId}

{/* Lock/Unlock */}
{/* User list with kick */}

房间成员({users.length})

{users.map((uid) => { const profile = userProfiles[uid]; const emoji = profile?.avatar ?? getAvatar(uid).emoji; const bg = profile ? getAvatarBg(profile.avatar) : getAvatar(uid).bg; const displayName = profile?.username ?? uid.slice(0, 8); const isCreator = uid === userId; const swiped = swipeCounts[uid] ?? 0; const finished = swiped >= totalCards; return (
{emoji}
{isCreator && ( 房主 )} {displayName}
{swiped}/{totalCards} {finished ? " 已完成" : " 进行中"}
{!isCreator && ( <> {confirmKick === uid ? (
) : ( )} )}
); })}
{/* End voting */}
{confirmEnd ? (

确定要结束投票吗?将根据当前已有的投票结果直接结算。

) : ( )}
)}
); }