import classNames from "classnames";
import { useMemo } from "react";
import { useTranslation } from "react-i18next";
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"];
sizeClass?: string;
iconClass?: string;
bottom?: React.ReactNode;
}
export function Avatar(props: AvatarProps) {
return (
{props.bottom ? (
{props.bottom}
) : null}
);
}
export function UserAvatar(props: {
sizeClass?: string;
iconClass?: string;
bottom?: React.ReactNode;
withName?: boolean;
}) {
const auth = useAuthStore();
const bufferSeed = useMemo(
() =>
auth.account && auth.account.seed
? base64ToBuffer(auth.account.seed)
: null,
[auth],
);
const { t } = useTranslation();
if (!auth.account || auth.account === null) return null;
const deviceName = bufferSeed
? (() => {
try {
return decryptData(auth.account.deviceName, bufferSeed);
} catch (error) {
console.warn(
"Failed to decrypt device name in Avatar, using fallback:",
error,
);
return t("settings.account.devices.unknownDevice");
}
})()
: "...";
return (
<>
{props.withName && bufferSeed ? (
{deviceName.length >= 20
? `${deviceName.slice(0, 20 - 1)}…`
: deviceName}
) : null}
>
);
}
export function NoUserAvatar(props: { iconClass?: string }) {
return (
);
}