"use client"; import { useState, useEffect } from "react"; import { Plus, TrendingUp, Filter, Receipt } from "lucide-react"; import { Button } from "@/components/ui/button"; import { Badge } from "@/components/ui/badge"; import { fetchExpenses, fetchExpensesSummary, updateExpenseStatus, } from "@/lib/supabase/expenses-actions"; import { STATUS_LABELS, STATUS_COLORS, formatCurrency, formatDateShort, type ExpenseStatus, type ExpenseWithCategory, } from "@/lib/supabase/expenses-types"; import PageSkeleton from "./PageSkeleton"; const TABS: { label: string; value: ExpenseStatus | "all" }[] = [ { label: "All", value: "all" }, { label: "Draft", value: "draft" }, { label: "Submitted", value: "submitted" }, { label: "Approved", value: "approved" }, { label: "Reimbursed", value: "reimbursed" }, ]; export default function ExpensesListPage({ onAddExpense }: { onAddExpense: () => void }) { const [expenses, setExpenses] = useState([]); const [loading, setLoading] = useState(true); const [activeTab, setActiveTab] = useState("all"); const [summary, setSummary] = useState<{ total: number } | null>(null); useEffect(() => { let cancelled = false; Promise.all([ fetchExpenses(activeTab), fetchExpensesSummary(), ]) .then(([exps, sum]) => { if (!cancelled) { setExpenses(exps); setSummary(sum); } }) .catch(() => {}) .finally(() => { if (!cancelled) setLoading(false); }); return () => { cancelled = true; }; }, [activeTab]); const handleStatusChange = async (expenseId: string, newStatus: ExpenseStatus) => { await updateExpenseStatus(expenseId, newStatus); setExpenses((prev) => prev.map((e) => e.id === expenseId ? { ...e, status: newStatus } : e)); }; if (loading) return ; return (
{/* Header */}

Expenses

Track and manage business expenses

{/* Summary cards */} {summary && (

Total Expenses

{formatCurrency(summary.total)}

Submitted

{formatCurrency(summary.total)}

Approved

{formatCurrency(summary.total)}

Reimbursed

{formatCurrency(summary.total)}

)} {/* Tabs */}
{TABS.map((tab) => ( ))}
{/* Expense list */} {expenses.length === 0 ? (

No expenses found

{activeTab !== "all" ? "Try a different filter" : "Add your first expense to get started"}

) : (
{expenses.map((exp) => ( ))}
Date Vendor Category Employee Amount Status
{formatDateShort(exp.expense_date)}

{exp.vendor || "—"}

{exp.description &&

{exp.description}

}
{exp.category ? ( {exp.category.name} ) : ( )} {exp.employee ? `${exp.employee.first_name} ${exp.employee.last_name}` : "—"} {formatCurrency(exp.amount, exp.currency)} {STATUS_LABELS[exp.status as ExpenseStatus]} {/* Quick actions for submitted expenses */} {exp.status === "submitted" && (
)}
)}
); }