"use client"; import { useState } from "react"; import { Dialog, DialogContent, DialogHeader, DialogTitle, } from "@/components/ui/dialog"; import { Tabs, TabsContent, TabsList, TabsTrigger } from "@/components/ui/tabs"; import { Input } from "@/components/ui/input"; import { Button } from "@/components/ui/button"; import { ScrollArea } from "@/components/ui/scroll-area"; import { useCompanyUsers, useCreateRoom } from "@/hooks/useMessenger"; import { useMessengerContext } from "@/contexts/MessengerContext"; import { UserAvatar } from "./UserAvatar"; import { Check } from "lucide-react"; import { cn } from "@/lib/utils"; import type { UserStatus } from "@/hooks/useMessengerSocket"; interface NewRoomModalProps { open: boolean; onOpenChange: (open: boolean) => void; userStatuses: Map; } export function NewRoomModal({ open, onOpenChange, userStatuses }: NewRoomModalProps) { const [tab, setTab] = useState<"dm" | "group" | "channel">("dm"); const [search, setSearch] = useState(""); const [selectedIds, setSelectedIds] = useState([]); const [roomName, setRoomName] = useState(""); const [channelDesc, setChannelDesc] = useState(""); const { data: users = [] } = useCompanyUsers(); const createRoom = useCreateRoom(); const { selectRoom } = useMessengerContext(); const filtered = users.filter( (u) => u.userName.toLowerCase().includes(search.toLowerCase()) || (u.deptName && u.deptName.toLowerCase().includes(search.toLowerCase())) ); const toggleUser = (userId: string) => { if (tab === "dm") { setSelectedIds([userId]); } else { setSelectedIds((prev) => prev.includes(userId) ? prev.filter((id) => id !== userId) : [...prev, userId] ); } }; const handleCreate = async () => { try { const room = await createRoom.mutateAsync({ type: tab, name: tab === "channel" ? roomName : tab === "group" ? roomName : undefined, description: tab === "channel" ? channelDesc : undefined, participantIds: selectedIds, }); selectRoom(room.id); onOpenChange(false); reset(); } catch { // handled by query } }; const reset = () => { setSearch(""); setSelectedIds([]); setRoomName(""); setChannelDesc(""); }; const canCreate = selectedIds.length > 0 && (tab === "dm" || tab === "group" || (tab === "channel" && roomName.trim())); return ( 새 대화 { setTab(v as typeof tab); reset(); }}> DM 그룹 채널 {(tab === "group" || tab === "channel") && (
setRoomName(e.target.value)} /> {tab === "channel" && ( setChannelDesc(e.target.value)} /> )}
)} setSearch(e.target.value)} className="mb-2" /> {selectedIds.length > 0 && tab !== "dm" && (
{selectedIds.map((id) => { const u = users.find((x) => x.userId === id); return u ? ( toggleUser(id)} className="inline-flex items-center gap-1 rounded-full bg-primary/10 text-primary text-xs px-2 py-0.5 cursor-pointer hover:bg-primary/20" > {u.userName} × ) : null; })}
)} {filtered.map((u) => { const selected = selectedIds.includes(u.userId); return ( ); })}
); }