From 6026286bbf42059afb5500f2c4dd6f5e34d934af Mon Sep 17 00:00:00 2001 From: khannurien Date: Sat, 19 Sep 2026 20:39:17 +0000 Subject: [PATCH] v3: journal becomes the default feed tab for visitors and for users who haven't picked one Co-Authored-By: Claude Opus 5 --- src/App.tsx | 3 ++- src/components/CategorySwitcher.tsx | 3 ++- src/components/FeedTabBar.tsx | 4 ++-- src/config/feedTabs.ts | 3 +++ src/hooks/useDefaultFeedTab.ts | 6 +++--- src/pages/Index.tsx | 4 ++-- 6 files changed, 14 insertions(+), 9 deletions(-) diff --git a/src/App.tsx b/src/App.tsx index 563419a9..72358f01 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -12,6 +12,7 @@ import { RestrictedGuest } from "./pages/RestrictedGuest.tsx"; import { RestrictedLoggedIn } from "./pages/RestrictedLoggedIn.tsx"; import { useAuth } from "./hooks/useAuth.ts"; import { useDefaultFeedTab } from "./hooks/useDefaultFeedTab.ts"; +import { DEFAULT_FEED_TAB } from "./config/feedTabs.ts"; import { AuthProvider } from "./contexts/AuthProvider.tsx"; import { PlayerProvider } from "./contexts/PlayerProvider.tsx"; @@ -83,7 +84,7 @@ const NotFound = lazy(() => function useResolvedDefaultTab() { const { user } = useAuth(); const [preferredTab] = useDefaultFeedTab(); - return preferredTab === "followed" && !user ? "hot" : preferredTab; + return preferredTab === "followed" && !user ? DEFAULT_FEED_TAB : preferredTab; } // The query string has to survive the hop: the Web Share Target posts to "/", diff --git a/src/components/CategorySwitcher.tsx b/src/components/CategorySwitcher.tsx index 05577bd7..57de15bf 100644 --- a/src/components/CategorySwitcher.tsx +++ b/src/components/CategorySwitcher.tsx @@ -9,6 +9,7 @@ import { createPortal } from "react-dom"; import { useNavigate, useParams } from "react-router"; import { t } from "@lingui/core/macro"; import { useCategories } from "../hooks/useCategories.ts"; +import { DEFAULT_FEED_TAB } from "../config/feedTabs.ts"; /** * Header dropdown that switches the feed scope between "All" and a category, @@ -73,7 +74,7 @@ export function CategorySwitcher() { if (categories.length === 0) return null; const value = categorySlug ?? "~"; - const tab = feedTab ?? "hot"; + const tab = feedTab ?? DEFAULT_FEED_TAB; const currentLabel = categorySlug ? categories.find((c) => c.slug === categorySlug)?.name ?? categorySlug : t`All`; diff --git a/src/components/FeedTabBar.tsx b/src/components/FeedTabBar.tsx index 83d947e0..39b59f2a 100644 --- a/src/components/FeedTabBar.tsx +++ b/src/components/FeedTabBar.tsx @@ -1,7 +1,7 @@ import { useNavigate, useParams } from "react-router"; import { Trans } from "@lingui/react/macro"; import { useAuth } from "../hooks/useAuth.ts"; -import { FEED_TABS, type FeedTab } from "../config/feedTabs.ts"; +import { DEFAULT_FEED_TAB, FEED_TABS, type FeedTab } from "../config/feedTabs.ts"; import { useDefaultFeedTab } from "../hooks/useDefaultFeedTab.ts"; import { TabBar } from "./TabBar.tsx"; import { CategorySwitcher } from "./CategorySwitcher.tsx"; @@ -18,7 +18,7 @@ export function FeedTabBar() { const [preferredTab] = useDefaultFeedTab(); const defaultTab: FeedTab = preferredTab === "followed" && !user - ? "hot" + ? DEFAULT_FEED_TAB : preferredTab; const active: FeedTab = (FEED_TABS as readonly string[]).includes(feedTab ?? "") ? (feedTab as FeedTab) diff --git a/src/config/feedTabs.ts b/src/config/feedTabs.ts index 2695db19..58ed517a 100644 --- a/src/config/feedTabs.ts +++ b/src/config/feedTabs.ts @@ -1,2 +1,5 @@ export const FEED_TABS = ["hot", "new", "journal", "followed"] as const; export type FeedTab = (typeof FEED_TABS)[number]; + +// Tab the index opens on for visitors and for users who haven't picked one. +export const DEFAULT_FEED_TAB: FeedTab = "journal"; diff --git a/src/hooks/useDefaultFeedTab.ts b/src/hooks/useDefaultFeedTab.ts index be7e3e13..a6741e3d 100644 --- a/src/hooks/useDefaultFeedTab.ts +++ b/src/hooks/useDefaultFeedTab.ts @@ -1,5 +1,5 @@ import { useCallback, useState } from "react"; -import { FEED_TABS, type FeedTab } from "../config/feedTabs.ts"; +import { DEFAULT_FEED_TAB, FEED_TABS, type FeedTab } from "../config/feedTabs.ts"; const STORAGE_KEY = "default-feed-tab"; @@ -7,12 +7,12 @@ function readStored(): FeedTab { const stored = localStorage.getItem(STORAGE_KEY); return stored && (FEED_TABS as readonly string[]).includes(stored) ? stored as FeedTab - : "hot"; + : DEFAULT_FEED_TAB; } /** * User preference for which feed tab the index opens on, persisted to - * localStorage (defaults to "hot"). Returns the stored tab and a setter that + * localStorage (defaults to DEFAULT_FEED_TAB). Returns the stored tab and a setter that * persists the choice. Consumers that only need to honour the preference (e.g. * the index default) can ignore the setter. */ diff --git a/src/pages/Index.tsx b/src/pages/Index.tsx index 653a3bb9..07150679 100644 --- a/src/pages/Index.tsx +++ b/src/pages/Index.tsx @@ -11,7 +11,7 @@ import { useLocation, useParams } from "react-router"; import { AppHeader } from "../components/AppHeader.tsx"; import { PresenceRow } from "../components/PresenceRow.tsx"; import { FeedTabBar } from "../components/FeedTabBar.tsx"; -import { FEED_TABS, type FeedTab } from "../config/feedTabs.ts"; +import { DEFAULT_FEED_TAB, FEED_TABS, type FeedTab } from "../config/feedTabs.ts"; import { useDefaultFeedTab } from "../hooks/useDefaultFeedTab.ts"; import { API_URL, DEFAULT_PAGE_SIZE } from "../config/api.ts"; @@ -89,7 +89,7 @@ export function Index({ categorySlug }: { categorySlug?: string }) { const { feedTab: rawTab } = useParams(); const [preferredTab] = useDefaultFeedTab(); const defaultTab: FeedTab = preferredTab === "followed" && !user - ? "hot" + ? DEFAULT_FEED_TAB : preferredTab; const tab: FeedTab = (FEED_TABS as readonly string[]).includes(rawTab ?? "") ? (rawTab as FeedTab)