import { useRouter } from "next/navigation"; import { createContext, forwardRef, useContext, useState } from "react"; import { Controller, useForm } from "react-hook-form"; import { v4 as uuidv4 } from "uuid"; import { useOrgBranding } from "@calcom/features/ee/organizations/context/provider"; import { RoutingFormEmbedButton, RoutingFormEmbedDialog } from "@calcom/features/embed/RoutingFormEmbed"; import { EmbedDialogProvider } from "@calcom/features/embed/lib/hooks/useEmbedDialogCtx"; import { classNames } from "@calcom/lib"; import { WEBSITE_URL } from "@calcom/lib/constants"; import { useLocale } from "@calcom/lib/hooks/useLocale"; import slugify from "@calcom/lib/slugify"; import { trpc } from "@calcom/trpc/react"; import type { ButtonProps } from "@calcom/ui"; import { Button, ConfirmationDialogContent, Dialog, DialogClose, DialogContent, DialogFooter, Dropdown, DropdownMenuContent, DropdownMenuItem, DropdownMenuTrigger, Form, SettingsToggle, showToast, Switch, TextAreaField, TextField, } from "@calcom/ui"; import getFieldIdentifier from "../lib/getFieldIdentifier"; type FormField = { identifier?: string; id: string; type: string; label: string; routerId?: string | null; }; type RoutingForm = { id: string; name: string; disabled: boolean; fields?: FormField[]; }; export type NewFormDialogState = { action: "new" | "duplicate"; target: string | null } | null; export type SetNewFormDialogState = React.Dispatch>; function NewFormDialog({ appUrl, newFormDialogState, setNewFormDialogState, }: { appUrl: string; newFormDialogState: NewFormDialogState; setNewFormDialogState: SetNewFormDialogState; }) { const { t } = useLocale(); const router = useRouter(); const utils = trpc.useUtils(); const action = newFormDialogState?.action; const target = newFormDialogState?.target; const mutation = trpc.viewer.appRoutingForms.formMutation.useMutation({ onSuccess: (_data, variables) => { router.push(`${appUrl}/form-edit/${variables.id}`); }, onError: (err) => { showToast(err.message || t("something_went_wrong"), "error"); }, onSettled: () => { utils.viewer.appRoutingForms.forms.invalidate(); }, }); const hookForm = useForm<{ name: string; description: string; shouldConnect: boolean; }>(); const formToDuplicate = action === "duplicate" ? target : null; const teamId = action === "new" ? Number(target) : null; const { register } = hookForm; return ( !open && setNewFormDialogState(null)}>

{t("form_description")}

{ const formId = uuidv4(); mutation.mutate({ id: formId, ...values, addFallback: true, teamId, duplicateFrom: formToDuplicate, }); }}>
{action === "duplicate" && ( { return ( { onChange(checked); }} /> ); }} /> )}
); } const dropdownCtx = createContext<{ dropdown: boolean }>({ dropdown: false }); export const FormActionsDropdown = ({ children, disabled, }: { disabled?: boolean; children: React.ReactNode; }) => { return (