"use client"; import Alert from "../ui/components/Alert"; import { fetchApi } from "../utils/fetch"; import ExchangeForm from "./ExchangeForm"; import { ChevronLeft, X } from "lucide-react"; import { useRouter } from "next/navigation"; import { useState, useEffect } from "react"; import InfiniteScroll from "react-infinite-scroll-component"; const PAGE_SIZE = 10; export default function ExchangePage() { const [items, setItems] = useState([]); const [selectedItem, setSelectedItem] = useState(null); const [alert, setAlert] = useState(null); const [exchanges, setExchanges] = useState([]); const [page, setPage] = useState(1); const [hasMore, setHasMore] = useState(true); const [currentUser, setCurrentUser] = useState(null); const [isRulesOpen, setIsRulesOpen] = useState(false); const router = useRouter(); useEffect(() => { fetchExchangeItems(); const user = JSON.parse(localStorage.getItem("currentUser") || "null"); setCurrentUser(user); }, []); useEffect(() => { loadExchanges(); }, [currentUser?.id]); const loadExchanges = async () => { if (!currentUser) return; try { const data = await fetchApi( `/api/exchange-history?userId=${encodeURIComponent( currentUser.id )}¤t=${page}&pageSize=${PAGE_SIZE}` ); if (data.success) { setExchanges((prev) => [...prev, ...data.data]); setPage((prev) => prev + 1); setHasMore(data.data.length === PAGE_SIZE); } else { setAlert({ type: "error", message: data.error }); console.error("Failed to fetch exchange history:", data.error); } } catch (error) { console.error("Error fetching exchange history:", error); } }; const fetchExchangeItems = async () => { try { const data = await fetchApi("/api/exchange-items"); if (data.success) { setItems(data.data); } else { setAlert({ type: "error", message: data.error }); console.error("获取兑换项目失败:", data.message); } } catch (error) { console.error("获取兑换项目失败:", error); } }; const handleExchange = (item) => { if (currentUser.points < item.points) { setAlert({ type: "error", message: "积分不足,无法兑换" }); return; } setSelectedItem(item); }; const Modal = ({ isOpen, onClose, children }) => { if (!isOpen) return null; return (
兑换资格:
用户必须拥有足够积分才能进行兑换。
商品种类:
积分可用于兑换以下几类商品:
(积分兑换商品会不定期更新,以显示为准)
平台对积分获取、使用及兑换规则保留最终解释权。
是否可以兑换多个商品?
可以,但需满足商品兑换所需积分条件。
积分是否可以转让给他人?
积分不可转让或赠送。
积分有效期是多久?
积分有效期为1年,逾期作废。
以上规则确保会员能够公平参与积分兑换活动,并提供了清晰的指引,保证平台和用户的权益。
所需积分: {item.points}
没有更多记录了
} scrollableTarget="exchangeScroll" > {exchanges.map((exchange, index) => ({new Date(exchange.exchangeTime).toLocaleDateString()}{" "} {new Date(exchange.exchangeTime).toLocaleTimeString( [], { hour: "2-digit", minute: "2-digit" } )}
{exchange.status}