"use client"; import React, { useRef, useEffect, useState } from 'react'; import { GetMeetListResponse } from '@/services/home/types'; import { formatNumberToKMB } from '@/lib/utils'; import { Tag } from '@/components/ui/tag'; import { Avatar, AvatarImage } from '@/components/ui/avatar'; import Link from 'next/link'; interface AIStandardCardProps { character: GetMeetListResponse; disableHover?: boolean; } const AIStandardCard: React.FC = ({ character, disableHover = false }) => { const { aiId, nickname, characterName, tagName, headImg, homeImageUrl, introduction, likedNum, } = character; const introContainerRef = useRef(null); const introTextRef = useRef(null); const [maxLines, setMaxLines] = useState(6); // 动态计算可用空间的行数 useEffect(() => { const calculateMaxLines = () => { if (introContainerRef.current) { const containerHeight = introContainerRef.current.offsetHeight; const lineHeight = 20; // 对应 leading-[20px] const calculatedLines = Math.floor(containerHeight / lineHeight); // 确保至少显示 1 行,最多不超过合理的行数 const finalLines = Math.max(1, Math.min(calculatedLines, 12)); setMaxLines(finalLines); } }; calculateMaxLines(); // 监听窗口大小变化 window.addEventListener('resize', calculateMaxLines); return () => window.removeEventListener('resize', calculateMaxLines); }, []); // 解析标签(假设是逗号分隔的字符串) const tags = tagName ? tagName.split(',').filter(tag => tag.trim()) : []; // 获取显示的背景图片 const displayImage = homeImageUrl || headImg; const displayName = `${nickname}`; return (
{/* 默认渐变遮罩层 */}
{/* 角色信息区域 */}
{/* 名称 */}
{displayName}
{/* 性格标签 */} {characterName && ( {characterName} )} {tags.length > 0 && (
{tags.slice(0, 2).map((tag, index) => ( {tag} ))}
)}
{/* 标签 {tags.length > 0 && (
{tags.slice(0, 2).map((tag, index) => ( {tag} ))}
)} */}
{/* 点赞数 */}
{formatNumberToKMB(likedNum ?? 0)}
{/* Hover 时显示的简介覆盖层 */} {!disableHover && (
{/* 头像和名称 */}
{nickname}
{/* 简介文本 */}

{introduction || 'No introduction'}

{/* 点赞数 */}
{formatNumberToKMB(likedNum ?? 0)}
)}
{/* 边框 */}
); }; export default AIStandardCard;