mirror of
				https://codeberg.org/yeentown/barkey.git
				synced 2025-10-31 13:34:12 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			60 lines
		
	
	
	
		
			1.7 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
			
		
		
	
	
			60 lines
		
	
	
	
		
			1.7 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
| /*
 | |
|  * 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<HTMLElement | null> = 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();
 |