UNPKG

@drivy/cobalt

Version:

Opinionated design system for Drivy's projects.

50 lines (47 loc) 2.54 kB
import { jsxs, Fragment, jsx } from 'react/jsx-runtime'; import React, { useRef, useState } from 'react'; import useBreakpoint from '../../hooks/useBreakpoint.js'; import Popover from './index.js'; const mergeRefs = (node, originalRef, buttonRef, extraRef) => { buttonRef.current = node; extraRef === null || extraRef === void 0 ? void 0 : extraRef(node); if (typeof originalRef === "function") { originalRef(node); } else if (originalRef && typeof originalRef === "object") { originalRef.current = node; } }; function PopoverWrapper({ content, children, trigger, onOpenChange, isOpenByDefault = false, disabled = false, responsive = true, ...popoverProps }) { var _a; const buttonRef = useRef(null); const [isOpen, setIsOpen] = useState(isOpenByDefault); const { breakpoint } = useBreakpoint(); const isMobile = responsive && (breakpoint === "sm" || breakpoint === "xs"); const handleOpenChange = (open) => { setIsOpen(open); onOpenChange === null || onOpenChange === void 0 ? void 0 : onOpenChange(open); }; if (disabled) return children; if (isMobile) { const childProps = children.props; return (jsxs(Fragment, { children: [React.cloneElement(children, { onClick: (event) => { var _a; (_a = childProps.onClick) === null || _a === void 0 ? void 0 : _a.call(childProps, event); handleOpenChange(true); }, ref: (node) => mergeRefs(node, children.ref, buttonRef), }), jsx(Popover, { ...popoverProps, responsive: true, isOpen: isOpen, onOpenChange: handleOpenChange, targetRef: buttonRef, children: content })] })); } return (jsx(Popover, { ...popoverProps, responsive: false, isOpen: isOpen, onOpenChange: handleOpenChange, targetRef: buttonRef, trigger: trigger, interactive: (_a = popoverProps.interactive) !== null && _a !== void 0 ? _a : trigger === "mouseenter", children: ({ refs, getReferenceProps, renderFloating }) => { const referenceProps = getReferenceProps(children.props); return (jsxs(Fragment, { children: [React.cloneElement(children, { ...referenceProps, ref: (node) => mergeRefs(node, children.ref, buttonRef, refs.setReference), }), renderFloating(content)] })); } })); } export { PopoverWrapper }; //# sourceMappingURL=PopoverWrapper.js.map