import React from 'react'; import { StyleSheet, Text, View } from 'react-native'; import { isMessageWithStylesReadByAndDateSeparator } from '../../MessageList/hooks/useMessageList'; import { MessageContextValue, useMessageContext, } from '../../../contexts/messageContext/MessageContext'; import { useTheme } from '../../../contexts/themeContext/ThemeContext'; import { Check } from '../../../icons/Check'; import { CheckAll } from '../../../icons/CheckAll'; import { Time } from '../../../icons/Time'; import type { DefaultAttachmentType, DefaultChannelType, DefaultCommandType, DefaultEventType, DefaultMessageType, DefaultReactionType, DefaultUserType, UnknownType, } from '../../../types/types'; const styles = StyleSheet.create({ readByCount: { fontSize: 11, fontWeight: '700', paddingRight: 3, }, statusContainer: { alignItems: 'flex-end', flexDirection: 'row', justifyContent: 'center', paddingRight: 3, }, }); export type MessageStatusPropsWithContext< 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, > = Pick< MessageContextValue, 'message' | 'readEventsEnabled' | 'threadList' >; const MessageStatusWithContext = < 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: MessageStatusPropsWithContext, ) => { const { message, readEventsEnabled, threadList } = props; const { theme: { colors: { accent_blue }, messageSimple: { status: { checkAllIcon, checkIcon, readByCount, statusContainer, timeIcon }, }, }, } = useTheme(); if (message.status === 'sending') { return ( ); } if ( isMessageWithStylesReadByAndDateSeparator(message) && !threadList && readEventsEnabled !== false ) { return ( {typeof message.readBy === 'number' ? ( {message.readBy} ) : null} {typeof message.readBy === 'number' || message.readBy === true ? ( ) : ( )} ); } if (message.status === 'received' && message.type !== 'ephemeral' && !threadList) { return ( ); } return null; }; 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: MessageStatusPropsWithContext, nextProps: MessageStatusPropsWithContext, ) => { const { message: prevMessage, readEventsEnabled: prevReadEventsEnabled, threadList: prevThreadList, } = prevProps; const { message: nextMessage, readEventsEnabled: nextReadEventsEnabled, threadList: nextThreadList, } = nextProps; const threadListEqual = prevThreadList === nextThreadList; if (!threadListEqual) return false; const readEventsEnabledEqual = prevReadEventsEnabled === nextReadEventsEnabled; if (!readEventsEnabledEqual) return false; const messageEqual = prevMessage.status === nextMessage.status && prevMessage.type === nextMessage.type && (isMessageWithStylesReadByAndDateSeparator(prevMessage) && prevMessage.readBy) === (isMessageWithStylesReadByAndDateSeparator(nextMessage) && nextMessage.readBy); if (!messageEqual) return false; return true; }; const MemoizedMessageStatus = React.memo( MessageStatusWithContext, areEqual, ) as typeof MessageStatusWithContext; export type MessageStatusProps< 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, > = Partial>; export const MessageStatus = < 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: MessageStatusProps, ) => { const { message, readEventsEnabled, threadList } = useMessageContext(); return ; }; MessageStatus.displayName = 'MessageStatus{messageSimple{status}}';