import * as React from 'react'; import { Image, ImageProps, ImageSourcePropType, StyleProp, StyleSheet, View, ViewStyle, } from 'react-native'; import { useInternalTheme } from '../../core/theming'; import type { ThemeProp } from '../../types'; const defaultSize = 64; export type AvatarImageSource = | ImageSourcePropType | ((props: { size: number }) => React.ReactNode); export type Props = React.ComponentPropsWithRef & { /** * Image to display for the `Avatar`. * It accepts a standard React Native Image `source` prop * Or a function that returns an `Image`. */ source: AvatarImageSource; /** * Size of the avatar. */ size?: number; style?: StyleProp; /** * Invoked on load error. */ onError?: ImageProps['onError']; /** * Invoked on mount and on layout changes. */ onLayout?: ImageProps['onLayout']; /** * Invoked when load completes successfully. */ onLoad?: ImageProps['onLoad']; /** * Invoked when load either succeeds or fails. */ onLoadEnd?: ImageProps['onLoadEnd']; /** * Invoked on load start. */ onLoadStart?: ImageProps['onLoadStart']; /** * Invoked on download progress. */ onProgress?: ImageProps['onProgress']; /** * @optional */ theme?: ThemeProp; }; /** * Avatars can be used to represent people in a graphical way. * *
*
* *
*
* * ## Usage * ```js * import * as React from 'react'; * import { Avatar } from 'react-native-paper'; * * const MyComponent = () => ( * * ); * export default MyComponent * ``` */ const AvatarImage = ({ size = defaultSize, source, style, onError, onLayout, onLoad, onLoadEnd, onLoadStart, onProgress, theme: themeOverrides, testID, ...rest }: Props) => { const { colors } = useInternalTheme(themeOverrides); const { backgroundColor = colors?.primary } = StyleSheet.flatten(style) || {}; return ( {typeof source === 'function' && source({ size })} {typeof source !== 'function' && ( )} ); }; AvatarImage.displayName = 'Avatar.Image'; export default AvatarImage;