From 5917783670d5bb5f55aee51dda9d72deefa68bda Mon Sep 17 00:00:00 2001 From: Neko Ayaka Date: Mon, 25 Aug 2025 00:04:20 +0800 Subject: [PATCH] fix(stage-ui): should exclude presets & file format handling --- .../Dialogs/model-selector/model-selector.vue | 4 ++-- .../src/components/Scenes/Live2D/Model.vue | 2 +- packages/stage-ui/src/stores/display-models.ts | 14 +++++++------- 3 files changed, 10 insertions(+), 10 deletions(-) diff --git a/packages/stage-ui/src/components/Scenarios/Dialogs/model-selector/model-selector.vue b/packages/stage-ui/src/components/Scenarios/Dialogs/model-selector/model-selector.vue index fec6feb4f..672340bbe 100644 --- a/packages/stage-ui/src/components/Scenarios/Dialogs/model-selector/model-selector.vue +++ b/packages/stage-ui/src/components/Scenarios/Dialogs/model-selector/model-selector.vue @@ -88,7 +88,7 @@ watch(vrmFiles, (newFiles) => { { px-1 py-2 > -
+
diff --git a/packages/stage-ui/src/components/Scenes/Live2D/Model.vue b/packages/stage-ui/src/components/Scenes/Live2D/Model.vue index 4763b8b88..471aeba67 100644 --- a/packages/stage-ui/src/components/Scenes/Live2D/Model.vue +++ b/packages/stage-ui/src/components/Scenes/Live2D/Model.vue @@ -151,7 +151,7 @@ async function loadModel() { if (modelSrcRef.value.startsWith('blob:')) { const res = await fetch(modelSrcRef.value) const blob = await res.blob() - await Live2DFactory.setupLive2DModel(modelInstance, [blob], { autoInteract: false }) + await Live2DFactory.setupLive2DModel(modelInstance, [new File([blob], 'model.zip')], { autoInteract: false }) } else { await Live2DFactory.setupLive2DModel(modelInstance, modelSrcRef.value, { autoInteract: false }) diff --git a/packages/stage-ui/src/stores/display-models.ts b/packages/stage-ui/src/stores/display-models.ts index 95900950a..ec183141a 100644 --- a/packages/stage-ui/src/stores/display-models.ts +++ b/packages/stage-ui/src/stores/display-models.ts @@ -25,6 +25,7 @@ export interface DisplayModelFile { file: File name: string previewImage?: string + importedAt: number } export interface DisplayModelURL { @@ -34,13 +35,12 @@ export interface DisplayModelURL { url: string name: string previewImage?: string + importedAt: number } const displayModelsPresets: DisplayModel[] = [ - { id: 'preset-live2d-1', format: DisplayModelFormat.Live2dZip, type: 'url', url: '/assets/live2d/models/hiyori_pro_zh.zip', name: 'Hiyori (Pro)', previewImage: '/assets/live2d/models/hiyori_free_zh/avatar.png' }, - { id: 'preset-live2d-2', format: DisplayModelFormat.Live2dZip, type: 'url', url: '/assets/live2d/models/hiyori_free_zh.zip', name: 'Hiyori (Free)', previewImage: '/assets/live2d/models/hiyori_free_zh/avatar.png' }, - { id: 'preset-live2d-3', format: DisplayModelFormat.Live2dZip, type: 'url', url: '/assets/live2d/models/hiyori_free_zh.zip', name: 'Hiyori (Free)' }, - { id: 'preset-live2d-4', format: DisplayModelFormat.Live2dZip, type: 'url', url: '/assets/live2d/models/hiyori_free_zh.zip', name: 'Hiyori (Free)', previewImage: '/assets/live2d/models/hiyori_free_zh/avatar.png' }, + { id: 'preset-live2d-1', format: DisplayModelFormat.Live2dZip, type: 'url', url: '/assets/live2d/models/hiyori_pro_zh.zip', name: 'Hiyori (Pro)', previewImage: '/assets/live2d/models/hiyori_free_zh/avatar.png', importedAt: 1733113886840 }, + { id: 'preset-live2d-2', format: DisplayModelFormat.Live2dZip, type: 'url', url: '/assets/live2d/models/hiyori_free_zh.zip', name: 'Hiyori (Free)', previewImage: '/assets/live2d/models/hiyori_free_zh/avatar.png', importedAt: 1733113886840 }, ] export const useDisplayModelsStore = defineStore('display-models', () => { @@ -55,9 +55,9 @@ export const useDisplayModelsStore = defineStore('display-models', () => { const models = [...displayModelsPresets] try { - await localforage.iterate<{ format: DisplayModelFormat, file: File }, void>((val, key) => { + await localforage.iterate<{ format: DisplayModelFormat, file: File, importedAt: number, previewImage?: string }, void>((val, key) => { if (key.startsWith('display-model-')) { - models.push({ id: key, format: val.format, type: 'file', file: val.file, name: val.file.name }) + models.push({ id: key, format: val.format, type: 'file', file: val.file, name: val.file.name, importedAt: val.importedAt, previewImage: val.previewImage }) } }) } @@ -76,7 +76,7 @@ export const useDisplayModelsStore = defineStore('display-models', () => { async function addDisplayModel(format: DisplayModelFormat, file: File) { await until(displayModelsFromIndexedDBLoading).toBe(false) - const newDisplayModel: DisplayModelFile = { id: `display-model-${nanoid()}`, format, type: 'file', file, name: file.name } + const newDisplayModel: DisplayModelFile = { id: `display-model-${nanoid()}`, format, type: 'file', file, name: file.name, importedAt: Date.now() } displayModels.value.push(newDisplayModel) localforage.setItem(newDisplayModel.id, newDisplayModel)