diff --git a/frontend/src/App.tsx b/frontend/src/App.tsx index af987fc..f45520e 100644 --- a/frontend/src/App.tsx +++ b/frontend/src/App.tsx @@ -48,6 +48,17 @@ const DEFAULT_FILTERS: FeedFilters = { }; const FILTERS_KEY = "subfeed.filters"; +const PAGE_KEY = "siftlode.page"; + +// Page is navigation state, not a filter, but it's also kept out of the address bar — so +// persist it to localStorage to survive a reload. A share link's ?page= still wins. +function loadInitialPage(): Page { + const params = new URLSearchParams(window.location.search); + if (params.has("page")) return readPage(); + const stored = localStorage.getItem(PAGE_KEY); + if (stored === "channels" || stored === "stats" || stored === "playlists") return stored; + return "feed"; +} function loadStoredFilters(): FeedFilters { try { @@ -70,7 +81,7 @@ export default function App() { const [filters, setFiltersState] = useState(loadInitialFilters); const [view, setView] = useState<"grid" | "list">("grid"); const [sidebarLayout, setSidebarLayoutState] = useState(loadLayout); - const [page, setPageState] = useState(readPage); + const [page, setPageState] = useState(loadInitialPage); const [settingsOpen, setSettingsOpen] = useState(false); const [wizardOpen, setWizardOpen] = useState(false); const [channelFilter, setChannelFilter] = useState("all"); @@ -90,6 +101,7 @@ export default function App() { function setPage(next: Page) { setPageState(next); + localStorage.setItem(PAGE_KEY, next); } function setSidebarLayout(next: SidebarLayout) {