import { ArrowDownUp, Coins, Search } from "lucide-react"; import { useCallback, useState, type FormEvent } from "react"; import { useSearchParams } from "react-router-dom"; import { adminApi } from "../../api/client"; import type { LedgerQuery } from "../../api/types"; import { Button, Card, ErrorState, Input, LoadingState, PageHeader, } from "../../components/primitives"; import { useCursorPage } from "../../hooks/use-cursor-page"; import { formatNumber } from "../../lib/format"; import { LedgerFilters } from "./ledger-filters"; import { LedgerTable } from "./ledger-table"; import { useLedgerFilters } from "./use-ledger-filters"; export function CreditsPage() { const [searchParams, setSearchParams] = useSearchParams(); const initialUserId = searchParams.get("userId") ?? ""; const [query, setQuery] = useState(initialUserId); const [activeUserId, setActiveUserId] = useState(initialUserId); const filters = useLedgerFilters(); const fetchLedger = useCallback( (value: LedgerQuery) => activeUserId ? adminApi.ledger(activeUserId, value) : adminApi.latestLedger(value), [activeUserId], ); const { items, nextCursor, loading, loadingMore, error, loadMore, reload, } = useCursorPage(filters.query, fetchLedger); function submit(event: FormEvent) { event.preventDefault(); const userId = query.trim(); setActiveUserId(userId); setSearchParams((current) => { const params = new URLSearchParams(current); if (userId) params.set("userId", userId); else params.delete("userId"); return params; }, { replace: true }); } const hasBusinessFilter = Boolean( filters.state.from || filters.state.until || filters.state.type || filters.state.entryType || filters.state.usageType || filters.state.referenceId, ); return (
{activeUserId ? "指定用户流水" : "最新积分流水"} · {formatNumber(items.length)} 条 {activeUserId ? ( {activeUserId} ) : null}
{error ? (
) : loading ? ( ) : ( filters.update({ sort, order })} onReferenceFilter={(referenceId) => filters.update({ referenceId })} footer={ nextCursor ? (
) : null } /> )}
); }