修复:同步提现审核列表与统计
邀请提现和其他提现页在窗口聚焦、恢复可见及每分钟自动刷新当前列表和统计。
This commit is contained in:
@@ -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([]);
|
||||
|
||||
Reference in New Issue
Block a user