import { useMutation, useQuery, useQueryClient } from '@tanstack/vue-query' import type { Ref } from 'vue' import { apiClient } from '@/lib/axios' import type { CreateShiftPayload, Shift, UpdateShiftPayload } from '@/types/section' interface ApiResponse { success: boolean data: T message?: string } interface PaginatedResponse { data: T[] } export function useShiftList(orgId: Ref, eventId: Ref, sectionId: Ref) { return useQuery({ queryKey: ['shifts', sectionId], queryFn: async () => { const { data } = await apiClient.get>( `/organisations/${orgId.value}/events/${eventId.value}/sections/${sectionId.value}/shifts`, ) return data.data }, enabled: () => !!orgId.value && !!eventId.value && !!sectionId.value, }) } export function useCreateShift(orgId: Ref, eventId: Ref, sectionId: Ref) { const queryClient = useQueryClient() return useMutation({ mutationFn: async (payload: CreateShiftPayload) => { const { data } = await apiClient.post>( `/organisations/${orgId.value}/events/${eventId.value}/sections/${sectionId.value}/shifts`, payload, ) return data.data }, onSuccess: () => { queryClient.invalidateQueries({ queryKey: ['shifts', sectionId.value] }) }, }) } export function useUpdateShift(orgId: Ref, eventId: Ref, sectionId: Ref) { const queryClient = useQueryClient() return useMutation({ mutationFn: async ({ id, ...payload }: UpdateShiftPayload & { id: string }) => { const { data } = await apiClient.put>( `/organisations/${orgId.value}/events/${eventId.value}/sections/${sectionId.value}/shifts/${id}`, payload, ) return data.data }, onSuccess: () => { queryClient.invalidateQueries({ queryKey: ['shifts', sectionId.value] }) }, }) } export function useDeleteShift(orgId: Ref, eventId: Ref, sectionId: Ref) { const queryClient = useQueryClient() return useMutation({ mutationFn: async (id: string) => { await apiClient.delete( `/organisations/${orgId.value}/events/${eventId.value}/sections/${sectionId.value}/shifts/${id}`, ) }, onSuccess: () => { queryClient.invalidateQueries({ queryKey: ['shifts', sectionId.value] }) }, }) } export function useAssignShift(orgId: Ref, eventId: Ref, sectionId: Ref) { const queryClient = useQueryClient() return useMutation({ mutationFn: async ({ shiftId, personId }: { shiftId: string; personId: string }) => { const { data } = await apiClient.post>( `/organisations/${orgId.value}/events/${eventId.value}/sections/${sectionId.value}/shifts/${shiftId}/assign`, { person_id: personId }, ) return data.data }, onSuccess: () => { queryClient.invalidateQueries({ queryKey: ['shifts', sectionId.value] }) queryClient.invalidateQueries({ queryKey: ['persons', eventId.value] }) }, }) }