From 171632365d59dda2e19e16a75667754ed878fad2 Mon Sep 17 00:00:00 2001 From: syuilo <4439005+syuilo@users.noreply.github.com> Date: Fri, 6 Jun 2025 17:48:27 +0900 Subject: [PATCH] wip --- locales/index.d.ts | 4 + locales/ja-JP.yml | 1 + .../frontend/src/components/MkPostForm.vue | 20 +++ .../src/components/MkPostFormDialog.vue | 15 ++- .../src/components/MkUploaderDialog.vue | 4 +- .../src/components/MkUploaderItems.vue | 6 +- .../frontend/src/composables/use-uploader.ts | 126 +++++++++++------- 7 files changed, 118 insertions(+), 58 deletions(-) diff --git a/locales/index.d.ts b/locales/index.d.ts index a4671aa812..31ab795552 100644 --- a/locales/index.d.ts +++ b/locales/index.d.ts @@ -9584,6 +9584,10 @@ export interface Locale extends ILocale { "disableFederationDescription": string; }; "_postForm": { + /** + * アップロードされていないファイルがありますが、破棄してフォームを閉じますか? + */ + "quitInspiteOfThereAreUnuploadedFilesConfirm": string; /** * このノートに返信... */ diff --git a/locales/ja-JP.yml b/locales/ja-JP.yml index 4988bfc259..e5c0481945 100644 --- a/locales/ja-JP.yml +++ b/locales/ja-JP.yml @@ -2522,6 +2522,7 @@ _visibility: disableFederationDescription: "他サーバーへの配信を行いません" _postForm: + quitInspiteOfThereAreUnuploadedFilesConfirm: "アップロードされていないファイルがありますが、破棄してフォームを閉じますか?" replyPlaceholder: "このノートに返信..." quotePlaceholder: "このノートを引用..." channelPlaceholder: "チャンネルに投稿..." diff --git a/packages/frontend/src/components/MkPostForm.vue b/packages/frontend/src/components/MkPostForm.vue index 525c780602..a7755a26cd 100644 --- a/packages/frontend/src/components/MkPostForm.vue +++ b/packages/frontend/src/components/MkPostForm.vue @@ -214,6 +214,11 @@ const uploader = useUploader({ features: props.features, }); +uploader.events.on('itemUploaded', ctx => { + files.value.push(ctx.item.uploaded!); + uploader.removeItem(ctx.item); +}); + const draftKey = computed((): string => { let key = props.channel ? `channel:${props.channel.id}` : ''; @@ -1151,8 +1156,23 @@ onMounted(() => { }); }); +async function canClose() { + if (!uploader.allItemsUploaded.value) { + const { canceled } = await os.confirm({ + type: 'question', + text: i18n.ts._postForm.quitInspiteOfThereAreUnuploadedFilesConfirm, + okText: i18n.ts.yes, + cancelText: i18n.ts.no, + }); + if (canceled) return false; + } + + return true; +} + defineExpose({ clear, + canClose, }); diff --git a/packages/frontend/src/components/MkPostFormDialog.vue b/packages/frontend/src/components/MkPostFormDialog.vue index c467e29df6..0a655bab99 100644 --- a/packages/frontend/src/components/MkPostFormDialog.vue +++ b/packages/frontend/src/components/MkPostFormDialog.vue @@ -7,9 +7,9 @@ SPDX-License-Identifier: AGPL-3.0-only @@ -43,6 +43,7 @@ const emit = defineEmits<{ }>(); const modal = useTemplateRef('modal'); +const form = useTemplateRef('form'); function onPosted() { modal.value?.close({ @@ -50,6 +51,12 @@ function onPosted() { }); } +async function _close() { + const canClose = await form.value?.canClose(); + if (!canClose) return; + modal.value?.close(); +} + function onModalClosed() { emit('closed'); } diff --git a/packages/frontend/src/components/MkUploaderDialog.vue b/packages/frontend/src/components/MkUploaderDialog.vue index 142d1cd788..ce098d71e4 100644 --- a/packages/frontend/src/components/MkUploaderDialog.vue +++ b/packages/frontend/src/components/MkUploaderDialog.vue @@ -93,7 +93,7 @@ onMounted(() => { const items = uploader.items; const firstUploadAttempted = ref(false); -const canRetry = computed(() => firstUploadAttempted.value && !items.value.some(item => item.uploading || item.preprocessing) && items.value.some(item => item.uploaded == null)); +const canRetry = computed(() => firstUploadAttempted.value && uploader.readyForUpload.value); const canDone = computed(() => items.value.some(item => item.uploaded != null)); const overallProgress = computed(() => { const max = items.value.length; @@ -151,7 +151,7 @@ async function abortWithConfirm() { } async function done() { - if (items.value.some(item => item.uploaded == null)) { + if (!uploader.allItemsUploaded.value) { const { canceled } = await os.confirm({ type: 'question', text: i18n.ts._uploader.doneConfirm, diff --git a/packages/frontend/src/components/MkUploaderItems.vue b/packages/frontend/src/components/MkUploaderItems.vue index e4cd22e5ed..2d624cf344 100644 --- a/packages/frontend/src/components/MkUploaderItems.vue +++ b/packages/frontend/src/components/MkUploaderItems.vue @@ -17,7 +17,7 @@ SPDX-License-Identifier: AGPL-3.0-only
-
+
{{ item.name }}
@@ -60,6 +60,10 @@ function onContextmenu(item: UploaderItem, ev: MouseEvent) { emit('showMenuViaContextmenu', item, ev); } + +function onThumbnailClick(item: UploaderItem, ev: MouseEvent) { + // TODO: preview when item is image +}