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'; import { DEFAULT_EMOJIS } from '../EmojiPicker/emojis'; const BUTTON_HIT_SLOP = { top: 4, right: 4, bottom: 4, left: 4 }; const EMOJI_SIZE = 30; interface IEmojiSearchBarProps { openEmoji: () => void; onChangeText: (value: string) => void; emojis: (IEmoji | string)[]; onEmojiSelected: (emoji: IEmoji | string) => void; baseUrl: string; } interface IListItem { emoji: IEmoji | string; onEmojiSelected: (emoji: IEmoji | string) => void; baseUrl: string; } const Emoji = ({ emoji, baseUrl }: { emoji: IEmoji | string; baseUrl: string }): React.ReactElement => { const { colors } = useTheme(); if (typeof emoji === 'string') { return ( {shortnameToUnicode(`:${emoji}:`)} ); } return ; }; const ListItem = ({ emoji, onEmojiSelected, baseUrl }: IListItem): React.ReactElement => { const key = typeof emoji === 'string' ? emoji : emoji?.name || emoji?.content; return ( onEmojiSelected(emoji)}> ); }; const EmojiSearchBar = React.forwardRef( ({ openEmoji, onChangeText, emojis, onEmojiSelected, baseUrl }, ref) => { const { colors } = useTheme(); const [searchText, setSearchText] = useState(''); const [frequentlyUsedEmojis, setFrequentlyUsed] = useState<(string | IEmoji)[]>(); 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); }; return ( } showsHorizontalScrollIndicator={false} ListEmptyComponent={() => ( {I18n.t('No_results_found')} )} // @ts-ignore keyExtractor={item => item?.content || 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;