From f95c48b062b536ff77594ed6dd767219eabb4cb6 Mon Sep 17 00:00:00 2001 From: Sergey Kozyrenko Date: Wed, 22 Jul 2026 18:23:00 +0700 Subject: [PATCH] refactor(knowledges): give knowledgeId back to the route param MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit `knowledgeId` means the route param everywhere else — the route is declared as `knowledges/:knowledgeId`, and both knowledge.tsx and the route-title resolver destructure it under that name. This header had taken the name for the loaded document's id and left the route param as `routeKnowledgeId`, so the one file that reads both used the project's vocabulary backwards. The document's id needed no binding of its own: `handleRenameSave` two functions above already guards on `knowledge` and passes `knowledge.id`, so `handleDelete` now does the same and the rename input keys off `knowledge?.id`. Co-Authored-By: Claude Opus 4.8 --- .../src/features/knowledges/knowledge-header.tsx | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/frontend/src/features/knowledges/knowledge-header.tsx b/frontend/src/features/knowledges/knowledge-header.tsx index 6ab4a9d7..00eb4586 100644 --- a/frontend/src/features/knowledges/knowledge-header.tsx +++ b/frontend/src/features/knowledges/knowledge-header.tsx @@ -80,15 +80,14 @@ export function KnowledgeHeader({ viewMode = 'rich', }: KnowledgeHeaderProps) { const navigate = useNavigate(); - const { knowledgeId: routeKnowledgeId } = useParams(); + const { knowledgeId } = useParams(); const { isMobile } = useBreakpoint(); const { deleteKnowledge, renameKnowledge } = useKnowledges(); const [isRenaming, setIsRenaming] = useState(false); const [isDeleting, setIsDeleting] = useState(false); const [isDeleteDialogOpen, setIsDeleteDialogOpen] = useState(false); - const documentId = knowledge?.id ?? null; - const knowledgeNav = useKnowledgeDetailNavigation(isNew ? null : (routeKnowledgeId ?? null)); + const knowledgeNav = useKnowledgeDetailNavigation(isNew ? null : (knowledgeId ?? null)); // Title source-of-truth is the server-side `question`. We intentionally do // not read it from the form draft below — the inline rename flow in this @@ -108,7 +107,7 @@ export function KnowledgeHeader({ isEditing: isEditingTitle, startEdit: handleRenameStart, stopEdit: handleRenameCancel, - } = useInlineEdit({ resetKey: documentId }); + } = useInlineEdit({ resetKey: knowledge?.id ?? null }); const handleRenameSave = useCallback(async () => { const newQuestion = editingInputRef.current?.value.trim(); @@ -139,14 +138,14 @@ export function KnowledgeHeader({ }, [editingInputRef, handleRenameCancel, knowledge, renameKnowledge]); const handleDelete = useCallback(async () => { - if (!documentId) { + if (!knowledge) { return; } setIsDeleting(true); try { - await deleteKnowledge(documentId); + await deleteKnowledge(knowledge.id); onBeforeNavigateAway?.(); navigate(routes.knowledges, { replace: true }); } catch { @@ -154,7 +153,7 @@ export function KnowledgeHeader({ } finally { setIsDeleting(false); } - }, [documentId, deleteKnowledge, navigate, onBeforeNavigateAway]); + }, [knowledge, deleteKnowledge, navigate, onBeforeNavigateAway]); return ( <>