1
0
Fork 0
mirror of https://github.com/sussy-code/smov.git synced 2024-12-23 15:07:43 +01:00
smov/src/components/Avatar.tsx

101 lines
2.7 KiB
TypeScript
Raw Normal View History

2023-11-23 00:45:06 +01:00
import classNames from "classnames";
import { useMemo } from "react";
2023-11-23 00:45:06 +01:00
import { base64ToBuffer, decryptData } from "@/backend/accounts/crypto";
import { Icon, Icons } from "@/components/Icon";
import { UserIcon } from "@/components/UserIcon";
import { AccountProfile } from "@/pages/parts/auth/AccountCreatePart";
import { useAuthStore } from "@/stores/auth";
export interface AvatarProps {
profile: AccountProfile["profile"];
2023-11-23 00:45:06 +01:00
sizeClass?: string;
iconClass?: string;
2023-11-24 21:54:44 +01:00
bottom?: React.ReactNode;
}
export function Avatar(props: AvatarProps) {
return (
2023-11-24 21:54:44 +01:00
<div className="relative inline-block">
<div
className={classNames(
props.sizeClass,
"rounded-full overflow-hidden flex items-center justify-center text-white"
)}
style={{
background: `linear-gradient(to bottom right, ${props.profile.colorA}, ${props.profile.colorB})`,
}}
>
<UserIcon
className={props.iconClass}
icon={props.profile.icon as any}
/>
</div>
{props.bottom ? (
<div className="absolute bottom-0 left-1/2 transform translate-y-1/2 -translate-x-1/2">
{props.bottom}
</div>
) : null}
</div>
);
}
2023-11-23 00:45:06 +01:00
export function UserAvatar(props: {
sizeClass?: string;
iconClass?: string;
bottom?: React.ReactNode;
withName?: boolean;
2023-11-23 00:45:06 +01:00
}) {
const auth = useAuthStore();
const bufferSeed = useMemo(
() =>
auth.account && auth.account.seed
? base64ToBuffer(auth.account.seed)
: null,
[auth]
);
if (!auth.account || auth.account === null) return null;
const deviceName = bufferSeed
? decryptData(auth.account.deviceName, bufferSeed)
: "...";
2023-11-23 00:45:06 +01:00
return (
<>
<Avatar
profile={auth.account.profile}
sizeClass={props.sizeClass ?? "w-[2rem] h-[2rem]"}
iconClass={props.iconClass}
bottom={props.bottom}
/>
{props.withName && bufferSeed ? (
<span className="hidden md:inline-block">
{deviceName.length >= 20
? `${deviceName.slice(0, 20 - 1)}`
: deviceName}
</span>
) : null}
</>
2023-11-23 00:45:06 +01:00
);
}
export function NoUserAvatar(props: {
sizeClass?: string;
iconClass?: string;
}) {
return (
<div className="relative inline-block">
<div
className={classNames(
props.sizeClass ?? "w-[2rem] h-[2rem]",
"rounded-full overflow-hidden flex items-center justify-center text-type-dimmed hover:text-type-secondary bg-pill-background bg-opacity-50 hover:bg-opacity-100 transition-colors duration-100"
)}
>
<Icon className={props.iconClass ?? "text-xl"} icon={Icons.MENU} />
</div>
</div>
);
}