summaryrefslogtreecommitdiff
path: root/packages/frontend/src/pages/settings
diff options
context:
space:
mode:
authortaichan <40626578+tai-cha@users.noreply.github.com>2025-05-12 10:00:06 +0900
committerGitHub <noreply@github.com>2025-05-12 10:00:06 +0900
commit5bc52b6743d1d23d215aaa7b62ceee85f15c3502 (patch)
tree0426e5a239f65cadf8ad7a8f3a14dba6c7a68cd3 /packages/frontend/src/pages/settings
parentlint (diff)
downloadmisskey-5bc52b6743d1d23d215aaa7b62ceee85f15c3502.tar.gz
misskey-5bc52b6743d1d23d215aaa7b62ceee85f15c3502.tar.bz2
misskey-5bc52b6743d1d23d215aaa7b62ceee85f15c3502.zip
feat(frontend): 絵文字をミュート可能にする機能 (#15966)
* wip ( 絵文字ミュートの基礎実装, PoC ) * refactor: 絵文字のmute/unmute処理の共通化 * SPDX * リアクションからも絵文字ミュート可能に * emojiMute/emojiUnmute * replace resource of emojiMute * add vitest preferstate for mutedEmojis * add vitest to preferReactive * 混入削除 * Fix typo (mutedEmojis -> mutingEmojis) * reactiveやめる * add時の判定ミスを修正 * Add CHANGELOG * Revert "reactiveやめる" This reverts commit 442742c371472f9c9e9372c5552cf73767aedecf. * Update Changelog
Diffstat (limited to 'packages/frontend/src/pages/settings')
-rw-r--r--packages/frontend/src/pages/settings/mute-block.emoji-mute.vue105
-rw-r--r--packages/frontend/src/pages/settings/mute-block.vue15
2 files changed, 120 insertions, 0 deletions
diff --git a/packages/frontend/src/pages/settings/mute-block.emoji-mute.vue b/packages/frontend/src/pages/settings/mute-block.emoji-mute.vue
new file mode 100644
index 0000000000..601ca7ee49
--- /dev/null
+++ b/packages/frontend/src/pages/settings/mute-block.emoji-mute.vue
@@ -0,0 +1,105 @@
+<!--
+SPDX-FileCopyrightText: syuilo and misskey-project
+SPDX-License-Identifier: AGPL-3.0-only
+-->
+
+<template>
+<div :class="$style.emojis">
+ <div v-for="emoji in emojis" :key="`emojiMute-${emoji}`" :class="$style.emoji" @click="onEmojiClick($event, emoji)">
+ <MkCustomEmoji
+ v-if="emoji.startsWith(':')"
+ :name="customEmojiName(emoji)"
+ :host="customEmojiHost(emoji)"
+ :normal="true"
+ :menu="false"
+ :menuReaction="false"
+ :ignoreMuted="true"
+ />
+ <MkEmoji
+ v-else
+ :emoji="emoji"
+ :menu="false"
+ :menuReaction="false"
+ :ignoreMuted="true"
+ ></MkEmoji>
+ </div>
+</div>
+
+<MkButton primary inline @click="add"><i class="ti ti-plus"></i> {{ i18n.ts.add }}</MkButton>
+</template>
+
+<script lang="ts" setup>
+import type { MenuItem } from '@/types/menu';
+import MkButton from '@/components/MkButton.vue';
+import * as os from '@/os.js';
+import { i18n } from '@/i18n.js';
+import { prefer } from '@/preferences.js';
+import {
+ mute as muteEmoji,
+ unmute as unmuteEmoji,
+ extractCustomEmojiName as customEmojiName,
+ extractCustomEmojiHost as customEmojiHost,
+} from '@/utility/emoji-mute.js';
+
+const emojis = prefer.model('mutingEmojis');
+
+function getHTMLElement(ev: MouseEvent): HTMLElement {
+ const target = ev.currentTarget ?? ev.target;
+ return target as HTMLElement;
+}
+
+function add(ev: MouseEvent) {
+ os.pickEmoji(getHTMLElement(ev), { showPinned: false }).then((emoji) => {
+ if (emoji) {
+ muteEmoji(emoji);
+ }
+ });
+}
+
+function onEmojiClick(ev: MouseEvent, emoji: string) {
+ const menuItems : MenuItem[] = [{
+ type: 'label',
+ text: emoji,
+ }, {
+ text: i18n.ts.emojiUnmute,
+ icon: 'ti ti-mood-off',
+ action: () => unmute(emoji),
+ }];
+ os.popupMenu(menuItems, ev.currentTarget ?? ev.target);
+}
+
+function unmute(emoji: string) {
+ os.confirm({
+ type: 'question',
+ title: i18n.tsx.unmuteX({ x: emoji }),
+ }).then(({ canceled }) => {
+ if (canceled) {
+ return;
+ }
+ unmuteEmoji(emoji);
+ });
+}
+</script>
+<style module>
+.emojis {
+ display: flex;
+ flex-wrap: wrap;
+ align-items: center;
+ gap: 4px;
+
+ &:empty {
+ display: none;
+ }
+}
+
+.emoji {
+ display: inline-flex;
+ height: 42px;
+ padding: 0 6px;
+ font-size: 1.5em;
+ border-radius: 6px;
+ align-items: center;
+ justify-content: center;
+ background: var(--MI_THEME-buttonBg);
+}
+</style>
diff --git a/packages/frontend/src/pages/settings/mute-block.vue b/packages/frontend/src/pages/settings/mute-block.vue
index 7c2376249e..9b24501cce 100644
--- a/packages/frontend/src/pages/settings/mute-block.vue
+++ b/packages/frontend/src/pages/settings/mute-block.vue
@@ -50,6 +50,20 @@ SPDX-License-Identifier: AGPL-3.0-only
</SearchMarker>
<SearchMarker
+ :label="i18n.ts.emojiMute"
+ :keywords="['emoji', 'mute', 'hide']"
+ >
+ <MkFolder>
+ <template #icon><i class="ti ti-mood-off"></i></template>
+ <template #label>{{ i18n.ts.emojiMute }}</template>
+
+ <div class="_gaps_m">
+ <XEmojiMute/>
+ </div>
+ </mkfolder>
+ </SearchMarker>
+
+ <SearchMarker
:label="i18n.ts.instanceMute"
:keywords="['note', 'server', 'instance', 'host', 'federation', 'mute', 'hide']"
>
@@ -163,6 +177,7 @@ SPDX-License-Identifier: AGPL-3.0-only
<script lang="ts" setup>
import { ref, computed, watch } from 'vue';
+import XEmojiMute from './mute-block.emoji-mute.vue';
import XInstanceMute from './mute-block.instance-mute.vue';
import XWordMute from './mute-block.word-mute.vue';
import MkPagination from '@/components/MkPagination.vue';