'use client'; import { useEffect, useRef, useState } from 'react'; import { useParams } from 'next/navigation'; import { io, Socket } from 'socket.io-client'; import { Send } from 'lucide-react'; import { Button } from '@/components/ui/button'; import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card'; import { api } from '@/lib/api'; import { getWsBaseUrl } from '@/lib/ws'; export default function InviteGroupPage() { const params = useParams(); const groupId = params?.groupId as string; const [messages, setMessages] = useState([]); const [members, setMembers] = useState([]); const [message, setMessage] = useState(''); const socketRef = useRef(null); useEffect(() => { if (!groupId) return; (async () => { await api.joinGroupByInvite(groupId).catch(() => null); const [msgs, mbrs] = await Promise.all([ api.getGroupMessages(groupId).catch(() => []), api.getGroupMembers(groupId).catch(() => []), ]); setMessages(msgs); setMembers(mbrs); })(); }, [groupId]); useEffect(() => { if (!groupId) return; const token = typeof window !== 'undefined' ? sessionStorage.getItem('coursecraft_api_token') || undefined : undefined; const socket = io(`${getWsBaseUrl()}/ws/course-groups`, { transports: ['websocket'], auth: { token }, }); socketRef.current = socket; socket.emit('groups:join', { groupId }); socket.on('groups:new-message', (msg: any) => setMessages((prev) => [...prev, msg])); return () => { socket.disconnect(); socketRef.current = null; }; }, [groupId]); const send = async () => { if (!groupId || !message.trim()) return; await api.sendGroupMessage(groupId, message.trim()); setMessage(''); }; return (
Групповой чат курса
{messages.map((msg) => (

{msg.user?.name || 'Участник'}

{msg.content}

))}
setMessage(e.target.value)} className="flex-1 rounded-md border bg-background px-3 py-2 text-sm" placeholder="Сообщение" />
Участники ({members.length}) {members.map((member) => (

{member.user?.name || member.user?.email}

{member.role}

))}
); }