Each page.tsx exceeded the 500-LOC hard cap. Extracted components and hooks into colocated _components/ and _hooks/ directories; page.tsx is now a thin orchestrator. - controls/page.tsx: 944 → 180 LOC; extracted ControlCard, AddControlForm, LoadingSkeleton, TransitionErrorBanner, StatsCards, FilterBar, RAGPanel into _components/ and useControlsData, useRAGSuggestions into _hooks/; types into _types.ts - training/page.tsx: 780 → 288 LOC; extracted ContentTab (inline content generator tab) into _components/ContentTab.tsx - control-provenance/page.tsx: 739 → 122 LOC; extracted MarkdownRenderer, UsageBadge, PermBadge, LicenseMatrix, SourceRegistry into _components/; PROVENANCE_SECTIONS static data into _data/provenance-sections.ts - iace/[projectId]/verification/page.tsx: 673 → 196 LOC; extracted StatusBadge, VerificationForm, CompleteModal, SuggestEvidenceModal, VerificationTable into _components/ Zero behavior changes; logic relocated verbatim. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
54 lines
1.6 KiB
TypeScript
54 lines
1.6 KiB
TypeScript
'use client'
|
|
|
|
import { useState } from 'react'
|
|
import type { RAGControlSuggestion } from '../_types'
|
|
|
|
export function useRAGSuggestions(setError: (msg: string | null) => void) {
|
|
const [ragLoading, setRagLoading] = useState(false)
|
|
const [ragSuggestions, setRagSuggestions] = useState<RAGControlSuggestion[]>([])
|
|
const [showRagPanel, setShowRagPanel] = useState(false)
|
|
const [selectedRequirementId, setSelectedRequirementId] = useState<string>('')
|
|
|
|
const suggestControlsFromRAG = async () => {
|
|
if (!selectedRequirementId) {
|
|
setError('Bitte eine Anforderungs-ID eingeben.')
|
|
return
|
|
}
|
|
setRagLoading(true)
|
|
setRagSuggestions([])
|
|
try {
|
|
const res = await fetch('/api/sdk/v1/compliance/ai/suggest-controls', {
|
|
method: 'POST',
|
|
headers: { 'Content-Type': 'application/json' },
|
|
body: JSON.stringify({ requirement_id: selectedRequirementId }),
|
|
})
|
|
if (!res.ok) {
|
|
const msg = await res.text()
|
|
throw new Error(msg || `HTTP ${res.status}`)
|
|
}
|
|
const data = await res.json()
|
|
setRagSuggestions(data.suggestions || [])
|
|
setShowRagPanel(true)
|
|
} catch (e) {
|
|
setError(`KI-Vorschlaege fehlgeschlagen: ${e instanceof Error ? e.message : 'Unbekannter Fehler'}`)
|
|
} finally {
|
|
setRagLoading(false)
|
|
}
|
|
}
|
|
|
|
const removeSuggestion = (controlId: string) => {
|
|
setRagSuggestions(prev => prev.filter(s => s.control_id !== controlId))
|
|
}
|
|
|
|
return {
|
|
ragLoading,
|
|
ragSuggestions,
|
|
showRagPanel,
|
|
setShowRagPanel,
|
|
selectedRequirementId,
|
|
setSelectedRequirementId,
|
|
suggestControlsFromRAG,
|
|
removeSuggestion,
|
|
}
|
|
}
|