From ff799b4726743a2ae5d3bf81bbf1ca0465bba06d Mon Sep 17 00:00:00 2001 From: Devin Leopold Date: Tue, 21 Jul 2026 08:00:30 -0600 Subject: [PATCH] fix(app): allow existing web users to switch layouts --- packages/app/src/context/settings.test.ts | 7 +++++++ packages/app/src/context/settings.tsx | 19 ++++++++++++++++++- 2 files changed, 25 insertions(+), 1 deletion(-) diff --git a/packages/app/src/context/settings.test.ts b/packages/app/src/context/settings.test.ts index ba0161a6cdd4..3f94f22ec3ff 100644 --- a/packages/app/src/context/settings.test.ts +++ b/packages/app/src/context/settings.test.ts @@ -1,5 +1,6 @@ import { describe, expect, test } from "bun:test" import { + hasExistingWebState, isAppUpgrade, layoutTransitionState, maximumSunsetTimeout, @@ -23,6 +24,12 @@ describe("layout transition", () => { expect(layoutTransitionState(true, true, false, false)).toEqual({ available: true, notice: false }) }) + test("classifies web profiles from existing settings or a recorded version", () => { + expect(hasExistingWebState("{}", undefined)).toBe(true) + expect(hasExistingWebState(null, "1.17.19")).toBe(true) + expect(hasExistingWebState(null, undefined)).toBe(false) + }) + test("preserves explicit and default layout preferences", () => { expect(resolveNewLayoutDesigns(false, false, true)).toBe(false) expect(resolveNewLayoutDesigns(false, undefined, false)).toBe(false) diff --git a/packages/app/src/context/settings.tsx b/packages/app/src/context/settings.tsx index c2b568041832..c6d583282b33 100644 --- a/packages/app/src/context/settings.tsx +++ b/packages/app/src/context/settings.tsx @@ -89,6 +89,13 @@ export function shouldDisplayTabsToast( return isAppUpgrade(previous, current) || (!previous && existingInstall) } +export function hasExistingWebState( + settings: Promise | string | null, + previousVersion: string | undefined, +) { + return settings !== null || previousVersion !== undefined +} + export function shouldEnableNewLayout(previous: string | undefined, current: string | undefined) { if (!current) return false const currentComparison = compareVersions(current, newLayoutDesignsUpgradeCutoff) @@ -220,7 +227,7 @@ export const { use: useSettings, provider: SettingsProvider } = createSimpleCont gate: false, init: () => { const platform = usePlatform() - const [store, setStore, _, ready] = persisted("settings.v3", createStore(defaultSettings)) + const [store, setStore, settingsInit, ready] = persisted("settings.v3", createStore(defaultSettings)) const [launch, setLaunch, , launchReady] = persisted( "app-version.v1", createStore<{ version?: string }>({ version: undefined }), @@ -293,6 +300,16 @@ export const { use: useSettings, provider: SettingsProvider } = createSimpleCont setLaunch("version", platform.version) }) + createEffect(() => { + if (!ready() || !launchState.classified || platform.platform !== "web") return + if (layoutTransitionClassified()) return + setStore( + "general", + "layoutTransitionEligible", + hasExistingWebState(settingsInit, launchState.previous), + ) + }) + createEffect(() => { if (!ready() || !launchState.classified || launchState.migrationApplied) return if (layoutUpgrade() && store.general?.newLayoutDesigns !== true) {