"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 (
{children}
); }; const PointsRules = () => { return (

积分兑换规则

1. 积分兑换规则

兑换资格:

用户必须拥有足够积分才能进行兑换。

商品种类:

积分可用于兑换以下几类商品:

  • 实物商品:如电子产品、生活用品等
  • 虚拟商品:如优惠券、抵用券、彩金等

(积分兑换商品会不定期更新,以显示为准)

2. 兑换流程

  1. 点击"兑换积分"按钮
  2. 按需兑换商品,输入智博会员账号(输入错误会影响奖品发放)点击"确认兑换"
  3. 兑换完成后需要等待审核,审核完成后会在3个工作日内自动派发
  4. 实物商品类需要填写姓名,联系方式,地址,预计7个工作日到件

3. 兑换商品退换规则

  • 实物商品,一旦兑换成功,概不退换
  • 虚拟商品(如优惠券、抵用券),一经兑换,不可折现

4. 解释权

平台对积分获取、使用及兑换规则保留最终解释权。

5. 常见问题

是否可以兑换多个商品?

可以,但需满足商品兑换所需积分条件。

积分是否可以转让给他人?

积分不可转让或赠送。

积分有效期是多久?

积分有效期为1年,逾期作废。

以上规则确保会员能够公平参与积分兑换活动,并提供了清晰的指引,保证平台和用户的权益。

); }; return (
router.back()} size={28} />

积分兑换

{items.map((item) => (
{item.title}

所需积分: {item.points}

))}
{/* 积分预测记录 */}

积分兑换记录

Loading...} endMessage={

没有更多记录了

} scrollableTarget="exchangeScroll" > {exchanges.map((exchange, index) => (

{new Date(exchange.exchangeTime).toLocaleDateString()}{" "} {new Date(exchange.exchangeTime).toLocaleTimeString( [], { hour: "2-digit", minute: "2-digit" } )}

{exchange.status}

-{exchange.item.points}
{index < exchanges.length - 1 && (
)}
))}
{/* 积分规则 */} setIsRulesOpen(false)}> {selectedItem && ( setSelectedItem(null)} /> )} {alert && ( setAlert(null)} /> )}
); }