import React from 'react'; import { ColorValue, Platform, StyleSheet, Text, TouchableOpacity, View } from 'react-native'; import { 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 { DefaultAttachmentType, DefaultChannelType, DefaultCommandType, DefaultEventType, DefaultMessageType, DefaultReactionType, DefaultUserType, UnknownType, } from '../../../types/types'; const styles = StyleSheet.create({ container: { alignItems: 'center', flexDirection: 'row', marginTop: 8, }, curveContainer: { flexDirection: 'row', }, leftMessageRepliesCurve: { borderBottomLeftRadius: 16, borderRightColor: 'transparent', ...Platform.select({ android: { borderRightWidth: 0, }, }), }, messageRepliesCurve: { borderTopColor: 'transparent', borderTopWidth: 0, borderWidth: 1, height: 16, width: 16, }, messageRepliesText: { fontSize: 12, fontWeight: '700', paddingBottom: 5, paddingLeft: 8, }, rightMessageRepliesCurve: { borderBottomRightRadius: 16, borderLeftColor: 'transparent', ...Platform.select({ android: { borderLeftWidth: 0, }, }), }, }); export type MessageRepliesPropsWithContext< 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< MessageContextValue, | 'alignment' | 'message' | 'onLongPress' | 'onPress' | 'onPressIn' | 'onOpenThread' | 'preventPress' | 'threadList' > & Pick, 'MessageRepliesAvatars'> & Pick & { noBorder?: boolean; repliesCurveColor?: ColorValue; }; const MessageRepliesWithContext = < 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: MessageRepliesPropsWithContext, ) => { const { alignment, message, MessageRepliesAvatars, noBorder, onLongPress, onOpenThread, onPress, onPressIn, preventPress, repliesCurveColor, t, threadList, } = props; const { theme: { colors: { accent_blue }, messageSimple: { replies: { container, leftCurve, messageRepliesText, rightCurve }, }, }, } = useTheme(); if (threadList || !message.reply_count) return null; return ( {alignment === 'left' && ( {!noBorder && ( )} )} { if (onLongPress) { onLongPress({ emitter: 'messageReplies', event, }); } }} onPress={(event) => { if (onPress) { onPress({ defaultHandler: onOpenThread, emitter: 'messageReplies', event, }); } }} onPressIn={(event) => { if (onPressIn) { onPressIn({ defaultHandler: onOpenThread, emitter: 'messageReplies', event, }); } }} style={[styles.container, container]} testID='message-replies' > {message.reply_count === 1 ? t('1 Thread Reply') : t('{{ replyCount }} Thread Replies', { replyCount: message.reply_count, })} {alignment === 'right' && ( {!noBorder && ( )} )} ); }; 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: MessageRepliesPropsWithContext, nextProps: MessageRepliesPropsWithContext, ) => { const { message: prevMessage, noBorder: prevNoBorder, t: prevT, threadList: prevThreadList, } = prevProps; const { message: nextMessage, noBorder: nextNoBorder, t: nextT, threadList: nextThreadList, } = nextProps; const threadListEqual = prevThreadList === nextThreadList; if (!threadListEqual) return false; const messageReplyCountEqual = prevMessage.reply_count === nextMessage.reply_count; if (!messageReplyCountEqual) return false; const noBorderEqual = prevNoBorder === nextNoBorder; if (!noBorderEqual) return false; const tEqual = prevT === nextT; if (!tEqual) return false; return true; }; const MemoizedMessageReplies = React.memo( MessageRepliesWithContext, areEqual, ) as typeof MessageRepliesWithContext; export type MessageRepliesProps< 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>; export const MessageReplies = < 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: MessageRepliesProps, ) => { const { alignment, message, onLongPress, onOpenThread, onPress, onPressIn, preventPress, threadList, } = useMessageContext(); const { MessageRepliesAvatars } = useMessagesContext(); const { t } = useTranslationContext(); return ( ); }; MessageReplies.displayName = 'MessageReplies{messageSimple{replies}}';