'use client'; import { memo, useCallback } from 'react'; import type { UseEmojiPickerType } from '@udecode/plate-emoji/react'; import { cn } from '@udecode/cn'; import { type Emoji, type GridRow, EmojiSettings } from '@udecode/plate-emoji'; export type EmojiButtonProps = { emoji: Emoji; index: number; onMouseOver: (emoji?: Emoji) => void; onSelect: (emoji: Emoji) => void; }; export type EmojiPickerContentProps = Pick< UseEmojiPickerType, | 'emojiLibrary' | 'i18n' | 'isSearching' | 'onMouseOver' | 'onSelectEmoji' | 'refs' | 'searchResult' | 'settings' | 'visibleCategories' >; export type RowOfButtonsProps = { row: GridRow; } & Pick; const Button = memo( ({ emoji, index, onMouseOver, onSelect }: EmojiButtonProps) => { return ( ); }, ); Button.displayName = 'Button'; const RowOfButtons = memo( ({ emojiLibrary, row, onMouseOver, onSelectEmoji }: RowOfButtonsProps) => (
{row.elements.map((emojiId, index) => (
), ); RowOfButtons.displayName = 'RowOfButtons'; export function EmojiPickerContent({ emojiLibrary, i18n, isSearching = false, refs, searchResult, settings = EmojiSettings, visibleCategories, onMouseOver, onSelectEmoji, }: EmojiPickerContentProps) { const getRowWidth = settings.perLine.value * settings.buttonSize.value; const isCategoryVisible = useCallback( (categoryId: any) => { return visibleCategories.has(categoryId) ? visibleCategories.get(categoryId) : false; }, [visibleCategories], ); const EmojiList = useCallback(() => { return emojiLibrary .getGrid() .sections() .map(({ id: categoryId }) => { const section = emojiLibrary.getGrid().section(categoryId); const { buttonSize } = settings; return (
{i18n.categories[categoryId]}
{isCategoryVisible(categoryId) && section .getRows() .map((row: GridRow) => ( ))}
); }); }, [ emojiLibrary, getRowWidth, i18n.categories, isCategoryVisible, onSelectEmoji, onMouseOver, settings, ]); const SearchList = useCallback(() => { return (
{i18n.searchResult}
{searchResult.map((emoji: Emoji, index: number) => (
); }, [ emojiLibrary, getRowWidth, i18n.searchResult, searchResult, onSelectEmoji, onMouseOver, ]); return (
{isSearching ? SearchList() : EmojiList()}
); }