UNPKG

reakit

Version:

Toolkit for building accessible rich web apps with React

101 lines (86 loc) 3.23 kB
import { _ as _objectWithoutPropertiesLoose, a as _objectSpread2 } from '../_rollupPluginBabelHelpers-1f0bf8c2.js'; import { useState, useEffect, useCallback, useRef } from 'react'; import { warning } from 'reakit-warning'; import { useIsomorphicEffect } from 'reakit-utils/useIsomorphicEffect'; import { useSealedState } from 'reakit-utils/useSealedState'; import '../Id/IdProvider.js'; import { unstable_useIdState } from '../Id/IdState.js'; function useLastValue(value) { var lastValue = useRef(null); useIsomorphicEffect(function () { lastValue.current = value; }, [value]); return lastValue; } function useDisclosureState(initialState) { if (initialState === void 0) { initialState = {}; } var _useSealedState = useSealedState(initialState), _useSealedState$visib = _useSealedState.visible, initialVisible = _useSealedState$visib === void 0 ? false : _useSealedState$visib, _useSealedState$anima = _useSealedState.animated, initialAnimated = _useSealedState$anima === void 0 ? false : _useSealedState$anima, sealed = _objectWithoutPropertiesLoose(_useSealedState, ["visible", "animated"]); var id = unstable_useIdState(sealed); var _React$useState = useState(initialVisible), visible = _React$useState[0], setVisible = _React$useState[1]; var _React$useState2 = useState(initialAnimated), animated = _React$useState2[0], setAnimated = _React$useState2[1]; var _React$useState3 = useState(false), animating = _React$useState3[0], setAnimating = _React$useState3[1]; var lastVisible = useLastValue(visible); var visibleHasChanged = lastVisible.current != null && lastVisible.current !== visible; if (animated && !animating && visibleHasChanged) { // Sets animating to true when when visible is updated setAnimating(true); } useEffect(function () { if (typeof animated === "number" && animating) { var timeout = setTimeout(function () { return setAnimating(false); }, animated); return function () { clearTimeout(timeout); }; } if (animated && animating && process.env.NODE_ENV === "development") { var _timeout = setTimeout(function () { process.env.NODE_ENV !== "production" ? warning(animating, "It's been 8 seconds but stopAnimation has not been called. Does the disclousure element have a CSS transition?") : void 0; }, 8000); return function () { clearTimeout(_timeout); }; } return function () {}; }, [animated, animating]); var show = useCallback(function () { return setVisible(true); }, []); var hide = useCallback(function () { return setVisible(false); }, []); var toggle = useCallback(function () { return setVisible(function (v) { return !v; }); }, []); var stopAnimation = useCallback(function () { return setAnimating(false); }, []); return _objectSpread2(_objectSpread2({}, id), {}, { visible: visible, animated: animated, animating: animating, show: show, hide: hide, toggle: toggle, setVisible: setVisible, setAnimated: setAnimated, stopAnimation: stopAnimation }); } export { useDisclosureState };