"use client"; import { useState } from "react"; import Link from "next/link"; import { CalendarDays, CalendarCheck, LogIn, Loader2 } from "lucide-react"; import { apiDoCheckin, type CheckinStatus } from "@/lib/api"; /** * 每日签到卡(右栏)。 * initial 为 undefined 表示游客;否则为 SSR 注入的登录用户签到状态。 */ export default function CheckinCard({ initial }: { initial?: CheckinStatus | null }) { const [status, setStatus] = useState(initial ?? null); const [loading, setLoading] = useState(false); const [error, setError] = useState(""); // 游客态 if (initial === undefined) { return (

每日签到

登录后每日签到领积分

登录后签到
); } const checked = status?.checked_today ?? false; async function doCheckin() { if (loading || checked) return; setLoading(true); setError(""); try { setStatus(await apiDoCheckin()); } catch (e) { setError(e instanceof Error ? e.message : "签到失败"); } finally { setLoading(false); } } return (
{checked ? : }

每日签到

{checked ? `已连续签到 ${status?.streak ?? 0} 天 · 累计 ${status?.total_points ?? 0} 积分` : `连续 ${status?.streak ?? 0} 天 · 今日可得 ${status?.today_points ?? 5} 积分`}

{!checked && ( +{status?.today_points ?? 5} )}
{error && (

{error}

)}
); }