import { useCallback, useEffect, useState } from 'react'; import { Container, Row, ScrollView, TouchableWithoutFeedback } from 'components/layout'; import { Text, TextField, BottomSheet, Fab, Visible, Card } from 'components'; import { metrics } from 'config'; import { smileysAndEmotion, animalsAndNature, foodAndDrink, travelAndPlaces, symbols, flags, } from 'emojis'; import { SearchIcon, Smiles, Clock, Animal, Food, Symbol, Travel, Flag } from 'icons'; import { useResponsiveLayout } from 'hooks'; import { IconProps } from 'icons/types'; import { isEmojisOpenVar } from 'state-management/dialogs'; const { STYLES } = metrics; const emojisObject: Record = { recent: smileysAndEmotion, smileys: smileysAndEmotion, animal: animalsAndNature, food: foodAndDrink, symbol: symbols, flag: flags, travel: travelAndPlaces, }; const emojiTitles: Record = { recent: 'Recent Used', smileys: 'Smileys & Emotions', animal: 'Animals & Nature', food: 'Food & Drink', symbol: 'Symbols', flag: 'Flags', travel: 'Travel & Places', }; export const EmojisAction: React.FC = ({ isSheetOpen, setIsSheetOpen }) => { const [activeTab, setActiveTab] = useState('recent'); const [searchString, setSearchString] = useState(''); const [searchedEmojis, setSearchedEmojis] = useState(); const { top, isMobile } = useResponsiveLayout(); const sheetHeight = 400 + top; const closeSheet = useCallback(() => { setIsSheetOpen(false); }, [setIsSheetOpen]); useEffect(() => { if (searchString && searchString.length > 0) { const smileySearch: EmojiType[] = smileysAndEmotion.filter((emoji) => emoji.description.includes(searchString) ); const animalSearch: EmojiType[] = animalsAndNature.filter((emoji) => emoji.description.includes(searchString) ); const foodSearch: EmojiType[] = foodAndDrink.filter((emoji) => emoji.description.includes(searchString) ); const symbolSearch: EmojiType[] = symbols.filter((emoji) => emoji.description.includes(searchString) ); const flagsSearch: EmojiType[] = flags.filter((emoji) => emoji.description.includes(searchString) ); const travelSearch: EmojiType[] = travelAndPlaces.filter((emoji) => emoji.description.includes(searchString) ); setSearchedEmojis([ ...smileySearch, ...animalSearch, ...foodSearch, ...symbolSearch, ...flagsSearch, ...travelSearch, ]); } }, [searchString]); const getIconColor = useCallback( (tab: EmojiTabsType) => { return activeTab === tab ? 'primary' : 'body'; }, [activeTab] ); const ClockIcon = (props: IconProps) => { return ; }; const SmileysIcon = (props: IconProps) => { return ; }; const AnimalIcon = (props: IconProps) => { return ; }; const FoodIcon = (props: IconProps) => { return ; }; const TravelIcon = (props: IconProps) => { return ; }; const SymbolIcon = (props: IconProps) => { return ; }; const FlagIcon = (props: IconProps) => { return ; }; const emojiTabs: EmojiTabsProps[] = [ { value: 'recent', Icon: ClockIcon, }, { value: 'smileys', Icon: SmileysIcon, }, { value: 'animal', Icon: AnimalIcon, }, { value: 'food', Icon: FoodIcon, }, { value: 'travel', Icon: TravelIcon, }, { value: 'symbol', Icon: SymbolIcon, }, { value: 'flag', Icon: FlagIcon, }, ]; const emojis = emojisObject[activeTab]; const emojiTitle = emojiTitles[activeTab]; const selectEmoji = useCallback(() => { isEmojisOpenVar(false); }, []); const isSearchEmojisValid = searchedEmojis && searchedEmojis?.length > 0; const InnerEmojisAction = () => { return ( <> } shapeVariant="round" placeholder="Search Emoji" variant="plain" onChangeText={setSearchString} value={searchString} backgroundVariant="base-02" colorVariant="primary" /> <> <> Search Results {searchedEmojis?.map(({ emoji }) => ( {emoji} } onPress={() => selectEmoji()} /> ))} {emojiTitle} {emojis.map(({ emoji }) => ( {emoji} } onPress={() => selectEmoji()} /> ))} {emojiTabs.map(({ Icon, value }) => ( setActiveTab(value)} variant="plain" colorVariant="base" shapeVariant="round" sizeVariant="medium" hoverColorVariant="base-02-hover" centerElement={Icon({})} /> ))} ); }; const isOpenOnMobile = isMobile && isSheetOpen; return ( <> {}}> ); }; export interface EmojisSheetProps { isSheetOpen: boolean; setIsSheetOpen: (value: boolean) => void; } type EmojiType = { emoji: string; description: string; category: string; }; type EmojiTabsType = 'recent' | 'smileys' | 'animal' | 'food' | 'travel' | 'symbol' | 'flag'; interface EmojiTabsProps { Icon: (props: IconProps) => JSX.Element; value: EmojiTabsType; }