the URL says which page, not which row
`?page=about` instead of `?page=2`. A URL that names the page can be read, sent to somebody, and still means the right thing after a database is restored from a dump with different ids — which happened once in this project already, earlier today. Home needs a word, because its slug is empty by design: that is the check constraint, and it is what makes `/` fall out of joining a slug to the root. An empty string is no use in a query parameter that has to name a page unambiguously, so the admin says `home` — and the site's API now REFUSES that slug, which is what makes the mapping total in both directions rather than merely usual. One reserved address costs nothing. Anybody who wanted /home wanted the front page, which they have. One place maps a page to its URL value and back — pageParam and pageFromParam — so the nav, the detail panel and the builder cannot disagree about what `?page=` means. `record` is deleted on every navigation. It belonged to the per-page record panels, which are unreachable now; nothing reads it, so it was not a bug, but every URL anybody copied carried a parameter naming a row in a section that no longer exists. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -41,3 +41,22 @@ export const usePages = () => {
|
||||
|
||||
return { pages, announce };
|
||||
};
|
||||
|
||||
/**
|
||||
* The value `?page=` carries, and how to read it back.
|
||||
*
|
||||
* The SLUG rather than the id, so a URL says which page it is: `?page=about` can be read, sent to
|
||||
* somebody, and still means the right thing after a database is restored from a dump with different
|
||||
* ids — which happened once already in this project.
|
||||
*
|
||||
* Home is the exception and needs a word, because its slug is empty by design. `home` is reserved by
|
||||
* the site's API, so no page can take that address and the mapping is total in both directions.
|
||||
*/
|
||||
export const HOME_PARAM = 'home';
|
||||
|
||||
export const pageParam = (page: Page): string => page.slug || HOME_PARAM;
|
||||
|
||||
export const pageFromParam = (pages: Page[] | null, value: string | null): Page | null => {
|
||||
if (!pages || !value) return null;
|
||||
return pages.find((page) => pageParam(page) === value) ?? null;
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user