fix(admin): paginate claims & settlement lists for backend-audit 50-cap

GET /billing/claims and GET /settlement now return only the first 50 rows by
default (data.data unchanged, data.meta added). ClaimsPage and
RepresentationSettlementPage read the full array with no pager, so rows beyond 50
were unreachable. Add page state + ?page/limit + the existing <Pagination>
(reading data.meta.totalRecords).

No change needed for: 422 on claim approve/pay (api.ts already surfaces the
backend message via toast; the admin UI sends no amount so it's unreachable),
the owner-only appointment-settings endpoints (admin user bypasses), and refresh
rotation (authStore.refresh already persists the rotated refresh_token).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
hamed
2026-06-28 21:49:44 +03:30
co-authored by Claude Opus 4.8
parent 2764e68e60
commit 2f3f25f48e
3 changed files with 139 additions and 4 deletions
@@ -4,6 +4,7 @@ import { toast } from 'sonner';
import { api } from '../lib/api';
import type { ApiResponse } from '../lib/api';
import { formatRial, formatDate } from '../lib/utils';
import Pagination from '../components/ui/Pagination';
interface WalletBalance { balance_rials: number }
interface RepSummary { income: { settlable_rials: number; settled_rials: number; pending_rials: number } }
@@ -29,6 +30,8 @@ export default function RepresentationSettlementPage() {
const qc = useQueryClient();
const [amount, setAmount] = useState('');
const [ibanId, setIbanId] = useState('');
const [page, setPage] = useState(1);
const limit = 20;
const balanceQ = useQuery({
queryKey: ['wallet-balance'],
@@ -55,12 +58,14 @@ export default function RepresentationSettlementPage() {
const income = useMemo<any>(() => ((summaryQ.data?.data as any)?.data ?? summaryQ.data?.data)?.income, [summaryQ.data]);
const listQ = useQuery({
queryKey: ['settlements-mine'],
queryFn: () => api.get<ApiResponse<SettlementRow[]>>('/api/v1/settlement'),
queryKey: ['settlements-mine', page],
queryFn: () => api.get<ApiResponse<SettlementRow[]>>(`/api/v1/settlement?page=${page}&limit=${limit}`),
staleTime: 30_000,
});
// eslint-disable-next-line @typescript-eslint/no-explicit-any
const settlements: SettlementRow[] = (listQ.data?.data as any)?.data ?? listQ.data?.data ?? [];
// eslint-disable-next-line @typescript-eslint/no-explicit-any
const settlementsTotal: number = (listQ.data?.data as any)?.meta?.totalRecords ?? settlements.length;
const createMut = useMutation({
mutationFn: (payload: { amount_rials: number; iban_id: string }) =>
@@ -163,6 +168,7 @@ export default function RepresentationSettlementPage() {
</tbody>
</table>
</div>
<Pagination page={page} total={settlementsTotal} limit={limit} onPageChange={setPage} />
</div>
</div>
);