71 lines
2.3 KiB
TypeScript
71 lines
2.3 KiB
TypeScript
import { t } from '@vegaprotocol/i18n';
|
|
import type * as Schema from '@vegaprotocol/types';
|
|
import { AsyncRenderer } from '@vegaprotocol/ui-toolkit';
|
|
import type { FilterChangedEvent } from 'ag-grid-community';
|
|
import type { AgGridReact } from 'ag-grid-react';
|
|
import { useCallback, useEffect, useMemo, useRef, useState } from 'react';
|
|
import { subDays, formatRFC3339 } from 'date-fns';
|
|
import type { AggregatedLedgerEntriesNode } from './ledger-entries-data-provider';
|
|
import { useLedgerEntriesDataProvider } from './ledger-entries-data-provider';
|
|
import { LedgerTable } from './ledger-table';
|
|
import type * as Types from '@vegaprotocol/types';
|
|
|
|
export interface Filter {
|
|
vegaTime?: {
|
|
value: Schema.DateRange;
|
|
};
|
|
fromAccountType?: { value: Types.AccountType[] };
|
|
toAccountType?: { value: Types.AccountType[] };
|
|
}
|
|
const defaultFilter = {
|
|
vegaTime: {
|
|
value: { start: formatRFC3339(subDays(Date.now(), 7)) },
|
|
},
|
|
};
|
|
export const LedgerManager = ({ partyId }: { partyId: string }) => {
|
|
const gridRef = useRef<AgGridReact | null>(null);
|
|
const [filter, setFilter] = useState<Filter>(defaultFilter);
|
|
const [dataCount, setDataCount] = useState(0);
|
|
|
|
const { data, error, loading, reload } = useLedgerEntriesDataProvider({
|
|
partyId,
|
|
filter,
|
|
gridRef,
|
|
});
|
|
|
|
const onFilterChanged = useCallback((event: FilterChangedEvent) => {
|
|
const updatedFilter = { ...defaultFilter, ...event.api.getFilterModel() };
|
|
setFilter(updatedFilter);
|
|
}, []);
|
|
const extractNodesDecorator = useCallback(
|
|
(data: AggregatedLedgerEntriesNode[] | null, loading: boolean) =>
|
|
data && !loading ? data.map((item) => item.node) : null,
|
|
[]
|
|
);
|
|
|
|
const extractedData = extractNodesDecorator(data, loading);
|
|
useEffect(() => {
|
|
setDataCount(gridRef.current?.api?.getModel().getRowCount() ?? 0);
|
|
}, [extractedData]);
|
|
|
|
return (
|
|
<div className="h-full relative">
|
|
<LedgerTable
|
|
ref={gridRef}
|
|
rowData={extractedData}
|
|
onFilterChanged={onFilterChanged}
|
|
/>
|
|
<div className="pointer-events-none absolute inset-0">
|
|
<AsyncRenderer
|
|
loading={loading}
|
|
error={error}
|
|
data={data}
|
|
noDataMessage={t('No entries')}
|
|
noDataCondition={() => !dataCount}
|
|
reload={reload}
|
|
/>
|
|
</div>
|
|
</div>
|
|
);
|
|
};
|