"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 function PulseCheckin({ initial }: { initial?: CheckinStatus | null }) { const [status, setStatus] = useState(initial ?? null); const [loading, setLoading] = useState(false); const [error, setError] = useState(""); const checked = status?.checked_today ?? false; const guest = initial === undefined; 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 ? : }

每日签到

{guest ? "登录后每日签到领积分" : checked ? `连签 ${status?.streak ?? 0} 天 · 累计 ${status?.total_points ?? 0} 积分` : `连签 ${status?.streak ?? 0} 天 · 今日 +${status?.today_points ?? 5}`}

{guest ? ( 登录 ) : checked ? ( 已签 ) : ( )}
{error && (

{error}

)}
); }