"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 => ( ))}
{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()}
)) )}
); }