§22 S2: Catalog + propose scoped to the active collection

Catalog reads the /c/:collectionId/ segment via useCollectionId and fetches the
collection-scoped catalog, building entry/proposal links with the active
collection; the propose modal threads the active collection so a propose from a
named collection targets it.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
Ben Stull
2026-06-05 13:12:45 -07:00
parent 98eea3e2d6
commit 2b32e124ab
3 changed files with 16 additions and 7 deletions
+6 -1
View File
@@ -66,6 +66,10 @@ export default function App() {
// right project. Falls back to the deployment default off a project route.
const _projMatch = location.pathname.match(/^\/p\/([^/]+)/)
const currentProjectId = (_projMatch && _projMatch[1]) || deployment.defaultProjectId
// §22 S2 — the collection the viewer is currently in (from the /c/<cid>/ URL
// segment), so a propose targets that collection. Falls back to the default.
const _colMatch = location.pathname.match(/^\/p\/[^/]+\/c\/([^/]+)/)
const currentCollectionId = (_colMatch && _colMatch[1]) || DEFAULT_COLLECTION
// #28 Parts 23: the LinkedText create/contribute affordances route via
// query params so they need no prop-threading from deep in a comment
// list. `?propose=<term>` opens the propose modal pre-filled;
@@ -389,12 +393,13 @@ export default function App() {
viewer={viewer}
initialTitle={proposeParam || ''}
projectId={currentProjectId}
collectionId={currentCollectionId}
onClose={() => { setProposeOpen(false); clearParams('propose') }}
onSubmitted={({ pr_number }) => {
setProposeOpen(false)
clearParams('propose')
setCatalogVersion(v => v + 1)
navigate(proposalPath(currentProjectId, pr_number))
navigate(proposalPath(currentProjectId, pr_number, currentCollectionId))
}}
/>
)}