diff --git a/src/components/Player/InputBox.jsx b/src/components/Player/InputBox.jsx index 0d7ab86..722aa72 100644 --- a/src/components/Player/InputBox.jsx +++ b/src/components/Player/InputBox.jsx @@ -106,6 +106,11 @@ export default function InputBox ({ } } + const noopHandler = (event) => { + event.target.valut = '' + event.preventDefault() + } + const inputHandlers = { char: { maxlength: '1', @@ -120,6 +125,11 @@ export default function InputBox ({ onKeyDown: lineArrowHandler, onKeyPress: lineHandler, }, + finished: { + placeholder: 'The program has finished', + onKeyDown: noopHandler, + onKeyPress: noopHandler, + }, } const enterFullscreen = () => @@ -134,6 +144,6 @@ export default function InputBox ({ autocomplete='off' onDblClick={enterFullscreen} onInput={({ target: { value } }) => setInputText(value)} - type='search' /> + type='text' /> ) } diff --git a/src/components/Player/Player.jsx b/src/components/Player/Player.jsx index 2a53dc1..c6a8564 100644 --- a/src/components/Player/Player.jsx +++ b/src/components/Player/Player.jsx @@ -9,7 +9,7 @@ import GridBuffer from './GridBuffer' import InputBox from './InputBox' import Status from './Status' -import { Handlers } from './playerHandlers' +import { Handlers, unhandledRejectionHandler } from './playerHandlers' import './player.css' @@ -47,20 +47,29 @@ export default function Player ({ const [sendMessage, setSendMessage] = useState(null) useEffect(() => { - const vm = runMachine({ + const handlers = Handlers({ + setStatus, + setWindows, + setCurrentWindowId, + setInputType, + setInbox, + }) + + setVm(runMachine({ engine, wasmBinary, storyfile, - handlers: Handlers({ - setStatus, - setWindows, - setCurrentWindowId, - setInputType, - setInbox, - }), - }) + handlers, + })) - setVm(vm) + const rejectionHandler = + unhandledRejectionHandler(handlers.onExit) + + window.addEventListener('unhandledrejection', rejectionHandler) + + return () => { + window.removeEventListener('unhandledrejection', rejectionHandler) + } }, [storyfile, engine, wasmBinary]) useEffect(() => { diff --git a/src/components/Player/playerHandlers.js b/src/components/Player/playerHandlers.js index 1357688..4adffa9 100644 --- a/src/components/Player/playerHandlers.js +++ b/src/components/Player/playerHandlers.js @@ -46,6 +46,15 @@ export const Handlers = ({ }, /* */ onExit: () => { - setInputType(null) + setInputType('finished') }, }) + +export const unhandledRejectionHandler = (onExit) => (event) => { + if (event.reason.name === 'ExitStatus' || event.reason.message === 'Program terminated with exit(0)') { + onExit() + } else { + console.error('Unhandled rejection (promise: ', event.promise, ', reason: ', event.reason, ').'); + } + event.preventDefault() +}