import React, { useCallback, useMemo } from "react"; import { Image, ImageSourcePropType, Text, View } from "react-native"; import { useCompTheme, useTheme } from "../../../theme/hook"; import { CometChatTheme } from "../../../theme/type"; import { deepMerge } from "../../helper/helperFunctions"; /** * Properties for the CometChatAvatar component. */ interface CometChatAvatarProps { /** * The image source for the avatar. * Can be a remote URI string, an object with a URI property, or a local require() number. */ image?: ImageSourcePropType; /** * The name to display if no valid image is provided. */ name: string; /** * Custom style for the avatar component, overriding theme styles. */ style?: CometChatTheme["avatarStyle"]; } /** * A functional component that renders a user's avatar. * * Props for the avatar. * The rendered avatar view. */ export const CometChatAvatar = (props: CometChatAvatarProps) => { const theme = useTheme(); const compTheme = useCompTheme(); const { image, name, style = {} } = props; // Merges theme styles with component styles and custom styles. const avatarStyle = useMemo(() => { return deepMerge(theme.avatarStyle, compTheme.avatarStyle ?? {}, style); }, [theme.avatarStyle, style, compTheme.avatarStyle]); // Returns an Image view if a valid image is provided, otherwise a text view with initials. const getImageView = useCallback(() => { const imageSource = typeof image === "string" ? { uri: image } : image; if ( (typeof imageSource === "object" && "uri" in imageSource && typeof imageSource.uri === "string") || typeof imageSource === "number" ) { return ; } const initials = [...(name || "")].slice(0, 2).join("").toUpperCase(); return ( {initials} ); }, [image, name, avatarStyle.imageStyle, avatarStyle.textStyle]); return {getImageView()}; };