Files split by agents before rate limit: - dsr/api.ts (669 → barrel + helpers) - einwilligungen/context.tsx (669 → barrel + hooks/reducer) - export.ts (753 → barrel + domain exporters) - incidents/api.ts (845 → barrel + api-helpers) - tom-generator/context.tsx (720 → barrel + hooks/reducer) - vendor-compliance/context.tsx (1010 → 234 provider + hooks/reducer) - api-docs/endpoints.ts — partially split (3 domain files created) - academy/api.ts — partially split (helpers extracted) - whistleblower/api.ts — partially split (helpers extracted) next build passes. api-client.ts (885) deferred to next session. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
89 lines
2.4 KiB
TypeScript
89 lines
2.4 KiB
TypeScript
'use client'
|
|
|
|
import { useContext, useMemo, createContext } from 'react'
|
|
import { VendorComplianceContextValue } from './types'
|
|
|
|
// ==========================================
|
|
// CONTEXT
|
|
// ==========================================
|
|
|
|
export const VendorComplianceContext = createContext<VendorComplianceContextValue | null>(null)
|
|
|
|
// ==========================================
|
|
// HOOK
|
|
// ==========================================
|
|
|
|
export function useVendorCompliance(): VendorComplianceContextValue {
|
|
const context = useContext(VendorComplianceContext)
|
|
|
|
if (!context) {
|
|
throw new Error(
|
|
'useVendorCompliance must be used within a VendorComplianceProvider'
|
|
)
|
|
}
|
|
|
|
return context
|
|
}
|
|
|
|
// ==========================================
|
|
// SELECTORS
|
|
// ==========================================
|
|
|
|
export function useVendor(vendorId: string | null) {
|
|
const { vendors } = useVendorCompliance()
|
|
return useMemo(
|
|
() => vendors.find((v) => v.id === vendorId) ?? null,
|
|
[vendors, vendorId]
|
|
)
|
|
}
|
|
|
|
export function useProcessingActivity(activityId: string | null) {
|
|
const { processingActivities } = useVendorCompliance()
|
|
return useMemo(
|
|
() => processingActivities.find((a) => a.id === activityId) ?? null,
|
|
[processingActivities, activityId]
|
|
)
|
|
}
|
|
|
|
export function useVendorContracts(vendorId: string | null) {
|
|
const { contracts } = useVendorCompliance()
|
|
return useMemo(
|
|
() => contracts.filter((c) => c.vendorId === vendorId),
|
|
[contracts, vendorId]
|
|
)
|
|
}
|
|
|
|
export function useVendorFindings(vendorId: string | null) {
|
|
const { findings } = useVendorCompliance()
|
|
return useMemo(
|
|
() => findings.filter((f) => f.vendorId === vendorId),
|
|
[findings, vendorId]
|
|
)
|
|
}
|
|
|
|
export function useContractFindings(contractId: string | null) {
|
|
const { findings } = useVendorCompliance()
|
|
return useMemo(
|
|
() => findings.filter((f) => f.contractId === contractId),
|
|
[findings, contractId]
|
|
)
|
|
}
|
|
|
|
export function useControlInstancesForEntity(
|
|
entityType: 'VENDOR' | 'PROCESSING_ACTIVITY',
|
|
entityId: string | null
|
|
) {
|
|
const { controlInstances, controls } = useVendorCompliance()
|
|
|
|
return useMemo(() => {
|
|
if (!entityId) return []
|
|
|
|
return controlInstances
|
|
.filter((ci) => ci.entityType === entityType && ci.entityId === entityId)
|
|
.map((ci) => ({
|
|
...ci,
|
|
control: controls.find((c) => c.id === ci.controlId),
|
|
}))
|
|
}, [controlInstances, controls, entityType, entityId])
|
|
}
|