"use client"; import { useEffect, useState } from "react"; interface Transaction { id: string; type: "earned" | "spent" | "bonus" | "penalty"; description: string; amount: number; timestamp: string; } const transactionIcons = { earned: ( ), spent: ( ), bonus: ( ), penalty: ( ), }; export default function TransactionHistory() { const [transactions, setTransactions] = useState([]); const [loading, setLoading] = useState(true); const [filter, setFilter] = useState<"all" | Transaction["type"]>("all"); useEffect(() => { fetchTransactions(); }, []); const fetchTransactions = async () => { try { const token = localStorage.getItem("token"); const response = await fetch("/api/users/me/points", { headers: { Authorization: `Bearer ${token}` }, }); const data = await response.json(); if (data.success && data.data) { setTransactions(data.data.transactions || []); } } catch (error) { console.error("Failed to fetch transactions:", error); } finally { setLoading(false); } }; const filteredTransactions = filter === "all" ? transactions : transactions.filter(t => t.type === filter); const formatDate = (timestamp: string) => { const date = new Date(timestamp); const now = new Date(); const diffMs = now.getTime() - date.getTime(); const diffMins = Math.floor(diffMs / 60000); const diffHours = Math.floor(diffMs / 3600000); const diffDays = Math.floor(diffMs / 86400000); if (diffMins < 1) return "Just now"; if (diffMins < 60) return `${diffMins}m ago`; if (diffHours < 24) return `${diffHours}h ago`; if (diffDays < 7) return `${diffDays}d ago`; return date.toLocaleDateString(); }; if (loading) { return ( ); } return ( {(["all", "earned", "spent", "bonus", "penalty"] as const).map(type => ( setFilter(type)} className={`px-4 py-2 rounded-lg font-medium transition capitalize ${ filter === type ? "bg-gradient-to-r from-yellow-500 to-orange-500 text-white" : "bg-gray-800 text-gray-300 hover:bg-gray-700" }`} > {type} ))} {filteredTransactions.length === 0 ? ( No transactions found ) : ( filteredTransactions.map(transaction => ( {transactionIcons[transaction.type]} {transaction.description} {formatDate(transaction.timestamp)} 0 ? "text-green-400" : "text-red-400" }`}> {transaction.amount > 0 ? "+" : ""}{transaction.amount.toLocaleString()} )) )} ); }
No transactions found
{transaction.description}
{formatDate(transaction.timestamp)}