2023-03-28 19:35:23 +02:00
|
|
|
import * as React from 'react'
|
|
|
|
import CloseButton from '@msgba/components/close-button'
|
|
|
|
import { sendSaveRequest } from '@msgba/packet'
|
2023-03-24 03:22:21 +01:00
|
|
|
|
|
|
|
export interface OverlayMenuProps {
|
2023-03-28 19:35:23 +02:00
|
|
|
hiddenMenu: boolean
|
|
|
|
setHiddenMenu: (c: boolean) => void
|
|
|
|
emulationStarted: boolean
|
|
|
|
setHiddenFormSelectFiles: (c: boolean) => void
|
|
|
|
screenRef: React.RefObject<HTMLDivElement>
|
|
|
|
isFullscreen: boolean
|
|
|
|
setIsFullscreen: (c: boolean) => void
|
|
|
|
firstMenuElement: React.RefObject<HTMLAnchorElement>
|
|
|
|
websocket: WebSocket | null
|
2023-04-02 17:28:27 +02:00
|
|
|
onSaveResponseLambdas: Map<bigint, (saveFile: Uint8Array) => void>
|
2023-03-24 03:22:21 +01:00
|
|
|
};
|
|
|
|
|
2023-03-28 19:35:23 +02:00
|
|
|
type Style = Record<string, string>
|
2023-03-24 03:22:21 +01:00
|
|
|
|
2023-03-28 19:35:23 +02:00
|
|
|
export default function OverlayMenu ({
|
|
|
|
hiddenMenu, setHiddenMenu, emulationStarted,
|
|
|
|
setHiddenFormSelectFiles, screenRef, isFullscreen, setIsFullscreen,
|
2023-04-02 17:28:27 +02:00
|
|
|
firstMenuElement, websocket, onSaveResponseLambdas
|
2023-03-28 19:35:23 +02:00
|
|
|
}: OverlayMenuProps): JSX.Element {
|
|
|
|
function exitMenu (): void {
|
|
|
|
setHiddenMenu(true)
|
2023-03-24 03:22:21 +01:00
|
|
|
}
|
|
|
|
|
2023-03-28 19:35:23 +02:00
|
|
|
function openSelectFilesMenu (): void {
|
|
|
|
setHiddenFormSelectFiles(false)
|
2023-03-24 03:22:21 +01:00
|
|
|
}
|
|
|
|
|
2023-03-28 19:35:23 +02:00
|
|
|
function toggleFullscreen (): void {
|
2023-03-24 19:13:09 +01:00
|
|
|
if (isFullscreen) {
|
2023-03-28 19:35:23 +02:00
|
|
|
document.exitFullscreen().catch((c: string) => { console.log(c) })
|
|
|
|
setIsFullscreen(false)
|
2023-03-24 19:13:09 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
if (screenRef.current != null) {
|
|
|
|
screenRef.current.requestFullscreen().then(() => {
|
2023-03-28 19:35:23 +02:00
|
|
|
setIsFullscreen(true)
|
|
|
|
}).catch((error: string) => {
|
|
|
|
console.log(error)
|
|
|
|
})
|
2023-03-24 19:13:09 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2023-03-28 19:35:23 +02:00
|
|
|
const styleSelectRom: Style = {}
|
2023-03-24 03:22:21 +01:00
|
|
|
if (emulationStarted) {
|
2023-03-28 19:35:23 +02:00
|
|
|
styleSelectRom.display = 'none'
|
2023-03-24 03:22:21 +01:00
|
|
|
}
|
|
|
|
|
2023-03-28 19:35:23 +02:00
|
|
|
const styleMenu: Style = {}
|
2023-03-24 03:22:21 +01:00
|
|
|
if (hiddenMenu) {
|
2023-03-28 19:35:23 +02:00
|
|
|
styleMenu.display = 'none'
|
2023-03-24 03:22:21 +01:00
|
|
|
}
|
2023-03-28 19:35:23 +02:00
|
|
|
let toggleFullscreenText: string = 'Set fullscreen'
|
2023-03-24 19:13:09 +01:00
|
|
|
if (isFullscreen) {
|
2023-03-28 19:35:23 +02:00
|
|
|
toggleFullscreenText = 'End fullscreen'
|
|
|
|
}
|
|
|
|
|
|
|
|
const saveButton = React.useRef<HTMLAnchorElement>(null)
|
|
|
|
const [saveIdentifier, setSaveidentifier] = React.useState<bigint>(0n)
|
|
|
|
|
|
|
|
function onSave (): void {
|
|
|
|
if (websocket == null) {
|
|
|
|
console.log('No websocket still')
|
|
|
|
return
|
|
|
|
}
|
|
|
|
const currentSave = saveIdentifier
|
|
|
|
setSaveidentifier((c: bigint) => c + 1n)
|
2023-04-02 17:28:27 +02:00
|
|
|
console.log('Reachs here')
|
|
|
|
onSaveResponseLambdas.set(currentSave, (saveFile: Uint8Array) => {
|
|
|
|
const anchor = document.createElement('a')
|
|
|
|
const blobSaveResponseFile = new Blob([saveFile.buffer])
|
|
|
|
const fileReader = new FileReader()
|
|
|
|
fileReader.onload = () => {
|
|
|
|
if (typeof fileReader.result === 'string') {
|
|
|
|
anchor.style.display = 'none'
|
|
|
|
document.body.appendChild(anchor)
|
|
|
|
anchor.href = fileReader.result
|
|
|
|
anchor.download = 'ruby.ss1'
|
|
|
|
anchor.click()
|
|
|
|
return true
|
|
|
|
}
|
|
|
|
return false
|
|
|
|
}
|
|
|
|
fileReader.readAsDataURL(blobSaveResponseFile)
|
|
|
|
})
|
|
|
|
console.log(onSaveResponseLambdas)
|
2023-03-28 19:35:23 +02:00
|
|
|
sendSaveRequest(websocket, currentSave)
|
|
|
|
}
|
|
|
|
|
|
|
|
const styleSave: Style = {}
|
|
|
|
if (!emulationStarted) {
|
|
|
|
styleSave.display = 'none'
|
2023-03-24 19:13:09 +01:00
|
|
|
}
|
2023-03-24 03:22:21 +01:00
|
|
|
|
|
|
|
return (
|
|
|
|
<div style={styleMenu} className="overlay-menu-div">
|
|
|
|
<div className="overlay-menu-div-header">
|
|
|
|
<CloseButton onClick={exitMenu}/>
|
|
|
|
</div>
|
|
|
|
<div className="overlay-menu">
|
|
|
|
<ul>
|
2023-03-24 19:13:09 +01:00
|
|
|
<li><a ref={firstMenuElement} style={styleSelectRom} onClick={openSelectFilesMenu} href="#">Select rom</a></li>
|
2023-03-28 19:35:23 +02:00
|
|
|
<li><a ref={saveButton} style={styleSave} onClick={onSave} href="#">Save</a></li>
|
2023-03-24 19:13:09 +01:00
|
|
|
<li><a onClick={toggleFullscreen} href="#">{toggleFullscreenText}</a></li>
|
2023-03-24 03:22:21 +01:00
|
|
|
<li><a href="#" onClick={exitMenu}>Exit</a></li>
|
|
|
|
</ul>
|
|
|
|
</div>
|
|
|
|
</div>
|
2023-03-28 19:35:23 +02:00
|
|
|
)
|
2023-03-24 03:22:21 +01:00
|
|
|
}
|