diff --git a/locales/index.d.ts b/locales/index.d.ts index 80551c091094..29e4155b6028 100644 --- a/locales/index.d.ts +++ b/locales/index.d.ts @@ -4916,6 +4916,14 @@ export interface Locale extends ILocale { * QRコード */ "qrcode": string; + /** + * このQRコードをスキャンすると、新規登録時の招待コードが自動で入力されます。 + */ + "qrcodeToInvite": string; + /** + * 指定された絵文字は既に存在します。 + */ + "emojiAlreadyExists": string; "_bubbleGame": { /** * 遊び方 diff --git a/locales/ja-JP.yml b/locales/ja-JP.yml index 3c2e1d8c16a9..e3e3b2643cdd 100644 --- a/locales/ja-JP.yml +++ b/locales/ja-JP.yml @@ -1225,6 +1225,8 @@ loading: "読み込み中" surrender: "やめる" gameRetry: "リトライ" qrcode: "QRコード" +qrcodeToInvite: "このQRコードをスキャンすると、新規登録時の招待コードが自動で入力されます。" +emojiAlreadyExists: "指定された絵文字は既に存在します。" _bubbleGame: howToPlay: "遊び方" diff --git a/packages/frontend/src/components/MkInviteCode.vue b/packages/frontend/src/components/MkInviteCode.vue index 88eba6e665eb..e1ea79d6ec6a 100644 --- a/packages/frontend/src/components/MkInviteCode.vue +++ b/packages/frontend/src/components/MkInviteCode.vue @@ -55,7 +55,7 @@ SPDX-License-Identifier: AGPL-3.0-only <MkButton v-if="!invite.used || moderator" danger rounded @click="deleteCode()"><i class="ti ti-trash"></i> {{ i18n.ts.delete }}</MkButton> </div> <div v-if="!invite.used && !isExpired"> - <div :class="$style.label">{{ i18n.ts.qrcode }}</div> + <div :class="$style.label">{{ i18n.ts.qrcode }} - {{ i18n.ts.qrcodeToInvite }}</div> <vue-qrcode :value="inviteUrl" :options="option" tag="img"></vue-qrcode> </div> </div> diff --git a/packages/frontend/src/components/global/MkCustomEmoji.vue b/packages/frontend/src/components/global/MkCustomEmoji.vue index 3b2ecd81092f..7e4e08186baa 100644 --- a/packages/frontend/src/components/global/MkCustomEmoji.vue +++ b/packages/frontend/src/components/global/MkCustomEmoji.vue @@ -87,14 +87,17 @@ const importEmoji = async (emojiName) => { query: emojiName, host: props.host, })).find((_emoji) => _emoji.name === emojiName); - await os.apiWithDialog('admin/emoji/copy', { - emojiId: emoji.id, + if (emoji) { + await os.apiWithDialog('admin/emoji/copy', { + emojiId: emoji.id, + }); + } + } else { + os.alert({ + title: i18n.ts.error, + text: i18n.ts.emojiAlreadyExists, }); } - - // リアクション - react(`:${emojiName}:`); - sound.playMisskeySfx('reaction'); }; function onClick(ev: MouseEvent) { @@ -111,10 +114,20 @@ function onClick(ev: MouseEvent) { os.success(); }, }, ...(props.menuImport && react ? [{ + text: i18n.ts.import, + icon: 'ti ti-download', + action: () => { + importEmoji(props.name); + }, + }, { text: i18n.ts.doReaction, icon: 'ti ti-plus', action: () => { - importEmoji(props.name); + importEmoji(props.name).then(() => { + // リアクション + react(`:${props.name}:`); + sound.playMisskeySfx('reaction'); + }); }, }] : []), ], ev.currentTarget ?? ev.target);