import React from 'react'; import { FlatList, StyleSheet, TouchableOpacity, TouchableOpacityProps } from 'react-native'; import { CommandsItem } from './CommandsItem'; import { EmojisItem } from './EmojisItem'; import { MentionsItem } from './MentionsItem'; import { isSuggestionCommand, isSuggestionEmoji, isSuggestionUser, Suggestion, SuggestionComponentType, Suggestions, } from '../../contexts/suggestionsContext/SuggestionsContext'; import { useTheme } from '../../contexts/themeContext/ThemeContext'; import type { DefaultCommandType, DefaultUserType, UnknownType } from '../../types/types'; const styles = StyleSheet.create({ emojiItem: { paddingVertical: 10 }, }); const SuggestionsItem: React.FC = (props) => { const { children, ...touchableOpacityProps } = props; return {children}; }; SuggestionsItem.displayName = 'SuggestionsHeader{messageInput{suggestions}}'; const isString = ( component: SuggestionComponentType, ): component is string => typeof component === 'string'; export type SuggestionsListProps< Co extends string = DefaultCommandType, Us extends UnknownType = DefaultUserType, > = { active: boolean; componentType: SuggestionComponentType; suggestions: Suggestions; suggestionsTitle?: React.ReactElement; }; export const SuggestionsList = < Co extends string = DefaultCommandType, Us extends UnknownType = DefaultUserType, >( props: SuggestionsListProps, ) => { const { active, componentType: Component, suggestions: { data, onSelect }, suggestionsTitle: SuggestionsTitle, } = props; const { theme: { messageInput: { suggestions: { container: { maxHeight }, item: itemStyle, }, }, }, } = useTheme(); const renderItem = ({ index, item }: { index: number; item: Suggestion }) => { if (isString(Component)) { switch (Component) { case 'MentionsItem': if (isSuggestionUser(item)) { return ( onSelect(item)} style={[ { paddingBottom: index === data.length - 1 ? 8 : 0, paddingTop: index === 0 ? 8 : 0, }, itemStyle, ]} > ); } return null; case 'CommandsItem': if (isSuggestionCommand(item)) { return ( onSelect(item)} style={[itemStyle]}> ); } return null; case 'EmojisItem': if (isSuggestionEmoji(item)) { return ( onSelect(item)} style={[styles.emojiItem, itemStyle]}> ); } return null; default: return null; } } return ( onSelect(item)}> {React.cloneElement(Component, { item })} ); }; if (!active || data.length === 0) return null; return ( `${item.name || (isSuggestionUser(item) ? item.id : '')}${index}` } ListHeaderComponent={SuggestionsTitle ? SuggestionsTitle : undefined} renderItem={renderItem} style={{ maxHeight, }} /> ); }; SuggestionsList.displayName = 'SuggestionsList{messageInput{suggestions}}';