From 249065851b95368cd25938269203ba047cf130f5 Mon Sep 17 00:00:00 2001 From: Benny Joo Date: Thu, 5 Feb 2026 18:36:05 +0900 Subject: [PATCH] refactor: Break useCreateEventType hook into web-specific and platform-specific ones (#27522) * migrate useCreateEventType hook to web * fix * fix * fix import --- .../components/CreateEventTypeDialog.tsx | 2 +- .../event-types}/hooks/useCreateEventType.ts | 31 ++---------------- .../settings/teams/[id]/event-types-view.tsx | 2 +- .../ee/teams/components/TeamEventTypeForm.tsx | 5 ++- .../components/CreateEventTypeForm.tsx | 5 ++- .../CreateEventTypePlatformWrapper.tsx | 2 +- .../private/useCreateEventTypeForm.ts | 32 +++++++++++++++++++ packages/platform/atoms/package.json | 1 + 8 files changed, 46 insertions(+), 34 deletions(-) rename {packages/features/eventtypes => apps/web/modules/event-types}/hooks/useCreateEventType.ts (63%) create mode 100644 packages/platform/atoms/hooks/event-types/private/useCreateEventTypeForm.ts diff --git a/apps/web/modules/event-types/components/CreateEventTypeDialog.tsx b/apps/web/modules/event-types/components/CreateEventTypeDialog.tsx index 9af51bf556..f95f93ea1c 100644 --- a/apps/web/modules/event-types/components/CreateEventTypeDialog.tsx +++ b/apps/web/modules/event-types/components/CreateEventTypeDialog.tsx @@ -5,7 +5,7 @@ import { z } from "zod"; import { Dialog } from "@calcom/features/components/controlled-dialog"; import { useOrgBranding } from "@calcom/features/ee/organizations/context/provider"; import CreateEventTypeForm from "@calcom/features/eventtypes/components/CreateEventTypeForm"; -import { useCreateEventType } from "@calcom/features/eventtypes/hooks/useCreateEventType"; +import { useCreateEventType } from "~/event-types/hooks/useCreateEventType"; import { useLocale } from "@calcom/lib/hooks/useLocale"; import { useTypedQuery } from "@calcom/lib/hooks/useTypedQuery"; import type { EventType } from "@calcom/prisma/client"; diff --git a/packages/features/eventtypes/hooks/useCreateEventType.ts b/apps/web/modules/event-types/hooks/useCreateEventType.ts similarity index 63% rename from packages/features/eventtypes/hooks/useCreateEventType.ts rename to apps/web/modules/event-types/hooks/useCreateEventType.ts index 2203b14191..ba77953bb4 100644 --- a/packages/features/eventtypes/hooks/useCreateEventType.ts +++ b/apps/web/modules/event-types/hooks/useCreateEventType.ts @@ -1,6 +1,4 @@ -import { zodResolver } from "@hookform/resolvers/zod"; -import { useEffect, useState } from "react"; -import { useForm } from "react-hook-form"; +import { useState } from "react"; import type { z } from "zod"; import { createEventTypeInput } from "@calcom/features/eventtypes/lib/types"; @@ -8,33 +6,8 @@ import { useDebounce } from "@calcom/lib/hooks/useDebounce"; import { useLocale } from "@calcom/lib/hooks/useLocale"; import { HttpError } from "@calcom/lib/http-error"; import type { EventType } from "@calcom/prisma/client"; -import { SchedulingType } from "@calcom/prisma/enums"; -import { unlockedManagedEventTypeProps } from "@calcom/prisma/zod-utils"; import { trpc } from "@calcom/trpc/react"; - -export type CreateEventTypeFormValues = z.infer; - -export const useCreateEventTypeForm = () => { - const form = useForm({ - defaultValues: { - length: 15, - }, - resolver: zodResolver(createEventTypeInput), - }); - - const schedulingTypeWatch = form.watch("schedulingType"); - const isManagedEventType = schedulingTypeWatch === SchedulingType.MANAGED; - - useEffect(() => { - if (isManagedEventType) { - form.setValue("metadata.managedEventConfig.unlockedFields", unlockedManagedEventTypeProps); - } else { - form.setValue("metadata", null); - } - }, [schedulingTypeWatch]); - - return { form, isManagedEventType }; -}; +import { useCreateEventTypeForm } from "@calcom/atoms/hooks/event-types/private/useCreateEventTypeForm"; export const useCreateEventType = ( onSuccessMutation: (eventType: EventType) => void, diff --git a/apps/web/modules/settings/teams/[id]/event-types-view.tsx b/apps/web/modules/settings/teams/[id]/event-types-view.tsx index 7fba0c2c40..a5a56234ac 100644 --- a/apps/web/modules/settings/teams/[id]/event-types-view.tsx +++ b/apps/web/modules/settings/teams/[id]/event-types-view.tsx @@ -3,7 +3,7 @@ import { useRouter } from "next/navigation"; import { useOrgBranding } from "@calcom/features/ee/organizations/context/provider"; -import { useCreateEventType } from "@calcom/features/eventtypes/hooks/useCreateEventType"; +import { useCreateEventType } from "~/event-types/hooks/useCreateEventType"; import { useCompatSearchParams } from "@calcom/lib/hooks/useCompatSearchParams"; import { useLocale } from "@calcom/lib/hooks/useLocale"; import { trpc } from "@calcom/trpc/react"; diff --git a/packages/features/ee/teams/components/TeamEventTypeForm.tsx b/packages/features/ee/teams/components/TeamEventTypeForm.tsx index 38247e0df5..5499f1f6d6 100644 --- a/packages/features/ee/teams/components/TeamEventTypeForm.tsx +++ b/packages/features/ee/teams/components/TeamEventTypeForm.tsx @@ -2,7 +2,6 @@ import type { ReactNode } from "react"; import type { UseFormReturn } from "react-hook-form"; import { useIsPlatform } from "@calcom/atoms/hooks/useIsPlatform"; -import type { CreateEventTypeFormValues } from "@calcom/features/eventtypes/hooks/useCreateEventType"; import { useLocale } from "@calcom/lib/hooks/useLocale"; import slugify from "@calcom/lib/slugify"; import { SchedulingType } from "@calcom/prisma/enums"; @@ -12,6 +11,10 @@ import { Form } from "@calcom/ui/components/form"; import { TextField } from "@calcom/ui/components/form"; import { RadioAreaGroup as RadioArea } from "@calcom/ui/components/radio"; import { Tooltip } from "@calcom/ui/components/tooltip"; +import type { z } from "zod"; +import { createEventTypeInput } from "@calcom/features/eventtypes/lib/types"; + +type CreateEventTypeFormValues = z.infer; type props = { permissions: { diff --git a/packages/features/eventtypes/components/CreateEventTypeForm.tsx b/packages/features/eventtypes/components/CreateEventTypeForm.tsx index 102013470e..3691163ce7 100644 --- a/packages/features/eventtypes/components/CreateEventTypeForm.tsx +++ b/packages/features/eventtypes/components/CreateEventTypeForm.tsx @@ -3,7 +3,6 @@ import { useState } from "react"; import type { UseFormReturn } from "react-hook-form"; import { useIsPlatform } from "@calcom/atoms/hooks/useIsPlatform"; -import type { CreateEventTypeFormValues } from "@calcom/features/eventtypes/hooks/useCreateEventType"; import { MAX_EVENT_DURATION_MINUTES, MIN_EVENT_DURATION_MINUTES } from "@calcom/lib/constants"; import { useLocale } from "@calcom/lib/hooks/useLocale"; import { md } from "@calcom/lib/markdownIt"; @@ -14,6 +13,10 @@ import { Form } from "@calcom/ui/components/form"; import { TextAreaField } from "@calcom/ui/components/form"; import { TextField } from "@calcom/ui/components/form"; import { Tooltip } from "@calcom/ui/components/tooltip"; +import type { z } from "zod"; +import { createEventTypeInput } from "@calcom/features/eventtypes/lib/types"; + +type CreateEventTypeFormValues = z.infer; export default function CreateEventTypeForm({ form, diff --git a/packages/platform/atoms/event-types/wrappers/CreateEventTypePlatformWrapper.tsx b/packages/platform/atoms/event-types/wrappers/CreateEventTypePlatformWrapper.tsx index 9ff8e42827..29d735238a 100644 --- a/packages/platform/atoms/event-types/wrappers/CreateEventTypePlatformWrapper.tsx +++ b/packages/platform/atoms/event-types/wrappers/CreateEventTypePlatformWrapper.tsx @@ -1,12 +1,12 @@ import { AtomsWrapper } from "@/components/atoms-wrapper"; import CreateEventTypeForm from "@calcom/features/eventtypes/components/CreateEventTypeForm"; -import { useCreateEventTypeForm } from "@calcom/features/eventtypes/hooks/useCreateEventType"; import { useLocale } from "@calcom/lib/hooks/useLocale"; import type { EventType } from "@calcom/prisma/client"; import { Button } from "@calcom/ui/components/button"; import { TeamEventTypeForm } from "@calcom/features/ee/teams/components/TeamEventTypeForm"; +import { useCreateEventTypeForm } from "../../hooks/event-types/private/useCreateEventTypeForm"; import { useCreateEventType } from "../../hooks/event-types/private/useCreateEventType"; import { useCreateTeamEventType } from "../../hooks/event-types/private/useCreateTeamEventType"; import { useTeams } from "../../hooks/teams/useTeams"; diff --git a/packages/platform/atoms/hooks/event-types/private/useCreateEventTypeForm.ts b/packages/platform/atoms/hooks/event-types/private/useCreateEventTypeForm.ts new file mode 100644 index 0000000000..b96d60b773 --- /dev/null +++ b/packages/platform/atoms/hooks/event-types/private/useCreateEventTypeForm.ts @@ -0,0 +1,32 @@ +import { zodResolver } from "@hookform/resolvers/zod"; +import { useEffect } from "react"; +import { useForm } from "react-hook-form"; +import type { z } from "zod"; + +import { createEventTypeInput } from "@calcom/features/eventtypes/lib/types"; +import { SchedulingType } from "@calcom/prisma/enums"; +import { unlockedManagedEventTypeProps } from "@calcom/prisma/zod-utils"; + +export type CreateEventTypeFormValues = z.infer; + +export const useCreateEventTypeForm = () => { + const form = useForm({ + defaultValues: { + length: 15, + }, + resolver: zodResolver(createEventTypeInput), + }); + + const schedulingTypeWatch = form.watch("schedulingType"); + const isManagedEventType = schedulingTypeWatch === SchedulingType.MANAGED; + + useEffect(() => { + if (isManagedEventType) { + form.setValue("metadata.managedEventConfig.unlockedFields", unlockedManagedEventTypeProps); + } else { + form.setValue("metadata", null); + } + }, [schedulingTypeWatch]); + + return { form, isManagedEventType }; +}; \ No newline at end of file diff --git a/packages/platform/atoms/package.json b/packages/platform/atoms/package.json index 6dbd8dba71..8055cfa4ff 100644 --- a/packages/platform/atoms/package.json +++ b/packages/platform/atoms/package.json @@ -69,6 +69,7 @@ "./hooks/useIsPlatform": "./hooks/useIsPlatform.ts", "./hooks/useIsPlatformBookerEmbed": "./hooks/useIsPlatformBookerEmbed.ts", "./hooks/event-types/private/useEventTypeById": "./hooks/event-types/private/useEventTypeById.ts", + "./hooks/event-types/private/useCreateEventTypeForm": "./hooks/event-types/private/useCreateEventTypeForm.ts", "./event-types/hooks/useEventTypeForm": "./event-types/hooks/useEventTypeForm.ts", "./event-types/hooks/useHandleRouteChange": "./event-types/hooks/useHandleRouteChange.ts", "./event-types/hooks/useTabsNavigations": "./event-types/hooks/useTabsNavigations.tsx",