import ActionsSidebarWrapper from "../components/ActionsSidebarWrapper"; import ChatFilledIcon from "../components/icons/ChatFilledIcon"; import ExitFilledIcon from "../components/icons/ExitFilledIcon"; import FullscreenExitIcon from "../components/icons/FullscreenExitIcon"; import FullscreenIcon from "../components/icons/FullscreenIcon"; import MicrophoneFilledIcon from "../components/icons/MicrophoneFilledIcon"; import ShareFilledIcon from "../components/icons/ShareFilledIcon"; import UsersFilledIcon from "../components/icons/UsersFilledIcon"; import VideoOffFilledIcon from "../components/icons/VideoOffFilledIcon"; import FloatingActionButton from "../components/ui/FloatingActionButton"; import ParticipantsPopup from "../components/popups/ParticipantsPopup"; import usePopupStore from "../store/popupStore"; import ControlsPopover from "../components/ui/ControlsPopover"; import ChatPopup from "../components/popups/ChatPopup"; import SharePopup from "../components/popups/SharePopup"; import { useEffect, useState } from "react"; import { useNavigate, useParams } from "react-router"; import { useQuery } from "@tanstack/react-query"; import { api } from "../lib/api"; import type { Session } from "../types/Session"; import { PixelStreamingWrapper } from "../components/PixelStreamingWrapper"; import WarningIcon from "../components/icons/WarningIcon"; import Button from "../components/ui/Button"; import LoaderIcon from "../components/icons/LoaderIcon"; import SessionUsersPanel from "../components/SessionUsersPanel"; import { useWebRTC } from "../hooks/useWebRTC"; import MicrophoneOffFilledIcon from "../components/icons/MicrophoneOffFilledIcon"; import VideoFilledIcon from "../components/icons/VideoFilledIcon"; import clsx from "clsx"; function SessionPage() { const { setPopup } = usePopupStore(); const [isFullscreen, setIsFullscreen] = useState(false); function toggleFullscreen() { if (document.fullscreenElement) document.exitFullscreen(); else document.documentElement.requestFullscreen(); } useEffect(() => { document.addEventListener("fullscreenchange", () => setIsFullscreen(!!document.fullscreenElement) ); return () => document.removeEventListener("fullscreenchange", () => setIsFullscreen(!!document.fullscreenElement) ); }, []); const { id } = useParams(); const navigate = useNavigate(); const { data: sessionData, isLoading, error, // refetch, } = useQuery({ queryKey: ["session", id], queryFn: async () => { const response = await api.get(`sessions/${id}`).json<{ session: Session; }>(); return response; }, refetchInterval: (query) => { // Автоматически обновляем каждые 2 секунды, если сессия в процессе запуска const data = query.state.data; if ( data?.session.status === "starting" || data?.session.status === "ending" ) { return 2000; } return false; }, }); const session = sessionData?.session; function handleChatOpen() { console.log("handleChatOpen"); setPopup(); } function handleParticipantsOpen() { if (session) { setPopup(); } } function handleShareOpen() { setPopup(); } const [mode, setMode] = useState<"full" | "mini">("full"); function toggleMode() { setMode(mode === "full" ? "mini" : "full"); } // Не перенаправляем автоматически - пользователи могут продолжать общаться // useEffect(() => { // if (session?.status === "ended") { // const timer = setTimeout(() => { // navigate("/test"); // }, 5000); // return () => clearTimeout(timer); // } // }, [session?.status, navigate]); const { localStream, toggleAudio, isAudioMuted, toggleVideo, isVideoMuted } = useWebRTC(session?.id, true); if (isLoading) { return (

Загрузка информации о сессии...

); } if (error || !session) { return (

Сессия не найдена

{error instanceof Error ? error.message : "Не удалось загрузить информацию о сессии"}

); } return (
{/* Pixel Streaming - показывается только когда сессия активна */} {session.status === "started" && session.mode === "stream" && session.server?.localIp && session.playerPort && (
{ console.log("Video initialized"); }} />
)} {/* Сообщение когда Pixel Streaming завершён, но WebRTC чат работает */} {session.status === "ended" && (
Сессия завершена
Вы можете продолжать общаться через видеочат
)}
{mode === "mini" ? : }
{!localStream || isAudioMuted ? ( ) : ( )}
{!localStream || isVideoMuted ? ( ) : ( )}
{isFullscreen ? : }
{/* WebRTC видеочат - работает всегда, пока пользователь на странице */}
); } export default SessionPage;