Project tree view and creation (#203)

* Implement creating and importing new projects

* Add downloading a zip of a project

* Project validation (WIP)

* Add project side panel, remove project pages

* Project file saving

* Add file tree actions to rename and delete

* Fix file creation auto focus

* Add button to save file from menu

* Add project creation

* Fix specificity on version switcher button

* Update default version to 1.19

* List project files by type, remember project and delete project
This commit is contained in:
Misode
2022-06-14 16:48:55 +02:00
committed by GitHub
parent 4942729e7c
commit 90eac0f9b8
39 changed files with 1132 additions and 267 deletions

View File

@@ -0,0 +1,38 @@
import { useCallback, useEffect } from 'preact/hooks'
import type { JSXInternal } from 'preact/src/jsx'
import { LOSE_FOCUS } from '../hooks'
const MODALS_KEY = 'data-modals'
interface Props extends JSXInternal.HTMLAttributes<HTMLDivElement> {
onDismiss: () => void,
}
export function Modal(props: Props) {
useEffect(() => {
addCurrentModals(1)
window.addEventListener('click', props.onDismiss)
return () => {
addCurrentModals(-1)
window.removeEventListener('click', props.onDismiss)
}
})
const onClick = useCallback((e: MouseEvent) => {
e.stopPropagation()
e.target?.dispatchEvent(new Event(LOSE_FOCUS, { bubbles: true }))
}, [])
return <div {...props} class={`modal ${props.class ?? ''}`} onClick={onClick}>
{props.children}
</div>
}
function addCurrentModals(diff: number) {
const currentModals = parseInt(document.body.getAttribute(MODALS_KEY) ?? '0')
const newModals = currentModals + diff
if (newModals <= 0) {
document.body.removeAttribute(MODALS_KEY)
} else {
document.body.setAttribute(MODALS_KEY, newModals.toFixed())
}
}