699e525cb9
- Extract milestoneColor to utils/palette.ts; remove duplicate in HomeView + ProjectListView - Create useBackgroundRefresh composable; wire into HomeView + BriefingView (removes manual setInterval/clearInterval boilerplate) - Extract _loadTabContent() in SettingsView so watch and onMounted share one tab→loader mapping - Move raw fetch() api-key calls to typed helpers in api/client.ts (listApiKeys, createApiKey, revokeApiKey) - Drop unused onUnmounted import from BriefingView Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
30 lines
840 B
TypeScript
30 lines
840 B
TypeScript
import { onMounted, onUnmounted } from 'vue'
|
|
|
|
/**
|
|
* Runs `refreshFn` on a recurring interval while the page is visible.
|
|
* Safe to use in any component — timer is cleared on unmount.
|
|
*
|
|
* @param refreshFn Called each tick. Should be silent (no loading state changes).
|
|
* @param intervalMs Polling interval in milliseconds.
|
|
* @param canRun Optional guard — refresh is skipped when this returns false.
|
|
*/
|
|
export function useBackgroundRefresh(
|
|
refreshFn: () => void,
|
|
intervalMs: number,
|
|
canRun?: () => boolean,
|
|
): void {
|
|
let timer: ReturnType<typeof setInterval> | null = null
|
|
|
|
onMounted(() => {
|
|
timer = setInterval(() => {
|
|
if (document.hidden) return
|
|
if (canRun && !canRun()) return
|
|
refreshFn()
|
|
}, intervalMs)
|
|
})
|
|
|
|
onUnmounted(() => {
|
|
if (timer !== null) clearInterval(timer)
|
|
})
|
|
}
|