|
|
|
@ -19,6 +19,7 @@ type Props = {
|
|
|
|
|
name?: string; // display name, profileName or phoneNumber, whatever is set first
|
|
|
|
|
pubkey?: string;
|
|
|
|
|
size: AvatarSize;
|
|
|
|
|
base64Data?: string; // if this is not empty, it will be used to render the avatar with base64 encoded data
|
|
|
|
|
memberAvatars?: Array<ConversationAvatar>; // this is added by usingClosedConversationDetails
|
|
|
|
|
onAvatarClick?: () => void;
|
|
|
|
|
};
|
|
|
|
@ -55,27 +56,29 @@ const NoImage = (props: {
|
|
|
|
|
|
|
|
|
|
const AvatarImage = (props: {
|
|
|
|
|
avatarPath?: string;
|
|
|
|
|
base64Data?: string;
|
|
|
|
|
name?: string; // display name, profileName or phoneNumber, whatever is set first
|
|
|
|
|
imageBroken: boolean;
|
|
|
|
|
handleImageError: () => any;
|
|
|
|
|
}) => {
|
|
|
|
|
const { avatarPath, name, imageBroken, handleImageError } = props;
|
|
|
|
|
const { avatarPath, base64Data, name, imageBroken, handleImageError } = props;
|
|
|
|
|
|
|
|
|
|
if (!avatarPath || imageBroken) {
|
|
|
|
|
if ((!avatarPath && !base64Data) || imageBroken) {
|
|
|
|
|
return null;
|
|
|
|
|
}
|
|
|
|
|
const dataToDisplay = base64Data ? `data:image/jpeg;base64,${base64Data}` : avatarPath;
|
|
|
|
|
|
|
|
|
|
return (
|
|
|
|
|
<img
|
|
|
|
|
onError={handleImageError}
|
|
|
|
|
alt={window.i18n('contactAvatarAlt', [name])}
|
|
|
|
|
src={avatarPath}
|
|
|
|
|
src={dataToDisplay}
|
|
|
|
|
/>
|
|
|
|
|
);
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
export const Avatar = (props: Props) => {
|
|
|
|
|
const { avatarPath, size, memberAvatars, name } = props;
|
|
|
|
|
const { avatarPath, base64Data, size, memberAvatars, name } = props;
|
|
|
|
|
const [imageBroken, setImageBroken] = useState(false);
|
|
|
|
|
// contentType is not important
|
|
|
|
|
|
|
|
|
@ -86,7 +89,7 @@ export const Avatar = (props: Props) => {
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
const isClosedGroupAvatar = memberAvatars && memberAvatars.length;
|
|
|
|
|
const hasImage = urlToLoad && !imageBroken && !isClosedGroupAvatar;
|
|
|
|
|
const hasImage = (base64Data || urlToLoad) && !imageBroken && !isClosedGroupAvatar;
|
|
|
|
|
|
|
|
|
|
const isClickable = !!props.onAvatarClick;
|
|
|
|
|
|
|
|
|
@ -107,6 +110,7 @@ export const Avatar = (props: Props) => {
|
|
|
|
|
{hasImage ? (
|
|
|
|
|
<AvatarImage
|
|
|
|
|
avatarPath={urlToLoad}
|
|
|
|
|
base64Data={base64Data}
|
|
|
|
|
imageBroken={imageBroken}
|
|
|
|
|
name={name}
|
|
|
|
|
handleImageError={handleImageError}
|
|
|
|
|