72 lines
1.9 KiB
TypeScript
72 lines
1.9 KiB
TypeScript
'use client';
|
|
import { addSlot, deleteSlot, getSlot, getSlots, updateSlot } from '@/actions/slots';
|
|
import { formatDate } from '@/utils/date';
|
|
// eslint-disable-next-line sonarjs/no-internal-api-use
|
|
import type * as ApolloTypes from '@repo/graphql/node_modules/@apollo/client/core';
|
|
import { useMutation, useQuery } from '@tanstack/react-query';
|
|
|
|
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
type FixTypescriptCringe = ApolloTypes.FetchResult;
|
|
|
|
type SlotAddInput = {
|
|
date: Date;
|
|
};
|
|
|
|
type SlotMutationInput = {
|
|
documentId: string;
|
|
};
|
|
|
|
type SlotQueryInput = {
|
|
date: Date;
|
|
masterId?: null | string;
|
|
};
|
|
|
|
export const useSlots = ({ date, masterId }: SlotQueryInput) => {
|
|
return useQuery({
|
|
queryFn: () =>
|
|
getSlots({
|
|
filters: {
|
|
date: { eq: formatDate(date).db() },
|
|
master: masterId ? { documentId: { eq: masterId } } : undefined,
|
|
},
|
|
}),
|
|
queryKey: ['slots', 'master', masterId, 'list', date],
|
|
});
|
|
};
|
|
|
|
export const useSlotQuery = ({ documentId }: SlotMutationInput) =>
|
|
useQuery({
|
|
queryFn: () => getSlot({ documentId }),
|
|
queryKey: ['slots', 'get', documentId],
|
|
});
|
|
|
|
export const useSlotMutation = ({ documentId }: SlotMutationInput) => {
|
|
const { refetch } = useSlotQuery({ documentId });
|
|
|
|
return useMutation({
|
|
mutationFn: updateSlot,
|
|
mutationKey: ['slots', 'update', documentId],
|
|
onSuccess: () => refetch(),
|
|
});
|
|
};
|
|
|
|
export const useSlotAdd = ({ date }: SlotAddInput) => {
|
|
const { refetch } = useSlots({ date });
|
|
|
|
return useMutation({
|
|
mutationFn: addSlot,
|
|
mutationKey: ['slots', 'add'],
|
|
onSuccess: () => refetch(),
|
|
});
|
|
};
|
|
|
|
export const useSlotDelete = ({ date, documentId }: SlotAddInput & SlotMutationInput) => {
|
|
const { refetch } = useSlots({ date });
|
|
|
|
return useMutation({
|
|
mutationFn: () => deleteSlot({ documentId }),
|
|
mutationKey: ['slots', 'delete', documentId],
|
|
onSuccess: () => refetch(),
|
|
});
|
|
};
|