import React from 'react'; import { TouchableOpacity } from 'react-native-gesture-handler'; import { ChannelContextValue, useChannelContext, } from '../../contexts/channelContext/ChannelContext'; import { isSuggestionCommand, SuggestionsContextValue, useSuggestionsContext, } from '../../contexts/suggestionsContext/SuggestionsContext'; import { useTheme } from '../../contexts/themeContext/ThemeContext'; import { Lightning } from '../../icons/Lightning'; import type { GestureResponderEvent } from 'react-native'; import type { DefaultAttachmentType, DefaultChannelType, DefaultCommandType, DefaultEventType, DefaultMessageType, DefaultReactionType, DefaultUserType, UnknownType, } from '../../types/types'; type CommandsButtonPropsWithContext< At extends UnknownType = DefaultAttachmentType, Ch extends UnknownType = DefaultChannelType, Co extends string = DefaultCommandType, Ev extends UnknownType = DefaultEventType, Me extends UnknownType = DefaultMessageType, Re extends UnknownType = DefaultReactionType, Us extends UnknownType = DefaultUserType, > = Pick, 'disabled'> & Pick, 'suggestions'> & { /** Function that opens commands selector */ handleOnPress?: ((event: GestureResponderEvent) => void) & (() => void); }; const CommandsButtonWithContext = < At extends UnknownType = DefaultAttachmentType, Ch extends UnknownType = DefaultChannelType, Co extends string = DefaultCommandType, Ev extends UnknownType = DefaultEventType, Me extends UnknownType = DefaultMessageType, Re extends UnknownType = DefaultReactionType, Us extends UnknownType = DefaultUserType, >( props: CommandsButtonPropsWithContext, ) => { const { disabled, handleOnPress, suggestions } = props; const { theme: { colors: { accent_blue, grey }, messageInput: { commandsButton }, }, } = useTheme(); return ( isSuggestionCommand(suggestion)) ? accent_blue : grey } /> ); }; const areEqual = < At extends UnknownType = DefaultAttachmentType, Ch extends UnknownType = DefaultChannelType, Co extends string = DefaultCommandType, Ev extends UnknownType = DefaultEventType, Me extends UnknownType = DefaultMessageType, Re extends UnknownType = DefaultReactionType, Us extends UnknownType = DefaultUserType, >( prevProps: CommandsButtonPropsWithContext, nextProps: CommandsButtonPropsWithContext, ) => { const { disabled: prevDisabled, suggestions: prevSuggestions } = prevProps; const { disabled: nextDisabled, suggestions: nextSuggestions } = nextProps; const disabledEqual = prevDisabled === nextDisabled; if (!disabledEqual) return false; const suggestionsEqual = !!prevSuggestions === !!nextSuggestions; if (!suggestionsEqual) return false; return true; }; const MemoizedCommandsButton = React.memo( CommandsButtonWithContext, areEqual, ) as typeof CommandsButtonWithContext; export type CommandsButtonProps< At extends UnknownType = DefaultAttachmentType, Ch extends UnknownType = DefaultChannelType, Co extends string = DefaultCommandType, Ev extends UnknownType = DefaultEventType, Me extends UnknownType = DefaultMessageType, Re extends UnknownType = DefaultReactionType, Us extends UnknownType = DefaultUserType, > = Partial>; /** * UI Component for attach button in MessageInput component. */ export const CommandsButton = < At extends UnknownType = DefaultAttachmentType, Ch extends UnknownType = DefaultChannelType, Co extends string = DefaultCommandType, Ev extends UnknownType = DefaultEventType, Me extends UnknownType = DefaultMessageType, Re extends UnknownType = DefaultReactionType, Us extends UnknownType = DefaultUserType, >( props: CommandsButtonProps, ) => { const { disabled = false } = useChannelContext(); const { suggestions } = useSuggestionsContext(); return ; }; CommandsButton.displayName = 'CommandsButton{messageInput}';