feat: F023 signal-to-match pipeline & shadow market decision flow

This commit is contained in:
Benjamin Sutter
2026-05-15 15:52:53 +02:00
parent fce0f684af
commit c65e565dc7
20 changed files with 1957 additions and 0 deletions
+48
View File
@@ -0,0 +1,48 @@
import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query'
import { signalPipelineService } from '../services/signalPipelineService'
import type { GateType } from '../domain/signalPipeline'
const STALE_PIPELINE = 15_000
export function useSignalPipelineState(signalId: string | null) {
return useQuery({
queryKey: ['signal-pipeline', signalId],
queryFn: () => signalPipelineService.getPipelineState(signalId!),
enabled: signalId !== null,
staleTime: STALE_PIPELINE,
select: (res) => res.data ?? null,
})
}
export function useSignalAuditTrail(signalId: string | null) {
return useQuery({
queryKey: ['signal-audit-trail', signalId],
queryFn: () => signalPipelineService.getAuditTrail(signalId!),
enabled: signalId !== null,
staleTime: STALE_PIPELINE,
select: (res) => res.data ?? [],
})
}
export function useEvaluateGate() {
const queryClient = useQueryClient()
return useMutation({
mutationFn: ({ signalId, gateType }: { signalId: string; gateType: GateType }) =>
signalPipelineService.evaluateGate(signalId, gateType),
onSuccess: (_data, { signalId }) => {
queryClient.invalidateQueries({ queryKey: ['signal-pipeline', signalId] })
},
})
}
export function usePublishToFutureAvailability() {
const queryClient = useQueryClient()
return useMutation({
mutationFn: (signalId: string) => signalPipelineService.publishToFutureAvailability(signalId),
onSuccess: (_data, signalId) => {
queryClient.invalidateQueries({ queryKey: ['signal-pipeline', signalId] })
queryClient.invalidateQueries({ queryKey: ['signal-audit-trail', signalId] })
queryClient.invalidateQueries({ queryKey: ['market-signals'] })
},
})
}