From a189c7df9a044a3eae38b5395e4c7180e993387a Mon Sep 17 00:00:00 2001 From: linkeyu <798648091@qq.com> Date: Mon, 27 Jul 2026 10:20:04 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=EF=BC=9A=E5=90=8C=E6=AD=A5?= =?UTF-8?q?=E6=8F=90=E7=8E=B0=E5=AE=A1=E6=A0=B8=E5=88=97=E8=A1=A8=E4=B8=8E?= =?UTF-8?q?=E7=BB=9F=E8=AE=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 邀请提现和其他提现页在窗口聚焦、恢复可见及每分钟自动刷新当前列表和统计。 --- .../(main)/withdraws/WithdrawReviewPage.tsx | 30 +++++++++++++++++-- 1 file changed, 28 insertions(+), 2 deletions(-) diff --git a/src/app/(main)/withdraws/WithdrawReviewPage.tsx b/src/app/(main)/withdraws/WithdrawReviewPage.tsx index bed7a0f..bc2be6e 100644 --- a/src/app/(main)/withdraws/WithdrawReviewPage.tsx +++ b/src/app/(main)/withdraws/WithdrawReviewPage.tsx @@ -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('/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([]);