import clsx from "clsx"; import { Dialog as DialogPrimitive } from "radix-ui"; import * as React from "react"; import { useEvent, useGetKey, useGetSet } from "../../hooks"; import { ButtonContext } from "../Link"; import * as styles from "./styles.module.css"; const SheetContext = React.createContext< React.ComponentPropsWithRef >({}); export function Sheet({ children, preview, onOpenChange, ...rest }: DialogPrimitive.DialogProps & { className?: string; children: React.ReactNode; preview?: true; "data-id": string; }) { const key = useGetKey(rest); const [{ isOpen }, setState] = useGetSet(key, { isOpen: false }, true); const open = React.useCallback(() => { setState({ isOpen: true }, process.env.PREVIEW ? `onChange` : undefined); }, [setState]); const close = React.useCallback(() => { setState({ isOpen: false }, process.env.PREVIEW ? `onChange` : undefined); }, [setState]); const id = rest["data-id"]; useEvent(id, "open", open); useEvent(id, "close", close); return ( { setState({ isOpen }, process.env.PREVIEW ? `onChange` : undefined); onOpenChange?.(isOpen); }} > {children} ); } Sheet.SheetTrigger = ({ children, ...props }: React.ComponentPropsWithRef) => { const child = props.asChild === false ? children : React.Children.toArray(children)?.[0]; return ( {child} ); }; const SheetOverlay = ({ className, ...props }: React.ComponentPropsWithRef) => ( ); Sheet.DialogOverlay = SheetOverlay; const SheetContent = ({ side = "right", className, children, autoFocus = true, ...props }: React.ComponentPropsWithRef & { autoFocus: boolean; side: "top" | "right" | "bottom" | "left"; }) => { const additionalProps: Partial< React.ComponentPropsWithoutRef > = {}; if (!autoFocus) { additionalProps.onOpenAutoFocus = block; additionalProps.onCloseAutoFocus = block; additionalProps.onPointerDownOutside = block; additionalProps.onInteractOutside = block; } const overlayProps = React.useContext(SheetContext); return ( {children} ); }; Sheet.SheetContent = SheetContent; SheetContent.SheetClose = ({ className, children, ...props }: DialogPrimitive.DialogCloseProps) => { const child = props.asChild === false ? children : React.Children.toArray(children)?.[0]; return ( {child} ); }; SheetContent.SheetHeader = ({ className, ...props }: React.HTMLAttributes) => (
); SheetContent.SheetFooter = ({ className, ...props }: React.HTMLAttributes) => (
); SheetContent.SheetTitle = ({ className, ...props }: React.ComponentPropsWithRef) => ( ); SheetContent.SheetDescription = ({ className, ...props }: React.ComponentPropsWithRef) => ( ); function block(e: Event) { e?.preventDefault(); }