From 18865361d77066686319cd1a06d229c98a817420 Mon Sep 17 00:00:00 2001 From: Saurabh Kumar Bajpai Date: Sat, 6 Jun 2026 15:40:08 +0530 Subject: [PATCH] fix: handle invalid bookmark storage --- app/hooks/useBookmarks.ts | 33 ++++++++++++++++++++++++++++----- 1 file changed, 28 insertions(+), 5 deletions(-) diff --git a/app/hooks/useBookmarks.ts b/app/hooks/useBookmarks.ts index 86b4bc4..f6357d7 100644 --- a/app/hooks/useBookmarks.ts +++ b/app/hooks/useBookmarks.ts @@ -6,13 +6,36 @@ export type Bookmark = { title: string; }; +const BOOKMARKS_STORAGE_KEY = "openCSE_bookmarks"; + +function parseSavedBookmarks(saved: string): Bookmark[] { + const parsed = JSON.parse(saved); + + if (!Array.isArray(parsed)) { + throw new Error("Saved bookmarks must be an array"); + } + + return parsed.filter( + (bookmark): bookmark is Bookmark => + typeof bookmark?.url === "string" && typeof bookmark?.title === "string", + ); +} + export function useBookmarks() { const [bookmarks, setBookmarks] = useState([]); useEffect(() => { - const saved = localStorage.getItem("openCSE_bookmarks"); - if (saved) { - setBookmarks(JSON.parse(saved)); + const saved = localStorage.getItem(BOOKMARKS_STORAGE_KEY); + if (!saved) { + return; + } + + try { + setBookmarks(parseSavedBookmarks(saved)); + } catch (error) { + console.warn("Invalid bookmark data found:", error); + localStorage.removeItem(BOOKMARKS_STORAGE_KEY); + setBookmarks([]); } }, []); @@ -25,7 +48,7 @@ export function useBookmarks() { newBookmarks = [...bookmarks, bookmark]; } setBookmarks(newBookmarks); - localStorage.setItem("openCSE_bookmarks", JSON.stringify(newBookmarks)); + localStorage.setItem(BOOKMARKS_STORAGE_KEY, JSON.stringify(newBookmarks)); }; const isBookmarked = (url: string) => { @@ -33,4 +56,4 @@ export function useBookmarks() { }; return { bookmarks, toggleBookmark, isBookmarked }; -} \ No newline at end of file +}