2021-07-12 12:26:10 +01:00
|
|
|
import React, { useState, useEffect } from 'react';
|
2020-09-03 14:21:16 +03:00
|
|
|
import { Image } from '@freecodecamp/react-bootstrap';
|
2021-06-25 20:11:27 +05:30
|
|
|
import DefaultAvatar from '../../assets/icons/default-avatar';
|
2020-09-03 14:21:16 +03:00
|
|
|
import { defaultUserImage } from '../../../../config/misc';
|
2021-06-25 07:23:52 -07:00
|
|
|
import { borderColorPicker } from '.';
|
2020-12-16 02:02:52 -06:00
|
|
|
import { useTranslation } from 'react-i18next';
|
2020-09-03 14:21:16 +03:00
|
|
|
|
2021-06-25 07:23:52 -07:00
|
|
|
interface AvatarRendererProps {
|
|
|
|
isDonating?: boolean;
|
|
|
|
isTopContributor?: boolean;
|
|
|
|
picture: string;
|
|
|
|
userName: string;
|
|
|
|
}
|
2020-09-03 14:21:16 +03:00
|
|
|
|
2021-06-25 07:23:52 -07:00
|
|
|
function AvatarRenderer({
|
|
|
|
picture,
|
|
|
|
userName,
|
|
|
|
isDonating,
|
|
|
|
isTopContributor
|
|
|
|
}: AvatarRendererProps): JSX.Element {
|
2020-12-16 02:02:52 -06:00
|
|
|
const { t } = useTranslation();
|
2021-07-12 12:26:10 +01:00
|
|
|
const [isPictureValid, setIsPictureValid] = useState(true);
|
2021-06-25 07:23:52 -07:00
|
|
|
const borderColor: string = borderColorPicker(isDonating, isTopContributor);
|
2021-07-12 12:26:10 +01:00
|
|
|
const onImageLoad = () => setIsPictureValid(true);
|
|
|
|
const onImageError = () => setIsPictureValid(false);
|
|
|
|
|
|
|
|
useEffect(() => {
|
|
|
|
const validationImage = document.createElement('img');
|
|
|
|
validationImage.src = picture;
|
|
|
|
validationImage.onload = onImageLoad;
|
|
|
|
validationImage.onerror = onImageError;
|
|
|
|
}, [picture]);
|
|
|
|
|
2021-06-25 07:23:52 -07:00
|
|
|
const isPlaceHolderImage =
|
2021-07-12 12:26:10 +01:00
|
|
|
!isPictureValid ||
|
|
|
|
/example.com|identicon.org/.test(picture) ||
|
|
|
|
picture === defaultUserImage;
|
2020-09-03 14:21:16 +03:00
|
|
|
|
|
|
|
return (
|
|
|
|
<div className={`avatar-container ${borderColor}`}>
|
|
|
|
{isPlaceHolderImage ? (
|
|
|
|
<DefaultAvatar className='avatar default-avatar' />
|
|
|
|
) : (
|
|
|
|
<Image
|
2020-12-16 02:02:52 -06:00
|
|
|
alt={t('profile.avatar', { username: userName })}
|
2020-09-03 14:21:16 +03:00
|
|
|
className='avatar'
|
|
|
|
responsive={true}
|
|
|
|
src={picture}
|
|
|
|
/>
|
|
|
|
)}
|
|
|
|
</div>
|
|
|
|
);
|
|
|
|
}
|
|
|
|
|
|
|
|
AvatarRenderer.displayName = 'AvatarRenderer';
|
|
|
|
export default AvatarRenderer;
|