/* * SPDX-FileCopyrightText: syuilo and misskey-project * SPDX-License-Identifier: AGPL-3.0-only */ import { defineAsyncComponent, Ref, ref } from 'vue'; import { popup } from '@/os.js'; import { defaultStore } from '@/store.js'; /** * 絵文字ピッカーを表示する。 * 類似の機能として{@link ReactionPicker}が存在しているが、この機能とは動きが異なる。 * 投稿フォームなどで絵文字を選択する時など、絵文字ピックアップ後でもダイアログが消えずに残り、 * 一度表示したダイアログを連続で使用できることが望ましいシーンでの利用が想定される。 */ class EmojiPicker { private src: Ref = ref(null); private manualShowing = ref(false); private onChosen?: (emoji: string) => void; private onClosed?: () => void; constructor() { // nop } public async init() { const emojisRef = defaultStore.reactiveState.pinnedEmojis; await popup(defineAsyncComponent(() => import('@/components/MkEmojiPickerDialog.vue')), { src: this.src, pinnedEmojis: emojisRef, asReactionPicker: false, manualShowing: this.manualShowing, choseAndClose: false, }, { done: emoji => { if (this.onChosen) this.onChosen(emoji); }, close: () => { this.manualShowing.value = false; }, closed: () => { this.src.value = null; if (this.onClosed) this.onClosed(); }, }); } public show( src: HTMLElement, onChosen?: EmojiPicker['onChosen'], onClosed?: EmojiPicker['onClosed'], ) { this.src.value = src; this.manualShowing.value = true; this.onChosen = onChosen; this.onClosed = onClosed; } } export const emojiPicker = new EmojiPicker();