"use client"; import { useState } from "react"; import Image from "next/image"; import Link from "next/link"; import { RefreshCw, Coffee } from "lucide-react"; import SessionCoverImage from "./SessionCoverImage"; import AddressLink from "./AddressLink"; import { ACTIVITY_TYPES, SESSION_TAGS, MOCK_JOINERS_SESSION1, MOCK_JOINERS_SESSION2 } from "@/config/home.config"; import { mergeJoiners, getUniqueDbCount } from "@/app/lib/joiners"; import { useXhClickOpener } from "@/app/hooks/useXhClickOpener"; interface JoinStats { count: number; joiners: { nickname: string; avatar?: string; xiaohongshu_url?: string }[]; } function getMockForSession(sessionId: string) { return sessionId === "session-1" ? MOCK_JOINERS_SESSION1 : MOCK_JOINERS_SESSION2; } function AvatarItem({ joiner }: { joiner: { name?: string; nickname?: string; avatar?: string; xiaohongshu_url?: string } }) { const [imgError, setImgError] = useState(false); const nickname = ("name" in joiner ? joiner.name : joiner.nickname) ?? ""; const avatar = joiner.avatar; const xhUrl = joiner.xiaohongshu_url; const showAvatar = avatar && avatar.length > 0 && !imgError; const handleClick = useXhClickOpener(xhUrl); return ( {showAvatar ? ( setImgError(true)} /> ) : ( {nickname.slice(0, 1) || "?"} )} ); } type SessionTag = keyof typeof SESSION_TAGS; interface SessionItem { id: string; type: "skill-exchange" | "side-hustle" | "loft" | "light-chat"; title: string; date: string; time: string; place: string; city: string; coverImage?: string; tags?: readonly SessionTag[]; } export default function SessionCard({ session, index, stats, }: { session: SessionItem; index: number; stats: JoinStats | null; }) { return (
{session.coverImage ? ( ) : (
{session.type === "skill-exchange" ? : }
)}
{session.tags?.map((tag) => ( {SESSION_TAGS[tag]} ))} {!session.tags?.includes("light-topic") && ( {SESSION_TAGS["light-topic"]} )} {index === 0 ? ( 主推 ) : ( 主推 )}
{ACTIVITY_TYPES[session.type]} · {session.city}

{session.title}

{session.date} {session.time}

报名这场 →
{mergeJoiners(getMockForSession(session.id), stats?.joiners).map((j, i) => ( ))}
{3 + getUniqueDbCount(stats?.joiners)} 人已报名
); }