From f4167ae7f1df7c2cd4cf264fc4d79d51b8c51133 Mon Sep 17 00:00:00 2001 From: syuilo <4439005+syuilo@users.noreply.github.com> Date: Sun, 1 Jun 2025 10:44:45 +0900 Subject: enhance(frontend): 非同期的なコンポーネントの読み込み時のハンドリングを強化 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/frontend/src/os.ts | 50 +++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 48 insertions(+), 2 deletions(-) (limited to 'packages/frontend/src/os.ts') diff --git a/packages/frontend/src/os.ts b/packages/frontend/src/os.ts index 08291a5595..d50f50cf20 100644 --- a/packages/frontend/src/os.ts +++ b/packages/frontend/src/os.ts @@ -206,6 +206,52 @@ export function popup( }; } +export async function popupAsyncWithDialog( + componentFetching: Promise, + props: ComponentProps, + events: Partial> = {}, +): Promise<{ dispose: () => void }> { + const closeWaiting = waiting(); + + let component: T; + + try { + component = await componentFetching; + } catch (err) { + closeWaiting(); + alert({ + type: 'error', + title: i18n.ts.somethingHappened, + text: 'CODE: ASYNC_COMP_LOAD_FAIL', + }); + throw err; + } + + closeWaiting(); + + markRaw(component); + + const id = ++popupIdCount; + const dispose = () => { + // このsetTimeoutが無いと挙動がおかしくなる(autocompleteが閉じなくなる)。Vueのバグ? + window.setTimeout(() => { + popups.value = popups.value.filter(p => p.id !== id); + }, 0); + }; + const state = { + component, + props, + events, + id, + }; + + popups.value.push(state); + + return { + dispose, + }; +} + export function pageWindow(path: string) { const { dispose } = popup(MkPageWindow, { initialPath: path, @@ -787,9 +833,9 @@ export function launchUploader( multiple?: boolean; }, ): Promise { - return new Promise((res, rej) => { + return new Promise(async (res, rej) => { if (files.length === 0) return rej(); - const { dispose } = popup(defineAsyncComponent(() => import('@/components/MkUploaderDialog.vue')), { + const { dispose } = await popupAsyncWithDialog(import('@/components/MkUploaderDialog.vue').then(x => x.default), { files: markRaw(files), folderId: options?.folderId, multiple: options?.multiple, -- cgit v1.2.3-freya