Bootstrap player

This commit is contained in:
He4eT 2021-02-25 03:45:43 +05:00
commit 8dc6ae88c5
2 changed files with 75 additions and 3 deletions

View file

@ -1,6 +1,78 @@
import { h } from 'preact'
import { useState, useEffect } from 'preact/hooks'
import CheapGlkOte from 'cheap-glkote'
const runMachine = ({ Engine, file, handlers }) => {
console.log('runMachine')
const vm = new Engine()
const { glkInterface, sendFn } = CheapGlkOte(handlers)
vm.prepare(file, glkInterface)
vm.start()
return { sendFn, instance: vm }
}
const Handlers = ({
setCurrentWindow,
setInputType,
setInbox
}) => ({
onInit: () => {},
onUpdateWindows: windows => {},
onUpdateInputs: type => {},
onUpdateContent: messages => {
console.log(messages)
},
onDisable: () => {},
onFileNameRequest: (tosave, usage, _, setFileName) => {
setFileName({ filename: 'filename', usage })
},
onFileRead: filename => {
return 'content'
},
onFileWrite: (filename, content) => {},
onExit: () => {}
})
export default function ({ vmParts: { file, engine } }) {
const [currentWindow, setCurrentWindow] = useState(null)
const [inputType, setInputType] = useState(null)
const [inbox, setInbox] = useState([])
const [messages, setMessages] = useState([])
const [vm, setVm] = useState(null)
const [sendMessage, setSendMessage] = useState(null)
useEffect(() => {
const handlers = Handlers({
setCurrentWindow,
setInputType,
setInbox
})
const vm = runMachine({
Engine: engine,
file,
handlers
})
setVm(vm)
}, [file, engine])
useEffect(() => {
setSendMessage(_ => vm
? vm.sendFn
: null)
}, [vm])
useEffect(() => {
window.send = sendMessage
}, [sendMessage])
return (
<div>
Player

View file

@ -8,14 +8,14 @@ const decode = encodedUrl => decodeURIComponent(encodedUrl)
export default function ({setTheme, theme, encodedUrl}) {
useEffect(() => setTheme(theme), [theme])
const [url, setUrl] = useState(decode(encodedUrl))
const [targetUrl, setTargetUrl] = useState(decode(encodedUrl))
useEffect(() => {
setUrl(decode(encodedUrl))
setTargetUrl(decode(encodedUrl))
}, [encodedUrl])
return (
<main>
<UrlPlayer url={url} />
<UrlPlayer url={targetUrl} />
</main>)
}