fix(routing): render a 404 page for unmatched routes (v0.52.3)
The top-level catch-all silently redirected unknown paths to "/", and the nested /admin/*, /p/:projectId/*, and /docs/* route groups had no catch-all (invalid subpaths rendered a blank pane). Add a shared NotFound component and wire it into all four route groups so a bad/typo'd URL shows a clear 404 with a link home. Client-side 404 UI (SPA still serves HTTP 200). Patch 0.52.2 → 0.52.3; CHANGELOG updated. Caught by the operator on PPE. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -7,6 +7,7 @@ import { brandTitle } from './lib/brand'
|
||||
import { entryPath, proposalPath, DEFAULT_COLLECTION } from './lib/entryPaths'
|
||||
import { useDeployment } from './context/DeploymentProvider'
|
||||
import ProjectLayout from './components/ProjectLayout.jsx'
|
||||
import NotFound from './components/NotFound.jsx'
|
||||
import Directory from './components/Directory.jsx'
|
||||
import ProjectSwitcher from './components/ProjectSwitcher.jsx'
|
||||
import Catalog from './components/Catalog.jsx'
|
||||
@@ -381,13 +382,14 @@ export default function App() {
|
||||
<Route path="c/:collectionId/e/:slug" element={<RFCView viewer={viewer} />} />
|
||||
<Route path="c/:collectionId/e/:slug/pr/:prNumber" element={<PRView viewer={viewer} />} />
|
||||
<Route path="c/:collectionId/proposals/:prNumber" element={<ProposalView viewer={viewer} onChange={() => setCatalogVersion(v => v + 1)} />} />
|
||||
<Route path="*" element={<NotFound />} />
|
||||
</Routes>
|
||||
</main>
|
||||
</ProjectLayout>
|
||||
} />
|
||||
{/* Any other path (incl. the retired bare-slug corpus URLs that
|
||||
somehow reach the SPA) lands on the deployment landing. */}
|
||||
<Route path="*" element={<Navigate to="/" replace />} />
|
||||
{/* Any unmatched path is a real 404 — surface it rather than
|
||||
silently bouncing home, so a bad/typo'd URL is visible. */}
|
||||
<Route path="*" element={<NotFound />} />
|
||||
</Routes>
|
||||
</div>
|
||||
{(proposeOpen || proposeParam != null) && viewer && (
|
||||
@@ -507,6 +509,7 @@ function DocsWithSidebar({ viewer }) {
|
||||
client-side redirect to the first configured spec. */}
|
||||
<Route path="specs" element={<DocsSpecsIndex />} />
|
||||
<Route path="specs/:name" element={<DocsSpec />} />
|
||||
<Route path="*" element={<NotFound />} />
|
||||
</Route>
|
||||
</Routes>
|
||||
</main>
|
||||
|
||||
Reference in New Issue
Block a user