From ff398f84ac5aba5fc95bd68bbbe778f7ec32fec3 Mon Sep 17 00:00:00 2001 From: Lukas May Date: Thu, 5 Mar 2026 21:35:10 +0100 Subject: [PATCH] fix: Move useMemo above early returns in ReviewTab to fix hooks ordering crash The allFiles useMemo was declared after two early-return branches. Approving the last phase empties pendingReviewPhases, triggering the early return and causing React to see fewer hooks than the previous render. --- apps/web/src/components/review/ReviewTab.tsx | 22 ++++++++++---------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/apps/web/src/components/review/ReviewTab.tsx b/apps/web/src/components/review/ReviewTab.tsx index ac6c4a1..def288f 100644 --- a/apps/web/src/components/review/ReviewTab.tsx +++ b/apps/web/src/components/review/ReviewTab.tsx @@ -262,6 +262,17 @@ export function ReviewTab({ initiativeId }: ReviewTabProps) { const unresolvedCount = comments.filter((c) => !c.resolved).length; + const activePhaseName = + diffQuery.data?.phaseName ?? + pendingReviewPhases.find((p) => p.id === activePhaseId)?.name ?? + "Phase"; + + // All files from the full branch diff (for sidebar file list) + const allFiles = useMemo(() => { + if (!diffQuery.data?.rawDiff) return []; + return parseUnifiedDiff(diffQuery.data.rawDiff); + }, [diffQuery.data?.rawDiff]); + // Initiative-level review takes priority if (isInitiativePendingReview) { return ( @@ -283,17 +294,6 @@ export function ReviewTab({ initiativeId }: ReviewTabProps) { ); } - const activePhaseName = - diffQuery.data?.phaseName ?? - pendingReviewPhases.find((p) => p.id === activePhaseId)?.name ?? - "Phase"; - - // All files from the full branch diff (for sidebar file list) - const allFiles = useMemo(() => { - if (!diffQuery.data?.rawDiff) return []; - return parseUnifiedDiff(diffQuery.data.rawDiff); - }, [diffQuery.data?.rawDiff]); - return (
{/* Header: phase selector + toolbar */}