'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'; import dayjs from 'dayjs'; export const useSlotsQuery = (variables: Parameters[0]) => { const { data: { customer } = {} } = useCustomerQuery(); const masterId = variables.filters?.master?.documentId?.eq || customer?.documentId; const date = variables.filters?.date?.eq; return useQuery({ queryFn: () => getSlots(variables), queryKey: ['slots', masterId, dayjs(date).format('YYYY-MM-DD')], }); }; 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], }); } }, }); }; export const useSlotCreate = () => { const { data: { customer } = {} } = useCustomerQuery(); const masterId = customer?.documentId; const queryClient = useQueryClient(); return useMutation({ mutationFn: createSlot, mutationKey: ['slot', 'create'], onSuccess: () => { queryClient.invalidateQueries({ queryKey: ['slots', masterId], }); }, }); }; export const useSlotDelete = ({ documentId }: Parameters[0]) => { const { data: { slot } = {} } = useSlotQuery({ documentId }); const queryClient = useQueryClient(); return useMutation({ mutationFn: () => deleteSlot({ documentId }), mutationKey: ['slot', 'delete', documentId], onSuccess: () => { const date = slot?.date; const masterId = slot?.master?.documentId; queryClient.invalidateQueries({ queryKey: ['slots', masterId, dayjs(date).format('YYYY-MM-DD')], }); queryClient.invalidateQueries({ queryKey: ['slot', documentId], }); }, }); };