UNPKG

1.99 kBJavaScriptView Raw
1import PropTypes from 'prop-types';
2import React, { useContext, useCallback } from 'react';
3import DropdownContext from './DropdownContext';
4
5var noop = function noop() {};
6/**
7 * Wires up Dropdown toggle functionality, returning a set a props to attach
8 * to the element that functions as the dropdown toggle (generally a button).
9 *
10 * @memberOf Dropdown
11 */
12
13
14export function useDropdownToggle() {
15 var _ref = useContext(DropdownContext) || {},
16 _ref$show = _ref.show,
17 show = _ref$show === void 0 ? false : _ref$show,
18 _ref$toggle = _ref.toggle,
19 toggle = _ref$toggle === void 0 ? noop : _ref$toggle,
20 setToggle = _ref.setToggle;
21
22 var handleClick = useCallback(function (e) {
23 toggle(!show, e);
24 }, [show, toggle]);
25 return [{
26 ref: setToggle || noop,
27 onClick: handleClick,
28 'aria-haspopup': true,
29 'aria-expanded': !!show
30 }, {
31 show: show,
32 toggle: toggle
33 }];
34}
35var propTypes = {
36 /**
37 * A render prop that returns a Toggle element. The `props`
38 * argument should spread through to **a component that can accept a ref**. Use
39 * the `onToggle` argument to toggle the menu open or closed
40 *
41 * @type {Function ({
42 * show: boolean,
43 * toggle: (show: boolean) => void,
44 * props: {
45 * ref: (?HTMLElement) => void,
46 * aria-haspopup: true
47 * aria-expanded: boolean
48 * },
49 * }) => React.Element}
50 */
51 children: PropTypes.func.isRequired
52};
53
54/**
55 * Also exported as `<Dropdown.Toggle>` from `Dropdown`.
56 *
57 * @displayName DropdownToggle
58 * @memberOf Dropdown
59 */
60function DropdownToggle(_ref2) {
61 var children = _ref2.children;
62
63 var _useDropdownToggle = useDropdownToggle(),
64 props = _useDropdownToggle[0],
65 meta = _useDropdownToggle[1];
66
67 return /*#__PURE__*/React.createElement(React.Fragment, null, children(props, meta));
68}
69
70DropdownToggle.displayName = 'ReactOverlaysDropdownToggle';
71DropdownToggle.propTypes = propTypes;
72/** @component */
73
74export default DropdownToggle;
\No newline at end of file