elk/components/publish/PublishEmojiPicker.client.vue

61 lines
1.4 KiB
Vue
Raw Permalink Normal View History

2022-12-23 19:15:19 +00:00
<script setup lang="ts">
import type { Picker } from 'emoji-mart'
const emit = defineEmits<{
(e: 'select', code: string): void
(e: 'selectCustom', image: any): void
2022-12-23 19:15:19 +00:00
}>()
const el = $ref<HTMLElement>()
let picker = $ref<Picker>()
const colorMode = useColorMode()
2022-12-23 19:15:19 +00:00
async function openEmojiPicker() {
await updateCustomEmojis()
if (picker) {
picker.update({
theme: colorMode.value,
custom: customEmojisData.value,
})
}
else {
2022-12-23 22:56:16 +00:00
const promise = import('@emoji-mart/data').then(r => r.default)
2022-12-23 19:15:19 +00:00
const { Picker } = await import('emoji-mart')
picker = new Picker({
2022-12-23 22:56:16 +00:00
data: () => promise,
onEmojiSelect({ native, src, alt, name }: any) {
native
? emit('select', native)
: emit('selectCustom', { src, alt, 'data-emoji-id': name })
2022-12-23 19:15:19 +00:00
},
theme: colorMode.value,
2022-12-23 22:56:16 +00:00
custom: customEmojisData.value,
2022-12-23 19:15:19 +00:00
})
}
2022-12-25 16:58:00 +00:00
await nextTick()
// TODO: custom picker
el?.appendChild(picker as any as HTMLElement)
}
const hideEmojiPicker = () => {
2022-12-25 16:58:00 +00:00
if (picker)
el?.removeChild(picker as any as HTMLElement)
2022-12-23 19:15:19 +00:00
}
</script>
<template>
2023-01-04 10:41:19 +00:00
<CommonTooltip content="Add emojis">
<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-23 19:15:19 +00:00
</template>