'use client'; import { useCustomerQuery } from './customers'; import { createSlot, deleteSlot, getAvailableTimeSlots, getSlot, getSlots, updateSlot, } from '@/actions/api/slots'; import { useMutation, useQuery, useQueryClient } from '@tanstack/react-query'; type UseMasterSlotsVariables = { filters: Required< Pick[0]['filters']>, 'datetime_start' | 'master'> >; }; export const useMasterSlotsQuery = (variables: UseMasterSlotsVariables) => { const masterId = variables.filters?.master?.documentId?.eq; const datetimeStart = variables.filters?.datetime_start; return useQuery({ queryFn: () => getSlots(variables), queryKey: ['slots', masterId, datetimeStart], }); }; export const useSlotsQuery = (variables: Parameters[0]) => { return useQuery({ queryFn: () => getSlots(variables), queryKey: ['slots', variables], }); }; export const useSlotQuery = (variables: Parameters[0]) => { const { documentId } = variables; return useQuery({ queryFn: () => getSlot(variables), queryKey: ['slot', documentId], }); }; export const useAvailableTimeSlotsQuery = ( ...variables: Parameters ) => { return useQuery({ queryFn: () => getAvailableTimeSlots(...variables), queryKey: ['available-time-slots', variables], staleTime: 15 * 1_000, }); }; export const useSlotMutation = ({ documentId, }: Pick[0], 'documentId'>) => { const queryClient = useQueryClient(); return useMutation({ mutationFn: ({ data }: Pick[0], 'data'>) => updateSlot({ data, documentId }), mutationKey: ['slot', 'update', documentId], onSuccess: () => { if (documentId) { queryClient.invalidateQueries({ queryKey: ['slot', documentId], }); queryClient.invalidateQueries({ queryKey: ['slots'], }); } }, }); }; export const useSlotCreate = () => { const { data: { customer } = {} } = useCustomerQuery(); const masterId = customer?.documentId; const queryClient = useQueryClient(); return useMutation({ mutationFn: createSlot, mutationKey: ['slot', 'create'], onSuccess: (data) => { queryClient.invalidateQueries({ queryKey: ['slots', masterId], }); const documentId = data?.createSlot?.documentId; if (documentId) queryClient.prefetchQuery({ queryFn: () => getSlot({ documentId }), queryKey: ['slot', documentId], }); }, }); }; export const useSlotDelete = ({ documentId }: Parameters[0]) => { const queryClient = useQueryClient(); return useMutation({ mutationFn: () => deleteSlot({ documentId }), mutationKey: ['slot', 'delete', documentId], onSuccess: () => { queryClient.invalidateQueries({ queryKey: ['slots'], }); queryClient.invalidateQueries({ queryKey: ['slot', documentId], }); }, }); };