import PropTypes from 'prop-types' import React, { ReactNode } from 'react' import { StyleSheet, View, ImageStyle, TextStyle, ViewStyle, } from 'react-native' import GiftedAvatar from './GiftedAvatar' import { StylePropType, isSameUser, isSameDay } from './utils' import { Omit, IMessage, User, LeftRightStyle } from './Models' const styles = { left: StyleSheet.create({ container: { marginRight: 8, }, onTop: { alignSelf: 'flex-start', }, onBottom: {}, image: { height: 36, width: 36, borderRadius: 18, }, }), right: StyleSheet.create({ container: { marginLeft: 8, }, onTop: { alignSelf: 'flex-start', }, onBottom: {}, image: { height: 36, width: 36, borderRadius: 18, }, }), } export interface AvatarProps { currentMessage?: TMessage previousMessage?: TMessage nextMessage?: TMessage position: 'left' | 'right' renderAvatarOnTop?: boolean showAvatarForEveryMessage?: 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 { renderAvatarOnTop, showAvatarForEveryMessage, containerStyle, position, currentMessage, renderAvatar, previousMessage, nextMessage, imageStyle, } = props const messageToCompare = renderAvatarOnTop ? previousMessage : nextMessage const computedStyle = renderAvatarOnTop ? 'onTop' : 'onBottom' if (renderAvatar === null) return null if ( !showAvatarForEveryMessage && currentMessage && messageToCompare && isSameUser(currentMessage, messageToCompare) && isSameDay(currentMessage, messageToCompare) ) return ( ) const renderAvatarComponent = () => { if (props.renderAvatar) { const { renderAvatar, ...avatarProps } = props return props.renderAvatar(avatarProps) } if (props.currentMessage) return ( props.onPressAvatar?.(props.currentMessage!.user)} onLongPress={() => props.onLongPressAvatar?.(props.currentMessage!.user) } /> ) return null } return ( {renderAvatarComponent()} ) } Avatar.defaultProps = { renderAvatarOnTop: false, showAvatarForEveryMessage: false, position: 'left', currentMessage: { user: null, }, previousMessage: {}, nextMessage: {}, containerStyle: {}, imageStyle: {}, onPressAvatar: () => {}, onLongPressAvatar: () => {}, } Avatar.propTypes = { renderAvatarOnTop: PropTypes.bool, showAvatarForEveryMessage: PropTypes.bool, position: PropTypes.oneOf(['left', 'right']), currentMessage: PropTypes.object, previousMessage: PropTypes.object, nextMessage: PropTypes.object, onPressAvatar: PropTypes.func, onLongPressAvatar: PropTypes.func, renderAvatar: PropTypes.func, containerStyle: PropTypes.shape({ left: StylePropType, right: StylePropType, }), imageStyle: PropTypes.shape({ left: StylePropType, right: StylePropType, }), }