Press n or j to go to the next uncovered block, b, p or k for the previous block.
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 | 23x 23x 23x 23x 23x 23x 600x 509x 600x 72x 1277x 104x | import { Avatar as MuiAvatar, styled } from "@mui/material";
import Link from "next/link";
import { LiteUser } from "proto/api_pb";
import React from "react";
import { routeToUser } from "routes";
import { getProfileLinkA11yLabel } from "./constants";
type UserWithAvatarUrl = Pick<
LiteUser.AsObject,
"username" | "name" | "avatarUrl"
>;
type UserWithAvatarThumbnailUrl = Pick<
LiteUser.AsObject,
"username" | "name" | "avatarThumbnailUrl"
>;
interface AvatarPropsHighRes {
children?: React.ReactNode;
highRes?: true;
user?: UserWithAvatarUrl;
grow?: boolean;
className?: string;
isProfileLink?: boolean;
style?: React.CSSProperties;
openInNewTab?: boolean;
}
interface AvatarPropsLowRes
extends Omit<AvatarPropsHighRes, "highRes" | "user"> {
highRes?: false | undefined;
user?: UserWithAvatarThumbnailUrl;
}
const StyledWrapper = styled("div")<{
isDefaultSize: boolean;
grow: boolean | undefined;
}>(({ isDefaultSize, grow }) => ({
flexShrink: 0,
position: "relative",
...(isDefaultSize && { height: "3rem", width: "3rem" }),
...(grow && { height: 0, paddingTop: "min(18rem, 100%)", width: "100%" }),
}));
const StyledLink = styled(Link)(({ theme }) => ({
display: "flex",
justifyContent: "center",
alignItems: "center",
}));
const StyledMuiAvatar = styled(MuiAvatar)(() => ({
height: "100%",
position: "absolute",
top: 0,
width: "100%",
maxWidth: "18rem",
maxHeight: "18rem",
}));
export default function Avatar({
user,
highRes,
grow,
className,
isProfileLink = true,
openInNewTab = false,
...otherProps
}: AvatarPropsHighRes | AvatarPropsLowRes) {
return (
<StyledWrapper
isDefaultSize={!className}
grow={grow}
className={className}
{...otherProps}
>
{user ? (
isProfileLink ? (
<StyledLink
href={routeToUser(user.username)}
aria-label={getProfileLinkA11yLabel(user.name)}
target={openInNewTab ? "_blank" : undefined}
>
<StyledMuiAvatar
alt={user.name}
src={
!!highRes
? (user as UserWithAvatarUrl).avatarUrl
: (user as UserWithAvatarThumbnailUrl).avatarThumbnailUrl
}
>
{user.name.split(/\s+/).map((name) => name[0])}
</StyledMuiAvatar>
</StyledLink>
) : (
<StyledMuiAvatar
alt={user.name}
src={
!!highRes
? (user as UserWithAvatarUrl).avatarUrl
: (user as UserWithAvatarThumbnailUrl).avatarThumbnailUrl
}
>
{user.name.split(/\s+/).map((name) => name[0])}
</StyledMuiAvatar>
)
) : otherProps.children ? (
<StyledMuiAvatar>{otherProps.children}</StyledMuiAvatar>
) : (
<StyledMuiAvatar />
)}
</StyledWrapper>
);
}
|