mirror of
https://github.com/He4eT/elseifplayer.git
synced 2026-05-05 01:17:22 +00:00
Add TextBuffer component
This commit is contained in:
parent
a5c6205bc0
commit
95c8ae8780
3 changed files with 91 additions and 20 deletions
8
src/components/player/InputBox.js
Normal file
8
src/components/player/InputBox.js
Normal file
|
|
@ -0,0 +1,8 @@
|
||||||
|
import { h } from 'preact'
|
||||||
|
// import { useState, useEffect } from 'preact/hooks'
|
||||||
|
|
||||||
|
export default function ({ currentWindow, inputType, sendMessage }) {
|
||||||
|
return (
|
||||||
|
<div>InputBox</div>
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
@ -3,6 +3,14 @@ import { useState, useEffect } from 'preact/hooks'
|
||||||
|
|
||||||
import CheapGlkOte from 'cheap-glkote'
|
import CheapGlkOte from 'cheap-glkote'
|
||||||
|
|
||||||
|
import TextBuffer from './TextBuffer'
|
||||||
|
import InputBox from './InputBox'
|
||||||
|
|
||||||
|
const INITIAL_STATUS = {
|
||||||
|
stage: 'loading',
|
||||||
|
details: 'Preparing...'
|
||||||
|
}
|
||||||
|
|
||||||
const runMachine = ({ Engine, file, handlers }) => {
|
const runMachine = ({ Engine, file, handlers }) => {
|
||||||
console.log('runMachine')
|
console.log('runMachine')
|
||||||
|
|
||||||
|
|
@ -16,30 +24,22 @@ const runMachine = ({ Engine, file, handlers }) => {
|
||||||
}
|
}
|
||||||
|
|
||||||
const Handlers = ({
|
const Handlers = ({
|
||||||
|
setStatus,
|
||||||
setCurrentWindow,
|
setCurrentWindow,
|
||||||
setInputType,
|
setInputType,
|
||||||
setInbox
|
setInbox
|
||||||
}) => ({
|
}) => ({
|
||||||
onInit: () => {},
|
onInit: _ => setStatus({ stage: 'ready' }),
|
||||||
|
/* */
|
||||||
onUpdateWindows: windows => {
|
onUpdateWindows: windows => {
|
||||||
setCurrentWindow(windows
|
setCurrentWindow(windows
|
||||||
.filter(x => x.type === 'buffer')
|
.filter(x => x.type === 'buffer')
|
||||||
.slice(-1)[0])
|
.slice(-1)[0])
|
||||||
},
|
},
|
||||||
onUpdateInputs: setInputType,
|
onUpdateInputs: setInputType,
|
||||||
onUpdateContent: messagesByWindow => {
|
onUpdateContent: setInbox,
|
||||||
const inbox =
|
onDisable: _ => setInputType(null),
|
||||||
messagesByWindow
|
/* */
|
||||||
.reduce((acc, {id, text}) => {
|
|
||||||
acc[id] = text
|
|
||||||
.map(({content}) => content || [null])
|
|
||||||
.reduce((xs, x) => [...xs, ...x], [])
|
|
||||||
return acc
|
|
||||||
}, {})
|
|
||||||
console.log(JSON.stringify(inbox, null, 1))
|
|
||||||
setInbox(inbox)
|
|
||||||
},
|
|
||||||
onDisable: () => setInputType(null),
|
|
||||||
onFileNameRequest: (tosave, usage, _, setFileName) => {
|
onFileNameRequest: (tosave, usage, _, setFileName) => {
|
||||||
setFileName({ filename: 'filename', usage })
|
setFileName({ filename: 'filename', usage })
|
||||||
},
|
},
|
||||||
|
|
@ -47,10 +47,13 @@ const Handlers = ({
|
||||||
return 'content'
|
return 'content'
|
||||||
},
|
},
|
||||||
onFileWrite: (filename, content) => {},
|
onFileWrite: (filename, content) => {},
|
||||||
onExit: () => setInputType(null)
|
/* */
|
||||||
|
onExit: _ => setInputType(null)
|
||||||
})
|
})
|
||||||
|
|
||||||
export default function ({ vmParts: { file, engine } }) {
|
export default function ({ vmParts: { file, engine } }) {
|
||||||
|
const [status, setStatus] = useState(INITIAL_STATUS)
|
||||||
|
|
||||||
const [currentWindow, setCurrentWindow] = useState(null)
|
const [currentWindow, setCurrentWindow] = useState(null)
|
||||||
const [inputType, setInputType] = useState(null)
|
const [inputType, setInputType] = useState(null)
|
||||||
const [inbox, setInbox] = useState([])
|
const [inbox, setInbox] = useState([])
|
||||||
|
|
@ -62,6 +65,7 @@ export default function ({ vmParts: { file, engine } }) {
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
const handlers = Handlers({
|
const handlers = Handlers({
|
||||||
|
setStatus,
|
||||||
setCurrentWindow,
|
setCurrentWindow,
|
||||||
setInputType,
|
setInputType,
|
||||||
setInbox
|
setInbox
|
||||||
|
|
@ -86,9 +90,13 @@ export default function ({ vmParts: { file, engine } }) {
|
||||||
window.send = x => sendMessage(x, currentWindow)
|
window.send = x => sendMessage(x, currentWindow)
|
||||||
}, [sendMessage, currentWindow])
|
}, [sendMessage, currentWindow])
|
||||||
|
|
||||||
return (
|
return status.stage !== 'ready'
|
||||||
<div>
|
? (<div>{status.details}</div>)
|
||||||
Player
|
: (<section>
|
||||||
</div>
|
<TextBuffer {...{
|
||||||
)
|
inbox,
|
||||||
|
currentWindow
|
||||||
|
}}/>
|
||||||
|
<InputBox/>
|
||||||
|
</section>)
|
||||||
}
|
}
|
||||||
|
|
|
||||||
55
src/components/player/TextBuffer.js
Normal file
55
src/components/player/TextBuffer.js
Normal file
|
|
@ -0,0 +1,55 @@
|
||||||
|
import { h } from 'preact'
|
||||||
|
import { useState, useEffect } from 'preact/hooks'
|
||||||
|
|
||||||
|
const parseInbox = (inbox, currentWindow) => {
|
||||||
|
const currentInbox =
|
||||||
|
inbox.find(({id}) =>
|
||||||
|
id === currentWindow.id)
|
||||||
|
|
||||||
|
if (!currentInbox) return {
|
||||||
|
clear: false,
|
||||||
|
incoming: []}
|
||||||
|
|
||||||
|
const {clear, text: inboxMessagesRaw} =
|
||||||
|
currentInbox
|
||||||
|
|
||||||
|
const incoming =
|
||||||
|
inboxMessagesRaw
|
||||||
|
/* Normalize. */
|
||||||
|
.map(({content}) =>
|
||||||
|
content || [{ style: 'emptyLine' }])
|
||||||
|
/* Flatten. */
|
||||||
|
.reduce((acc, x) =>
|
||||||
|
acc.concat(x), [])
|
||||||
|
/* Collapse empty lines. */
|
||||||
|
.reduce((acc, x, i, xs) => {
|
||||||
|
if (x.style !== 'emptyLine') return [...acc, x]
|
||||||
|
|
||||||
|
const prev = xs[i - 1] || {}
|
||||||
|
return prev.style === 'emptyLine'
|
||||||
|
? acc
|
||||||
|
: [...acc, x]
|
||||||
|
}, [])
|
||||||
|
|
||||||
|
return {clear, incoming}
|
||||||
|
}
|
||||||
|
|
||||||
|
export default function ({ inbox, currentWindow }) {
|
||||||
|
const [messages, setMessages] = useState([])
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
const {incoming, clear} =
|
||||||
|
parseInbox(inbox, currentWindow)
|
||||||
|
|
||||||
|
setMessages(clear
|
||||||
|
? incoming
|
||||||
|
: messages.concat(incoming))
|
||||||
|
}, [inbox])
|
||||||
|
|
||||||
|
return (
|
||||||
|
<div>
|
||||||
|
{messages?.map(({text}) =>
|
||||||
|
(<div>{text}</div>))}
|
||||||
|
</div>
|
||||||
|
)
|
||||||
|
}
|
||||||
Loading…
Add table
Add a link
Reference in a new issue