import { useParams, useNavigate } from 'react-router-dom'; import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query'; import { getTeam } from '../api/teams'; import { getChannels, getChannelMessages, createMessage } from '../api/channels'; import { MessageSquare, Plus, Send, Loader2 } from 'lucide-react'; import { useState, useRef, useEffect } from 'react'; import type { CreateMessageRequest } from '../types/api'; export function ChatPage() { const { teamId, channelId } = useParams<{ teamId: string; channelId: string }>(); const navigate = useNavigate(); const queryClient = useQueryClient(); const [messageText, setMessageText] = useState(''); const messagesEndRef = useRef(null); const { data: team } = useQuery({ queryKey: ['team', teamId], queryFn: () => getTeam(teamId!), enabled: !!teamId, }); const { data: channelsData } = useQuery({ queryKey: ['channels', teamId], queryFn: () => getChannels(teamId!), enabled: !!teamId, }); const { data: messagesData, isLoading: messagesLoading } = useQuery({ queryKey: ['messages', channelId], queryFn: () => getChannelMessages(channelId!), enabled: !!channelId, }); const currentChannel = channelsData?.channels.find((c) => c.id === channelId); const sendMessageMutation = useMutation({ mutationFn: (data: CreateMessageRequest) => createMessage(channelId!, data), onSuccess: () => { setMessageText(''); queryClient.invalidateQueries({ queryKey: ['messages', channelId] }); }, }); const handleSendMessage = (e: React.FormEvent) => { e.preventDefault(); if (!messageText.trim() || sendMessageMutation.isPending) return; sendMessageMutation.mutate({ content: messageText.trim() }); }; useEffect(() => { messagesEndRef.current?.scrollIntoView({ behavior: 'smooth' }); }, [messagesData?.messages]); if (messagesLoading) { return (
); } const messages = messagesData?.messages || []; return (
{/* Sidebar */}
{/* Team Header */}

{team?.name || 'Завантаження...'}

{team?.description && (

{team.description}

)}
{/* Channels List */}

Канали

{channelsData?.channels.map((channel) => ( ))}
{/* Chat Area */}
{/* Chat Header */}

{currentChannel?.name || 'Канал'}

{currentChannel?.type === 'public' ? 'Публічний канал' : 'Приватна кімната'}

{/* Messages */}
{messages.length === 0 ? (

Повідомлень поки немає

Почніть розмову!

) : ( messages.map((message) => (
{message.user?.name?.[0]?.toUpperCase() || message.user?.email?.[0]?.toUpperCase() || '?'}
{message.user?.name || message.user?.email || 'Анонім'} {new Date(message.created_at).toLocaleTimeString('uk-UA', { hour: '2-digit', minute: '2-digit', })}

{message.content}

)) )}
{/* Message Composer */}
setMessageText(e.target.value)} placeholder="Написати повідомлення..." className="flex-1 px-4 py-2 border border-gray-300 rounded-lg focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-transparent" disabled={sendMessageMutation.isPending} />
); }