From ceb1cbc0095b22a4d4bb5508360cae89568c257b Mon Sep 17 00:00:00 2001 From: G30 <50341825+silentoplayz@users.noreply.github.com> Date: Mon, 1 Jun 2026 13:33:54 -0400 Subject: [PATCH] fix(ui): guard JSON.parse(localStorage) calls with try/catch to prevent UI crashes (#25481) --- src/lib/components/chat/Navbar.svelte | 17 ++++++++++++----- src/routes/+layout.svelte | 6 +++++- 2 files changed, 17 insertions(+), 6 deletions(-) diff --git a/src/lib/components/chat/Navbar.svelte b/src/lib/components/chat/Navbar.svelte index 43439a7fc6..a6121b9e59 100644 --- a/src/lib/components/chat/Navbar.svelte +++ b/src/lib/components/chat/Navbar.svelte @@ -59,6 +59,14 @@ let closedBannerIds = []; + const getDismissedBannerIds = (): string[] => { + try { + return JSON.parse(localStorage.getItem('dismissedBannerIds') ?? '[]'); + } catch { + return []; + } + }; + let showShareChatModal = false; let showDownloadChatModal = false; @@ -299,7 +307,7 @@ /> {/if} - {#each $banners.filter((b) => ![...JSON.parse(localStorage.getItem('dismissedBannerIds') ?? '[]'), ...closedBannerIds].includes(b.id)) as banner (banner.id)} + {#each $banners.filter((b) => ![...getDismissedBannerIds(), ...closedBannerIds].includes(b.id)) as banner (banner.id)} { @@ -309,10 +317,9 @@ localStorage.setItem( 'dismissedBannerIds', JSON.stringify( - [ - bannerId, - ...JSON.parse(localStorage.getItem('dismissedBannerIds') ?? '[]') - ].filter((id) => $banners.find((b) => b.id === id)) + [bannerId, ...getDismissedBannerIds()].filter((id) => + $banners.find((b) => b.id === id) + ) ) ); } else { diff --git a/src/routes/+layout.svelte b/src/routes/+layout.svelte index 5efbd43b1c..5fb4f8da35 100644 --- a/src/routes/+layout.svelte +++ b/src/routes/+layout.svelte @@ -973,7 +973,11 @@ if (userSettings) { settings.set(userSettings.ui); } else { - settings.set(JSON.parse(localStorage.getItem('settings') ?? '{}')); + try { + settings.set(JSON.parse(localStorage.getItem('settings') ?? '{}')); + } catch { + settings.set({}); + } } setTextScale($settings?.textScale ?? 1);