diff --git a/app/(home-pages)/layout.tsx b/app/(home-pages)/layout.tsx index 5e402858..13135142 100644 --- a/app/(home-pages)/layout.tsx +++ b/app/(home-pages)/layout.tsx @@ -1,5 +1,6 @@ import { getIdentityData } from "actions/getIdentityData"; import { EntitySetProvider } from "components/EntitySetProvider"; +import { NavStateTracker } from "components/NavStateTracker"; import { ThemeProvider, ThemeBackgroundProvider, @@ -13,6 +14,7 @@ export default async function HomePagesLayout(props: { if (!identityData?.home_leaflet) return ( <> + {props.children} ); @@ -34,6 +36,7 @@ export default async function HomePagesLayout(props: { > + {props.children} diff --git a/app/(home-pages)/page.tsx b/app/(home-pages)/page.tsx new file mode 100644 index 00000000..036e9562 --- /dev/null +++ b/app/(home-pages)/page.tsx @@ -0,0 +1,31 @@ +import { cookies } from "next/headers"; +import ReaderLayout from "./reader/layout"; +import ReaderPage from "./reader/page"; +import HomePage from "./home/page"; + +export default async function RootPage() { + const cookieStore = await cookies(); + const hasAuth = + cookieStore.has("auth_token") || + cookieStore.has("external_auth_token"); + + if (!hasAuth) { + return ( + + + + ); + } + + const navState = cookieStore.get("nav-state")?.value; + + if (navState === "reader") { + return ( + + + + ); + } + + return ; +} diff --git a/app/(home-pages)/reader/layout.tsx b/app/(home-pages)/reader/layout.tsx index 76bee57b..29e6695c 100644 --- a/app/(home-pages)/reader/layout.tsx +++ b/app/(home-pages)/reader/layout.tsx @@ -27,8 +27,13 @@ export default function ReaderLayout({ const tabs = allTabs.filter((tab) => !tab.requiresAuth || isLoggedIn); const isActive = (href: string) => { - if (href === "/reader") return pathname === "/reader"; - if (href === "/reader/hot" && !isLoggedIn && pathname === "/reader") + if (href === "/reader") + return pathname === "/reader" || pathname === "/"; + if ( + href === "/reader/hot" && + !isLoggedIn && + (pathname === "/reader" || pathname === "/") + ) return true; return pathname.startsWith(href); }; @@ -62,7 +67,7 @@ export default function ReaderLayout({ ))}
- {pathname === "/reader" && ( + {(pathname === "/reader" || pathname === "/") && (
Publications
diff --git a/app/api/update-nav-state/route.ts b/app/api/update-nav-state/route.ts new file mode 100644 index 00000000..3e496e82 --- /dev/null +++ b/app/api/update-nav-state/route.ts @@ -0,0 +1,16 @@ +import { NextRequest, NextResponse } from "next/server"; + +export async function POST(request: NextRequest) { + const { state } = (await request.json()) as { state: string }; + if (state !== "home" && state !== "reader") { + return NextResponse.json({ error: "Invalid state" }, { status: 400 }); + } + + const response = NextResponse.json({ ok: true }); + response.cookies.set("nav-state", state, { + path: "/", + sameSite: "lax", + maxAge: 60 * 60 * 24 * 365, + }); + return response; +} diff --git a/app/route.ts b/app/route.ts deleted file mode 100644 index 9bc9116d..00000000 --- a/app/route.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { createNewLeaflet } from "actions/createNewLeaflet"; -import { cookies } from "next/headers"; -import { redirect } from "next/navigation"; - -export const preferredRegion = ["sfo1"]; -export const dynamic = "force-dynamic"; -export const fetchCache = "force-no-store"; - -export async function GET() { - redirect("/home"); -} diff --git a/components/NavStateTracker.tsx b/components/NavStateTracker.tsx new file mode 100644 index 00000000..4bdf6fb3 --- /dev/null +++ b/components/NavStateTracker.tsx @@ -0,0 +1,27 @@ +"use client"; + +import { usePathname } from "next/navigation"; +import { useEffect, useRef } from "react"; + +export function NavStateTracker() { + const pathname = usePathname(); + const lastState = useRef(null); + + useEffect(() => { + let state: string | null = null; + if (pathname === "/home") state = "home"; + else if (pathname === "/reader" || pathname.startsWith("/reader/")) + state = "reader"; + + if (state && state !== lastState.current) { + lastState.current = state; + fetch("/api/update-nav-state", { + method: "POST", + headers: { "Content-Type": "application/json" }, + body: JSON.stringify({ state }), + }); + } + }, [pathname]); + + return null; +}