fix(workbench): delay live refresh on first load (#1943)

This commit is contained in:
Lyon
2026-06-23 03:20:37 +08:00
committed by GitHub
parent 10deb6ba19
commit 5c1f620713
2 changed files with 25 additions and 5 deletions
@@ -1,8 +1,14 @@
import { onBeforeUnmount, onMounted, ref, type Ref } from "vue";
export function useAutoRefresh(callback: () => Promise<void> | void, intervalMs = 30_000): { active: Ref<boolean>; refreshNow: () => Promise<void> } {
export interface AutoRefreshOptions {
immediate?: boolean;
initialDelayMs?: number;
}
export function useAutoRefresh(callback: () => Promise<void> | void, intervalMs = 30_000, options: AutoRefreshOptions = {}): { active: Ref<boolean>; refreshNow: () => Promise<void> } {
const active = ref(false);
let timer: ReturnType<typeof setInterval> | null = null;
let intervalTimer: ReturnType<typeof setInterval> | null = null;
let initialTimer: ReturnType<typeof setTimeout> | null = null;
async function refreshNow(): Promise<void> {
await callback();
@@ -10,13 +16,27 @@ export function useAutoRefresh(callback: () => Promise<void> | void, intervalMs
onMounted(() => {
active.value = true;
const startInterval = (): void => {
if (intervalTimer !== null) return;
intervalTimer = setInterval(() => void refreshNow(), intervalMs);
};
if (options.immediate === false) {
const delay = Math.max(0, Math.trunc(Number(options.initialDelayMs ?? intervalMs)));
initialTimer = setTimeout(() => {
initialTimer = null;
void refreshNow();
startInterval();
}, delay);
return;
}
void refreshNow();
timer = setInterval(() => void refreshNow(), intervalMs);
startInterval();
});
onBeforeUnmount(() => {
active.value = false;
if (timer) clearInterval(timer);
if (initialTimer) clearTimeout(initialTimer);
if (intervalTimer) clearInterval(intervalTimer);
});
return { active, refreshNow };
@@ -42,7 +42,7 @@ onBeforeUnmount(() => {
});
watch(() => route.params.sessionId, () => void applyRouteSession());
watch(() => workbench.activeSessionId, (sessionId) => void reflectActiveSessionInUrl(sessionId));
useAutoRefresh(() => workbench.refreshLive(), 30_000);
useAutoRefresh(() => workbench.refreshLive(), 30_000, { immediate: false, initialDelayMs: 10_000 });
async function applyRouteSession(): Promise<boolean> {
const sessionId = routeRequestId.value;