import { useQuery, useMutation, useQueryClient } from '@tanstack/vue-query' import type { Ref } from 'vue' import { apiClient } from '@/lib/axios' import type { AllMyShiftsEventGroup, AvailableShiftsDay, MyShiftsResponse } from '@/types/portal-shift' interface ApiResponse { data: T } export function useAllMyShifts() { return useQuery({ queryKey: ['portal-all-my-shifts'], queryFn: async () => { const { data } = await apiClient.get>( '/portal/my-shifts', ) return data.data }, }) } export function useAvailableShifts(eventId: Ref) { return useQuery({ queryKey: ['available-shifts', eventId], queryFn: async () => { const { data } = await apiClient.get>( `/portal/events/${eventId.value}/available-shifts`, ) return data.data }, enabled: () => !!eventId.value, }) } export function useMyShifts(eventId: Ref) { return useQuery({ queryKey: ['my-shifts', eventId], queryFn: async () => { const { data } = await apiClient.get>( `/portal/events/${eventId.value}/my-shifts`, ) return data.data }, enabled: () => !!eventId.value, }) } export function useClaimShift(eventId: Ref) { const queryClient = useQueryClient() return useMutation({ mutationFn: async (shiftId: string) => { const { data } = await apiClient.post>( `/portal/events/${eventId.value}/shifts/${shiftId}/claim`, ) return data.data }, onSuccess: () => { queryClient.invalidateQueries({ queryKey: ['available-shifts', eventId] }) queryClient.invalidateQueries({ queryKey: ['my-shifts', eventId] }) }, }) } export function useCancelAssignment(eventId: Ref) { const queryClient = useQueryClient() return useMutation({ mutationFn: async ({ assignmentId, reason }: { assignmentId: string; reason?: string }) => { const { data } = await apiClient.post>( `/portal/events/${eventId.value}/assignments/${assignmentId}/cancel`, reason ? { reason } : {}, ) return data.data }, onSuccess: () => { queryClient.invalidateQueries({ queryKey: ['available-shifts', eventId] }) queryClient.invalidateQueries({ queryKey: ['my-shifts', eventId] }) }, }) }