From 90c40cd153c40421a768b83d50f8f63a4c7ada82 Mon Sep 17 00:00:00 2001 From: syuilo <4439005+syuilo@users.noreply.github.com> Date: Tue, 13 May 2025 14:20:43 +0900 Subject: [PATCH] wip --- packages/frontend/src/components/MkDrive.vue | 6 ++-- .../frontend/src/components/MkPostForm.vue | 2 +- ...kUploadDialog.vue => MkUploaderDialog.vue} | 0 packages/frontend/src/os.ts | 19 +++++++++++++ .../frontend/src/pages/chat/room.form.vue | 8 ++++-- packages/frontend/src/utility/select-file.ts | 28 +++++++------------ 6 files changed, 39 insertions(+), 24 deletions(-) rename packages/frontend/src/components/{MkUploadDialog.vue => MkUploaderDialog.vue} (100%) diff --git a/packages/frontend/src/components/MkDrive.vue b/packages/frontend/src/components/MkDrive.vue index b5840dad51..edbde654ec 100644 --- a/packages/frontend/src/components/MkDrive.vue +++ b/packages/frontend/src/components/MkDrive.vue @@ -316,9 +316,9 @@ function onDrop(ev: DragEvent) { // ドロップされてきたものがファイルだったら if (ev.dataTransfer.files.length > 0) { - for (const file of Array.from(ev.dataTransfer.files)) { - upload(file, folder.value); - } + os.launchUploader(Array.from(ev.dataTransfer.files), { + folderId: folder.value?.id ?? null, + }); return; } diff --git a/packages/frontend/src/components/MkPostForm.vue b/packages/frontend/src/components/MkPostForm.vue index 76965f91f5..457a369ddb 100644 --- a/packages/frontend/src/components/MkPostForm.vue +++ b/packages/frontend/src/components/MkPostForm.vue @@ -729,7 +729,7 @@ function onDrop(ev: DragEvent): void { // ファイルだったら if (ev.dataTransfer && ev.dataTransfer.files.length > 0) { ev.preventDefault(); - for (const x of Array.from(ev.dataTransfer.files)) upload(x); + os.launchUploader(Array.from(ev.dataTransfer.files), {}); return; } diff --git a/packages/frontend/src/components/MkUploadDialog.vue b/packages/frontend/src/components/MkUploaderDialog.vue similarity index 100% rename from packages/frontend/src/components/MkUploadDialog.vue rename to packages/frontend/src/components/MkUploaderDialog.vue diff --git a/packages/frontend/src/os.ts b/packages/frontend/src/os.ts index 9d26242c3c..6d58307ea0 100644 --- a/packages/frontend/src/os.ts +++ b/packages/frontend/src/os.ts @@ -773,3 +773,22 @@ export function checkExistence(fileData: ArrayBuffer): Promise { }); }); }*/ + +export function launchUploader( + files: File[], + options?: { + folderId?: string | null; + }, +): Promise { + return new Promise((res, rej) => { + const { dispose } = popup(defineAsyncComponent(() => import('@/components/MkUploaderDialog.vue')), { + files: markRaw(files), + folderId: options?.folderId, + }, { + done: driveFiles => { + res(driveFiles); + }, + closed: () => dispose(), + }); + }); +} diff --git a/packages/frontend/src/pages/chat/room.form.vue b/packages/frontend/src/pages/chat/room.form.vue index ff3ea6d32b..138359e05e 100644 --- a/packages/frontend/src/pages/chat/room.form.vue +++ b/packages/frontend/src/pages/chat/room.form.vue @@ -128,7 +128,7 @@ function onDrop(ev: DragEvent): void { // ファイルだったら if (ev.dataTransfer.files.length === 1) { ev.preventDefault(); - upload(ev.dataTransfer.files[0]); + os.launchUploader([Array.from(ev.dataTransfer.files)[0]], {}); return; } else if (ev.dataTransfer.files.length > 1) { ev.preventDefault(); @@ -173,7 +173,11 @@ function chooseFile(ev: MouseEvent) { function onChangeFile() { if (fileEl.value == null || fileEl.value.files == null) return; - if (fileEl.value.files[0]) upload(fileEl.value.files[0]); + if (fileEl.value.files[0]) { + os.launchUploader(Array.from(fileEl.value.files), {}).then(driveFiles => { + file.value = driveFiles[0]; + }); + } } function send() { diff --git a/packages/frontend/src/utility/select-file.ts b/packages/frontend/src/utility/select-file.ts index fe8a87f111..a5e458b9ff 100644 --- a/packages/frontend/src/utility/select-file.ts +++ b/packages/frontend/src/utility/select-file.ts @@ -3,7 +3,7 @@ * SPDX-License-Identifier: AGPL-3.0-only */ -import { defineAsyncComponent, markRaw, ref } from 'vue'; +import { } from 'vue'; import * as Misskey from 'misskey-js'; import * as os from '@/os.js'; import { misskeyApi } from '@/utility/misskey-api.js'; @@ -12,30 +12,22 @@ import { i18n } from '@/i18n.js'; import { prefer } from '@/preferences.js'; export function chooseFileFromPc( - multiple: boolean, - options?: { - uploadFolder?: string | null; - nameConverter?: (file: File) => string | undefined; - }, + options: { + multiple?: boolean; + folderId?: string | null; + } = {}, ): Promise { - const uploadFolder = options?.uploadFolder ?? prefer.s.uploadFolder; - const nameConverter = options?.nameConverter ?? (() => undefined); - return new Promise((res, rej) => { const input = window.document.createElement('input'); input.type = 'file'; - input.multiple = multiple; + input.multiple = options.multiple ?? false; input.onchange = () => { if (!input.files) return res([]); - const { dispose } = os.popup(defineAsyncComponent(() => import('@/components/MkUploadDialog.vue')), { - files: markRaw(Array.from(input.files)), - folderId: uploadFolder, - }, { - done: driveFiles => { - res(driveFiles); - }, - closed: () => dispose(), + os.launchUploader(Array.from(input.files), { + folderId: options.folderId, + }).then(driveFiles => { + res(driveFiles); }); // 一応廃棄