2022-12-24 04:15:19 +09:00
|
|
|
<script setup lang="ts">
|
|
|
|
import type { Picker } from 'emoji-mart'
|
2024-09-30 17:11:56 +09:00
|
|
|
import importEmojiLang from 'virtual:emoji-mart-lang-importer'
|
2022-12-24 04:15:19 +09:00
|
|
|
|
|
|
|
const emit = defineEmits<{
|
|
|
|
(e: 'select', code: string): void
|
2022-12-28 03:38:57 +09:00
|
|
|
(e: 'selectCustom', image: any): void
|
2022-12-24 04:15:19 +09:00
|
|
|
}>()
|
|
|
|
|
2023-02-16 04:15:11 +09:00
|
|
|
const { locale } = useI18n()
|
|
|
|
|
2024-02-22 00:20:08 +09:00
|
|
|
const el = ref<HTMLElement>()
|
|
|
|
const picker = ref<Picker>()
|
2022-12-29 21:26:08 +09:00
|
|
|
const colorMode = useColorMode()
|
2022-12-24 04:15:19 +09:00
|
|
|
|
|
|
|
async function openEmojiPicker() {
|
2022-12-27 21:28:02 +09:00
|
|
|
await updateCustomEmojis()
|
2023-02-16 04:15:11 +09:00
|
|
|
|
2024-02-22 00:20:08 +09:00
|
|
|
if (picker.value) {
|
|
|
|
picker.value.update({
|
|
|
|
theme: colorMode,
|
2022-12-27 21:28:02 +09:00
|
|
|
custom: customEmojisData.value,
|
|
|
|
})
|
|
|
|
}
|
|
|
|
else {
|
2023-02-16 04:15:11 +09:00
|
|
|
const [Picker, dataPromise, i18n] = await Promise.all([
|
|
|
|
import('emoji-mart').then(({ Picker }) => Picker),
|
|
|
|
import('@emoji-mart/data/sets/14/twitter.json').then((r: any) => r.default).catch(() => {}),
|
|
|
|
importEmojiLang(locale.value.split('-')[0]),
|
|
|
|
])
|
|
|
|
|
2024-02-22 00:20:08 +09:00
|
|
|
picker.value = new Picker({
|
2023-02-16 04:15:11 +09:00
|
|
|
data: () => dataPromise,
|
2022-12-28 03:38:57 +09:00
|
|
|
onEmojiSelect({ native, src, alt, name }: any) {
|
2024-08-16 23:52:08 +09:00
|
|
|
if (native)
|
|
|
|
emit('select', native)
|
|
|
|
else
|
|
|
|
emit('selectCustom', { src, alt, 'data-emoji-id': name })
|
2022-12-24 04:15:19 +09:00
|
|
|
},
|
2023-01-21 04:26:18 +09:00
|
|
|
set: 'twitter',
|
2024-02-22 00:20:08 +09:00
|
|
|
theme: colorMode,
|
2022-12-24 07:56:16 +09:00
|
|
|
custom: customEmojisData.value,
|
2023-02-16 04:15:11 +09:00
|
|
|
i18n,
|
2022-12-24 04:15:19 +09:00
|
|
|
})
|
|
|
|
}
|
2022-12-26 01:58:00 +09:00
|
|
|
await nextTick()
|
|
|
|
// TODO: custom picker
|
2024-02-22 00:20:08 +09:00
|
|
|
el.value?.appendChild(picker.value as any as HTMLElement)
|
2022-12-26 01:58:00 +09:00
|
|
|
}
|
|
|
|
|
2023-03-31 04:01:24 +09:00
|
|
|
function hideEmojiPicker() {
|
2024-02-22 00:20:08 +09:00
|
|
|
if (picker.value)
|
|
|
|
el.value?.removeChild(picker.value as any as HTMLElement)
|
2022-12-24 04:15:19 +09:00
|
|
|
}
|
|
|
|
</script>
|
|
|
|
|
|
|
|
<template>
|
2023-01-14 01:22:36 +09:00
|
|
|
<CommonTooltip :content="$t('tooltip.add_emojis')">
|
2023-01-04 19:41:19 +09:00
|
|
|
<VDropdown
|
|
|
|
auto-boundary-max-size
|
|
|
|
@apply-show="openEmojiPicker()"
|
|
|
|
@apply-hide="hideEmojiPicker()"
|
|
|
|
>
|
|
|
|
<slot />
|
|
|
|
|
|
|
|
<template #popper>
|
|
|
|
<div ref="el" min-w-10 min-h-10 />
|
|
|
|
</template>
|
|
|
|
</VDropdown>
|
|
|
|
</CommonTooltip>
|
2022-12-24 04:15:19 +09:00
|
|
|
</template>
|