diff --git a/admin-compliance/app/(sdk)/sdk/compliance-scope/page.tsx b/admin-compliance/app/(sdk)/sdk/compliance-scope/page.tsx index 9dd35a1..037d11e 100644 --- a/admin-compliance/app/(sdk)/sdk/compliance-scope/page.tsx +++ b/admin-compliance/app/(sdk)/sdk/compliance-scope/page.tsx @@ -49,21 +49,21 @@ export default function ComplianceScopePage() { const [isLoading, setIsLoading] = useState(true) const [isEvaluating, setIsEvaluating] = useState(false) - // Load from SDK context first (persisted via State API), then localStorage as fallback + // Load from SDK context first (persisted via State API), then localStorage as fallback. + // Runs ONCE on mount only — empty deps breaks the dispatch→sdkState→setScopeState→dispatch loop. useEffect(() => { try { // Priority 1: SDK context (loaded from PostgreSQL via State API) - if (sdkState.complianceScope && sdkState.complianceScope.answers?.length > 0) { - setScopeState(sdkState.complianceScope) - // Also update localStorage for offline fallback - localStorage.setItem(STORAGE_KEY, JSON.stringify(sdkState.complianceScope)) + const ctxScope = sdkState.complianceScope + if (ctxScope && ctxScope.answers?.length > 0) { + setScopeState(ctxScope) + localStorage.setItem(STORAGE_KEY, JSON.stringify(ctxScope)) } else { // Priority 2: localStorage fallback const stored = localStorage.getItem(STORAGE_KEY) if (stored) { const parsed = JSON.parse(stored) as ComplianceScopeState setScopeState(parsed) - // Sync to SDK context for backend persistence dispatch({ type: 'SET_COMPLIANCE_SCOPE', payload: parsed }) } } @@ -72,7 +72,8 @@ export default function ComplianceScopePage() { } finally { setIsLoading(false) } - }, [dispatch, sdkState.complianceScope]) + // eslint-disable-next-line react-hooks/exhaustive-deps + }, []) // Save to localStorage and SDK context whenever state changes useEffect(() => { @@ -248,8 +249,8 @@ export default function ComplianceScopePage() { - {/* Tab Content */} -