"use client"; import { useState, type ReactNode } from "react"; import type { BankAccount, BankTransaction, Resource } from "@/payload-types"; import { LandmarkIcon, PlusIcon } from "lucide-react"; import { Tabs, TabsContent, TabsList, TabsTrigger } from "@/components/ui/tabs"; import { AccountCard } from "@/components/frontend/banking/AccountCard"; import { CreateAccountDialog } from "@/components/frontend/banking/CreateAccountDialog"; import { WalletHero } from "@/components/frontend/banking/WalletHero"; import { ActivityFeed } from "@/components/frontend/banking/ActivityFeed"; import { currencyLabel, type CurrencyConfig } from "@/lib/banking/format"; import { CurrencyAmount } from "@/components/frontend/banking/CurrencyAmount"; import { usePageCommands } from "@/components/command-palette/CommandPaletteContext"; interface BankingOverviewProps { accounts: BankAccount[]; recentTransactions: BankTransaction[]; currentUser: { id: number; username: string; displayName?: string } | null; currencyResource: Resource | null; currencyConfig: CurrencyConfig; isManager: boolean; factions: { id: number; name: string }[]; } function Section({ title, count, children, }: { title: string; count: number; children: ReactNode; }) { return (

{title}

{count} account{count !== 1 ? "s" : ""}
{count === 0 ? (

None.

) : (
{children}
)}
); } export function BankingOverview({ accounts, recentTransactions, currentUser, currencyResource, currencyConfig, isManager, factions, }: BankingOverviewProps) { const [createAccountOpen, setCreateAccountOpen] = useState(false); usePageCommands([ { id: "banking:create-account", group: "Banking", label: "Create Bank Account", icon: PlusIcon, keywords: ["new", "account", "bank"], onSelect: () => setCreateAccountOpen(true), }, ]); const treasury = accounts.filter((a) => a.accountType === "treasury"); const factionAccounts = accounts.filter((a) => a.accountType === "faction"); const personal = accounts.filter((a) => a.accountType === "personal"); const myAccount = currentUser ? personal.find((a) => { if (!a.ownerUser) return false; const ownerId = typeof a.ownerUser === "object" ? a.ownerUser.id : a.ownerUser; return ownerId === currentUser.id; }) : undefined; // Regular users see only their own personal account; managers see everything. const visiblePersonal = isManager ? personal : myAccount ? [myAccount] : []; const unitFundsTotal = [...treasury, ...factionAccounts].reduce( (sum, a) => sum + (a.balance ?? 0), 0, ); const visibleAccountsCount = (isManager ? treasury.length + factionAccounts.length : 0) + visiblePersonal.length; const tickerCurrency = (label: string): string => label.length > 8 ? `${label.slice(0, 8)}…` : label; return (
Activity Accounts {isManager && (

UNIT FUNDS 

)}

Unit Accounts

{visibleAccountsCount}
{visibleAccountsCount === 0 ? (

No accessible accounts.{" "} {!isManager && "Ask logistics personnel to set up the unit treasury."}

) : ( <> {isManager && treasury.length > 0 && (
{treasury.map((account) => ( ))}
)} {isManager && factionAccounts.length > 0 && (
{factionAccounts.map((account) => ( ))}
)} {visiblePersonal.length > 0 && (
{visiblePersonal.map((account) => ( ))}
)} )}
{accounts.length === 0 && (

No accounts yet. Create your first account to get started.

)}

SYS.BANKING / currency={tickerCurrency(currencyLabel(currencyConfig))}

); }