import React from 'react'; import { View } from 'react-native'; import { Avatar, AvatarProps } from '../../Avatar/Avatar'; import { MessageContextValue, useMessageContext, } from '../../../contexts/messageContext/MessageContext'; import { useTheme } from '../../../contexts/themeContext/ThemeContext'; import type { DefaultAttachmentType, DefaultChannelType, DefaultCommandType, DefaultEventType, DefaultMessageType, DefaultReactionType, DefaultUserType, UnknownType, } from '../../../types/types'; export type MessageAvatarPropsWithContext< 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, 'alignment' | 'lastGroupMessage' | 'message' | 'showAvatar' > & Partial>; const MessageAvatarWithContext = < 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: MessageAvatarPropsWithContext, ) => { const { alignment, lastGroupMessage, message, showAvatar, size } = props; const { theme: { avatar: { BASE_AVATAR_SIZE }, messageSimple: { avatarWrapper: { container, leftAlign, rightAlign, spacer }, }, }, } = useTheme(); const visible = typeof showAvatar === 'boolean' ? showAvatar : lastGroupMessage; return ( {visible ? ( ) : ( )} ); }; 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: MessageAvatarPropsWithContext, nextProps: MessageAvatarPropsWithContext, ) => { const { lastGroupMessage: prevLastGroupMessage, message: prevMessage } = prevProps; const { lastGroupMessage: nextLastGroupMessage, message: nextMessage } = nextProps; const lastGroupMessageEqual = prevLastGroupMessage === nextLastGroupMessage; if (!lastGroupMessageEqual) return false; const userEqual = prevMessage.user?.image === nextMessage.user?.image && prevMessage.user?.name === nextMessage.user?.name && prevMessage.user?.id === nextMessage.user?.id; if (!userEqual) return false; return true; }; const MemoizedMessageAvatar = React.memo( MessageAvatarWithContext, areEqual, ) as typeof MessageAvatarWithContext; export type MessageAvatarProps< 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 MessageAvatar = < 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: MessageAvatarProps, ) => { const { alignment, lastGroupMessage, message, showAvatar } = useMessageContext(); return ( ); }; MessageAvatar.displayName = 'MessageAvatar{messageSimple{avatarWrapper}}';