summaryrefslogtreecommitdiff
path: root/packages/frontend/src/scripts
diff options
context:
space:
mode:
authorおさむのひと <46447427+samunohito@users.noreply.github.com>2023-12-03 17:25:34 +0900
committerGitHub <noreply@github.com>2023-12-03 17:25:34 +0900
commit5e1d87240426e08858b7fc5ccad5ca235bd3c6e7 (patch)
tree4720b482d224941eb50426514ad43c24a8d99bb9 /packages/frontend/src/scripts
parentfix(backend): reject malformed timestamp (#12554) (diff)
downloadsharkey-5e1d87240426e08858b7fc5ccad5ca235bd3c6e7.tar.gz
sharkey-5e1d87240426e08858b7fc5ccad5ca235bd3c6e7.tar.bz2
sharkey-5e1d87240426e08858b7fc5ccad5ca235bd3c6e7.zip
入力フォームでもリアクション選択時に使用するピッカーを使うようにしたい (#12337)
* 入力フォームでもリアクション選択時に使用するピッカーを使うようにしたい * erase console.log * fix CHANGELOG.md * reaction-picker.ts を戻し、今回の対応を入れた emoji-picker.ts を新たに作成 * fix CHANGELOG.md * tweak --------- Co-authored-by: osamu <46447427+sam-osamu@users.noreply.github.com> Co-authored-by: syuilo <Syuilotan@yahoo.co.jp>
Diffstat (limited to 'packages/frontend/src/scripts')
-rw-r--r--packages/frontend/src/scripts/emoji-picker.ts57
1 files changed, 57 insertions, 0 deletions
diff --git a/packages/frontend/src/scripts/emoji-picker.ts b/packages/frontend/src/scripts/emoji-picker.ts
new file mode 100644
index 0000000000..d6d6bf1245
--- /dev/null
+++ b/packages/frontend/src/scripts/emoji-picker.ts
@@ -0,0 +1,57 @@
+/*
+ * SPDX-FileCopyrightText: syuilo and other misskey contributors
+ * SPDX-License-Identifier: AGPL-3.0-only
+ */
+
+import { defineAsyncComponent, Ref, ref } from 'vue';
+import { popup } from '@/os.js';
+
+/**
+ * 絵文字ピッカーを表示する。
+ * 類似の機能として{@link ReactionPicker}が存在しているが、この機能とは動きが異なる。
+ * 投稿フォームなどで絵文字を選択する時など、絵文字ピックアップ後でもダイアログが消えずに残り、
+ * 一度表示したダイアログを連続で使用できることが望ましいシーンでの利用が想定される。
+ */
+class EmojiPicker {
+ private src: Ref<HTMLElement | null> = ref(null);
+ private manualShowing = ref(false);
+ private onChosen?: (emoji: string) => void;
+ private onClosed?: () => void;
+
+ constructor() {
+ // nop
+ }
+
+ public async init() {
+ await popup(defineAsyncComponent(() => import('@/components/MkEmojiPickerDialog.vue')), {
+ src: this.src,
+ 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();