efc72b720e
- 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>
66 lines
2.0 KiB
TypeScript
66 lines
2.0 KiB
TypeScript
import { useMutation } from '@tanstack/react-query'
|
|
import { offerService } from '../services/offerService'
|
|
import type { AssetType } from '../domain/enums'
|
|
import { useToastStore } from '../stores/toastStore'
|
|
|
|
export function useCreateOfferDraft() {
|
|
return useMutation({
|
|
mutationFn: (input: {
|
|
needId: string
|
|
selectedPropertyIds: string[]
|
|
needTitle: string
|
|
location: string
|
|
assetType: AssetType
|
|
sizeRange: { min: number; max: number }
|
|
}) =>
|
|
offerService.createOfferDraft(
|
|
input.needId,
|
|
input.selectedPropertyIds,
|
|
input.needTitle,
|
|
input.location,
|
|
input.assetType,
|
|
input.sizeRange,
|
|
),
|
|
onError: () => {
|
|
useToastStore.getState().showToast('Angebot konnte nicht erstellt werden.', 'error')
|
|
},
|
|
})
|
|
}
|
|
|
|
export function useUpdateOfferField() {
|
|
return useMutation({
|
|
mutationFn: (input: { offerDraftId: string; fieldId: string; value: string }) =>
|
|
offerService.updateOfferField(input.offerDraftId, input.fieldId, input.value),
|
|
onError: () => {
|
|
useToastStore.getState().showToast('Feld konnte nicht gespeichert werden.', 'error')
|
|
},
|
|
})
|
|
}
|
|
|
|
export function useMarkOfferChecked() {
|
|
return useMutation({
|
|
mutationFn: (offerDraftId: string) => offerService.markOfferChecked(offerDraftId),
|
|
onError: () => {
|
|
useToastStore.getState().showToast('Prüfung konnte nicht gespeichert werden.', 'error')
|
|
},
|
|
})
|
|
}
|
|
|
|
export function useGeneratePdfPreview() {
|
|
return useMutation({
|
|
mutationFn: (offerDraftId: string) => offerService.generatePdfPreview(offerDraftId),
|
|
onError: () => {
|
|
useToastStore.getState().showToast('PDF-Vorschau konnte nicht generiert werden.', 'error')
|
|
},
|
|
})
|
|
}
|
|
|
|
export function useSendOffer() {
|
|
return useMutation({
|
|
mutationFn: (offerDraftId: string) => offerService.sendOffer(offerDraftId),
|
|
onError: () => {
|
|
useToastStore.getState().showToast('Angebot konnte nicht gesendet werden. Bitte versuchen Sie es erneut.', 'error')
|
|
},
|
|
})
|
|
}
|