feat: F016 future availability workspace

2-panel workspace at /supply/future-availability: filterable signal list with FutureSignalCard (type/sensitivity/review badges + mandatory disclaimer) and collapsible detail panel with full evidence, review workflow (IN_REVIEW→APPROVED/REJECTED), shortlist action, and review task creation.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
Benjamin Sutter
2026-05-16 21:19:52 +02:00
parent 65130efca7
commit 2e68638246
13 changed files with 767 additions and 216 deletions
+24 -1
View File
@@ -1,5 +1,6 @@
import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query'
import { futureSignalService } from '../services/futureSignalService'
import type { ReviewStatus } from '../domain/enums'
import { STALE_SIGNALS } from '../lib/constants'
export function useFutureSignals() {
@@ -11,6 +12,16 @@ export function useFutureSignals() {
})
}
export function useFutureSignal(id: string) {
return useQuery({
queryKey: ['futureSignal', id],
queryFn: () => futureSignalService.getById(id),
staleTime: STALE_SIGNALS,
enabled: !!id,
select: (res) => res.data ?? null,
})
}
export function useFutureSignalsByProperty(propertyId: string) {
return useQuery({
queryKey: ['futureSignals', 'property', propertyId],
@@ -24,9 +35,21 @@ export function useFutureSignalsByProperty(propertyId: string) {
export function useVerifySignal() {
const queryClient = useQueryClient()
return useMutation({
mutationFn: (signalId: string) => futureSignalService.verify(signalId, 'current-user'),
mutationFn: (signalId: string) => futureSignalService.verify(signalId, 'admin@ideal-sharing.ch'),
onSuccess: () => {
queryClient.invalidateQueries({ queryKey: ['futureSignals'] })
},
})
}
export function useUpdateSignalReviewStatus() {
const queryClient = useQueryClient()
return useMutation({
mutationFn: ({ id, status }: { id: string; status: ReviewStatus }) =>
futureSignalService.updateReviewStatus(id, status),
onSuccess: () => {
queryClient.invalidateQueries({ queryKey: ['futureSignals'] })
queryClient.invalidateQueries({ queryKey: ['futureSignal'] })
},
})
}