Files
2026-07-13 12:08:39 +08:00

89 lines
2.4 KiB
TypeScript

import { useState } from 'react';
import { PageHeader } from '@@/PageHeader';
import { useTableStateWithoutStorage } from '@@/datatables/useTableState';
import { BEOverlay } from '@@/BEFeatureIndicator/BEOverlay';
import { FeatureId } from '../../feature-flags/enums';
import { ActivityLogsTable } from './ActivityLogsTable';
import { useActivityLogs, getSortType } from './useActivityLogs';
import { useExportMutation } from './useExportMutation';
import { FilterBar } from './FilterBar';
export function ActivityLogsView() {
const exportMutation = useExportMutation();
const [range, setRange] = useState<
{ start: Date; end: Date | null } | undefined
>(undefined);
const [page, setPage] = useState(0);
const tableState = useTableStateWithoutStorage('Timestamp', true);
const offset = page * tableState.pageSize;
const query = {
offset,
limit: tableState.pageSize,
sortBy: getSortType(tableState.sortBy?.id),
sortDesc: tableState.sortBy?.desc,
keyword: tableState.search,
...(range
? {
after: seconds(range?.start?.valueOf()),
before: seconds(range?.end?.valueOf()),
}
: undefined),
};
const logsQuery = useActivityLogs(query);
return (
<>
<PageHeader
title="User activity logs"
breadcrumbs="User activity logs"
reload
/>
<div className="mx-4">
<BEOverlay variant="multi-widget" featureId={FeatureId.ACTIVITY_AUDIT}>
<div className="row">
<div className="col-sm-12">
<FilterBar
value={range}
onChange={setRange}
onExport={handleExport}
/>
</div>
</div>
<ActivityLogsTable
sort={tableState.sortBy}
onChangeSort={(value) =>
tableState.setSortBy(value?.id, value?.desc || false)
}
limit={tableState.pageSize}
onChangeLimit={tableState.setPageSize}
keyword={tableState.search}
onChangeKeyword={tableState.setSearch}
currentPage={page}
onChangePage={setPage}
totalItems={logsQuery.data?.totalCount || 0}
dataset={logsQuery.data?.logs}
/>
</BEOverlay>
</div>
</>
);
function handleExport() {
exportMutation.mutate(query);
}
}
function seconds(ms?: number) {
if (!ms) {
return undefined;
}
return Math.floor(ms / 1000);
}