enhance(frontend): 投稿内のunicode絵文字もメニューを出せるように
This commit is contained in:
parent
2c836ba71f
commit
bb76ee2c0e
|
@ -51,7 +51,7 @@
|
||||||
- Enhance: プラグインで`Plugin:register_note_view_interruptor`を用いてnoteの代わりにnullを返却することでノートを非表示にできるようになりました
|
- Enhance: プラグインで`Plugin:register_note_view_interruptor`を用いてnoteの代わりにnullを返却することでノートを非表示にできるようになりました
|
||||||
- Enhance: AiScript関数`Mk:nyaize()`が追加されました
|
- Enhance: AiScript関数`Mk:nyaize()`が追加されました
|
||||||
- Enhance: 情報→ツール はナビゲーションバーにツールとして独立した項目になりました
|
- Enhance: 情報→ツール はナビゲーションバーにツールとして独立した項目になりました
|
||||||
- Enhance: ノート内のカスタム絵文字をクリックすることで、コピーおよびリアクションができるように
|
- Enhance: ノート内の絵文字をクリックすることで、コピーおよびリアクションができるように
|
||||||
- Enhance: その他細かなブラッシュアップ
|
- Enhance: その他細かなブラッシュアップ
|
||||||
- Fix: 投稿フォームでのユーザー変更がプレビューに反映されない問題を修正
|
- Fix: 投稿フォームでのユーザー変更がプレビューに反映されない問題を修正
|
||||||
- Fix: ユーザーページの ノート > ファイル付き タブにリプライが表示されてしまう
|
- Fix: ユーザーページの ノート > ファイル付き タブにリプライが表示されてしまう
|
||||||
|
|
|
@ -4,21 +4,28 @@ SPDX-License-Identifier: AGPL-3.0-only
|
||||||
-->
|
-->
|
||||||
|
|
||||||
<template>
|
<template>
|
||||||
<img v-if="!useOsNativeEmojis" :class="$style.root" :src="url" :alt="props.emoji" decoding="async" @pointerenter="computeTitle"/>
|
<img v-if="!useOsNativeEmojis" :class="$style.root" :src="url" :alt="props.emoji" decoding="async" @pointerenter="computeTitle" @click="onClick"/>
|
||||||
<span v-else-if="useOsNativeEmojis" :alt="props.emoji" @pointerenter="computeTitle">{{ props.emoji }}</span>
|
<span v-else-if="useOsNativeEmojis" :alt="props.emoji" @pointerenter="computeTitle" @click="onClick">{{ props.emoji }}</span>
|
||||||
<span v-else>{{ emoji }}</span>
|
<span v-else>{{ emoji }}</span>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script lang="ts" setup>
|
<script lang="ts" setup>
|
||||||
import { computed } from 'vue';
|
import { computed, inject } from 'vue';
|
||||||
import { char2twemojiFilePath, char2fluentEmojiFilePath } from '@/scripts/emoji-base.js';
|
import { char2twemojiFilePath, char2fluentEmojiFilePath } from '@/scripts/emoji-base.js';
|
||||||
import { defaultStore } from '@/store.js';
|
import { defaultStore } from '@/store.js';
|
||||||
import { getEmojiName } from '@/scripts/emojilist.js';
|
import { getEmojiName } from '@/scripts/emojilist.js';
|
||||||
|
import * as os from '@/os.js';
|
||||||
|
import copyToClipboard from '@/scripts/copy-to-clipboard.js';
|
||||||
|
import { i18n } from '@/i18n.js';
|
||||||
|
|
||||||
const props = defineProps<{
|
const props = defineProps<{
|
||||||
emoji: string;
|
emoji: string;
|
||||||
|
menu?: boolean;
|
||||||
|
menuReaction?: boolean;
|
||||||
}>();
|
}>();
|
||||||
|
|
||||||
|
const react = inject<((name: string) => void) | null>('react', null);
|
||||||
|
|
||||||
const char2path = defaultStore.state.emojiStyle === 'twemoji' ? char2twemojiFilePath : char2fluentEmojiFilePath;
|
const char2path = defaultStore.state.emojiStyle === 'twemoji' ? char2twemojiFilePath : char2fluentEmojiFilePath;
|
||||||
|
|
||||||
const useOsNativeEmojis = computed(() => defaultStore.state.emojiStyle === 'native');
|
const useOsNativeEmojis = computed(() => defaultStore.state.emojiStyle === 'native');
|
||||||
|
@ -31,6 +38,28 @@ function computeTitle(event: PointerEvent): void {
|
||||||
const title = getEmojiName(props.emoji as string) ?? props.emoji as string;
|
const title = getEmojiName(props.emoji as string) ?? props.emoji as string;
|
||||||
(event.target as HTMLElement).title = title;
|
(event.target as HTMLElement).title = title;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function onClick(ev: MouseEvent) {
|
||||||
|
if (props.menu) {
|
||||||
|
os.popupMenu([{
|
||||||
|
type: 'label',
|
||||||
|
text: props.emoji,
|
||||||
|
}, {
|
||||||
|
text: i18n.ts.copy,
|
||||||
|
icon: 'ti ti-copy',
|
||||||
|
action: () => {
|
||||||
|
copyToClipboard(props.emoji);
|
||||||
|
os.success();
|
||||||
|
},
|
||||||
|
}, ...(props.menuReaction && react ? [{
|
||||||
|
text: i18n.ts.doReaction,
|
||||||
|
icon: 'ti ti-plus',
|
||||||
|
action: () => {
|
||||||
|
react(props.emoji);
|
||||||
|
},
|
||||||
|
}] : [])], ev.currentTarget ?? ev.target);
|
||||||
|
}
|
||||||
|
}
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<style lang="scss" module>
|
<style lang="scss" module>
|
||||||
|
|
|
@ -354,6 +354,8 @@ export default function(props: MfmProps) {
|
||||||
return [h(MkEmoji, {
|
return [h(MkEmoji, {
|
||||||
key: Math.random(),
|
key: Math.random(),
|
||||||
emoji: token.props.emoji,
|
emoji: token.props.emoji,
|
||||||
|
menu: props.enableEmojiMenu,
|
||||||
|
menuReaction: props.enableEmojiMenuReaction,
|
||||||
})];
|
})];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue