Fix #637 unsupported project storage undefined on first load

This commit is contained in:
Misode
2024-11-27 22:39:49 +01:00
parent 5c874e3f8a
commit dc72614e85
6 changed files with 33 additions and 25 deletions

View File

@@ -33,6 +33,9 @@ export function FileCreation({ docAndNode, gen, method }: Props) {
}
const doSave = useCallback(() => {
if (!project) {
return
}
if (!fileId.match(/^([a-z0-9_.-]+:)?[a-z0-9/_.-]+$/)) {
setError('Invalid resource location')
return

View File

@@ -11,13 +11,16 @@ export function ProjectDeletion() {
const { project, deleteProject } = useProject()
const doSave = useCallback(() => {
if (!project) {
return
}
Analytics.deleteProject('menu')
deleteProject(project.name)
deleteProject(project!.name)
hideModal()
}, [deleteProject, hideModal])
return <Modal class="file-modal">
<p>{locale('project.delete_confirm.1', project.name)}</p>
<p>{project && locale('project.delete_confirm.1', project.name)}</p>
<p><b>{locale('project.delete_confirm.2')}</b></p>
<div class="button-group">
<Btn icon="trashcan" label={locale('project.delete')} onClick={doSave} class="danger" />

View File

@@ -22,11 +22,14 @@ export function ProjectPanel() {
const { projects, project, projectUri, setProjectUri, changeProject } = useProject()
const { client, service } = useSpyglass()
const projectRoot = getProjectRoot(project)
const projectRoot = project ? getProjectRoot(project) : undefined
const [entries, setEntries] = useState<string[]>()
useEffect(() => {
setEntries(undefined)
if (!projectRoot) {
return
}
client.fs.readdir(projectRoot).then(entries => {
setEntries(entries.flatMap(e => {
return e.isFile() ? [e.name.slice(projectRoot.length)] : []
@@ -34,7 +37,7 @@ export function ProjectPanel() {
})
}, [projectRoot])
useEffect(() => {
if (!service) {
if (!service || !projectRoot) {
return
}
service.watchTree(projectRoot, setEntries)
@@ -44,7 +47,9 @@ export function ProjectPanel() {
const download = useRef<HTMLAnchorElement>(null)
const onDownload = async () => {
if (!download.current || entries === undefined) return
if (!download.current || entries === undefined || !project) {
return
}
const zipEntries = await Promise.all(entries.map(async e => {
const data = await client.fs.readFile(projectRoot + e)
return [e, data] as [string, Uint8Array]
@@ -139,13 +144,13 @@ export function ProjectPanel() {
return <div class="panel-content">
<div class="project-controls">
<BtnMenu icon="chevron_down" label={project.name} tooltip={locale('switch_project')} tooltipLoc="se">
{projects.map(p => <Btn label={p.name} active={p.name === project.name} onClick={() => changeProject(p.name)} />)}
<BtnMenu icon="chevron_down" label={project ? project.name : locale('loading')} tooltip={locale('switch_project')} tooltipLoc="se">
{projects.map(p => <Btn label={p.name} active={p.name === project?.name} onClick={() => changeProject(p.name)} />)}
</BtnMenu>
<BtnMenu icon="kebab_horizontal" >
<Btn icon="file_zip" label={locale('project.download')} onClick={onDownload} />
<Btn icon="plus_circle" label={locale('project.new')} onClick={onCreateProject} />
{project.name !== DRAFT_PROJECT.name && <Btn icon="trashcan" label={locale('project.delete')} onClick={onDeleteProject} />}
{(project && project.name !== DRAFT_PROJECT.name) && <Btn icon="trashcan" label={locale('project.delete')} onClick={onDeleteProject} />}
</BtnMenu>
</div>
<div class="project-files">

View File

@@ -118,7 +118,7 @@ export function SchemaGenerator({ gen, allowedVersions }: Props) {
ignoreChange.current = false
Analytics.setGenerator(gen.id)
return docAndNode
}, [gen.id, version, sharedSnippetId, currentPreset, project.name, service, uri])
}, [gen.id, version, sharedSnippetId, currentPreset, service, uri])
const { doc } = docAndNode ?? {}
@@ -216,7 +216,7 @@ export function SchemaGenerator({ gen, allowedVersions }: Props) {
const selectVersion = (version: VersionId) => {
setSharedSnippetId(undefined, true)
changeVersion(version)
if (project.name !== DRAFT_PROJECT.name && project.version !== version) {
if (project && project.name !== DRAFT_PROJECT.name && project.version !== version) {
updateProject({ version })
}
}