From c39c978c27b93ab7b431860c091de73415596b1c Mon Sep 17 00:00:00 2001 From: sim1222 Date: Thu, 22 Dec 2022 16:42:38 +0900 Subject: [PATCH] feat: import to react remote emoji --- .../components/MkReactionsViewer.reaction.vue | 2 +- .../client/src/scripts/reactionImportMenu.ts | 41 +++++++++++++++---- 2 files changed, 35 insertions(+), 8 deletions(-) diff --git a/packages/client/src/components/MkReactionsViewer.reaction.vue b/packages/client/src/components/MkReactionsViewer.reaction.vue index 01607dbb9..f025e805a 100644 --- a/packages/client/src/components/MkReactionsViewer.reaction.vue +++ b/packages/client/src/components/MkReactionsViewer.reaction.vue @@ -93,7 +93,7 @@ useTooltip(buttonRef, async (showing) => { const onContextmenu = (e: MouseEvent) => { e.preventDefault(); - openReactionImportMenu(e, props.reaction); + openReactionImportMenu(e, props.reaction, props.note.id); }; diff --git a/packages/client/src/scripts/reactionImportMenu.ts b/packages/client/src/scripts/reactionImportMenu.ts index e9b9092f1..7a5fadc06 100644 --- a/packages/client/src/scripts/reactionImportMenu.ts +++ b/packages/client/src/scripts/reactionImportMenu.ts @@ -5,7 +5,7 @@ import * as os from '@/os'; import copyToClipboard from '@/scripts/copy-to-clipboard'; import { MenuItem } from '@/types/menu'; -export async function openReactionImportMenu(ev: MouseEvent, reaction: string): Promise { +export async function openReactionImportMenu(ev: MouseEvent, reaction: string, noteId: string): Promise { if (!reaction) return; const host = reaction.match(/(?<=@).*\.*(?=:)/g)?.[0]; @@ -58,14 +58,17 @@ export async function openReactionImportMenu(ev: MouseEvent, reaction: string): return emojiId; }; - const importEmoji = async (): Promise => { + const importEmoji = async (skip: boolean): Promise => { const emojiId = await getEmojiId(); if (!await emojiId) return; os.api('admin/emoji/copy', { emojiId: emojiId, - }).then(async emoji => os.popup(defineAsyncComponent(() => import('@/pages/admin/emoji-edit-dialog.vue')), { - emoji: await getEmojiObject(emoji), - })); + }).then(async emoji => { + if (skip) return; + os.popup(defineAsyncComponent(() => import('@/pages/admin/emoji-edit-dialog.vue')), { + emoji: await getEmojiObject(emoji), + }); + }); }; const menuItems: MenuItem[] = [{ @@ -89,6 +92,30 @@ export async function openReactionImportMenu(ev: MouseEvent, reaction: string): !isLocal ) { menuItems.push({ + type: 'button', + icon: 'fas fa-check', + text: 'リアクションする', + action: async () => { + const duplication: boolean = await os.api('meta').then(meta => { + const emojis = meta.emojis; + return emojis.some((emoji) => { + return (emoji === name); + }); + }); + if (duplication) { + os.api('notes/reactions/create', { + noteId: noteId, + reaction: name, + }); + } else { + await importEmoji(true); + os.api('notes/reactions/create', { + noteId: noteId, + reaction: name, + }); + } + }, + }, { type: 'button', icon: 'fas fa-download', text: i18n.ts.import, @@ -106,10 +133,10 @@ export async function openReactionImportMenu(ev: MouseEvent, reaction: string): text: i18n.ts.duplicateEmoji, }).then(res => { if (res.canceled) return; - importEmoji(); + importEmoji(false); }); } else { - importEmoji(); + importEmoji(false); } }, });