"use client"; import { useEffect, useState } from "react"; import Image from "next/image"; import Link from "next/link"; import SessionCoverImage from "./SessionCoverImage"; import { SESSIONS, RECENT_JOINERS } from "@/config/home.config"; const MOCK_JOINERS = RECENT_JOINERS.slice(0, 3); export default function HeroSection() { const mainSession = SESSIONS[0]; const [stats, setStats] = useState<{ count: number; joiners: { nickname: string }[] } | null>(null); useEffect(() => { if (!mainSession) return; fetch("/api/join/stats") .then((r) => r.json()) .then((d) => d?.stats?.[mainSession.id] && setStats(d.stats[mainSession.id])) .catch(() => {}); }, [mainSession?.id]); return (

周末留两小时
去loft民宿,认识几位同频的人

深圳 · 6–8 人小圈子

公开场地 · 填表申请 · 免费 · 不尬聊

填表申请本周场次
{mainSession && (
{mainSession.coverImage ? ( ) : (
)}
周末下午 6–8 人 公开场地

本周场次

{mainSession.title}

{mainSession.date} {mainSession.time} · {mainSession.place}

报名这场 →
{(stats?.joiners?.length ? stats.joiners : MOCK_JOINERS).slice(0, 5).map((j, i) => { const nickname = "name" in j ? (j as { name: string }).name : (j as { nickname: string }).nickname; const avatar = "avatar" in j ? (j as { avatar: string }).avatar : (j as { avatar?: string }).avatar; const xhUrl = (j as { xiaohongshu_url?: string }).xiaohongshu_url; const showAvatar = avatar && avatar.length > 0; return ( e.preventDefault()} > {showAvatar ? ( ) : ( {nickname.slice(0, 1) || "?"} )} ); })}
{stats?.count ? `${stats.count} 人已报名` : "有人报名中"}
)}
); }