import React, { ReactNode, useCallback } from 'react' import { ImageStyle, StyleSheet, TextStyle, View, ViewStyle, } from 'react-native' import { GiftedAvatar } from './GiftedAvatar' import { IMessage, LeftRightStyle, User } from './Models' import { isSameUser, isSameDay } from './utils' interface Styles { left: { container: ViewStyle onTop: ViewStyle image: ImageStyle } right: { container: ViewStyle onTop: ViewStyle image: ImageStyle } } const styles: Styles = { left: StyleSheet.create({ container: { marginRight: 8, }, onTop: { alignSelf: 'flex-start', }, image: { height: 36, width: 36, borderRadius: 18, }, }), right: StyleSheet.create({ container: { marginLeft: 8, }, onTop: { alignSelf: 'flex-start', }, image: { height: 36, width: 36, borderRadius: 18, }, }), } export interface AvatarProps { currentMessage: TMessage previousMessage?: TMessage nextMessage?: TMessage position: 'left' | 'right' isAvatarOnTop?: boolean isAvatarVisibleForEveryMessage?: boolean imageStyle?: LeftRightStyle containerStyle?: LeftRightStyle textStyle?: TextStyle renderAvatar?(props: Omit, 'renderAvatar'>): ReactNode onPressAvatar?: (user: User) => void onLongPressAvatar?: (user: User) => void } export function Avatar ( props: AvatarProps ) { const { isAvatarOnTop, isAvatarVisibleForEveryMessage, containerStyle, position, currentMessage, renderAvatar, previousMessage, nextMessage, imageStyle, onPressAvatar, onLongPressAvatar, } = props const messageToCompare = isAvatarOnTop ? previousMessage : nextMessage const renderAvatarComponent = useCallback(() => { if (renderAvatar) return renderAvatar({ isAvatarOnTop, isAvatarVisibleForEveryMessage, containerStyle, position, currentMessage, previousMessage, nextMessage, imageStyle, onPressAvatar, onLongPressAvatar, }) if (currentMessage) return ( onPressAvatar?.(currentMessage.user)} onLongPress={() => onLongPressAvatar?.(currentMessage.user)} /> ) return null }, [ renderAvatar, isAvatarOnTop, isAvatarVisibleForEveryMessage, containerStyle, position, currentMessage, previousMessage, nextMessage, imageStyle, onPressAvatar, onLongPressAvatar, ]) if (renderAvatar === null) return null if ( !isAvatarVisibleForEveryMessage && currentMessage && messageToCompare && isSameUser(currentMessage, messageToCompare) && isSameDay(currentMessage, messageToCompare) ) return ( ) return ( {renderAvatarComponent()} ) }