diff options
| author | Martin Kagamino Lehoux <martin@lehoux.net> | 2026-10-18 21:26:24 +0200 |
|---|---|---|
| committer | Martin Kagamino Lehoux <martin@lehoux.net> | 2026-10-18 21:26:24 +0200 |
| commit | 031f99e626f52ea7baac9155b0cbe6e4fcfbfb31 (patch) | |
| tree | 5c6851213527ce7c8f5945c56a11448c7e8fdeac /src/lib/shared/refresh-policy.ts | |
| parent | 66939bab93cdcb9b7732c45d7bc3b99b6951fe15 (diff) | |
feat: poll server data so shared pages stay near-live
Refetch the current page every 15s while the tab is visible, gated by a
pure refresh policy: edit pages, hidden or offline tabs and in-flight
navigations are left alone. Replaces refresh-on-refocus with auto-refresh.
Diffstat (limited to 'src/lib/shared/refresh-policy.ts')
| -rw-r--r-- | src/lib/shared/refresh-policy.ts | 31 |
1 files changed, 31 insertions, 0 deletions
diff --git a/src/lib/shared/refresh-policy.ts b/src/lib/shared/refresh-policy.ts new file mode 100644 index 0000000..d79e6b7 --- /dev/null +++ b/src/lib/shared/refresh-policy.ts @@ -0,0 +1,31 @@ +/** + * Routes whose page data must not be refetched in the background: edit pages + * hold in-progress work, and refreshing the login form is pointless. + */ +export const EXCLUDED_ROUTES: Record<string, true> = { + '/login': true, + '/grocery/[id]': true, + '/projects/[projectId]/routine/[routineId]': true, +}; + +export interface RefreshConditions { + /** `$page.route.id`; null when no route matched yet. */ + routeId: string | null | undefined; + /** Document is visible (not a backgrounded tab). */ + visible: boolean; + /** Browser reports a network connection. */ + online: boolean; + /** A navigation or form action is already in flight. */ + navigating: boolean; +} + +/** A background refetch may re-run the page load only if nothing is at stake. */ +export function shouldAutoRefresh({ + routeId, + visible, + online, + navigating, +}: RefreshConditions): boolean { + if (!routeId || routeId in EXCLUDED_ROUTES) return false; + return visible && online && !navigating; +} |
