controlled-dropdown.js 989 B

12345678910111213141516171819202122232425262728293031323334353637
  1. import React from 'react'
  2. import { Dropdown } from 'react-bootstrap'
  3. import PropTypes from 'prop-types'
  4. import useDropdown from '../hooks/use-dropdown'
  5. export default function ControlledDropdown(props) {
  6. const dropdownProps = useDropdown(Boolean(props.defaultOpen))
  7. return (
  8. <Dropdown {...props} {...dropdownProps}>
  9. {React.Children.map(props.children, child => {
  10. if (!React.isValidElement(child)) {
  11. return child
  12. }
  13. // Dropdown.Menu
  14. if ('open' in child.props) {
  15. return React.cloneElement(child, { open: dropdownProps.open })
  16. }
  17. // Overlay
  18. if ('show' in child.props) {
  19. return React.cloneElement(child, { show: dropdownProps.open })
  20. }
  21. // anything else
  22. return React.cloneElement(child)
  23. })}
  24. </Dropdown>
  25. )
  26. }
  27. ControlledDropdown.propTypes = {
  28. children: PropTypes.any,
  29. defaultOpen: PropTypes.bool,
  30. id: PropTypes.string,
  31. className: PropTypes.string,
  32. }