diff --git a/src/renderer/src/components/EmojiPicker/index.tsx b/src/renderer/src/components/EmojiPicker/index.tsx index 8ba9d3e967..d2479cae51 100644 --- a/src/renderer/src/components/EmojiPicker/index.tsx +++ b/src/renderer/src/components/EmojiPicker/index.tsx @@ -1,33 +1,62 @@ +import 'emoji-picker-element' + import TwemojiCountryFlagsWoff2 from '@renderer/assets/fonts/country-flag-fonts/TwemojiCountryFlags.woff2?url' import { useTheme } from '@renderer/context/ThemeProvider' import { polyfillCountryFlagEmojis } from 'country-flag-emoji-polyfill' +import emojiData from 'emoji-picker-element-data/en/emojibase/data.json' import type { FC } from 'react' import { useEffect, useRef } from 'react' +interface EmojiPickerElement extends HTMLElement { + dataSource: typeof emojiData +} + +interface EmojiClickEvent extends CustomEvent { + detail: { + unicode?: string + emoji?: { unicode: string } + } +} + interface Props { onEmojiClick: (emoji: string) => void } +declare module 'react' { + namespace JSX { + interface IntrinsicElements { + 'emoji-picker': React.DetailedHTMLProps & { class?: string }, HTMLElement> + } + } +} + const EmojiPicker: FC = ({ onEmojiClick }) => { const { theme } = useTheme() - const ref = useRef(null) + const ref = useRef(null) useEffect(() => { polyfillCountryFlagEmojis('Twemoji Mozilla', TwemojiCountryFlagsWoff2) }, []) + // 初始化 dataSource + useEffect(() => { + if (ref.current) { + ref.current.dataSource = emojiData + } + }, []) + + // 事件监听 useEffect(() => { const refValue = ref.current if (refValue) { - const handleEmojiClick = (event: any) => { + const handleEmojiClick = (event: Event) => { event.stopPropagation() - onEmojiClick(event.detail.unicode || event.detail.emoji.unicode) + const emojiEvent = event as EmojiClickEvent + onEmojiClick(emojiEvent.detail.unicode || emojiEvent.detail.emoji?.unicode || '') } - // 添加事件监听器 refValue.addEventListener('emoji-click', handleEmojiClick) - // 清理事件监听器 return () => { refValue.removeEventListener('emoji-click', handleEmojiClick) } @@ -35,7 +64,6 @@ const EmojiPicker: FC = ({ onEmojiClick }) => { return }, [onEmojiClick]) - // @ts-ignore next-line return }