fix(layout): refresh load() data on tab/app resume
CI / update (push) Successful in 3m51s

Tauri WebView sessions (and long-lived browser tabs) persist
hydrated load() data indefinitely, so server-side changes never
surface until the user manually navigates across a depends()
boundary. Wire visibilitychange + focus to invalidateAll(),
throttled to once per 5 min to keep expensive loaders cheap.
This commit is contained in:
2026-04-21 19:44:56 +02:00
parent a056618696
commit f0ad5b67a5
2 changed files with 23 additions and 2 deletions
+1 -1
View File
@@ -1,6 +1,6 @@
{ {
"name": "homepage", "name": "homepage",
"version": "1.44.1", "version": "1.44.2",
"private": true, "private": true,
"type": "module", "type": "module",
"scripts": { "scripts": {
+22 -1
View File
@@ -1,10 +1,31 @@
<script> <script>
import '../app.css'; import '../app.css';
import { onNavigate } from '$app/navigation'; import { onNavigate, invalidateAll } from '$app/navigation';
import { onMount } from 'svelte';
import Toast from '$lib/components/Toast.svelte'; import Toast from '$lib/components/Toast.svelte';
import ConfirmDialog from '$lib/components/ConfirmDialog.svelte'; import ConfirmDialog from '$lib/components/ConfirmDialog.svelte';
let { children } = $props(); let { children } = $props();
/** Refresh server data on resume — Tauri WebView and backgrounded browser tabs
* don't re-run SvelteKit load() otherwise. Throttled: at most once per 5 min. */
const REFRESH_MIN_GAP_MS = 5 * 60 * 1000;
let lastRefreshAt = Date.now();
onMount(() => {
const refresh = () => {
if (document.hidden) return;
const now = Date.now();
if (now - lastRefreshAt < REFRESH_MIN_GAP_MS) return;
lastRefreshAt = now;
invalidateAll();
};
document.addEventListener('visibilitychange', refresh);
window.addEventListener('focus', refresh);
return () => {
document.removeEventListener('visibilitychange', refresh);
window.removeEventListener('focus', refresh);
};
});
onNavigate((navigation) => { onNavigate((navigation) => {
if (!(/** @type {any} */ (document)).startViewTransition) return; if (!(/** @type {any} */ (document)).startViewTransition) return;