import { useRouter } from "next/navigation"; import { createContext, forwardRef, useContext, useState } from "react"; import { useForm } from "react-hook-form"; import { v4 as uuidv4 } from "uuid"; import { Dialog } from "@calcom/features/components/controlled-dialog"; import { dataTableQueryParamsSerializer } from "@calcom/features/data-table/lib/serializers"; import { ColumnFilterType } from "@calcom/features/data-table/lib/types"; 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 { 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 classNames from "@calcom/ui/classNames"; import type { ButtonProps } from "@calcom/ui/components/button"; import { Button } from "@calcom/ui/components/button"; import { DialogContent, DialogFooter, DialogClose, ConfirmationDialogContent, } from "@calcom/ui/components/dialog"; import { Dropdown, DropdownMenuContent, DropdownMenuItem, DropdownMenuTrigger, } from "@calcom/ui/components/dropdown"; import { TextAreaField } from "@calcom/ui/components/form"; import { TextField } from "@calcom/ui/components/form"; import { Form } from "@calcom/ui/components/form"; import { Switch } from "@calcom/ui/components/form"; import { showToast } from "@calcom/ui/components/toast"; 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, }); }}>
{/* Disable this feature for new forms till we get it fully working with Routing Form with Attributes. This isn't much used feature */} {/* {action === "duplicate" && ( { return ( { onChange(checked); }} /> ); }} /> )} */}
); } const dropdownCtx = createContext<{ dropdown: boolean }>({ dropdown: false }); export const FormActionsDropdown = ({ children, disabled, }: { disabled?: boolean; children: React.ReactNode; }) => { return (