import { chatAPI } from '@/lib/api'; import { useAuthStore } from '@/stores/authStore'; import { useChatStore } from '@/stores/chatStore'; import type { ChatRoom, CreateChatRoomRequest } from '@/types'; import { useMutation, useQuery } from '@tanstack/react-query'; import { LogOut, MessageCircle, Plus, Users } from 'lucide-react'; import { useState, type FC, type FormEvent } from 'react'; import { toast } from 'sonner'; import { Badge } from './ui/badge'; import { Button } from './ui/button'; import { Dialog, DialogContent, DialogHeader, DialogTitle, DialogTrigger, } from './ui/dialog'; import { Input } from './ui/input'; import { Label } from './ui/label'; import { ScrollArea } from './ui/scroll-area'; import { Textarea } from './ui/textarea'; type ChatSidebarProps = { selectedRoomId: string | null; onRoomSelect: (roomId: string) => void; }; export const ChatSidebar: FC = ({ selectedRoomId, onRoomSelect, }) => { const [isCreateDialogOpen, setIsCreateDialogOpen] = useState(false); const [newRoomData, setNewRoomData] = useState({ name: '', description: '', memberUsernames: [], }); const { user, logout } = useAuthStore(); const { chatRooms, onlineUsers, setChatRooms, addChatRoom } = useChatStore(); const { isLoading } = useQuery({ queryKey: ['chatRooms'], queryFn: async () => { const response = await chatAPI.getChatRooms(); if (response.data.success) { setChatRooms(response.data.data); return response.data.data; } throw new Error(response.data.error ?? 'Failed to fetch chat rooms'); }, }); const createRoomMutation = useMutation({ mutationKey: ['createChatRoom'], mutationFn: chatAPI.createChatRoom, onSuccess: (response) => { if (response.data.success) { addChatRoom(response.data.data); setIsCreateDialogOpen(false); setNewRoomData({ name: '', description: '', memberUsernames: [] }); toast.success('Chat room created successfully'); } }, // eslint-disable-next-line @typescript-eslint/no-explicit-any onError: (error: any) => { toast.error(error.response?.data?.error ?? 'Failed to create chat room'); }, }); const handleCreateRoom = (e: FormEvent) => { e.preventDefault(); createRoomMutation.mutate(newRoomData); }; const getOnlineMembersCount = (room: ChatRoom) => { return room.members.filter((member) => onlineUsers.has(member.userId)) .length; }; if (isLoading) { return (
); } return (
{/* Header */}

Chat Rooms

Create New Chat Room
setNewRoomData({ ...newRoomData, name: e.target.value }) } required placeholder="Enter room name" />