doctor-mail/apps/web/src/components/presentation/CustomAvatar.tsx

58 lines
1.5 KiB
TypeScript
Raw Normal View History

2025-01-25 22:39:22 +08:00
import React, { useMemo } from "react";
2025-01-25 00:46:59 +08:00
import { Avatar } from "antd";
import { AvatarProps } from "antd/lib/avatar";
2025-01-25 22:39:22 +08:00
import multiavatar from "@multiavatar/multiavatar";
2025-01-25 00:46:59 +08:00
interface CustomAvatarProps extends Omit<AvatarProps, "children"> {
src?: string;
name?: string;
2025-01-25 22:39:22 +08:00
ip?: string;
2025-01-25 00:46:59 +08:00
}
export function CustomAvatar({
src,
name,
className = "",
2025-01-25 22:39:22 +08:00
ip,
2025-01-25 00:46:59 +08:00
...props
}: CustomAvatarProps) {
// 获取名字的第一个字符,如果没有名字则显示"匿"
const firstChar = name ? name.charAt(0) : "匿";
2025-01-25 22:39:22 +08:00
// 如果没有 src且 name 不存在或为 "匿名用户",则使用 ip 生成随机头像
const generateAvatarFromIp = (ip: string) => {
// 使用 multiavatar 生成 SVG 字符串
const svgString = multiavatar(ip);
return `data:image/svg+xml;utf8,${encodeURIComponent(svgString)}`;
};
// 判断头像模式
const avatarMode = useMemo(() => {
if (src) {
return "avatar"; // 使用 src 提供的头像
}
if (name && name !== "匿名用户") {
return "name"; // 使用名称的首字母
}
return "random"; // 使用随机头像(基于 ip
}, [src, name]);
// 判断是否需要使用 ip 生成头像
const avatarSrc =
src || (name && name !== "匿名用户")
? src
: generateAvatarFromIp(ip || "default");
2025-01-25 00:46:59 +08:00
return (
<Avatar
2025-01-25 22:39:22 +08:00
className={`
${avatarMode ? "bg-primary-300text-white" : ""}
2025-01-25 00:46:59 +08:00
transition-all duration-200 ease-in-out shadow-md
hover:shadow-lg
${className}`}
2025-01-25 22:39:22 +08:00
src={avatarSrc}
2025-01-25 00:46:59 +08:00
{...props}>
2025-01-25 22:39:22 +08:00
{!avatarSrc && firstChar}
2025-01-25 00:46:59 +08:00
</Avatar>
);
}