@base-ui-components/react
Version:
Base UI is a library of headless ('unstyled') React components and low-level hooks. You gain complete control over your app's CSS and accessibility features.
113 lines (112 loc) • 4.9 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.usePreviewCardRoot = usePreviewCardRoot;
var React = _interopRequireWildcard(require("react"));
var ReactDOM = _interopRequireWildcard(require("react-dom"));
var _react2 = require("@floating-ui/react");
var _useControlled = require("../../utils/useControlled");
var _useTransitionStatus = require("../../utils/useTransitionStatus");
var _useEventCallback = require("../../utils/useEventCallback");
var _useFocusExtended = require("../utils/useFocusExtended");
var _constants = require("../utils/constants");
var _translateOpenChangeReason = require("../../utils/translateOpenChangeReason");
var _useAfterExitAnimation = require("../../utils/useAfterExitAnimation");
function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function (e) { return e ? t : r; })(e); }
function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
function usePreviewCardRoot(params) {
const {
open: externalOpen,
onOpenChange: onOpenChangeProp = () => {},
defaultOpen = false,
delay,
closeDelay
} = params;
const delayWithDefault = delay ?? _constants.OPEN_DELAY;
const closeDelayWithDefault = closeDelay ?? _constants.CLOSE_DELAY;
const [triggerElement, setTriggerElement] = React.useState(null);
const [positionerElement, setPositionerElement] = React.useState(null);
const [instantTypeState, setInstantTypeState] = React.useState();
const popupRef = React.useRef(null);
const [open, setOpenUnwrapped] = (0, _useControlled.useControlled)({
controlled: externalOpen,
default: defaultOpen,
name: 'PreviewCard',
state: 'open'
});
const onOpenChange = (0, _useEventCallback.useEventCallback)(onOpenChangeProp);
const {
mounted,
setMounted,
transitionStatus
} = (0, _useTransitionStatus.useTransitionStatus)(open);
const setOpen = (0, _useEventCallback.useEventCallback)((nextOpen, event, reason) => {
onOpenChange(nextOpen, event, reason);
setOpenUnwrapped(nextOpen);
});
(0, _useAfterExitAnimation.useAfterExitAnimation)({
open,
animatedElementRef: popupRef,
onFinished: () => setMounted(false)
});
const context = (0, _react2.useFloatingRootContext)({
elements: {
reference: triggerElement,
floating: positionerElement
},
open,
onOpenChange(openValue, eventValue, reasonValue) {
const isHover = reasonValue === 'hover' || reasonValue === 'safe-polygon';
const isFocusOpen = openValue && reasonValue === 'focus';
const isDismissClose = !openValue && (reasonValue === 'reference-press' || reasonValue === 'escape-key');
function changeState() {
setOpen(openValue, eventValue, (0, _translateOpenChangeReason.translateOpenChangeReason)(reasonValue));
}
if (isHover) {
// If a hover reason is provided, we need to flush the state synchronously. This ensures
// `node.getAnimations()` knows about the new state.
ReactDOM.flushSync(changeState);
} else {
changeState();
}
if (isFocusOpen || isDismissClose) {
setInstantTypeState(isFocusOpen ? 'focus' : 'dismiss');
} else if (reasonValue === 'hover') {
setInstantTypeState(undefined);
}
}
});
const instantType = instantTypeState;
const computedRestMs = delayWithDefault;
const hover = (0, _react2.useHover)(context, {
mouseOnly: true,
move: false,
handleClose: (0, _react2.safePolygon)(),
restMs: computedRestMs,
delay: {
close: closeDelayWithDefault
}
});
const focus = (0, _useFocusExtended.useFocusExtended)(context);
const dismiss = (0, _react2.useDismiss)(context);
const {
getReferenceProps: getRootTriggerProps,
getFloatingProps: getRootPopupProps
} = (0, _react2.useInteractions)([hover, focus, dismiss]);
return React.useMemo(() => ({
open,
setOpen,
mounted,
setMounted,
setTriggerElement,
positionerElement,
setPositionerElement,
popupRef,
getRootTriggerProps,
getRootPopupProps,
floatingRootContext: context,
instantType,
transitionStatus
}), [mounted, open, setMounted, setOpen, positionerElement, getRootTriggerProps, getRootPopupProps, context, instantType, transitionStatus]);
}