From 2bef39287dd77dca2d1d492012f7be96e6e0a36b Mon Sep 17 00:00:00 2001 From: Vixalie Date: Fri, 27 Mar 2026 16:49:47 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=B7=BB=E5=8A=A0=E6=95=B0=E6=8D=AE?= =?UTF-8?q?=E9=9B=86=E5=8A=A0=E8=BD=BD=E5=8A=9F=E8=83=BD=EF=BC=8C=E6=94=AF?= =?UTF-8?q?=E6=8C=81=E4=BB=8E=E6=96=87=E4=BB=B6=E8=AF=BB=E5=8F=96=E5=85=83?= =?UTF-8?q?=E6=95=B0=E6=8D=AE=E5=92=8C=E5=9B=BE=E5=83=8F=E5=85=83=E6=95=B0?= =?UTF-8?q?=E6=8D=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/lib/stores/dataset.ts | 5 ++++ src/routes/dataset/+page.ts | 53 +++++++++++++++++++++++++++++++++++++ 2 files changed, 58 insertions(+) create mode 100644 src/routes/dataset/+page.ts diff --git a/src/lib/stores/dataset.ts b/src/lib/stores/dataset.ts index 188f58e..487e0e2 100644 --- a/src/lib/stores/dataset.ts +++ b/src/lib/stores/dataset.ts @@ -1,3 +1,8 @@ +import type { DatasetMeta, ImageMeta } from "$lib/types/meta"; import { writable } from "svelte/store"; export const openedDatasetDir = writable(null); + +export const activeDatasetMeta = writable(null); + +export const activeDatasetImageMetas = writable([]); diff --git a/src/routes/dataset/+page.ts b/src/routes/dataset/+page.ts new file mode 100644 index 0000000..e64483a --- /dev/null +++ b/src/routes/dataset/+page.ts @@ -0,0 +1,53 @@ +import { goto } from '$app/navigation'; +import { activeDatasetImageMetas, activeDatasetMeta, openedDatasetDir } from '$lib/stores/dataset'; +import { isDatasetMeta, type ImageMeta } from '$lib/types/meta'; +import { join } from '@tauri-apps/api/path'; +import { readDir, readTextFile } from '@tauri-apps/plugin-fs'; +import { isNil } from 'es-toolkit'; +import { get } from 'svelte/store'; +import type { PageLoad } from './$types'; + +export const load = (async () => { + const activeDataset = get(openedDatasetDir); + + if (isNil(activeDataset)) { + await goto('/boot'); + return {}; + } + + try { + const metaPath = await join(activeDataset, 'meta.json'); + const metaText = await readTextFile(metaPath); + const parsedMeta: unknown = JSON.parse(metaText); + + if (!isDatasetMeta(parsedMeta)) { + activeDatasetMeta.set(null); + activeDatasetImageMetas.set([]); + await goto('/boot'); + return {}; + } + + activeDatasetMeta.set(parsedMeta); + + const entries = await readDir(activeDataset); + const hasImagesMeta = entries.some((entry) => entry.name === 'images.json'); + + if (!hasImagesMeta) { + activeDatasetImageMetas.set([]); + return {}; + } + + const imagesPath = await join(activeDataset, 'images.json'); + const imagesText = await readTextFile(imagesPath); + const parsedImages: unknown = JSON.parse(imagesText); + const imageMetas = Array.isArray(parsedImages) ? (parsedImages as ImageMeta[]) : []; + + activeDatasetImageMetas.set(imageMetas); + } catch { + activeDatasetMeta.set(null); + activeDatasetImageMetas.set([]); + await goto('/boot'); + } + + return {}; +}) satisfies PageLoad;