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>
|
|
|
|
|
);
|
|
|
|
|
}
|