aboutsummaryrefslogtreecommitdiff
path: root/src/lib/shared/refresh-policy.ts
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib/shared/refresh-policy.ts')
-rw-r--r--src/lib/shared/refresh-policy.ts31
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;
+}