From 81cf69c9bf69d750740fc3f3e5c805ca7a7fa925 Mon Sep 17 00:00:00 2001 From: Johann150 Date: Thu, 6 Feb 2025 19:41:02 +0100 Subject: [PATCH] client: refactor getNoteMenu Instead of re-determining `appearNote` inside `getNoteMenu`, it makes sense to pass in the value since it has already been computed anyway. --- .../client/src/components/note-detailed.vue | 4 +- packages/client/src/components/note.vue | 4 +- packages/client/src/scripts/get-note-menu.ts | 105 ++++++++++-------- 3 files changed, 61 insertions(+), 52 deletions(-) diff --git a/packages/client/src/components/note-detailed.vue b/packages/client/src/components/note-detailed.vue index 1eb1c6d21..a26801f0a 100644 --- a/packages/client/src/components/note-detailed.vue +++ b/packages/client/src/components/note-detailed.vue @@ -245,12 +245,12 @@ function onContextmenu(ev: MouseEvent): void { ev.preventDefault(); react(); } else { - os.contextMenu(getNoteMenu({ note, translating, translation, menuButton, isDeleted }), ev).then(focus); + os.contextMenu(getNoteMenu({ note: appearNote, translating, translation, menuButton, isDeleted }), ev).then(focus); } } function menu(viaKeyboard = false): void { - os.popupMenu(getNoteMenu({ note, translating, translation, menuButton, isDeleted }), menuButton.value, { + os.popupMenu(getNoteMenu({ note: appearNote, translating, translation, menuButton, isDeleted }), menuButton.value, { viaKeyboard, }).then(focus); } diff --git a/packages/client/src/components/note.vue b/packages/client/src/components/note.vue index eda606de9..c7594250e 100644 --- a/packages/client/src/components/note.vue +++ b/packages/client/src/components/note.vue @@ -233,12 +233,12 @@ function onContextmenu(ev: MouseEvent): void { ev.preventDefault(); react(); } else { - os.contextMenu(getNoteMenu({ note, translating, translation, menuButton, isDeleted, currentClipPage }), ev).then(focus); + os.contextMenu(getNoteMenu({ note: appearNote, translating, translation, menuButton, isDeleted, currentClipPage }), ev).then(focus); } } function menu(viaKeyboard = false): void { - os.popupMenu(getNoteMenu({ note, translating, translation, menuButton, isDeleted, currentClipPage }), menuButton.value, { + os.popupMenu(getNoteMenu({ note: appearNote, translating, translation, menuButton, isDeleted, currentClipPage }), menuButton.value, { viaKeyboard, }).then(focus); } diff --git a/packages/client/src/scripts/get-note-menu.ts b/packages/client/src/scripts/get-note-menu.ts index 61fc4cc73..3078c673a 100644 --- a/packages/client/src/scripts/get-note-menu.ts +++ b/packages/client/src/scripts/get-note-menu.ts @@ -16,9 +16,7 @@ export function getNoteMenu(props: { isDeleted: Ref; currentClipPage?: Ref; }) { - const appearNote = foundkey.entities.isPureRenote(props.note) - ? props.note.renote as foundkey.entities.Note - : props.note; + const isPureRenote = foundkey.entities.isPureRenote(props.note); function del(): void { os.confirm({ @@ -28,7 +26,7 @@ export function getNoteMenu(props: { if (canceled) return; os.api('notes/delete', { - noteId: appearNote.id, + noteId: props.note.id, }); }); } @@ -41,16 +39,21 @@ export function getNoteMenu(props: { if (canceled) return; os.api('notes/delete', { - noteId: appearNote.id, + noteId: props.note.id, }); - os.post({ initialNote: appearNote, renote: appearNote.renote, reply: appearNote.reply, channel: appearNote.channel }); + os.post({ + initialNote: props.note, + renote: props.note.renote, + reply: props.note.reply, + channel: props.note.channel, + }); }); } function toggleWatch(watch: boolean): void { os.apiWithDialog(watch ? 'notes/watching/create' : 'notes/watching/delete', { - noteId: appearNote.id, + noteId: props.note.id, }); } @@ -71,7 +74,7 @@ export function getNoteMenu(props: { } await os.apiWithDialog('notes/thread-muting/create', { - noteId: appearNote.id, + noteId: props.note.id, mutingNotificationTypes, }); }, @@ -80,23 +83,23 @@ export function getNoteMenu(props: { function unmuteThread(): void { os.apiWithDialog('notes/thread-muting/delete', { - noteId: appearNote.id, + noteId: props.note.id, }); } function copyContent(): void { - copyToClipboard(appearNote.text); + copyToClipboard(props.note.text); os.success(); } function copyLink(): void { - copyToClipboard(`${url}/notes/${appearNote.id}`); + copyToClipboard(`${url}/notes/${props.note.id}`); os.success(); } function togglePin(pin: boolean): void { os.apiWithDialog(pin ? 'i/pin' : 'i/unpin', { - noteId: appearNote.id, + noteId: props.note.id, }, undefined, null, res => { if (res.code === 'PIN_LIMIT_EXCEEDED') { os.alert({ @@ -134,13 +137,13 @@ export function getNoteMenu(props: { const clip = await os.apiWithDialog('clips/create', result); - os.apiWithDialog('clips/add-note', { clipId: clip.id, noteId: appearNote.id }); + os.apiWithDialog('clips/add-note', { clipId: clip.id, noteId: props.note.id }); }, }, null, ...clips.map(clip => ({ text: clip.name, action: () => { os.promiseDialog( - os.api('clips/add-note', { clipId: clip.id, noteId: appearNote.id }), + os.api('clips/add-note', { clipId: clip.id, noteId: props.note.id }), null, async (err) => { if (err.id === 'ALREADY_CLIPPED') { @@ -149,7 +152,7 @@ export function getNoteMenu(props: { text: i18n.t('confirmToUnclipAlreadyClippedNote', { name: clip.name }), }); if (!confirm.canceled) { - os.apiWithDialog('clips/remove-note', { clipId: clip.id, noteId: appearNote.id }); + os.apiWithDialog('clips/remove-note', { clipId: clip.id, noteId: props.note.id }); if (props.currentClipPage?.value.id === clip.id) props.isDeleted.value = true; } } else { @@ -166,15 +169,15 @@ export function getNoteMenu(props: { } async function unclip(): Promise { - os.apiWithDialog('clips/remove-note', { clipId: props.currentClipPage.value.id, noteId: appearNote.id }); + os.apiWithDialog('clips/remove-note', { clipId: props.currentClipPage.value.id, noteId: props.note.id }); props.isDeleted.value = true; } function share(): void { navigator.share({ - title: i18n.t('noteOf', { user: appearNote.user.name || appearNote.user.username }), - text: appearNote.text, - url: `${url}/notes/${appearNote.id}`, + title: i18n.t('noteOf', { user: props.note.user.name || props.note.user.username }), + text: props.note.text, + url: `${url}/notes/${props.note.id}`, }); } @@ -190,7 +193,7 @@ export function getNoteMenu(props: { } const res = await os.api('notes/translate', { - noteId: appearNote.id, + noteId: props.note.id, targetLang, }); props.translating.value = false; @@ -200,7 +203,7 @@ export function getNoteMenu(props: { let menu; if ($i) { const statePromise = os.api('notes/state', { - noteId: appearNote.id, + noteId: props.note.id, }); menu = [ @@ -212,19 +215,21 @@ export function getNoteMenu(props: { action: unclip, }, null] : [] ), - { + !isPureRenote ? { icon: 'fas fa-copy', text: i18n.ts.copyContent, action: copyContent, - }, { + } : undefined, + { icon: 'fas fa-link', text: i18n.ts.copyLink, action: copyLink, - }, (appearNote.url || appearNote.uri) ? { + }, + (props.note.url || props.note.uri) ? { icon: 'fas fa-external-link-square-alt', text: i18n.ts.showOnRemote, action: () => { - window.open(appearNote.url || appearNote.uri, '_blank'); + window.open(props.note.url || props.note.uri, '_blank'); }, } : undefined, { @@ -232,7 +237,7 @@ export function getNoteMenu(props: { text: i18n.ts.share, action: share, }, - instance.translatorAvailable ? { + (!isPureRenote && instance.translatorAvailable) ? { icon: 'fas fa-language', text: i18n.ts.translate, action: translate, @@ -243,7 +248,7 @@ export function getNoteMenu(props: { text: i18n.ts.clip, action: () => clip(), }, - (appearNote.userId !== $i.id) ? statePromise.then(state => state.isWatching ? { + (props.note.userId !== $i.id) ? statePromise.then(state => state.isWatching ? { icon: 'fas fa-eye-slash', text: i18n.ts.unwatch, action: () => toggleWatch(false), @@ -261,7 +266,7 @@ export function getNoteMenu(props: { text: i18n.ts.muteThread, action: () => muteThread(), }), - appearNote.userId === $i.id ? ($i.pinnedNoteIds || []).includes(appearNote.id) ? { + props.note.userId === $i.id ? ($i.pinnedNoteIds || []).includes(props.note.id) ? { icon: 'fas fa-thumbtack', text: i18n.ts.unpin, action: () => togglePin(false), @@ -270,24 +275,24 @@ export function getNoteMenu(props: { text: i18n.ts.pin, action: () => togglePin(true), } : undefined, - ...(appearNote.userId !== $i.id ? [ + ...(props.note.userId !== $i.id && !isPureRenote ? [ null, { icon: 'fas fa-exclamation-circle', text: i18n.ts.reportAbuse, action: () => { - const u = appearNote.url || appearNote.uri || `${url}/notes/${appearNote.id}`; + const u = props.note.url || props.note.uri || `${url}/notes/${props.note.id}`; os.popup(defineAsyncComponent(() => import('@/components/abuse-report-window.vue')), { - user: appearNote.user, + user: props.note.user, urls: [u], }, {}, 'closed'); }, }] : [] ), - ...(appearNote.userId === $i.id || $i.isModerator || $i.isAdmin ? [ + ...(props.note.userId === $i.id || $i.isModerator || $i.isAdmin ? [ null, - appearNote.userId === $i.id ? { + (!isPureRenote && props.note.userId === $i.id) ? { icon: 'fas fa-edit', text: i18n.ts.deleteAndEdit, action: delEdit, @@ -302,21 +307,25 @@ export function getNoteMenu(props: { )] .filter(x => x !== undefined); } else { - menu = [{ - icon: 'fas fa-copy', - text: i18n.ts.copyContent, - action: copyContent, - }, { - icon: 'fas fa-link', - text: i18n.ts.copyLink, - action: copyLink, - }, (appearNote.url || appearNote.uri) ? { - icon: 'fas fa-external-link-square-alt', - text: i18n.ts.showOnRemote, - action: () => { - window.open(appearNote.url || appearNote.uri, '_blank'); + menu = [ + !isPureRenote ? { + icon: 'fas fa-copy', + text: i18n.ts.copyContent, + action: copyContent, + } : undefined, + { + icon: 'fas fa-link', + text: i18n.ts.copyLink, + action: copyLink, }, - } : undefined] + (props.note.url || props.note.uri) ? { + icon: 'fas fa-external-link-square-alt', + text: i18n.ts.showOnRemote, + action: () => { + window.open(props.note.url || props.note.uri, '_blank'); + }, + } : undefined + ] .filter(x => x !== undefined); } @@ -325,7 +334,7 @@ export function getNoteMenu(props: { icon: 'fas fa-plug', text: action.title, action: () => { - action.handler(appearNote); + action.handler(props.note); }, }))]); }