controlled-dropdown.js 1.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647
  1. import React, { useCallback, useState } from 'react'
  2. import { Dropdown } from 'react-bootstrap'
  3. import PropTypes from 'prop-types'
  4. export default function ControlledDropdown(props) {
  5. const [open, setOpen] = useState(Boolean(props.defaultOpen))
  6. const handleClick = useCallback(event => {
  7. event.stopPropagation()
  8. }, [])
  9. const handleToggle = useCallback(value => {
  10. setOpen(value)
  11. }, [])
  12. return (
  13. <Dropdown
  14. {...props}
  15. open={open}
  16. onToggle={handleToggle}
  17. onClick={handleClick}
  18. >
  19. {React.Children.map(props.children, child => {
  20. if (!React.isValidElement(child)) {
  21. return child
  22. }
  23. // Dropdown.Menu
  24. if ('open' in child.props) {
  25. return React.cloneElement(child, { open })
  26. }
  27. // Overlay
  28. if ('show' in child.props) {
  29. return React.cloneElement(child, { show: open })
  30. }
  31. // anything else
  32. return React.cloneElement(child)
  33. })}
  34. </Dropdown>
  35. )
  36. }
  37. ControlledDropdown.propTypes = {
  38. children: PropTypes.any,
  39. defaultOpen: PropTypes.bool,
  40. }