diff --git a/src/app/components/generator/ProjectDeletion.tsx b/src/app/components/generator/ProjectDeletion.tsx
index 04856d33..7145b5a5 100644
--- a/src/app/components/generator/ProjectDeletion.tsx
+++ b/src/app/components/generator/ProjectDeletion.tsx
@@ -1,28 +1,27 @@
import { useCallback } from 'preact/hooks'
import { Analytics } from '../../Analytics.js'
import { useLocale, useProject } from '../../contexts/index.js'
+import { useModal } from '../../contexts/Modal.jsx'
import { Btn } from '../Btn.js'
import { Modal } from '../Modal.js'
-interface Props {
- onClose: () => void,
-}
-export function ProjectDeletion({ onClose }: Props) {
+export function ProjectDeletion() {
const { locale } = useLocale()
+ const { hideModal } = useModal()
const { project, deleteProject } = useProject()
const doSave = useCallback(() => {
Analytics.deleteProject('menu')
deleteProject(project.name)
- onClose()
- }, [onClose, deleteProject])
+ hideModal()
+ }, [deleteProject, hideModal])
- return
+ return
{locale('project.delete_confirm.1', project.name)}
{locale('project.delete_confirm.2')}
-
+
}
diff --git a/src/app/components/generator/ProjectPanel.tsx b/src/app/components/generator/ProjectPanel.tsx
index e43d545a..1b9b4993 100644
--- a/src/app/components/generator/ProjectPanel.tsx
+++ b/src/app/components/generator/ProjectPanel.tsx
@@ -2,6 +2,7 @@ import { route } from 'preact-router'
import { useCallback, useMemo, useRef } from 'preact/hooks'
import config from '../../Config.js'
import { DRAFT_PROJECT, getProjectRoot, useLocale, useProject } from '../../contexts/index.js'
+import { useModal } from '../../contexts/Modal.jsx'
import { useSpyglass } from '../../contexts/Spyglass.jsx'
import { useAsync } from '../../hooks/useAsync.js'
import { useFocus } from '../../hooks/useFocus.js'
@@ -11,15 +12,13 @@ import { BtnMenu } from '../BtnMenu.js'
import { Octicon } from '../Octicon.jsx'
import type { TreeViewGroupRenderer, TreeViewLeafRenderer } from '../TreeView.js'
import { TreeView } from '../TreeView.js'
+import { FileRenaming } from './FileRenaming.jsx'
+import { ProjectCreation } from './ProjectCreation.jsx'
+import { ProjectDeletion } from './ProjectDeletion.jsx'
-interface Props {
- onError: (message: string) => void,
- onRename: (uri: string) => void,
- onCreateProject: () => void,
- onDeleteProject: () => void,
-}
-export function ProjectPanel({ onRename, onCreateProject, onDeleteProject}: Props) {
+export function ProjectPanel() {
const { locale } = useLocale()
+ const { showModal } = useModal()
const { projects, project, projectUri, setProjectUri, changeProject } = useProject()
const { client, service } = useSpyglass()
@@ -47,12 +46,20 @@ export function ProjectPanel({ onRename, onCreateProject, onDeleteProject}: Prop
download.current.click()
}
+ const onDeleteProject = useCallback(() => {
+ showModal(() => )
+ }, [])
+
+ const onCreateProject = useCallback(() => {
+ showModal(() => )
+ }, [])
+
const actions = useMemo(() => [
{
icon: 'pencil',
label: locale('project.rename_file'),
onAction: (uri: string) => {
- onRename(uri)
+ showModal(() => )
},
},
{
@@ -64,7 +71,7 @@ export function ProjectPanel({ onRename, onCreateProject, onDeleteProject}: Prop
})
},
},
- ], [client, onRename, projectRoot])
+ ], [client, projectRoot, showModal])
const FolderEntry: TreeViewGroupRenderer = useCallback(({ name, open, onClick }) => {
return
diff --git a/src/app/components/generator/SchemaGenerator.tsx b/src/app/components/generator/SchemaGenerator.tsx
index 8c6d8fae..300782da 100644
--- a/src/app/components/generator/SchemaGenerator.tsx
+++ b/src/app/components/generator/SchemaGenerator.tsx
@@ -5,6 +5,7 @@ import { Analytics } from '../../Analytics.js'
import type { ConfigGenerator } from '../../Config.js'
import config from '../../Config.js'
import { DRAFT_PROJECT, useLocale, useProject, useVersion } from '../../contexts/index.js'
+import { useModal } from '../../contexts/Modal.jsx'
import { useSpyglass, watchSpyglassUri } from '../../contexts/Spyglass.jsx'
import { AsyncCancel, useActiveTimeout, useAsync, useSearchParam } from '../../hooks/index.js'
import type { VersionId } from '../../services/index.js'
@@ -12,7 +13,7 @@ import { checkVersion, fetchDependencyMcdoc, fetchPreset, fetchRegistries, getSn
import { DEPENDENCY_URI } from '../../services/Spyglass.js'
import { Store } from '../../Store.js'
import { cleanUrl, genPath } from '../../Utils.js'
-import { Ad, Btn, BtnMenu, ErrorPanel, FileCreation, FileRenaming, Footer, HasPreview, Octicon, PreviewPanel, ProjectCreation, ProjectDeletion, ProjectPanel, SearchList, SourcePanel, TextInput, Tree, VersionSwitcher } from '../index.js'
+import { Ad, Btn, BtnMenu, ErrorPanel, FileCreation, Footer, HasPreview, Octicon, PreviewPanel, ProjectPanel, SearchList, SourcePanel, TextInput, Tree, VersionSwitcher } from '../index.js'
import { getRootDefault } from './McdocHelpers.js'
export const SHARE_KEY = 'share'
@@ -25,6 +26,7 @@ export function SchemaGenerator({ gen, allowedVersions }: Props) {
const { locale } = useLocale()
const { version, changeVersion, changeTargetVersion } = useVersion()
const { service } = useSpyglass()
+ const { showModal } = useModal()
const { project, projectUri, setProjectUri, updateProject } = useProject()
const [error, setError] = useState(null)
const [errorBoundary, errorRetry] = useErrorBoundary()
@@ -164,7 +166,7 @@ export function SchemaGenerator({ gen, allowedVersions }: Props) {
Analytics.redoGenerator(gen.id, 1, 'hotkey')
await service.redoEdit(uri)
} else if (e.ctrlKey && e.key === 's') {
- setFileSaving('hotkey')
+ saveFile('hotkey')
e.preventDefault()
e.stopPropagation()
}
@@ -302,7 +304,7 @@ export function SchemaGenerator({ gen, allowedVersions }: Props) {
}
}
- const [projectShown, setProjectShown] = useState(Store.getProjectPanelOpen() ?? window.innerWidth > 1000)
+ const [projectShown, setProjectShown] = useState(Store.getProjectPanelOpen() ?? false)
const toggleProjectShown = useCallback(() => {
if (projectShown) {
Analytics.hideProject('menu')
@@ -313,15 +315,22 @@ export function SchemaGenerator({ gen, allowedVersions }: Props) {
setProjectShown(!projectShown)
}, [projectShown])
- const [projectCreating, setProjectCreating] = useState(false)
- const [projectDeleting, setprojectDeleting] = useState(false)
- const [fileSaving, setFileSaving] = useState(undefined)
- const [fileRenaming, setFileRenaming] = useState(undefined)
+ const saveFile = useCallback((method: Method) => {
+ if (!docAndNode) {
+ return
+ }
+ showModal(() => )
+ }, [showModal, gen, docAndNode])
- const onNewFile = useCallback(() => {
+ const newEmptyFile = useCallback(async () => {
+ if (service) {
+ const unsavedUri = service.getUnsavedFileUri(gen)
+ const node = getRootDefault(gen.id, service.getCheckerContext())
+ const text = service.formatNode(node, unsavedUri)
+ await service.writeFile(unsavedUri, text)
+ }
setProjectUri(undefined)
- // TODO: create new file with default contents
- }, [setProjectUri])
+ }, [showModal])
return <>
@@ -339,8 +348,8 @@ export function SchemaGenerator({ gen, allowedVersions }: Props) {
-
- setFileSaving('menu')} />
+
+ saveFile('menu')} />
{error && setError(null)} />}
@@ -380,11 +389,7 @@ export function SchemaGenerator({ gen, allowedVersions }: Props) {