diff --git a/packages/platform/atoms/event-types/wrappers/EventTypePlatformWrapper.tsx b/packages/platform/atoms/event-types/wrappers/EventTypePlatformWrapper.tsx index 894325500c..10ce1abab4 100644 --- a/packages/platform/atoms/event-types/wrappers/EventTypePlatformWrapper.tsx +++ b/packages/platform/atoms/event-types/wrappers/EventTypePlatformWrapper.tsx @@ -11,6 +11,7 @@ import { useLocale } from "@calcom/lib/hooks/useLocale"; import { SchedulingType } from "@calcom/prisma/enums"; import { useDeleteEventTypeById } from "../../hooks/event-types/private/useDeleteEventTypeById"; +import { useDeleteTeamEventTypeById } from "../../hooks/event-types/private/useDeleteTeamEventTypeById"; import { useMe } from "../../hooks/useMe"; import { AtomsWrapper } from "../../src/components/atoms-wrapper"; import { useToast } from "../../src/components/ui/use-toast"; @@ -40,6 +41,7 @@ export type EventTypePlatformWrapperProps = { customClassNames?: { atomsWrapper?: string; }; + disableToasts?: boolean; }; const EventType = ({ @@ -51,6 +53,7 @@ const EventType = ({ id, allowDelete = true, customClassNames, + disableToasts = false, ...props }: EventTypeSetupProps & EventTypePlatformWrapperProps) => { const { t } = useLocale(); @@ -63,17 +66,34 @@ const EventType = ({ const [slugExistsChildrenDialogOpen, setSlugExistsChildrenDialogOpen] = useState([]); const { data: user, isLoading: isUserLoading } = useMe(); + const handleDeleteSuccess = () => { + showToast(t("event_type_deleted_successfully"), "success"); + isTeamEventTypeDeleted.current = true; + setSlugExistsChildrenDialogOpen([]); + setIsOpenAssignmentWarnDialog(false); + onDeleteSuccess?.(); + }; + + const handleDeleteError = (err: Error) => { + showToast(err.message, "error"); + onDeleteError?.(err.message); + }; + const deleteMutation = useDeleteEventTypeById({ onSuccess: async () => { - showToast(t("event_type_deleted_successfully"), "success"); - isTeamEventTypeDeleted.current = true; - setSlugExistsChildrenDialogOpen([]); - setIsOpenAssignmentWarnDialog(false); - onDeleteSuccess?.(); + handleDeleteSuccess(); }, onError: (err) => { - showToast(err.message, "error"); - onDeleteError?.(err.message); + handleDeleteError(err); + }, + }); + + const deleteTeamEventTypeMutation = useDeleteTeamEventTypeById({ + onSuccess: async () => { + handleDeleteSuccess(); + }, + onError: (err) => { + handleDeleteError(err); }, }); @@ -111,7 +131,9 @@ const EventType = ({ const slug = form.watch("slug") ?? eventType.slug; const showToast = (message: string, variant: "success" | "warning" | "error") => { - toast({ description: message }); + if (!disableToasts) { + toast({ description: message }); + } }; const tabMap = { @@ -190,9 +212,12 @@ const EventType = ({ const onDelete = () => { if (allowDelete) { isTeamEventTypeDeleted.current = true; - deleteMutation.mutate(id); + team?.id + ? deleteTeamEventTypeMutation.mutate({ eventTypeId: id, teamId: team.id }) + : deleteMutation.mutate(id); } }; + const onConflict = (conflicts: ChildrenEventType[]) => { setSlugExistsChildrenDialogOpen(conflicts); }; diff --git a/packages/platform/atoms/hooks/event-types/private/useDeleteTeamEventTypeById.ts b/packages/platform/atoms/hooks/event-types/private/useDeleteTeamEventTypeById.ts new file mode 100644 index 0000000000..52ef67b655 --- /dev/null +++ b/packages/platform/atoms/hooks/event-types/private/useDeleteTeamEventTypeById.ts @@ -0,0 +1,46 @@ +import { useMutation } from "@tanstack/react-query"; + +import { V2_ENDPOINTS, SUCCESS_STATUS } from "@calcom/platform-constants"; +import type { ApiResponse, ApiSuccessResponse } from "@calcom/platform-types"; +import type { EventType } from "@calcom/prisma/client"; + +import http from "../../../lib/http"; +import { useAtomsContext } from "../../useAtomsContext"; + +export const QUERY_KEY = "use-delete-team-event-by-id"; +export type UseDeleteTeamEventTypeProps = { + onSuccess?: (data: ResponseDataType) => void; + onError?: (err: Error) => void; + onSettled?: () => void; +}; + +export type ResponseDataType = NonNullable< + Pick & { lengthInMinutes: number } +>; + +export const useDeleteTeamEventTypeById = ({ + onSuccess, + onError, + onSettled, +}: UseDeleteTeamEventTypeProps) => { + const { organizationId } = useAtomsContext(); + + return useMutation({ + onSuccess, + onError, + onSettled, + mutationFn: ({ eventTypeId, teamId }: { eventTypeId: number; teamId: number }) => { + if (!eventTypeId) throw new Error("Event type id is required"); + if (!teamId) throw new Error("team id is required"); + if (!organizationId) throw new Error("organization id is required"); + + const pathname = `/organizations/${organizationId}/teams/${teamId}/${V2_ENDPOINTS.eventTypes}/${eventTypeId}`; + return http?.delete>(pathname).then((res) => { + if (res.data.status === SUCCESS_STATUS) { + return (res.data as ApiSuccessResponse).data; + } + throw new Error(res.data.error.message); + }); + }, + }); +};