import React from 'react'; import { LayoutChangeEvent, StyleSheet, View } from 'react-native'; import merge from 'lodash/merge'; import { MessageTextContainer } from './MessageTextContainer'; import { Alignment, MessageContextValue, useMessageContext, } from '../../../contexts/messageContext/MessageContext'; import { MessagesContextValue, useMessagesContext, } from '../../../contexts/messagesContext/MessagesContext'; import { useTheme } from '../../../contexts/themeContext/ThemeContext'; import { TranslationContextValue, useTranslationContext, } from '../../../contexts/translationContext/TranslationContext'; import type { MessageFooterProps } from './MessageFooter'; import type { MessageType } from '../../MessageList/hooks/useMessageList'; import type { DefaultAttachmentType, DefaultChannelType, DefaultCommandType, DefaultEventType, DefaultMessageType, DefaultReactionType, DefaultUserType, UnknownType, } from '../../../types/types'; const styles = StyleSheet.create({ containerInner: { borderTopLeftRadius: 16, borderTopRightRadius: 16, borderWidth: 1, overflow: 'hidden', }, leftAlignItems: { alignItems: 'flex-start', }, rightAlignItems: { alignItems: 'flex-end', }, }); type MessageDeletedComponentProps = { formattedDate: string | Date; groupStyle: string; noBorder: boolean; onLayout: (event: LayoutChangeEvent) => void; }; type MessageDeletedPropsWithContext< 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, 'alignment' | 'message'> & Pick, 'MessageFooter'> & Pick & MessageDeletedComponentProps; const MessageDeletedWithContext = < 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: MessageDeletedPropsWithContext, ) => { const { alignment, formattedDate, groupStyle, message, MessageFooter, noBorder, onLayout, t } = props; const { theme: { colors: { grey, grey_whisper }, messageSimple: { content: { container: { borderRadiusL, borderRadiusS }, deletedContainer, deletedContainerInner, deletedText, }, }, }, } = useTheme(); return ( markdownStyles={merge({ em: { color: grey } }, deletedText)} message={{ ...message, text: `_${t('Message deleted')}_` }} /> ); }; 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: MessageDeletedPropsWithContext, nextProps: MessageDeletedPropsWithContext, ) => { const { alignment: prevAlignment, formattedDate: prevFormattedDate, message: prevMessage, } = prevProps; const { alignment: nextAlignment, formattedDate: nextFormattedDate, message: nextMessage, } = nextProps; const alignmentEqual = prevAlignment === nextAlignment; if (!alignmentEqual) return false; const messageEqual = prevMessage.deleted_at === nextMessage.deleted_at && prevMessage.reply_count === nextMessage.reply_count && prevMessage.status === nextMessage.status && prevMessage.type === nextMessage.type && prevMessage.text === nextMessage.text; if (!messageEqual) return false; const formattedDateEqual = prevFormattedDate === nextFormattedDate; if (!formattedDateEqual) return false; return true; }; const MemoizedMessageDeleted = React.memo( MessageDeletedWithContext, areEqual, ) as typeof MessageDeletedWithContext; export type MessageDeletedProps< 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 DefaultUserType = DefaultUserType, > = MessageDeletedComponentProps & { alignment?: Alignment; message?: MessageType; MessageFooter?: React.ComponentType>; }; export const MessageDeleted = < 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 DefaultUserType = DefaultUserType, >( props: MessageDeletedProps, ) => { const { alignment, message } = useMessageContext(); const { MessageFooter } = useMessagesContext(); const { t } = useTranslationContext(); return ( ); }; MessageDeleted.displayName = 'MessageDeleted{messageSimple{content}}';