import React, { 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, addFrequentlyUsed } 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; const onPress = () => { onEmojiSelected(emoji); if (typeof emoji === 'string') { addFrequentlyUsed({ content: emoji, name: emoji, isCustom: false }); } else { addFrequentlyUsed({ content: emoji?.content || emoji?.name, name: emoji?.name, extension: emoji.extension, isCustom: true }); } }; return ( ); }; const EmojiSearchBar = React.forwardRef( ({ openEmoji, onChangeText, emojis, onEmojiSelected, baseUrl }, ref) => { const { colors } = useTheme(); const [searchText, setSearchText] = useState(''); const { frequentlyUsed } = useFrequentlyUsedEmoji(); const frequentlyUsedWithDefaultEmojis = frequentlyUsed .filter(emoji => { if (typeof emoji === 'string') return !DEFAULT_EMOJIS.includes(emoji); return !DEFAULT_EMOJIS.includes(emoji.name); }) .concat(DEFAULT_EMOJIS); 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} testID='openback-emoji-keyboard' > handleTextChange('')} iconRight={'search'} testID='emoji-searchbar-input' /> ); } ); export default EmojiSearchBar;