dorfteich/apps/web/src/layout/use-pond-route.ts
Claude Sonnet 5 49beb45b3e
All checks were successful
CD / Build and push images (push) Successful in 1m59s
CI / Lint, typecheck, test (push) Successful in 1m38s
CI / Auth e2e pack (push) Successful in 1m48s
CI / Build container images (push) Has been skipped
CD / Deploy to Test (push) Successful in 8s
CD / Smoke tests against Test (push) Successful in 1m10s
CD / Promote to Int (push) Successful in 9s
Add pond sidebar with page list, sort modes, and pond switcher (#26)
GET /ponds/:id/pages lists a pond's pages ordered by the pond's
persisted sidebarSort setting (alpha/created; manual arrives with #45).
The sidebar consumes it to show the page list with an active-page
highlight, an owner-only sort switch (persists via the existing
PATCH /ponds/:id), and an inline "new page" flow. The top bar gains a
pond switcher; a new /p/:pondSlug route gives it somewhere to land,
redirecting to the pond's first page once loaded. Sidebar collapse
gains a Ctrl/Cmd+\ shortcut and a slightly refined transition.

Closes #26
2026-07-06 12:37:44 +02:00

19 lines
627 B
TypeScript

import { useLocation } from 'react-router-dom';
interface PondRoute {
pondSlug: string | null;
pageSlug: string | null;
}
/**
* The sidebar and top bar render outside the routed `<Outlet>` (they wrap
* it), so `useParams` cannot see `:pondSlug`/`:pageSlug` — those only exist
* on the nested page routes. Parsing the path directly works regardless of
* which route matched underneath.
*/
export function useCurrentPondRoute(): PondRoute {
const { pathname } = useLocation();
const match = /^\/p\/([^/]+)(?:\/([^/]+))?/.exec(pathname);
return { pondSlug: match?.[1] ?? null, pageSlug: match?.[2] ?? null };
}