import React, { useCallback, useContext, useEffect, useMemo, useState } from 'react'; import SmoothImage from 'react-smooth-image'; import { Avatar, Badge, Tooltip } from '@mui/material'; import { SendReceiveIcon } from '../Icons'; import placeholder from './placeholder.json'; import { AppContext, type UseAppStoreType } from '../../contexts/AppContext'; import { roboidentitiesClient } from '../../services/Roboidentities/Web'; interface Props { shortAlias?: string | undefined; hashId?: string | undefined; smooth?: boolean; small?: boolean; flipHorizontally?: boolean; style?: object; imageStyle?: object; placeholderType?: 'loading' | 'generating'; statusColor?: 'primary' | 'secondary' | 'default' | 'error' | 'info' | 'success' | 'warning'; orderType?: number; tooltip?: string; tooltipPosition?: string; avatarClass?: string; onLoad?: () => void; } interface BackgroundData { mime: string; data: string; } const RobotAvatar: React.FC = ({ shortAlias, hashId, orderType, statusColor, tooltip, tooltipPosition = 'right', smooth = false, small = false, flipHorizontally = false, placeholderType = 'loading', style = {}, avatarClass = 'flippedSmallAvatar', imageStyle = {}, onLoad = () => {}, }) => { const [avatarSrc, setAvatarSrc] = useState(''); const [activeBackground, setActiveBackground] = useState(true); const { hostUrl } = useContext(AppContext); const backgroundFadeTime = 3000; const [backgroundData] = useState(placeholder.loading); const backgroundImage = `url(data:${backgroundData.mime};base64,${backgroundData.data})`; const className = placeholderType === 'loading' ? 'loadingAvatar' : 'generatingAvatar'; useEffect(() => { if (hashId !== undefined) { roboidentitiesClient .generateRobohash(hashId, small ? 'small' : 'large') .then((avatar) => { setAvatarSrc(avatar); }) .catch(() => { setAvatarSrc(''); }); setTimeout(() => { setActiveBackground(false); }, backgroundFadeTime); } }, [hashId]); useEffect(() => { if (shortAlias !== undefined) { if (window.NativeRobosats === undefined) { setAvatarSrc( `${hostUrl}/static/federation/avatars/${shortAlias}${small ? '.small' : ''}.webp`, ); } else { setAvatarSrc( `file:///android_asset/Web.bundle/assets/federation/avatars/${shortAlias}.webp`, ); } setTimeout(() => { setActiveBackground(false); }, backgroundFadeTime); } else { setActiveBackground(true); } }, [shortAlias]); const statusBadge = (
{orderType === 0 ? ( ) : ( )}
); const avatar = useMemo(() => { if (smooth) { return (
); } else { return ( ); } }, [hashId, shortAlias, avatarSrc, statusColor, tooltip, avatarClass, activeBackground]); const getAvatarWithBadges = useCallback(() => { let component = avatar; if (statusColor !== undefined) { component = ( {component} ); } if (orderType !== undefined) { component = ( {component} ); } if (tooltip !== undefined) { component = ( {component} ); } return component; }, [avatar]); return getAvatarWithBadges(); }; export default RobotAvatar;