import React, {useCallback} from 'react' import {StyleSheet, View, TouchableOpacity, Alert, Image} from 'react-native' import Svg, {Circle, Text, Defs, LinearGradient, Stop} from 'react-native-svg' import {FontAwesomeIcon} from '@fortawesome/react-native-fontawesome' import { openCamera, openCropper, openPicker, } from 'react-native-image-crop-picker' import {getGradient} from '../../lib/asset-gen' import {colors} from '../../lib/styles' import {IMAGES_ENABLED} from '../../../build-flags' export function UserAvatar({ size, handle, userAvatar, displayName, setUserAvatar, }: { size: number handle: string displayName: string | undefined userAvatar: string | null | undefined setUserAvatar?: React.Dispatch> }) { const initials = getInitials(displayName || handle) const gradient = getGradient(handle) const handleEditAvatar = useCallback(() => { Alert.alert('Select upload method', '', [ { text: 'Take a new photo', onPress: () => { openCamera({ mediaType: 'photo', cropping: true, width: 80, height: 80, cropperCircleOverlay: true, }).then(item => { if (setUserAvatar != null) { setUserAvatar(item.path) } }) }, }, { text: 'Select from gallery', onPress: () => { openPicker({ mediaType: 'photo', }).then(async item => { await openCropper({ mediaType: 'photo', path: item.path, width: 80, height: 80, cropperCircleOverlay: true, }).then(croppedItem => { if (setUserAvatar != null) { setUserAvatar(croppedItem.path) } }) }) }, }, ]) }, [setUserAvatar]) const renderSvg = (size: number, initials: string) => ( {initials} ) // setUserAvatar is only passed as prop on the EditProfile component return setUserAvatar != null && IMAGES_ENABLED ? ( {userAvatar ? ( ) : ( renderSvg(size, initials) )} ) : userAvatar ? ( ) : ( renderSvg(size, initials) ) } function getInitials(str: string): string { const tokens = str .toLowerCase() .replace(/[^a-z]/g, '') .split(' ') .filter(Boolean) .map(v => v.trim()) if (tokens.length >= 2 && tokens[0][0] && tokens[0][1]) { return tokens[0][0].toUpperCase() + tokens[1][0].toUpperCase() } if (tokens.length === 1 && tokens[0][0]) { return tokens[0][0].toUpperCase() } return 'X' } const styles = StyleSheet.create({ editButtonContainer: { position: 'absolute', width: 24, height: 24, bottom: 0, right: 0, borderRadius: 12, alignItems: 'center', justifyContent: 'center', backgroundColor: colors.gray5, }, avatarImage: { width: 80, height: 80, borderRadius: 40, }, })