import { TFunction } from "next-i18next"; import { useRouter } from "next/router"; import { EventTypeSetupProps, FormValues } from "pages/event-types/[type]"; import { useMemo, useState, Suspense } from "react"; import { UseFormReturn } from "react-hook-form"; import { TbWebhook } from "react-icons/tb"; import Shell from "@calcom/features/shell/Shell"; import { classNames } from "@calcom/lib"; import { CAL_URL } from "@calcom/lib/constants"; import { useLocale } from "@calcom/lib/hooks/useLocale"; import { HttpError } from "@calcom/lib/http-error"; import { trpc, TRPCClientError } from "@calcom/trpc/react"; import { Button, ButtonGroup, ConfirmationDialogContent, Dialog, DropdownMenuSeparator, Dropdown, DropdownMenuContent, DropdownMenuItem, DropdownItem, DropdownMenuTrigger, HorizontalTabs, Label, showToast, Skeleton, Switch, Tooltip, VerticalDivider, VerticalTabs, } from "@calcom/ui"; import { FiLink, FiCalendar, FiClock, FiSliders, FiRepeat, FiGrid, FiZap, FiUsers, FiExternalLink, FiCode, FiTrash, FiMoreHorizontal, FiLoader, } from "@calcom/ui/components/icon"; import { EmbedButton, EmbedDialog } from "@components/Embed"; type Props = { children: React.ReactNode; eventType: EventTypeSetupProps["eventType"]; currentUserMembership: EventTypeSetupProps["currentUserMembership"]; team: EventTypeSetupProps["team"]; disableBorder?: boolean; enabledAppsNumber: number; installedAppsNumber: number; enabledWorkflowsNumber: number; formMethods: UseFormReturn; isUpdateMutationLoading?: boolean; }; function getNavigation(props: { t: TFunction; eventType: Props["eventType"]; enabledAppsNumber: number; enabledWorkflowsNumber: number; installedAppsNumber: number; }) { const { eventType, t, enabledAppsNumber, installedAppsNumber, enabledWorkflowsNumber } = props; const duration = eventType.metadata?.multipleDuration?.map((duration) => ` ${duration}`) || eventType.length; return [ { name: "event_setup_tab_title", href: `/event-types/${eventType.id}?tabName=setup`, icon: FiLink, info: `${duration} ${t("minute_timeUnit")}`, // TODO: Get this from props }, { name: "availability", href: `/event-types/${eventType.id}?tabName=availability`, icon: FiCalendar, info: `default_schedule_name`, // TODO: Get this from props }, { name: "event_limit_tab_title", href: `/event-types/${eventType.id}?tabName=limits`, icon: FiClock, info: `event_limit_tab_description`, }, { name: "event_advanced_tab_title", href: `/event-types/${eventType.id}?tabName=advanced`, icon: FiSliders, info: `event_advanced_tab_description`, }, { name: "recurring", href: `/event-types/${eventType.id}?tabName=recurring`, icon: FiRepeat, info: `recurring_event_tab_description`, }, { name: "apps", href: `/event-types/${eventType.id}?tabName=apps`, icon: FiGrid, //TODO: Handle proper translation with count handling info: `${installedAppsNumber} apps, ${enabledAppsNumber} ${t("active")}`, }, { name: "workflows", href: `/event-types/${eventType.id}?tabName=workflows`, icon: FiZap, info: `${enabledWorkflowsNumber} ${t("active")}`, }, ]; } function EventTypeSingleLayout({ children, eventType, currentUserMembership, team, disableBorder, enabledAppsNumber, installedAppsNumber, enabledWorkflowsNumber, isUpdateMutationLoading, formMethods, }: Props) { const utils = trpc.useContext(); const { t } = useLocale(); const router = useRouter(); const [deleteDialogOpen, setDeleteDialogOpen] = useState(false); const hasPermsToDelete = currentUserMembership?.role !== "MEMBER" || !currentUserMembership; const deleteMutation = trpc.viewer.eventTypes.delete.useMutation({ onSuccess: async () => { await utils.viewer.eventTypes.invalidate(); showToast(t("event_type_deleted_successfully"), "success"); await router.push("/event-types"); setDeleteDialogOpen(false); }, onError: (err) => { if (err instanceof HttpError) { const message = `${err.statusCode}: ${err.message}`; showToast(message, "error"); setDeleteDialogOpen(false); } else if (err instanceof TRPCClientError) { showToast(err.message, "error"); } }, }); // Define tab navigation here const EventTypeTabs = useMemo(() => { const navigation = getNavigation({ t, eventType, enabledAppsNumber, installedAppsNumber, enabledWorkflowsNumber, }); // If there is a team put this navigation item within the tabs if (team) { navigation.splice(2, 0, { name: "assignment", href: `/event-types/${eventType.id}?tabName=team`, icon: FiUsers, info: eventType.schedulingType === "COLLECTIVE" ? "collective" : "round_robin", }); navigation.push({ name: "webhooks", href: `/event-types/${eventType.id}?tabName=webhooks`, icon: TbWebhook, info: `${eventType.webhooks.filter((webhook) => webhook.active).length} ${t("active")}`, }); } return navigation; }, [t, eventType, installedAppsNumber, enabledAppsNumber, enabledWorkflowsNumber, team]); const permalink = `${CAL_URL}/${team ? `team/${team.slug}` : eventType.users[0].username}/${ eventType.slug }`; const embedLink = `${team ? `team/${team.slug}` : eventType.users[0].username}/${eventType.slug}`; return (
{t("hide_from_profile")} { formMethods.setValue("hidden", e); }} />
{/* TODO: Figure out why combined isnt working - works in storybook */}
); } export { EventTypeSingleLayout };