1
0
Fork 0
polaris-task-force/src/app/(frontend)/logistics/banking/page.tsx

94 lines
3 KiB
TypeScript

import config from "@payload-config";
import { isPayloadUser } from "@/utils/access-control/isPayloadUser";
import { getPayload } from "payload";
import { headers as nextHeaders } from "next/headers";
import type { BankAccount, BankTransaction, Faction, Resource } from "@/payload-types";
import { LandmarkIcon } from "lucide-react";
import { BankingOverview } from "@/components/frontend/banking/BankingOverview";
import { hasPermission } from "@/utils/access-control/hasPermission";
import { hasLogisticsQualification } from "@/utils/access-control/hasLogisticsQualification";
import { getCurrencyConfig } from "@/lib/banking";
export const metadata = {
title: "Banking: Polaris Task Force",
};
export default async function BankingPage() {
const payload = await getPayload({ config });
const { user: authUser } = await payload.auth({
headers: await nextHeaders(),
canSetHeaders: false,
});
const user = isPayloadUser(authUser) ? authUser : null;
const accountsRes = await payload.find({
collection: "bank-accounts",
sort: "name",
limit: 500,
depth: 1,
});
const accounts = accountsRes.docs as unknown as BankAccount[];
const transactionsRes = await payload.find({
collection: "bank-transactions",
sort: "-timestamp",
limit: 25,
depth: 1,
});
const recentTransactions = transactionsRes.docs as unknown as BankTransaction[];
const factionsRes = await payload.find({
collection: "factions",
limit: 100,
depth: 0,
});
const factions = (factionsRes.docs as unknown as Faction[]).map((f) => ({
id: f.id,
name: f.name,
}));
const isManager = user
? (await hasPermission(payload, user, "banking:manage")) ||
(await hasLogisticsQualification(payload, user).catch(() => false))
: false;
const currentUser = user
? {
id: user.id as number,
username: user.username,
displayName: user.displayName ?? user.username,
}
: null;
// Currency is shared across all accounts (main currency set in Game Rules).
// Resolve from the first account whose currency populated at depth 1.
const currencyResource =
accounts.length > 0 && typeof accounts[0].currency === "object"
? (accounts[0].currency as Resource)
: null;
const currencyConfig = await getCurrencyConfig(payload);
return (
<div className="p-5 flex flex-col gap-6">
<div className="flex flex-col gap-1">
<div className="flex items-center gap-2">
<LandmarkIcon className="size-5 text-muted-foreground" />
<h1 className="text-lg font-semibold">Banking</h1>
</div>
<p className="text-sm text-muted-foreground">
Unit accounts, faction reserves, and personal wallets.
</p>
</div>
<BankingOverview
accounts={accounts}
recentTransactions={recentTransactions}
currentUser={currentUser}
currencyResource={currencyResource}
currencyConfig={currencyConfig}
isManager={isManager}
factions={factions}
/>
</div>
);
}