mirror of
https://github.com/cinnyapp/cinny.git
synced 2025-09-13 14:22:25 +03:00
42 lines
1.1 KiB
TypeScript
42 lines
1.1 KiB
TypeScript
import { AvatarFallback, AvatarImage, color } from 'folds';
|
|
import React, { ReactEventHandler, ReactNode, useState } from 'react';
|
|
import classNames from 'classnames';
|
|
import * as css from './UserAvatar.css';
|
|
import colorMXID from '../../../util/colorMXID';
|
|
|
|
type UserAvatarProps = {
|
|
className?: string;
|
|
userId: string;
|
|
src?: string;
|
|
alt?: string;
|
|
renderFallback: () => ReactNode;
|
|
};
|
|
export function UserAvatar({ className, userId, src, alt, renderFallback }: UserAvatarProps) {
|
|
const [error, setError] = useState(false);
|
|
|
|
const handleLoad: ReactEventHandler<HTMLImageElement> = (evt) => {
|
|
evt.currentTarget.setAttribute('data-image-loaded', 'true');
|
|
};
|
|
|
|
if (!src || error) {
|
|
return (
|
|
<AvatarFallback
|
|
style={{ backgroundColor: colorMXID(userId), color: color.Surface.Container }}
|
|
className={classNames(css.UserAvatar, className)}
|
|
>
|
|
{renderFallback()}
|
|
</AvatarFallback>
|
|
);
|
|
}
|
|
|
|
return (
|
|
<AvatarImage
|
|
className={classNames(css.UserAvatar, className)}
|
|
src={src}
|
|
alt={alt}
|
|
onError={() => setError(true)}
|
|
onLoad={handleLoad}
|
|
draggable={false}
|
|
/>
|
|
);
|
|
}
|