diff --git a/packages/platform/atoms/availability/AvailabilitySettings.tsx b/packages/platform/atoms/availability/AvailabilitySettings.tsx index b40b6ac2e4..f7c08da1d0 100644 --- a/packages/platform/atoms/availability/AvailabilitySettings.tsx +++ b/packages/platform/atoms/availability/AvailabilitySettings.tsx @@ -13,15 +13,15 @@ import { useLocale } from "@calcom/lib/hooks/useLocale"; import type { TimeRange, WorkingHours } from "@calcom/types/schedule"; import { Button, - ConfirmationDialogContent as WebConfirmationDialogContent, - Dialog as WebDialog, - DialogTrigger as WebDialogTrigger, + ConfirmationDialogContent, EditableHeading, Form, + SkeletonText, + Dialog, + DialogTrigger, Label, SelectSkeletonLoader, Skeleton, - SkeletonText, Switch, TimezoneSelect as WebTimezoneSelect, Tooltip, @@ -29,11 +29,6 @@ import { } from "@calcom/ui"; import { ArrowLeft, Info, MoreVertical, Plus, Trash } from "@calcom/ui/components/icon"; -import { ConfirmationDialogContent as PlatformConfirmationDialogContent } from "../src/components/ui/confirmation-dialog-content"; -import { - Dialog as PlatformDialog, - DialogTrigger as PlatformDialogTrigger, -} from "../src/components/ui/dialog"; import { Shell as PlatformShell } from "../src/components/ui/shell"; import { cn } from "../src/lib/utils"; import { Timezone as PlatformTimzoneSelect } from "../timezone/index"; @@ -96,22 +91,14 @@ const DeleteDialogButton = ({ buttonClassName, isPending, onDeleteConfirmed, - isPlatform, handleDelete, }: { disabled?: boolean; onDeleteConfirmed?: () => void; buttonClassName: string; - isPlatform: boolean; handleDelete: () => void; isPending: boolean; }) => { - const [Dialog, DialogTrigger, ConfirmationDialogContent] = useMemo(() => { - return isPlatform - ? [PlatformDialog, PlatformDialogTrigger, PlatformConfirmationDialogContent] - : [WebDialog, WebDialogTrigger, WebConfirmationDialogContent]; - }, [isPlatform]); - const { t } = useLocale(); return ( @@ -318,7 +305,6 @@ export function AvailabilitySettings({ disabled={schedule.isLastSchedule} isPending={isDeleting} handleDelete={handleDelete} - isPlatform={isPlatform} /> @@ -342,7 +328,6 @@ export function AvailabilitySettings({ disabled={schedule.isLastSchedule} isPending={isDeleting} handleDelete={handleDelete} - isPlatform={isPlatform} onDeleteConfirmed={() => { setOpenSidebar(false); }} diff --git a/packages/platform/atoms/src/components/ui/confirmation-dialog-content.tsx b/packages/platform/atoms/src/components/ui/confirmation-dialog-content.tsx deleted file mode 100644 index 0b23c94de7..0000000000 --- a/packages/platform/atoms/src/components/ui/confirmation-dialog-content.tsx +++ /dev/null @@ -1,69 +0,0 @@ -import type { PropsWithChildren } from "react"; - -import type { ConfirmationDialogContentProps } from "@calcom/ui"; -import { Button } from "@calcom/ui"; -import { AlertCircle, Check } from "@calcom/ui/components/icon"; - -import { DialogContent, DialogClose, DialogTitle, DialogDescription, DialogHeader } from "./dialog"; - -export function ConfirmationDialogContent(props: PropsWithChildren) { - const { - title, - variety, - confirmBtn = null, - confirmBtnText = "Confirm", - cancelBtnText = "Cancel", - loadingText = "Loading", - isPending = false, - onConfirm, - children, - } = props; - return ( - - <> - - {variety && ( - - {variety === "danger" && ( - - - - )} - {variety === "warning" && ( - - - - )} - {variety === "success" && ( - - - - )} - - )} - - {title} - {children} - - - - {confirmBtn ? ( - confirmBtn - ) : ( - - onConfirm && onConfirm(e)} - data-testid="dialog-confirmation"> - {isPending ? loadingText : confirmBtnText} - - - )} - - {cancelBtnText} - - - > - - ); -} diff --git a/packages/ui/components/dialog/Dialog.tsx b/packages/ui/components/dialog/Dialog.tsx index 836367155a..ad9bb6f961 100644 --- a/packages/ui/components/dialog/Dialog.tsx +++ b/packages/ui/components/dialog/Dialog.tsx @@ -1,8 +1,10 @@ import * as DialogPrimitive from "@radix-ui/react-dialog"; import { usePathname, useRouter } from "next/navigation"; -import type { ReactNode } from "react"; +import { useMemo } from "react"; +import type { ReactNode, ForwardRefExoticComponent, ReactElement } from "react"; import React, { useState } from "react"; +import { useIsPlatform, Dialog as PlatformDialogPrimitives } from "@calcom/atoms/monorepo"; import classNames from "@calcom/lib/classNames"; import { useCompatSearchParams } from "@calcom/lib/hooks/useCompatSearchParams"; import { useLocale } from "@calcom/lib/hooks/useLocale"; @@ -26,6 +28,11 @@ const enum DIALOG_STATE { } export function Dialog(props: DialogProps) { + const isPlatform = useIsPlatform(); + return !isPlatform ? : ; +} + +function WebDialog(props: DialogProps) { const router = useRouter(); const pathname = usePathname(); const searchParams = useCompatSearchParams(); @@ -70,6 +77,7 @@ export function Dialog(props: DialogProps) { return {children}; } + type DialogContentProps = React.ComponentProps<(typeof DialogPrimitive)["Content"]> & { size?: "xl" | "lg" | "md"; type?: "creation" | "confirmation"; @@ -84,10 +92,22 @@ type DialogContentProps = React.ComponentProps<(typeof DialogPrimitive)["Content // enableOverflow:- use this prop whenever content inside DialogContent could overflow and require scrollbar export const DialogContent = React.forwardRef( ({ children, title, Icon, enableOverflow, type = "creation", ...props }, forwardedRef) => { + const isPlatform = useIsPlatform(); + const [Portal, Overlay, Content] = useMemo( + () => + isPlatform + ? [ + ({ children }: { children: ReactElement | ReactElement[] }) => <>{children}>, + PlatformDialogPrimitives.DialogOverlay, + PlatformDialogPrimitives.DialogContent, + ] + : [DialogPrimitive.Portal, DialogPrimitive.Overlay, DialogPrimitive.Content], + [isPlatform] + ); return ( - - - + + )} {!type && children} - - + + ); } ); @@ -134,7 +154,7 @@ export const DialogContent = React.forwardRef; export function DialogHeader(props: DialogHeaderProps) { if (!props.title) return null; @@ -152,7 +172,12 @@ export function DialogHeader(props: DialogHeaderProps) { ); } -export function DialogFooter(props: { children: ReactNode; className?: string; showDivider?: boolean }) { +type DialogFooterProps = { + children: React.ReactNode; + showDivider?: boolean; +} & React.HTMLAttributes; + +export function DialogFooter(props: DialogFooterProps) { return ( {props.showDivider && ( @@ -172,8 +197,27 @@ export function DialogFooter(props: { children: ReactNode; className?: string; s DialogContent.displayName = "DialogContent"; -export const DialogTrigger = DialogPrimitive.Trigger; -// export const DialogClose = DialogPrimitive.Close; +export const DialogTrigger: ForwardRefExoticComponent< + DialogPrimitive.DialogTriggerProps & React.RefAttributes +> = React.forwardRef((props, ref) => { + const isPlatform = useIsPlatform(); + return !isPlatform ? ( + + ) : ( + + ); +}); + +DialogTrigger.displayName = "DialogTrigger"; + +type DialogCloseProps = { + "data-testid"?: string; + dialogCloseProps?: React.ComponentProps<(typeof DialogPrimitive)["Close"]>; + children?: ReactNode; + onClick?: (e: React.MouseEvent) => void; + disabled?: boolean; + color?: ButtonProps["color"]; +} & React.ComponentProps; export function DialogClose( props: { @@ -186,8 +230,14 @@ export function DialogClose( } & React.ComponentProps ) { const { t } = useLocale(); + const isPlatform = useIsPlatform(); + const Close = useMemo( + () => (isPlatform ? PlatformDialogPrimitives.DialogClose : DialogPrimitive.Close), + [isPlatform] + ); + return ( - + {/* This will require the i18n string passed in */} {props.children ? props.children : t("Close")} - + ); } + +DialogClose.displayName = "WebDialogClose";