ledger revanced

This commit is contained in:
NextJS
2026-05-11 06:34:15 +00:00
parent 6d2050cd24
commit 49d9f31182
13 changed files with 1719 additions and 302 deletions
+37 -1
View File
@@ -8,6 +8,7 @@ import {
type AdminDashboardTab,
} from "@/lib/dashboard-search-url";
import { createAdminSupabase } from "@/lib/supabase/admin";
import { normalizeLedgerPageSize } from "@/lib/ledger-table-view";
function parseScoreField(raw: FormDataEntryValue | null): number | null {
if (raw == null) return null;
@@ -41,7 +42,42 @@ export async function updateUserCcRc(formData: FormData) {
const participant =
participantRaw === "" ? null : participantRaw;
const base = { tab, highlightId, participantRaw: participant };
const ledgerFromRaw = String(formData.get("ledgerFrom") ?? "").trim();
const ledgerToRaw = String(formData.get("ledgerTo") ?? "").trim();
const ledgerPageRaw = String(formData.get("ledgerPage") ?? "").trim();
const ledgerPageSizeRaw = String(
formData.get("ledgerPageSize") ?? "",
).trim();
const ledgerSortRaw = String(formData.get("ledgerSort") ?? "").trim();
const ledgerOrderRaw = String(formData.get("ledgerOrder") ?? "").trim();
const ledgerPageNum =
ledgerPageRaw === "" ? NaN : Number.parseInt(ledgerPageRaw, 10);
const base = {
tab,
highlightId,
participantRaw: participant,
...(tab === "ledger"
? {
ledgerFrom: ledgerFromRaw || null,
ledgerTo: ledgerToRaw || null,
ledgerPage:
Number.isInteger(ledgerPageNum) && ledgerPageNum > 1
? ledgerPageNum
: null,
ledgerSort: ledgerSortRaw || null,
ledgerOrder:
ledgerOrderRaw === "desc"
? ("desc" as const)
: ledgerOrderRaw === "asc"
? ("asc" as const)
: null,
ledgerPageSize: normalizeLedgerPageSize(
ledgerPageSizeRaw === "" ? null : ledgerPageSizeRaw,
),
}
: {}),
};
if (!Number.isInteger(userId) || userId < 1) {
redirect(buildDashboardHref(base));
+105 -8
View File
@@ -2,6 +2,15 @@ import { AdminDashboard } from "@/components/admin-dashboard";
import { AdminHeader } from "@/components/admin-header";
import { EditUserCcRcOverlay } from "@/components/edit-user-cc-rc-overlay";
import { loadDashboardStatsBundle } from "@/lib/dashboard-stats";
import {
normalizeLedgerDateRange,
utcLast30DaysDateRange,
} from "@/lib/ledger-utc-date-range";
import { fetchLedgerGlobalSummary } from "@/lib/ledger-global-summary-server";
import {
serializeLedgerGlobalSummary,
type SerializedLedgerGlobalSummary,
} from "@/lib/ledger-integrity";
import { createAdminSupabase } from "@/lib/supabase/admin";
import type { AdminDashboardTab } from "@/lib/dashboard-search-url";
import {
@@ -10,6 +19,16 @@ import {
} from "@/lib/matchmaker-log-source";
import { readMatchmakerLogFile } from "@/lib/matchmaker-logs-server";
import type { DbMatch, DbTransaction, DbUser } from "@/types/database";
import {
normalizeLedgerPage,
normalizeLedgerPageSize,
normalizeLedgerSortKey,
normalizeLedgerSortOrder,
sliceLedgerPage,
sortLedgerTransactions,
type LedgerSortKey,
type LedgerSortOrder,
} from "@/lib/ledger-table-view";
export const dynamic = "force-dynamic";
@@ -31,6 +50,12 @@ export default async function Home({
edit?: string | string[];
saveError?: string | string[];
mklog?: string | string[];
lfrom?: string | string[];
lto?: string | string[];
lpage?: string | string[];
lsize?: string | string[];
lsort?: string | string[];
lorder?: string | string[];
}>;
}) {
const sp = await searchParams;
@@ -58,8 +83,18 @@ export default async function Home({
let configError: string | null = null;
let usersError: string | null = null;
let matchesError: string | null = null;
let transactions: DbTransaction[] = [];
let transactionsError: string | null = null;
let ledgerGlobalSummary: SerializedLedgerGlobalSummary | null = null;
let ledgerTransactionsFiltered: DbTransaction[] = [];
let ledgerTableRows: DbTransaction[] = [];
let ledgerTotalRowsInRange = 0;
let ledgerPageView = 1;
let ledgerPageSizeView = normalizeLedgerPageSize(null);
let ledgerTotalPagesView = 1;
let ledgerSortKeyView: LedgerSortKey = "created_at";
let ledgerSortOrderView: LedgerSortOrder = "desc";
let ledgerFrom = utcLast30DaysDateRange().from;
let ledgerTo = utcLast30DaysDateRange().to;
let statsBundle: Awaited<ReturnType<typeof loadDashboardStatsBundle>> | null =
null;
@@ -108,15 +143,61 @@ export default async function Home({
statsBundle = await loadDashboardStatsBundle(supabase);
if (tab === "ledger") {
const txRes = await supabase
const lfromRaw = firstSearchParam(sp.lfrom);
const ltoRaw = firstSearchParam(sp.lto);
const range = normalizeLedgerDateRange(lfromRaw, ltoRaw);
ledgerFrom = range.from;
ledgerTo = range.to;
const rangeStartIso = `${ledgerFrom}T00:00:00.000Z`;
const rangeEndIso = `${ledgerTo}T23:59:59.999Z`;
const filteredQuery = supabase
.from("transactions")
.select("id, created_at, from, to, amount, remarks, match_id")
.order("id", { ascending: false })
.limit(5000);
if (txRes.error) {
transactionsError = txRes.error.message;
.gte("created_at", rangeStartIso)
.lte("created_at", rangeEndIso)
.order("created_at", { ascending: true })
.order("id", { ascending: true })
.limit(10000);
const [globalRes, filteredRes] = await Promise.all([
fetchLedgerGlobalSummary(supabase),
filteredQuery,
]);
if (!globalRes.ok) {
transactionsError = globalRes.message;
} else {
transactions = (txRes.data ?? []) as DbTransaction[];
ledgerGlobalSummary = serializeLedgerGlobalSummary(globalRes.data);
}
if (filteredRes.error) {
if (!transactionsError) {
transactionsError = filteredRes.error.message;
}
} else {
ledgerTransactionsFiltered = (filteredRes.data ??
[]) as DbTransaction[];
const pageRaw = normalizeLedgerPage(firstSearchParam(sp.lpage));
ledgerPageSizeView = normalizeLedgerPageSize(
firstSearchParam(sp.lsize),
);
ledgerSortKeyView = normalizeLedgerSortKey(
firstSearchParam(sp.lsort),
);
ledgerSortOrderView = normalizeLedgerSortOrder(
firstSearchParam(sp.lorder),
ledgerSortKeyView,
);
const sorted = sortLedgerTransactions(
ledgerTransactionsFiltered,
ledgerSortKeyView,
ledgerSortOrderView,
);
const slice = sliceLedgerPage(sorted, pageRaw, ledgerPageSizeView);
ledgerTableRows = slice.rows;
ledgerTotalRowsInRange = slice.totalRows;
ledgerPageView = slice.page;
ledgerTotalPagesView = slice.totalPages;
}
}
}
@@ -145,7 +226,6 @@ export default async function Home({
matches={matches}
usersError={usersError}
matchesError={matchesError}
transactions={transactions}
transactionsError={transactionsError}
statsBundle={statsBundle}
tab={tab}
@@ -154,6 +234,17 @@ export default async function Home({
matchmakerSource={matchmakerSource}
matchmakerContent={matchmakerContent}
matchmakerError={matchmakerError}
ledgerGlobalSummary={ledgerGlobalSummary}
ledgerTransactionsFiltered={ledgerTransactionsFiltered}
ledgerTableRows={ledgerTableRows}
ledgerTotalRowsInRange={ledgerTotalRowsInRange}
ledgerPage={ledgerPageView}
ledgerPageSize={ledgerPageSizeView}
ledgerTotalPages={ledgerTotalPagesView}
ledgerSort={ledgerSortKeyView}
ledgerOrder={ledgerSortOrderView}
ledgerFrom={ledgerFrom}
ledgerTo={ledgerTo}
/>
{editUser ? (
<EditUserCcRcOverlay
@@ -162,6 +253,12 @@ export default async function Home({
highlightId={highlightId}
participantRaw={participantRaw}
saveError={saveError}
ledgerFrom={ledgerFrom}
ledgerTo={ledgerTo}
ledgerPage={ledgerPageView}
ledgerPageSize={ledgerPageSizeView}
ledgerSort={ledgerSortKeyView}
ledgerOrder={ledgerSortOrderView}
/>
) : null}
</>