import { useState, useEffect } from "react"; import { useNavigate } from "react-router-dom"; import type { StampWithStatus, RedemptionRecord } from "@stamp/shared"; import { apiFetch } from "../lib/api"; import { useAuth } from "../lib/auth"; import StampGrid from "../components/StampGrid"; import RedeemModal from "../components/RedeemModal"; import RegisterModal from "../components/RegisterModal"; export default function AlbumPage() { const navigate = useNavigate(); const { user, isLoading: authLoading } = useAuth(); const [stamps, setStamps] = useState([]); const [history, setHistory] = useState([]); const [loading, setLoading] = useState(true); const [selectedStampId, setSelectedStampId] = useState(null); const [showRegister, setShowRegister] = useState(false); const collectedCount = stamps.filter((s) => s.collected).length; const selectedStamp = selectedStampId ? stamps.find((s) => s.id === selectedStampId) ?? null : null; const fetchData = async () => { setLoading(true); try { const stampsData = await apiFetch("/stamps"); setStamps(stampsData); if (user) { const historyData = await apiFetch("/redemption/history"); setHistory(historyData); } else { setHistory([]); } } catch { // Stamps endpoint works without auth } finally { setLoading(false); } }; useEffect(() => { if (!authLoading) fetchData(); }, [authLoading, user]); const handleRedeem = async (stampId: string) => { await apiFetch("/redemption/redeem", { method: "POST", body: JSON.stringify({ stampId }), }); await fetchData(); }; const handleStampClick = (stamp: StampWithStatus) => { if (!user) { setShowRegister(true); return; } setSelectedStampId(stamp.id); }; if (loading || authLoading) { return (
); } return (
{/* Header */}

图章集册

{/* Progress */}
收集进度
{collectedCount} / {stamps.length}
{stamps.length > 0 && collectedCount < stamps.length && ( 还差 {stamps.length - collectedCount} 枚集齐 )} {stamps.length > 0 && collectedCount === stamps.length && ( 已集齐全部图章 ✨ )}

点击任意图章查看品牌权益,已点亮的图章可直接兑换

{/* Stamp Grid */}
{/* Redemption History */} {history.length > 0 && (

兑换记录

{history.map((r) => (

{r.prizeName}

{r.stampName} · {new Date(r.redeemedAt).toLocaleDateString("zh-CN")}

已兑换
))}
)} {/* Modals */} {selectedStamp && ( setSelectedStampId(null)} /> )} {showRegister && ( { setShowRegister(false); fetchData(); }} onClose={() => setShowRegister(false)} /> )}
); }