fix(nav): persist the current page across reloads

Since filters/page are no longer mirrored to the URL (de-URL refactor), pressing F5
on the Channels/Playlists/Stats page dropped back to the feed because the initial
page was read only from the (now-absent) ?page= param. Persist page to localStorage
and restore it on load; a share link's ?page= still takes precedence.
This commit is contained in:
npeter83 2026-06-15 14:59:24 +02:00
parent 201ec4c3fb
commit 49cf2246b8

View file

@ -48,6 +48,17 @@ const DEFAULT_FILTERS: FeedFilters = {
}; };
const FILTERS_KEY = "subfeed.filters"; 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 { function loadStoredFilters(): FeedFilters {
try { try {
@ -70,7 +81,7 @@ export default function App() {
const [filters, setFiltersState] = useState<FeedFilters>(loadInitialFilters); const [filters, setFiltersState] = useState<FeedFilters>(loadInitialFilters);
const [view, setView] = useState<"grid" | "list">("grid"); const [view, setView] = useState<"grid" | "list">("grid");
const [sidebarLayout, setSidebarLayoutState] = useState<SidebarLayout>(loadLayout); const [sidebarLayout, setSidebarLayoutState] = useState<SidebarLayout>(loadLayout);
const [page, setPageState] = useState<Page>(readPage); const [page, setPageState] = useState<Page>(loadInitialPage);
const [settingsOpen, setSettingsOpen] = useState(false); const [settingsOpen, setSettingsOpen] = useState(false);
const [wizardOpen, setWizardOpen] = useState(false); const [wizardOpen, setWizardOpen] = useState(false);
const [channelFilter, setChannelFilter] = useState<ChannelStatusFilter>("all"); const [channelFilter, setChannelFilter] = useState<ChannelStatusFilter>("all");
@ -90,6 +101,7 @@ export default function App() {
function setPage(next: Page) { function setPage(next: Page) {
setPageState(next); setPageState(next);
localStorage.setItem(PAGE_KEY, next);
} }
function setSidebarLayout(next: SidebarLayout) { function setSidebarLayout(next: SidebarLayout) {