Files
element-call/src/Avatar.tsx
T

70 lines
1.3 KiB
TypeScript
Raw Normal View History

2023-01-03 16:55:26 +00:00
/*
Copyright 2022-2024 New Vector Ltd.
2023-01-03 16:55:26 +00:00
SPDX-License-Identifier: AGPL-3.0-only
Please see LICENSE in the repository root for full details.
2023-01-03 16:55:26 +00:00
*/
2023-08-31 15:46:09 +02:00
import { useMemo, FC } from "react";
import { Avatar as CompoundAvatar } from "@vector-im/compound-web";
2022-05-06 11:32:09 +01:00
import { getAvatarUrl } from "./utils/matrix";
2022-05-18 19:00:59 -04:00
import { useClient } from "./ClientContext";
2021-12-07 17:59:55 -08:00
2022-05-18 19:00:59 -04:00
export enum Size {
XS = "xs",
SM = "sm",
MD = "md",
LG = "lg",
XL = "xl",
}
export const sizes = new Map([
[Size.XS, 22],
[Size.SM, 32],
[Size.MD, 36],
[Size.LG, 42],
[Size.XL, 90],
]);
2023-08-31 15:46:09 +02:00
interface Props {
id: string;
name: string;
className?: string;
2022-07-30 10:06:28 +02:00
src?: string;
2022-05-18 19:00:59 -04:00
size?: Size | number;
2022-05-06 11:32:09 +01:00
}
export const Avatar: FC<Props> = ({
2023-08-31 15:46:09 +02:00
className,
id,
name,
2021-12-07 17:59:55 -08:00
src,
2022-05-18 19:00:59 -04:00
size = Size.MD,
2022-05-06 11:32:09 +01:00
}) => {
2022-05-18 19:00:59 -04:00
const { client } = useClient();
2023-08-31 15:46:09 +02:00
const sizePx = useMemo(
2022-05-18 19:00:59 -04:00
() =>
Object.values(Size).includes(size as Size)
2023-08-31 15:46:09 +02:00
? sizes.get(size as Size)
: (size as number),
2023-10-11 10:42:04 -04:00
[size],
2022-05-18 19:00:59 -04:00
);
2023-06-30 16:43:28 +01:00
const resolvedSrc = useMemo(() => {
if (!client || !src || !sizePx) return undefined;
return src.startsWith("mxc://") ? getAvatarUrl(client, src, sizePx) : src;
2023-06-30 16:43:28 +01:00
}, [client, src, sizePx]);
2022-05-18 19:00:59 -04:00
2021-12-07 17:59:55 -08:00
return (
2023-08-31 15:46:09 +02:00
<CompoundAvatar
className={className}
id={id}
name={name}
size={`${sizePx}px`}
src={resolvedSrc}
/>
2021-12-07 17:59:55 -08:00
);
2022-05-06 11:32:09 +01:00
};