e377234137
新增提现审核列表的关键词搜索、日期范围筛选、快捷筛选、排序控件和重置筛选能力。 新增提现详情抽屉,展示用户快照、风险提示、处理时间线、最近提现和现金流水。 支持批量通过、批量拒绝、批量刷新查单,并优化批量操作确认与结果提示。 修复筛选请求竞态,避免旧请求晚返回覆盖新的筛选结果。
52 lines
1.5 KiB
TypeScript
52 lines
1.5 KiB
TypeScript
'use client';
|
|
|
|
import { useCallback, useEffect, useRef, useState } from 'react';
|
|
import { api } from './api';
|
|
import type { CursorPage } from './types';
|
|
|
|
/**
|
|
* 游标分页列表 hook(对接后端 CursorPage)。
|
|
* filters 变化自动重载第一页;loadMore 追加下一页;reload 重置(写操作后刷新)。
|
|
*/
|
|
export function useCursorList<T>(url: string, filters: Record<string, unknown>, limit = 20) {
|
|
const [items, setItems] = useState<T[]>([]);
|
|
const [nextCursor, setNextCursor] = useState<number | null>(null);
|
|
const [loading, setLoading] = useState(false);
|
|
const requestSeq = useRef(0);
|
|
|
|
const filtersKey = JSON.stringify(filters);
|
|
|
|
const load = useCallback(
|
|
async (cursor: number | null) => {
|
|
const seq = requestSeq.current + 1;
|
|
requestSeq.current = seq;
|
|
setLoading(true);
|
|
try {
|
|
const params: Record<string, unknown> = { ...JSON.parse(filtersKey), limit };
|
|
if (cursor != null) params.cursor = cursor;
|
|
const { data } = await api.get<CursorPage<T>>(url, { params });
|
|
if (requestSeq.current !== seq) return;
|
|
setItems((prev) => (cursor == null ? data.items : [...prev, ...data.items]));
|
|
setNextCursor(data.next_cursor);
|
|
} finally {
|
|
if (requestSeq.current === seq) setLoading(false);
|
|
}
|
|
},
|
|
[url, filtersKey, limit],
|
|
);
|
|
|
|
useEffect(() => {
|
|
setItems([]);
|
|
setNextCursor(null);
|
|
load(null);
|
|
}, [load]);
|
|
|
|
return {
|
|
items,
|
|
nextCursor,
|
|
loading,
|
|
loadMore: () => load(nextCursor),
|
|
reload: () => load(null),
|
|
};
|
|
}
|