@blockstack/ui
Version:
Blockstack UI components built using React and styled-components with styled-system.
208 lines (181 loc) • 6.49 kB
JavaScript
import { objectSpread2 as _objectSpread2 } from '../_virtual/_rollupPluginBabelHelpers.js';
import { useState, useRef, useEffect, useCallback } from 'react';
import { mergeRefs, callAllHandlers } from '../utils/index.esm.js';
import '../hooks/use-controllable.esm.js';
import '../hooks/use-previous.esm.js';
import { useDisclosure } from '../hooks/use-disclosure.esm.js';
import '../hooks/use-latest-ref.esm.js';
import { useEventListener } from '../hooks/use-event-listener.esm.js';
import '../hooks/use-force-update.esm.js';
import { useId } from '../hooks/use-id.esm.js';
import { useMergeRefs } from '../hooks/use-merge-refs.esm.js';
import '../hooks/use-safe-layout-effect.esm.js';
import '../hooks/use-timeout.esm.js';
import '../hooks/use-theme.esm.js';
import '../hooks/use-color-mode.esm.js';
import { usePopper } from '../popper/index.esm.js';
import flushable from 'flushable';
var hideOperation;
var activeId = null;
function show(fn, delay) {
var _hideOperation;
var isHidePending = (_hideOperation = hideOperation) === null || _hideOperation === void 0 ? void 0 : _hideOperation.pending();
if (isHidePending) {
hideOperation.flush();
}
var showOperation = flushable(function () {
return fn(isHidePending);
}, isHidePending ? 0 : delay);
return showOperation.cancel;
}
function hide(fn, delay) {
hideOperation = flushable(function (flushed) {
return fn(flushed);
}, delay);
return hideOperation.cancel;
}
function useTooltip(props) {
if (props === void 0) {
props = {};
}
var _props = props,
_props$showDelay = _props.showDelay,
showDelay = _props$showDelay === void 0 ? 200 : _props$showDelay,
_props$hideDelay = _props.hideDelay,
hideDelay = _props$hideDelay === void 0 ? 200 : _props$hideDelay,
_props$hideOnClick = _props.hideOnClick,
hideOnClick = _props$hideOnClick === void 0 ? false : _props$hideOnClick,
onShow = _props.onShow,
onHide = _props.onHide,
hideOnMouseDown = _props.hideOnMouseDown,
placement = _props.placement,
id = _props.id,
isOpenProp = _props.isOpen,
defaultIsOpen = _props.defaultIsOpen,
_props$arrowSize = _props.arrowSize,
arrowSize = _props$arrowSize === void 0 ? 10 : _props$arrowSize,
_label = _props.label;
var _React$useState = useState(_label),
label = _React$useState[0],
setLabel = _React$useState[1];
var labelIsUpToDate = _label === label;
if (!labelIsUpToDate) setLabel(_label);
var _useDisclosure = useDisclosure({
isOpen: isOpenProp,
defaultIsOpen: defaultIsOpen,
onOpen: onShow,
onClose: onHide
}),
isOpen = _useDisclosure.isOpen,
open = _useDisclosure.onOpen,
close = _useDisclosure.onClose;
var popper = usePopper({
forceUpdate: isOpen && labelIsUpToDate,
placement: placement,
arrowSize: arrowSize
});
var tooltipId = useId(id, 'tooltip');
var ref = useRef(null);
var triggerRef = useMergeRefs(ref, popper.reference.ref);
var flushRef = useRef();
useEffect(function () {
return function () {
var _flushRef$current;
return (_flushRef$current = flushRef.current) === null || _flushRef$current === void 0 ? void 0 : _flushRef$current.call(flushRef);
};
}, []);
var hideImmediately = useCallback(function () {
var _flushRef$current2;
(_flushRef$current2 = flushRef.current) === null || _flushRef$current2 === void 0 ? void 0 : _flushRef$current2.call(flushRef);
close();
}, [close]);
var onClick = useCallback(function () {
if (hideOnClick) {
hideImmediately();
}
}, [hideOnClick, hideImmediately]);
var onMouseDown = useCallback(function () {
if (hideOnMouseDown) {
hideImmediately();
}
}, [hideOnMouseDown, hideImmediately]);
var showTooltip = useCallback(function () {
var _flushRef$current3;
(_flushRef$current3 = flushRef.current) === null || _flushRef$current3 === void 0 ? void 0 : _flushRef$current3.call(flushRef);
if (tooltipId !== activeId) {
hideImmediately();
}
activeId = tooltipId;
if (!isOpen) {
flushRef.current = show(function () {
open();
}, showDelay);
}
}, [isOpen, showDelay, open, tooltipId, hideImmediately]);
var hideTooltip = useCallback(function () {
var _flushRef$current4;
(_flushRef$current4 = flushRef.current) === null || _flushRef$current4 === void 0 ? void 0 : _flushRef$current4.call(flushRef);
activeId = null;
if (isOpen) {
flushRef.current = hide(function () {
close();
}, hideDelay);
}
}, [isOpen, hideDelay, close]);
var onMouseOver = useCallback(function (event) {
var isSelf = event.target === ref.current;
if (isOpen && isSelf) {
return;
}
showTooltip();
}, [isOpen, showTooltip]);
var onKeyDown = useCallback(function (event) {
if (isOpen && event.key === 'Escape') {
hideImmediately();
}
}, [isOpen, hideImmediately]);
useEventListener('keydown', onKeyDown);
return {
isOpen: isOpen,
show: open,
hide: close,
placement: popper.placement,
getTriggerProps: function getTriggerProps(props) {
if (props === void 0) {
props = {};
}
return _objectSpread2({}, props, {
ref: mergeRefs(props.ref, triggerRef),
onMouseOut: callAllHandlers(props.onMouseOut, hideTooltip),
onMouseOver: callAllHandlers(props.onMouseOver, onMouseOver),
onClick: callAllHandlers(props.onClick, onClick),
onMouseDown: callAllHandlers(props.onMouseDown, onMouseDown),
onFocus: callAllHandlers(props.onFocus, showTooltip),
onBlur: callAllHandlers(props.onBlur, hideTooltip),
'aria-describedby': isOpen ? tooltipId : undefined
});
},
getTooltipProps: function getTooltipProps(props) {
if (props === void 0) {
props = {};
}
return _objectSpread2({}, props, {
id: tooltipId,
role: 'tooltip',
ref: mergeRefs(props.ref, popper.popper.ref),
style: _objectSpread2({}, props.style, {}, popper.popper.style)
});
},
getArrowProps: function getArrowProps(props) {
if (props === void 0) {
props = {};
}
return _objectSpread2({}, props, {
ref: mergeRefs(props.ref, popper.arrow.ref),
style: _objectSpread2({}, props.style, {}, popper.arrow.style)
});
}
};
}
export { useTooltip };
//# sourceMappingURL=hooks.esm.js.map