import React, { useEffect, useState } from 'react' import { openURL } from 'prismarine-viewer/viewer/lib/simpleUtils' import { haveDirectoryPicker } from '../utils' import { activeModalStack } from '../globalState' import styles from './mainMenu.module.css' import Button from './Button' import ButtonWithTooltip from './ButtonWithTooltip' type Action = (e: React.MouseEvent) => void interface Props { connectToServerAction?: Action singleplayerAction?: Action optionsAction?: Action githubAction?: Action discordAction?: Action openFileAction?: Action mapsProvider?: string } const refreshApp = async (failedUpdate = false) => { const registration = await navigator.serviceWorker.getRegistration() await registration?.unregister() if (failedUpdate) { await new Promise(resolve => { setTimeout(resolve, 2000) }) } if (activeModalStack.length !== 0) return if (failedUpdate) { sessionStorage.justReloaded = false // try to force bypass cache location.search = '?update=true' } else { window.justReloaded = true sessionStorage.justReloaded = true window.location.reload() } } const httpsRegex = /^https?:\/\// export default ({ connectToServerAction, mapsProvider, singleplayerAction, optionsAction, githubAction, discordAction, openFileAction }: Props) => { const [versionStatus, setVersionStatus] = useState('') const [versionTitle, setVersionTitle] = useState('') useEffect(() => { if (process.env.NODE_ENV === 'development') { setVersionStatus('(dev)') } else { fetch('./version.txt').then(async (f) => { if (f.status === 404) return const contents = await f.text() const isLatest = contents === process.env.BUILD_VERSION if (!isLatest && sessionStorage.justReloaded) { setVersionStatus('(force reloading, wait)') void refreshApp(true) return } setVersionStatus(`(${isLatest ? 'latest' : 'new version available'})`) setVersionTitle(`Loaded: ${process.env.BUILD_VERSION}. Remote: ${contents}`) }, () => { }) } }, []) return (
Prismarine is a beautiful block
Connect to server
Singleplayer
GitHub
{ setVersionStatus('(reloading)') await refreshApp() }} className={styles['product-info']} > Prismarine Web Client {versionStatus} Privacy Policy A Minecraft client in the browser!
{mapsProvider && openURL(httpsRegex.test(mapsProvider) ? mapsProvider : 'https://' + mapsProvider, false)} />}
) }