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
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
19 lines
627 B
TypeScript
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 };
|
|
}
|