import React from 'react'; import { Text, Pressable } from 'react-native'; import { BottomSheetFlatList } from '@gorhom/bottom-sheet'; import { FlatList as GHFlatList } from 'react-native-gesture-handler'; import shortnameToUnicode from '../../lib/methods/helpers/shortnameToUnicode'; import styles from './styles'; import CustomEmoji from './CustomEmoji'; import scrollPersistTaps from '../../lib/methods/helpers/scrollPersistTaps'; import { IEmoji, IEmojiCategory } from '../../definitions/IEmoji'; import { useTheme } from '../../theme'; import { isIOS } from '../../lib/methods/helpers'; const MAX_EMOJI_SIZE = 50; interface IEmojiProps { emoji: IEmoji; size: number; baseUrl: string; } const Emoji = React.memo(({ emoji, size, baseUrl }: IEmojiProps) => { if (emoji?.isCustom || emoji?.name) { return ( ); } return ( {shortnameToUnicode(`:${emoji}:`)} ); }); const EmojiCategory = ({ baseUrl, onEmojiSelected, emojis, width, tabsCount, isBottomSheet }: IEmojiCategory): React.ReactElement | null => { const emojiSize = width ? Math.min(width / tabsCount, MAX_EMOJI_SIZE) : MAX_EMOJI_SIZE; const numColumns = Math.trunc(width ? width / emojiSize : tabsCount); const { colors } = useTheme(); const FlatList = isBottomSheet ? BottomSheetFlatList : GHFlatList; const renderItem = (emoji: IEmoji) => ( onEmojiSelected(emoji)} testID={`reaction-picker-${emoji && emoji.isCustom ? emoji.content : emoji}`} android_ripple={{ color: colors.bannerBackground, borderless: true, radius: emojiSize / 2 }} style={({ pressed }: { pressed: boolean }) => ({ backgroundColor: isIOS && pressed ? colors.bannerBackground : 'transparent' })} > ); if (!width) { return null; } return ( (item && item.isCustom && item.content) || item} data={emojis} extraData={{ baseUrl, width }} renderItem={({ item }) => renderItem(item)} numColumns={numColumns} initialNumToRender={45} removeClippedSubviews {...scrollPersistTaps} keyboardDismissMode={'none'} /> ); }; export default EmojiCategory;