import React from "react"; import useC2C, { C2CProvider } from "../components/hooks/useC2C"; import { itemMap, useGameItemActionMap, ItemForm } from "../gameComponents"; import BoardView from "./BoardView"; import Waiter from "./Waiter"; import { useUsers } from "../components/users"; import useSession, { SessionProvider } from "../hooks/useSession"; import AutoSaveSession from "./AutoSaveSession"; import { useTranslation } from "react-i18next"; import useAsyncEffect from "use-async-effect"; export const SessionView = () => { const { loadSession, setSession, sessionLoaded, gameId, sessionId, } = useSession(); const { c2c, isMaster } = useC2C("board"); const { actionMap } = useGameItemActionMap(); const { setCurrentUser } = useUsers(); const gameLoadingRef = React.useRef(false); const { t } = useTranslation(); React.useEffect(() => { setCurrentUser((prev) => ({ ...prev, space: sessionId })); }, [sessionId, setCurrentUser]); useAsyncEffect( async (isMounted) => { if (isMaster && !sessionLoaded && !gameLoadingRef.current) { gameLoadingRef.current = true; const sessionData = await loadSession(); if (!isMounted) return; setSession(sessionData, true); } }, [sessionLoaded, isMaster] ); // Load game from master if any React.useEffect(() => { if (!isMaster && !sessionLoaded && !gameLoadingRef.current) { gameLoadingRef.current = true; const onReceiveGame = (receivedSession) => { setSession(receivedSession); }; c2c.call("getSession").then(onReceiveGame, () => { setTimeout( () => c2c .call("getSession") .then(onReceiveGame, (error) => console.log("Failed to call getSession with error", error) ), 1000 ); }); } }, [c2c, isMaster, sessionLoaded, setSession]); const mediaLibraries = React.useMemo( () => gameId ? [ { id: "session", name: t("Session"), boxId: "session", resourceId: sessionId, }, { id: "game", name: t("Game"), boxId: "game", resourceId: gameId }, ] : [ { id: "session", name: t("Session"), boxId: "session", resourceId: sessionId, }, ], [gameId, sessionId, t] ); if (!sessionLoaded) { return ; } return ( <> ); }; const ConnectedSessionView = ({ sessionId, fromGame }) => { return ( ); }; export default ConnectedSessionView;