- scoreCalculator: apply dataQuality/confidence modifiers to finalScore (were computed but hardcoded to 0) - authService: call queryClient.clear() on logout to prevent cross-session data leakage - queryClient: extract to src/lib/queryClient.ts singleton so services can access it without circular imports - matchSyncService: new service layer owns match-generation logic; MockupNeedProvider no longer imports other providers directly - hooks (11 files): add onError + German toast feedback to every useMutation Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
56 lines
2.0 KiB
TypeScript
56 lines
2.0 KiB
TypeScript
import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query'
|
|
import { signalPipelineService } from '../services/signalPipelineService'
|
|
import type { GateType } from '../domain/signalPipeline'
|
|
import { useToastStore } from '../stores/toastStore'
|
|
|
|
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] })
|
|
},
|
|
onError: () => {
|
|
useToastStore.getState().showToast('Gate-Evaluierung fehlgeschlagen.', 'error')
|
|
},
|
|
})
|
|
}
|
|
|
|
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'] })
|
|
},
|
|
onError: () => {
|
|
useToastStore.getState().showToast('Veröffentlichung fehlgeschlagen. Bitte versuchen Sie es erneut.', 'error')
|
|
},
|
|
})
|
|
}
|