import { useEffect, useState } from 'react' import { Lock, Music, Loader2 } from 'lucide-react' import { LIMITS } from '@music-together/shared' import { ResponsiveDialog, ResponsiveDialogBody, ResponsiveDialogContent, ResponsiveDialogHeader, ResponsiveDialogTitle, } from '@/components/ui/responsive-dialog' import { Input } from '@/components/ui/input' import { Button } from '@/components/ui/button' import { Switch } from '@/components/ui/switch' import { Label } from '@/components/ui/label' interface CreateRoomDialogProps { open: boolean onOpenChange: (open: boolean) => void onCreateRoom: (nickname: string, roomName?: string, password?: string) => void defaultNickname: string isLoading: boolean } export function CreateRoomDialog({ open, onOpenChange, onCreateRoom, defaultNickname, isLoading, }: CreateRoomDialogProps) { const [nickname, setNickname] = useState(defaultNickname) const [roomName, setRoomName] = useState('') const [passwordEnabled, setPasswordEnabled] = useState(false) const [password, setPassword] = useState('') useEffect(() => { if (!open) return const frame = requestAnimationFrame(() => setNickname(defaultNickname)) return () => cancelAnimationFrame(frame) }, [open, defaultNickname]) const canSubmit = nickname.trim() && !(passwordEnabled && !password.trim()) const handleSubmit = (e: React.FormEvent) => { e.preventDefault() if (!canSubmit) return onCreateRoom( nickname.trim(), roomName.trim() || undefined, passwordEnabled && password.trim() ? password.trim() : undefined, ) } return ( 创建房间
setNickname(e.target.value)} maxLength={LIMITS.NICKNAME_MAX_LENGTH} autoFocus />
setRoomName(e.target.value)} maxLength={LIMITS.ROOM_NAME_MAX_LENGTH} />
{passwordEnabled && ( setPassword(e.target.value)} maxLength={LIMITS.ROOM_PASSWORD_MAX_LENGTH} autoFocus /> )}
) }