import React, { useCallback, useMemo, useState } from 'react'; import { ColorValue, StyleProp, StyleSheet, View, ViewStyle } from 'react-native'; import { avatarSizes } from './constants'; import { useComponentsContext } from '../../../contexts/componentsContext/ComponentsContext'; import { useTheme } from '../../../contexts/themeContext/ThemeContext'; import { primitives } from '../../../theme'; export type AvatarProps = { size: '2xl' | 'xl' | 'lg' | 'md' | 'sm' | 'xs'; imageUrl?: string; placeholder?: React.ReactNode; showBorder?: boolean; backgroundColor?: ColorValue; style?: StyleProp; }; export const Avatar = (props: AvatarProps) => { const [error, setError] = useState(false); const { theme: { semantics }, } = useTheme(); const { ImageComponent } = useComponentsContext(); const defaultAvatarBg = semantics.avatarPaletteBg1; const { backgroundColor = defaultAvatarBg, size, imageUrl, placeholder, showBorder, style, } = props; const styles = useStyles(); const onHandleError = useCallback(() => { setError(true); }, []); return ( {imageUrl && !error ? ( ) : ( placeholder )} ); }; const useStyles = () => { const { theme: { semantics }, } = useTheme(); const { borderCoreOpacitySubtle } = semantics; return useMemo( () => StyleSheet.create({ border: { borderColor: borderCoreOpacitySubtle, borderWidth: 1, }, container: { alignItems: 'center', borderRadius: primitives.radiusMax, justifyContent: 'center', overflow: 'hidden', }, image: {}, }), [borderCoreOpacitySubtle], ); };