/** * @fileoverview React component for GameBase.jsx * * @module components.game.GameBase */ import React from "react"; import PropTypes from "prop-types"; import { Panel, PanelGroup } from "react-resizable-panels"; import GameNavBar from "./GameNavBar"; import GameFaseInfo from "./GameFaseInfo"; import GameArea from "./GameArea"; import GameFooter from "./GameFooter"; import SeletorDeFases from "./SeletorDeFases"; import SucessoModal from "./SucessoModal"; import FalhaModal from "./FalhaModal"; import ResizeHandle from "./ResizeHandle"; import { useIsMobile } from "../../hooks/useIsMobile"; import { useGameState } from "../../contexts/GameStateContext"; import { EditorProvider } from "../../contexts/EditorContext"; import { usePhaser } from "../../hooks/usePhaser"; import { useGameModals } from "../../hooks/useGameModals"; function GameBaseContent({ gameFactory, gameConfig, children, onHelpClick, customFailureHandler, }) { const isMobile = useIsMobile(); const { currentPhase, setCurrentPhase, resetProgress, executionState, generatedCode, failureMessage, restart, setOnWorkspaceChange, } = useGameState(); const phaseConfig = gameConfig.fases[currentPhase - 1]; const usaModalFalha = !!customFailureHandler; const { gameContainerRef } = usePhaser({ gameFactory, phaseConfig, currentPhase, customFailureHandler, gameConfig, }); const { modalFasesAberto, setModalFasesAberto, modalSucessoAberto, modalFalhaAberto, blocksRemainingCount, handleProximaFase, handleFecharModalSucesso, handleFecharModalFalha, handleTentarNovamente, } = useGameModals({ executionState, currentPhase, phaseConfig, gameConfig, setCurrentPhase, restart, setOnWorkspaceChange, usaModalFalha, }); const handleResetProgresso = () => { resetProgress(); window.dispatchEvent( new CustomEvent("resetBlocklyWorkspace", { detail: { gameId: gameConfig.gameId }, }), ); }; const codeToShow = React.useMemo(() => { if (!generatedCode) return "Nenhum código gerado"; let codigo = ""; if (typeof generatedCode === "string") { codigo = generatedCode; } else if (typeof generatedCode === "object" && generatedCode.codigo) { codigo = generatedCode.codigo; } else { return "Código não disponível"; } const codigoLimpo = codigo .split("\n") .filter((linha) => !linha.trim().startsWith("highlightBlock(")) .join("\n") .trim(); return codigoLimpo || codigo; }, [generatedCode]); return (