From 48de4d98cdd6cb2807452e74baa964437af7781b Mon Sep 17 00:00:00 2001 From: Benjamin Admin Date: Mon, 13 Apr 2026 17:06:11 +0200 Subject: [PATCH] Fix infinite loop in StepBoxGridReview auto-build Auto-build was triggering on every grid.zones.length change, which happens on every rebuild (zone indices increment). Now uses a ref to ensure auto-build fires only once. Also removed boxZones.length===0 condition that could trigger unnecessary builds. Co-Authored-By: Claude Opus 4.6 (1M context) --- .../components/ocr-kombi/StepBoxGridReview.tsx | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/admin-lehrer/components/ocr-kombi/StepBoxGridReview.tsx b/admin-lehrer/components/ocr-kombi/StepBoxGridReview.tsx index bca7cec..72f7ec7 100644 --- a/admin-lehrer/components/ocr-kombi/StepBoxGridReview.tsx +++ b/admin-lehrer/components/ocr-kombi/StepBoxGridReview.tsx @@ -1,6 +1,6 @@ 'use client' -import { useCallback, useEffect, useState } from 'react' +import { useCallback, useEffect, useRef, useState } from 'react' import { useGridEditor } from '@/components/grid-editor/useGridEditor' import type { GridZone } from '@/components/grid-editor/types' import { GridTable } from '@/components/grid-editor/GridTable' @@ -96,15 +96,16 @@ export function StepBoxGridReview({ sessionId, onNext }: StepBoxGridReviewProps) await buildBoxGrids({ [String(boxIdx)]: layoutType }) }, [buildBoxGrids]) - // Auto-build on first load if box zones have no cells + // Auto-build once on first load if box zones have no cells + const autoBuildDone = useRef(false) useEffect(() => { - if (!grid || loading || building) return - const needsBuild = boxZones.length === 0 || boxZones.some(z => !z.cells || z.cells.length === 0) - // Only auto-build if we know there are boxes (check structure_result via a quick fetch) + if (!grid || loading || building || autoBuildDone.current) return + const needsBuild = boxZones.some(z => !z.cells || z.cells.length === 0) if (needsBuild && sessionId) { + autoBuildDone.current = true buildBoxGrids() } - }, [grid?.zones?.length, loading]) // eslint-disable-line react-hooks/exhaustive-deps + }, [grid, loading]) // eslint-disable-line react-hooks/exhaustive-deps if (loading) { return (