修复:同步提现审核列表与统计

邀请提现和其他提现页在窗口聚焦、恢复可见及每分钟自动刷新当前列表和统计。
This commit is contained in:
linkeyu
2026-07-27 10:20:04 +08:00
parent 4cd92539a7
commit a189c7df9a
@@ -1,6 +1,6 @@
'use client';
import { useCallback, useEffect, useState } from 'react';
import { useCallback, useEffect, useRef, useState } from 'react';
import type { Key } from 'react';
import {
App,
@@ -61,6 +61,7 @@ import {
const { Text } = Typography;
const { RangePicker } = DatePicker;
const REVIEW_PAGE_POLL_INTERVAL_MS = 60_000;
// 提现单 / 审计 / 用户均为 UTC 口径(server_default=func.now());现金流水为北京 wall-clock。
const dt = (v: string) => formatUtcTime(v);
@@ -194,6 +195,10 @@ export function WithdrawReviewPage({ mode = 'other' }: { mode?: WithdrawReviewMo
: {};
const { items, total, page, pageSize, loading, onChange: onPageChange, reload } =
usePagedList<WithdrawListItem>('/admin/api/withdraws', filters, 20);
const reloadRef = useRef(reload);
useEffect(() => {
reloadRef.current = reload;
}, [reload]);
const canManage = canDo(['finance']);
const selectedOrders = items.filter((item) => selectedRowKeys.includes(item.id));
const selectedReviewing = selectedOrders.filter((item) => item.status === 'reviewing');
@@ -257,10 +262,31 @@ export function WithdrawReviewPage({ mode = 'other' }: { mode?: WithdrawReviewMo
}
}, []);
const refreshReviewData = useCallback(() => {
void reloadRef.current();
void loadSummary();
}, [loadSummary]);
useEffect(() => {
void loadSummary();
void loadHealth();
}, [loadHealth, loadSummary]);
const onWindowFocus = () => refreshReviewData();
const onVisibilityChange = () => {
if (document.visibilityState === 'visible') refreshReviewData();
};
const pollTimer = window.setInterval(() => {
if (document.visibilityState === 'visible') refreshReviewData();
}, REVIEW_PAGE_POLL_INTERVAL_MS);
window.addEventListener('focus', onWindowFocus);
document.addEventListener('visibilitychange', onVisibilityChange);
return () => {
window.clearInterval(pollTimer);
window.removeEventListener('focus', onWindowFocus);
document.removeEventListener('visibilitychange', onVisibilityChange);
};
}, [loadHealth, loadSummary, refreshReviewData]);
useEffect(() => {
setSelectedRowKeys([]);