Files
shaguabijia-admin-web/src/lib/useCursorList.ts
T
OuYingJun1024 e377234137 feat: 运营后台完善微信提现审核列表和批量处理
新增提现审核列表的关键词搜索、日期范围筛选、快捷筛选、排序控件和重置筛选能力。

新增提现详情抽屉,展示用户快照、风险提示、处理时间线、最近提现和现金流水。

支持批量通过、批量拒绝、批量刷新查单,并优化批量操作确认与结果提示。

修复筛选请求竞态,避免旧请求晚返回覆盖新的筛选结果。
2026-06-08 17:37:40 +08:00

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),
};
}