diff --git a/app/api/join/route.ts b/app/api/join/route.ts index b4c5865..af2f248 100644 --- a/app/api/join/route.ts +++ b/app/api/join/route.ts @@ -29,9 +29,18 @@ export async function POST(request: NextRequest) { const session = String(formData.session || "").trim(); const ageRange = String(formData.age_range || "").trim(); const wechatOrPhone = String(formData.wechat_or_phone || "").trim(); - const intro = String(formData.intro || "").trim(); + let intro = String(formData.intro || "").trim(); const firstTime = String(formData.first_time || "").trim(); const agreeRules = !!formData.agree_rules; + const status = String(formData.status || "").trim(); + const activityType = String(formData.activity_type || "").trim(); + const whyJoin = String(formData.why_join || "").trim(); + const region = String(formData.region || "").trim(); + const availableTime = String(formData.available_time || "").trim(); + if (!intro && (status || activityType || whyJoin || region || availableTime)) { + const extra = [status && `状态:${status}`, activityType && `活动偏好:${activityType}`, whyJoin && `原因:${whyJoin}`, region && `区域:${region}`, availableTime && `时间:${availableTime}`].filter(Boolean).join(" | "); + intro = extra; + } if (!nickname || !wechatOrPhone || !intro || !session || !agreeRules) { return NextResponse.json( diff --git a/app/components/AvatarStack.tsx b/app/components/AvatarStack.tsx index e693318..9478e25 100644 --- a/app/components/AvatarStack.tsx +++ b/app/components/AvatarStack.tsx @@ -1,34 +1,31 @@ "use client"; -import Image from "next/image"; import { RECENT_JOINERS } from "@/config/home.config"; +function getInitial(name: string): string { + if (!name || name.length === 0) return "?"; + return name.slice(0, 1); +} + export default function AvatarStack() { return (
- 📍 深圳 · 广州 · 惠州 -
-- 😌 氛围轻松 · 📍 公开场地 · 填表即报 +
+ 深圳 · 广州 · 惠州 · 周末 6–8 人轻社交小组
-+ 咖啡馆 / 书店 / citywalk · 6–8 人小组 · 公开场地 · 填表申请 · 联系方式仅用于活动确认 · 不收费 +
+- 本周主推 + 本周场次
- {mainSession.date} {mainSession.time} + {mainSession.date} {mainSession.time} · {mainSession.place}
报名这场 → diff --git a/app/components/SessionCoverImage.tsx b/app/components/SessionCoverImage.tsx index 78782a5..759f5f6 100644 --- a/app/components/SessionCoverImage.tsx +++ b/app/components/SessionCoverImage.tsx @@ -6,7 +6,7 @@ import Image from "next/image"; interface SessionCoverImageProps { src: string; alt: string; - type?: "skill-exchange" | "side-hustle"; + type?: "skill-exchange" | "side-hustle" | "cafe" | "bookstore" | "citywalk" | "light-chat"; className?: string; fill?: boolean; sizes?: string; @@ -18,7 +18,7 @@ export default function SessionCoverImage({ src, alt, type, className = "", fill if (error) { return (- 我们会尽快通过您留下的联系方式与您确认 + 我们会尽快通过您留下的联系方式与您确认。不是所有报名都会自动确认,我们会根据场次与匹配度联系合适报名者。
- ✍️ 填表即可 · 无需注册 · 不收费 + 先填表,我们会根据场次与匹配度联系合适报名者
++ 不是所有报名都会自动确认 +
+ + {/* 进度提示 */} ++ 仅用于活动确认,不会公开给其他报名者 +
+- {error} +
+ 提交后我们会根据场次与匹配度联系合适报名者,通过微信/短信确认地点与时间。若当前场次不匹配,不会反复打扰。
- )} - -+ {error} +
+ )} + +{faq.a}
+{faq.a}
+ 查看是否适合参加 · 先填表,我们会根据场次联系 +
@@ -157,7 +249,7 @@ export default function Home() { href="/join" className="block w-full bg-amber-600 hover:bg-amber-700 text-white text-center py-3 rounded-xl font-medium text-sm" > - ✨ 报名参加 + 申请本周场次