webapp/src/components/Views/Create.tsx

75 lines
2.2 KiB
TypeScript
Raw Normal View History

import { Show, onCleanup, createEffect, onError, onMount, untrack, createSignal } from 'solid-js'
2022-09-09 11:53:35 +00:00
import { createMutable, unwrap } from 'solid-js/store'
2022-11-01 19:27:43 +00:00
import { State, StateContext, newState } from '../Editor/store/context'
2022-10-18 18:43:50 +00:00
import { createCtrl } from '../Editor/store/actions'
2022-10-08 16:40:58 +00:00
import { Layout } from '../Editor/components/Layout'
2022-10-18 15:50:49 +00:00
import { Editor } from '../Editor/components/Editor'
2022-10-08 16:40:58 +00:00
import { Sidebar } from '../Editor/components/Sidebar'
import ErrorView from '../Editor/components/Error'
2022-09-09 11:53:35 +00:00
2022-10-18 15:50:49 +00:00
const matchDark = () => window.matchMedia('(prefers-color-scheme: dark)')
2022-11-01 19:27:43 +00:00
export const CreateView = () => {
const [isMounted, setIsMounted] = createSignal(false)
onMount(() => setIsMounted(true))
2022-10-19 15:56:29 +00:00
const onChangeTheme = () => ctrl.updateTheme()
2022-10-18 18:43:50 +00:00
onMount(() => {
matchDark().addEventListener('change', onChangeTheme)
onCleanup(() => matchDark().removeEventListener('change', onChangeTheme))
})
2022-11-01 19:27:43 +00:00
const [store, ctrl] = createCtrl(newState())
2022-09-09 11:53:35 +00:00
const mouseEnterCoords = createMutable({ x: 0, y: 0 })
2022-10-07 12:57:33 +00:00
const onMouseEnter = (e: MouseEvent) => {
2022-09-09 11:53:35 +00:00
mouseEnterCoords.x = e.pageX
mouseEnterCoords.y = e.pageY
}
onMount(async () => {
2022-10-09 00:00:13 +00:00
console.debug('[create] view mounted')
if (store.error) {
console.error(store.error)
return
}
2022-09-09 11:53:35 +00:00
await ctrl.init()
})
onError((error) => {
console.error('[create] error:', error)
ctrl.setState({ error: { id: 'exception', props: { error } } })
})
createEffect((prev) => {
const lastModified = store.lastModified
if (!lastModified || (store.loading === 'initialized' && prev === 'loading')) {
return store.loading
}
const state: State = untrack(() => unwrap(store))
ctrl.saveState(state)
2022-10-09 00:00:13 +00:00
console.debug('[create] status update')
2022-09-09 11:53:35 +00:00
return store.loading
}, store.loading)
return (
<Show when={isMounted()}>
<StateContext.Provider value={[store, ctrl]}>
<Layout
config={store.config}
data-testid={store.error ? 'error' : store.loading}
onMouseEnter={onMouseEnter}
>
<Show when={!store.error} fallback={<ErrorView />}>
<Editor />
<Sidebar />
</Show>
</Layout>
</StateContext.Provider>
</Show>
2022-09-09 11:53:35 +00:00
)
}
2022-11-01 19:27:43 +00:00
export default CreateView