controlled-dropdown.tsx 909 B

12345678910111213141516171819202122232425262728293031323334
  1. import { Children, cloneElement, type FC, isValidElement } from 'react'
  2. import { Dropdown, DropdownProps } from 'react-bootstrap'
  3. import useDropdown from '../hooks/use-dropdown'
  4. const ControlledDropdown: FC<
  5. DropdownProps & { defaultOpen?: boolean }
  6. > = props => {
  7. const dropdownProps = useDropdown(Boolean(props.defaultOpen))
  8. return (
  9. <Dropdown {...props} {...dropdownProps}>
  10. {Children.map(props.children, child => {
  11. if (!isValidElement(child)) {
  12. return child
  13. }
  14. // Dropdown.Menu
  15. if ('open' in child.props) {
  16. return cloneElement(child, { open: dropdownProps.open })
  17. }
  18. // Overlay
  19. if ('show' in child.props) {
  20. return cloneElement(child, { show: dropdownProps.open })
  21. }
  22. // anything else
  23. return cloneElement(child)
  24. })}
  25. </Dropdown>
  26. )
  27. }
  28. export default ControlledDropdown