import * as React from 'react' import { GameIdContext } from "../app" import { InputModeContext, MobileContext, WorldLevelIdContext } from "./infoview/context" import { GameInfo, useGetGameInfoQuery } from '../state/api' import { changedOpenedIntro, selectCompleted, selectDifficulty, selectProgress } from '../state/progress' import { useSelector } from 'react-redux' import { useAppDispatch, useAppSelector } from '../hooks' import { Button } from './button' import { FontAwesomeIcon } from '@fortawesome/react-fontawesome' import { faDownload, faUpload, faEraser, faBook, faBookOpen, faGlobe, faHome, faArrowRight, faArrowLeft, faXmark, faBars, faCode, faCircleInfo, faTerminal } from '@fortawesome/free-solid-svg-icons' import { PrivacyPolicyPopup } from './popup/privacy_policy' import { WorldSelectionMenu, downloadFile } from './world_tree' /** navigation to switch between pages on mobile */ function MobileNav({pageNumber, setPageNumber}: { pageNumber: number, setPageNumber: any}) { const gameId = React.useContext(GameIdContext) const dispatch = useAppDispatch() let prevText = {0 : null, 1: "Intro", 2: null}[pageNumber] let prevIcon = {0 : null, 1: null, 2: faBookOpen}[pageNumber] let prevTitle = { 0: null, 1: "Game Introduction", 2: "World selection"}[pageNumber] let nextText = {0 : "Start", 1: null, 2: null}[pageNumber] let nextIcon = {0 : null, 1: faBook, 2: null}[pageNumber] let nextTitle = { 0: "World selection", 1: "Inventory", 2: null}[pageNumber] return <> {(prevText || prevTitle || prevIcon) && } {(nextText || nextTitle || nextIcon) && } } export function WelcomeAppBar({gameInfo, toggleImpressum, openEraseMenu, openUploadMenu, toggleInfo} : { gameInfo: GameInfo, toggleImpressum: any, openEraseMenu: any, openUploadMenu: any, toggleInfo: any }) { const gameId = React.useContext(GameIdContext) const {mobile, pageNumber, setPageNumber} = React.useContext(MobileContext) const [navOpen, setNavOpen] = React.useState(false) /** Download the current progress (i.e. what's saved in the browser store) */ const gameProgress = useSelector(selectProgress(gameId)) const downloadProgress = (e) => { e.preventDefault() downloadFile({ data: JSON.stringify(gameProgress, null, 2), fileName: `lean4game-${gameId}-${new Date().toLocaleDateString()}.json`, fileType: 'text/json', }) } return
<>
{mobile ? '' : gameInfo?.title}
{mobile && <> {/* BUTTONS for MOBILE */} }
{/* {levelId < gameInfo.data?.worldSize[worldId] && } {levelId > 0 && <> } */}
} // /** The menu that is shown next to the world selection graph */ // function WorldSelectionMenu() { // const [file, setFile] = React.useState(); // const gameId = React.useContext(GameIdContext) // const store = useStore() // const difficulty = useSelector(selectDifficulty(gameId)) // /* state variables to toggle the pop-up menus */ // const [eraseMenu, setEraseMenu] = React.useState(false); // const openEraseMenu = () => setEraseMenu(true); // const closeEraseMenu = () => setEraseMenu(false); // const [uploadMenu, setUploadMenu] = React.useState(false); // const openUploadMenu = () => setUploadMenu(true); // const closeUploadMenu = () => setUploadMenu(false); // const gameProgress = useSelector(selectProgress(gameId)) // const dispatch = useAppDispatch() // /** Download the current progress (i.e. what's saved in the browser store) */ // const downloadProgress = (e) => { // e.preventDefault() // downloadFile({ // data: JSON.stringify(gameProgress, null, 2), // fileName: `lean4game-${gameId}-${new Date().toLocaleDateString()}.json`, // fileType: 'text/json', // }) // } // const handleFileChange = (e) => { // if (e.target.files) { // setFile(e.target.files[0]) // } // } // /** Upload progress from a */ // const uploadProgress = (e) => { // if (!file) {return} // const fileReader = new FileReader() // fileReader.readAsText(file, "UTF-8") // fileReader.onload = (e) => { // const data = JSON.parse(e.target.result.toString()) as GameProgressState // console.debug("Json Data", data) // dispatch(loadProgress({game: gameId, data: data})) // } // closeUploadMenu() // } // const eraseProgress = () => { // dispatch(deleteProgress({game: gameId})) // closeEraseMenu() // } // const downloadAndErase = (e) => { // downloadProgress(e) // eraseProgress() // } // function label(x : number) { // return x == 0 ? 'none' : x == 1 ? 'lax' : 'regular' // } // return // } /** The top-navigation bar */ export function LevelAppBar({ isLoading, levelTitle, impressum, toggleImpressum, pageNumber = undefined, setPageNumber = undefined, lockEditorMode=false}) { const gameId = React.useContext(GameIdContext) const {worldId, levelId} = React.useContext(WorldLevelIdContext) const gameInfo = useGetGameInfoQuery({game: gameId}) const {mobile} = React.useContext(MobileContext) const difficulty = useSelector(selectDifficulty(gameId)) const completed = useAppSelector(selectCompleted(gameId, worldId, levelId)) const { typewriterMode, setTypewriterMode } = React.useContext(InputModeContext) const [navOpen, setNavOpen] = React.useState(false) function toggleEditor(ev) { if (!lockEditorMode){ setTypewriterMode(!typewriterMode) setNavOpen(false) } } return
{mobile ? <> {/* MOBILE VERSION */}
{levelTitle}
{mobile && pageNumber == 0 ? : pageNumber == 1 && }
{levelId < gameInfo.data?.worldSize[worldId] && } {levelId > 0 && <> }
: <> {/* DESKTOP VERSION */}
{gameInfo.data?.worlds.nodes[worldId].title && `World: ${gameInfo.data?.worlds.nodes[worldId].title}`}
{levelTitle}
{levelId > 0 && <> } {levelId < gameInfo.data?.worldSize[worldId] ? : }
}
}