import React, { useEffect, useState } from 'react'; import { View, Text, Pressable, TextInput, FlatList } from 'react-native'; import { FormTextInput } from '../TextInput/FormTextInput'; import { useTheme } from '../../theme'; import I18n from '../../i18n'; import { CustomIcon } from '../CustomIcon'; import { IEmoji } from '../../definitions'; import shortnameToUnicode from '../../lib/methods/helpers/shortnameToUnicode'; import CustomEmoji from '../EmojiPicker/CustomEmoji'; import styles from './styles'; import useFrequentlyUsedEmoji from '../EmojiPicker/frequentlyUsedEmojis'; const BUTTON_HIT_SLOP = { top: 15, right: 15, bottom: 15, left: 15 }; const EMOJI_SIZE = 30; const DEFAULT_EMOJIS = ['clap', '+1', 'heart_eyes', 'grinning', 'thinking_face', 'smiley']; interface IEmojiSearchBarProps { openEmoji: () => void; onChangeText: (value: string) => void; emojis: IEmoji[]; onEmojiSelected: (emoji: IEmoji) => void; baseUrl: string; } interface ICustomEmoji { name: string; extension: string; } const Emoji = React.memo(({ emoji, baseUrl }: { emoji: IEmoji; baseUrl: string }) => { const { colors } = useTheme(); if (emoji.isCustom || emoji.name) { return ; } return ( {shortnameToUnicode(`:${emoji}:`)} ); }); const EmojiSearchBar = React.forwardRef( ({ openEmoji, onChangeText, emojis, onEmojiSelected, baseUrl }, ref) => { const { colors } = useTheme(); const [searchText, setSearchText] = useState(''); const [frequentlyUsedEmojis, setFrequentlyUsed] = useState<(string | ICustomEmoji)[]>(); const { frequentlyUsed, loaded } = useFrequentlyUsedEmoji(); useEffect(() => { if (loaded) { const frequentlyUsedWithDefaultEmojis = frequentlyUsed .filter(emoji => { if (typeof emoji === 'string') return !DEFAULT_EMOJIS.includes(emoji); return !DEFAULT_EMOJIS.includes(emoji.name); }) .concat(DEFAULT_EMOJIS); setFrequentlyUsed(frequentlyUsedWithDefaultEmojis); } }, [loaded]); const handleTextChange = (text: string) => { setSearchText(text); onChangeText(text); }; const renderItem = React.memo((emoji: IEmoji) => ( onEmojiSelected(emoji)}> )); return ( renderItem(item as IEmoji)} showsHorizontalScrollIndicator={false} ListEmptyComponent={() => ( {I18n.t('No_results_found')} )} // @ts-ignore keyExtractor={item => item?.name || item} contentContainerStyle={styles.emojiListContainer} keyboardShouldPersistTaps='always' /> [styles.openEmojiKeyboard, { opacity: pressed ? 0.7 : 1 }]} onPress={openEmoji} hitSlop={BUTTON_HIT_SLOP}> handleTextChange('')} iconRight={'search'} /> ); } ); export default EmojiSearchBar;