auto-sync: 2026-05-20 21:06:34
This commit is contained in:
@@ -582,20 +582,59 @@ export const useStore = create<AppStore>((set, get) => ({
|
||||
// ── Countdown & Polling ──
|
||||
|
||||
let _cdTimer: ReturnType<typeof setInterval> | null = null;
|
||||
let _blurFlushTimer: ReturnType<typeof setTimeout> | null = null;
|
||||
let _lastActivity = Date.now();
|
||||
|
||||
// P0: 输入焦点保护
|
||||
function hasActiveInput(): boolean {
|
||||
const el = document.activeElement;
|
||||
if (!el) return false;
|
||||
const tag = (el as HTMLElement).tagName;
|
||||
return tag === 'INPUT' || tag === 'TEXTAREA' || tag === 'SELECT'
|
||||
|| (el as HTMLElement).isContentEditable;
|
||||
}
|
||||
|
||||
// P0-2: blur 后补刷,执行前再次检查焦点
|
||||
function scheduleBlurFlush() {
|
||||
if (_blurFlushTimer) clearTimeout(_blurFlushTimer);
|
||||
_blurFlushTimer = setTimeout(() => {
|
||||
_blurFlushTimer = null;
|
||||
if (!hasActiveInput()) {
|
||||
useStore.getState().loadAll();
|
||||
}
|
||||
}, 2000);
|
||||
}
|
||||
|
||||
// P1: 活跃度追踪
|
||||
export function markActivity() {
|
||||
_lastActivity = Date.now();
|
||||
}
|
||||
|
||||
function getPollInterval(): number {
|
||||
const idle = Date.now() - _lastActivity;
|
||||
return idle > 60000 ? 30 : 10; // 空闲>60s → 30s,否则 10s
|
||||
}
|
||||
|
||||
export function startPolling() {
|
||||
if (_cdTimer) return;
|
||||
useStore.getState().loadAll();
|
||||
_cdTimer = setInterval(() => {
|
||||
// P0-1: 有输入焦点时跳过整个 loadAll
|
||||
if (hasActiveInput()) return;
|
||||
const s = useStore.getState();
|
||||
const cd = s.countdown - 1;
|
||||
if (cd <= 0) {
|
||||
s.setCountdown(5);
|
||||
s.setCountdown(getPollInterval());
|
||||
s.loadAll();
|
||||
} else {
|
||||
s.setCountdown(cd);
|
||||
}
|
||||
}, 1000);
|
||||
|
||||
// P0-2: blur 后补刷
|
||||
document.addEventListener('focusout', () => {
|
||||
scheduleBlurFlush();
|
||||
});
|
||||
}
|
||||
|
||||
export function stopPolling() {
|
||||
@@ -603,6 +642,10 @@ export function stopPolling() {
|
||||
clearInterval(_cdTimer);
|
||||
_cdTimer = null;
|
||||
}
|
||||
if (_blurFlushTimer) {
|
||||
clearTimeout(_blurFlushTimer);
|
||||
_blurFlushTimer = null;
|
||||
}
|
||||
}
|
||||
|
||||
// ── Utility ──
|
||||
|
||||
Reference in New Issue
Block a user