From 4e59a1a166847045897a6b576812bb53546e683b Mon Sep 17 00:00:00 2001 From: Ruben Fiszel Date: Thu, 19 Mar 2026 14:17:06 +0000 Subject: [PATCH] fix: prevent raw app iframe reload on userStore refresh (#8455) Co-authored-by: Claude Opus 4.6 (1M context) --- frontend/src/lib/components/raw_apps/RawAppPreview.svelte | 8 ++++++-- frontend/src/routes/(root)/(logged)/+layout.svelte | 5 ++++- 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/frontend/src/lib/components/raw_apps/RawAppPreview.svelte b/frontend/src/lib/components/raw_apps/RawAppPreview.svelte index e45ea3b20b..296590a0e4 100644 --- a/frontend/src/lib/components/raw_apps/RawAppPreview.svelte +++ b/frontend/src/lib/components/raw_apps/RawAppPreview.svelte @@ -3,7 +3,7 @@ import RawAppBackgroundRunner from './RawAppBackgroundRunner.svelte' import type { Runnable } from './rawAppPolicy' import { htmlContent } from './utils' - import { onMount } from 'svelte' + import { onMount, untrack } from 'svelte' interface Props { workspace: string @@ -26,10 +26,14 @@ // Use blob URL instead of srcDoc to give the iframe a proper origin. // srcDoc iframes have "null" origin which breaks URL constructor in routers. + // untrack(user) so that userStore refreshes don't regenerate the blob URL + // and cause the iframe to fully reload (losing all state). + // The user context is only needed for initial render. let blobUrl = $derived.by(() => { if (!secret) return undefined + const u = untrack(() => user) const baseUrl = typeof window !== 'undefined' ? window.location.origin : '' - const html = htmlContent(workspace, secret, { ctx: user, workspace }, baseUrl, initialHash) + const html = htmlContent(workspace, secret, { ctx: u, workspace }, baseUrl, initialHash) const blob = new Blob([html], { type: 'text/html' }) return URL.createObjectURL(blob) }) diff --git a/frontend/src/routes/(root)/(logged)/+layout.svelte b/frontend/src/routes/(root)/(logged)/+layout.svelte index 1d3efa1c32..b384b11a1e 100644 --- a/frontend/src/routes/(root)/(logged)/+layout.svelte +++ b/frontend/src/routes/(root)/(logged)/+layout.svelte @@ -50,6 +50,7 @@ import { syncTutorialsTodos } from '$lib/tutorialUtils' import { ArrowLeft, Search, WandSparkles } from 'lucide-svelte' import { getUserExt } from '$lib/user' + import { deepEqual } from 'fast-equals' import { twMerge } from 'tailwind-merge' import OperatorMenu from '$lib/components/sidebar/OperatorMenu.svelte' import GlobalSearchModal from '$lib/components/search/GlobalSearchModal.svelte' @@ -125,7 +126,9 @@ console.error('Could not persist workspace to local storage', e) } const user = await getUserExt(workspace) - userStore.set(user) + if (!deepEqual(user, $userStore)) { + userStore.set(user) + } if (isCloudHosted() && user?.is_admin) { isPremiumStore.set(await WorkspaceService.getIsPremium({ workspace })) }