import React from 'react'; import { StyleSheet, View } from 'react-native'; import { MessageInputContextValue, useMessageInputContext, } from '../../contexts/messageInputContext/MessageInputContext'; import { useTheme } from '../../contexts/themeContext/ThemeContext'; import type { DefaultAttachmentType, DefaultChannelType, DefaultCommandType, DefaultEventType, DefaultMessageType, DefaultReactionType, DefaultUserType, UnknownType, } from '../../types/types'; const styles = StyleSheet.create({ attachButtonContainer: { paddingRight: 10 }, }); export type InputButtonsProps< At extends DefaultAttachmentType = 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>; export type InputButtonsWithContextProps< At extends DefaultAttachmentType = 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< MessageInputContextValue, | 'AttachButton' | 'CommandsButton' | 'giphyActive' | 'hasCommands' | 'hasFilePicker' | 'hasImagePicker' | 'MoreOptionsButton' | 'openCommandsPicker' | 'selectedPicker' | 'setShowMoreOptions' | 'showMoreOptions' | 'text' | 'toggleAttachmentPicker' | 'uploadsEnabled' >; export const InputButtonsWithContext = < At extends DefaultAttachmentType = 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: InputButtonsWithContextProps, ) => { const { AttachButton, CommandsButton, giphyActive, hasCommands, hasFilePicker, hasImagePicker, MoreOptionsButton, openCommandsPicker, setShowMoreOptions, showMoreOptions, text, toggleAttachmentPicker, uploadsEnabled, } = props; const { theme: { messageInput: { attachButtonContainer, commandsButtonContainer }, }, } = useTheme(); if (giphyActive) { return null; } return !showMoreOptions && (hasImagePicker || hasFilePicker) && hasCommands ? ( setShowMoreOptions(true)} /> ) : ( <> {(hasImagePicker || hasFilePicker) && uploadsEnabled !== false && ( )} {hasCommands && !text && ( )} ); }; 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: InputButtonsWithContextProps, nextProps: InputButtonsWithContextProps, ) => { const { giphyActive: prevGiphyActive, hasCommands: prevHasCommands, hasFilePicker: prevHasFilePicker, hasImagePicker: prevHasImagePicker, selectedPicker: prevSelectedPicker, showMoreOptions: prevShowMoreOptions, text: prevText, uploadsEnabled: prevUploadsEnabled, } = prevProps; const { giphyActive: nextGiphyActive, hasCommands: nextHasCommands, hasFilePicker: nextHasFilePicker, hasImagePicker: nextHasImagePicker, selectedPicker: nextSelectedPicker, showMoreOptions: nextShowMoreOptions, text: nextText, uploadsEnabled: nextUploadsEnabled, } = nextProps; if (prevHasImagePicker !== nextHasImagePicker) { return false; } if (prevHasFilePicker !== nextHasFilePicker) { return false; } if (prevHasCommands !== nextHasCommands) { return false; } if (prevUploadsEnabled !== nextUploadsEnabled) { return false; } if (prevSelectedPicker !== nextSelectedPicker) { return false; } if (prevShowMoreOptions !== nextShowMoreOptions) { return false; } if ((!prevProps.text && nextText) || (prevText && !nextText)) { return false; } if (prevGiphyActive !== nextGiphyActive) { return false; } return true; }; const MemoizedInputButtonsWithContext = React.memo( InputButtonsWithContext, areEqual, ) as typeof InputButtonsWithContext; export const InputButtons = < At extends DefaultAttachmentType = 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: InputButtonsProps, ) => { const { AttachButton, CommandsButton, giphyActive, hasCommands, hasFilePicker, hasImagePicker, MoreOptionsButton, openCommandsPicker, selectedPicker, setShowMoreOptions, showMoreOptions, text, toggleAttachmentPicker, uploadsEnabled, } = useMessageInputContext(); return ( ); };