* refactor: UserAvatarGroupWithOrg.tsx remove unecessary profile prop * chore: define event-type types in platform/types * feat: event-type transformes in lib and re-exported through platform-libraries * chore: define user types in platform/types * chore: add users endpoint to platform-constants * refactor: app-store use narrowed down booker event type * chore: version old event-types module * fix: old event-types e2e test * fix: libraries add missing export * fix: reset libraries version to 0 * feat: new event-types module and users endpoints * feat: make booker atom work with v2 event-types * updating event type * refactor: remove guard for get event-types * refactor: move private hook to public * Revert "refactor: remove guard for get event-types" This reverts commit d41204069f1d5bb1305b388ce53399f9175f4249. * Revert "refactor: move private hook to public" This reverts commit 09322e8fba102e57104959f79ed6bfa9a677dc9d. * refactor: get by username and slug in /event-types * remove console log * feat: locations handle displayEventPublicly * test e2e event-types * revert: user output from types * refactor: event-types hooks have private and public folders * refactor: require event-type.slug in input * refactor: demand that all labels of booking fields are unique * refactor: remove unused import * refactor: only have email and name by default in booker * refactor: add booking field slug * fix: display event-type location publicly / hide it in booker * fix: display event-type location publicly / hide it in booker * fix: packages/lib tests * fix: typescript in e2e test * fix: dynamic event types input * refactor: use IsIn instead of IsEnum * refactor: simplify getEventTypes * fix: use ApiAuthGuard instead of AccessTokenGuard * chore: export more stuff from libraries * refactor: SchedulingTypeEnum and Type --------- Co-authored-by: Morgan <33722304+ThyMinimalDev@users.noreply.github.com>
72 lines
2.3 KiB
TypeScript
72 lines
2.3 KiB
TypeScript
import { useEffect } from "react";
|
|
import { shallow } from "zustand/shallow";
|
|
|
|
import dayjs from "@calcom/dayjs";
|
|
import { useBookerStore } from "@calcom/features/bookings/Booker/store";
|
|
import { useSlotReservationId } from "@calcom/features/bookings/Booker/useSlotReservationId";
|
|
import type { BookerEvent } from "@calcom/features/bookings/types";
|
|
import { MINUTES_TO_BOOK } from "@calcom/lib/constants";
|
|
|
|
import { useDeleteSelectedSlot } from "./useDeleteSelectedSlot";
|
|
import { useReserveSlot } from "./useReserveSlot";
|
|
|
|
export type UseSlotsReturnType = ReturnType<typeof useSlots>;
|
|
|
|
export const useSlots = (event: { data?: Pick<BookerEvent, "id" | "length"> | null }) => {
|
|
const selectedDuration = useBookerStore((state) => state.selectedDuration);
|
|
const [selectedTimeslot, setSelectedTimeslot] = useBookerStore(
|
|
(state) => [state.selectedTimeslot, state.setSelectedTimeslot],
|
|
shallow
|
|
);
|
|
const [slotReservationId, setSlotReservationId] = useSlotReservationId();
|
|
const reserveSlotMutation = useReserveSlot({
|
|
onSuccess: (res) => {
|
|
setSlotReservationId(res.data);
|
|
},
|
|
});
|
|
|
|
const removeSelectedSlot = useDeleteSelectedSlot();
|
|
const handleRemoveSlot = () => {
|
|
if (event?.data) {
|
|
removeSelectedSlot.mutate({ uid: slotReservationId ?? undefined });
|
|
}
|
|
};
|
|
const handleReserveSlot = () => {
|
|
if (event?.data?.id && selectedTimeslot && (selectedDuration || event?.data?.length)) {
|
|
reserveSlotMutation.mutate({
|
|
slotUtcStartDate: dayjs(selectedTimeslot).utc().format(),
|
|
eventTypeId: event.data.id,
|
|
slotUtcEndDate: dayjs(selectedTimeslot)
|
|
.utc()
|
|
.add(selectedDuration || event.data.length, "minutes")
|
|
.format(),
|
|
});
|
|
}
|
|
};
|
|
|
|
const timeslot = useBookerStore((state) => state.selectedTimeslot);
|
|
|
|
useEffect(() => {
|
|
handleReserveSlot();
|
|
|
|
const interval = setInterval(() => {
|
|
handleReserveSlot();
|
|
}, parseInt(MINUTES_TO_BOOK) * 60 * 1000 - 2000);
|
|
|
|
return () => {
|
|
handleRemoveSlot();
|
|
clearInterval(interval);
|
|
};
|
|
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
}, [event?.data?.id, timeslot]);
|
|
|
|
return {
|
|
selectedTimeslot,
|
|
setSelectedTimeslot,
|
|
setSlotReservationId,
|
|
slotReservationId,
|
|
handleReserveSlot,
|
|
handleRemoveSlot,
|
|
};
|
|
};
|