import * as React from "react"; import { DropdownProps, DropdownState } from "./typings/Dropdown"; import { DropDownButton } from "./Button"; import { dropDownStyle, wrapperStyle } from "./styles/Dropdown.styles"; import { cx } from "emotion"; import OutsideClick from "./OutsideClick"; import { animated } from "react-spring/renderprops.cjs"; import MountTransition from "./shared/MountTransition"; import { Manager, Reference, Popper } from "react-popper"; import { colors } from "pebble-shared"; class DropDown extends React.PureComponent { state: DropdownState = { isOpen: !!this.props.initiallyOpen }; static defaultProps: Partial = { closeOnOutsideClick: true, placement: "bottom-start", modifiers: { hide: { enabled: false }, preventOverflow: { enabled: false }, flip: { enabled: false } } }; private toggleDropdown = () => { this.setState({ isOpen: !this.state.isOpen }); }; render() { const { buttonLabel, children, labelComponent, padding, className, dropDownClassName, isSelected, disabled, labelClassName, controlled, onOutsideClick } = this.props; const _isDropDownOpen = controlled ? !!this.props.isOpen : this.state.isOpen; return ( { this.setState({ isOpen: false }); if (onOutsideClick) onOutsideClick(_isDropDownOpen); }} disabled={!_isDropDownOpen} > {({ ref }) => (
{labelComponent ? ( labelComponent({ isOpen: _isDropDownOpen, toggleDropdown: this.toggleDropdown }) ) : ( {buttonLabel} )}
)}
{/* TODO: Add native flag. */} {transitionStyles => ( {({ ref, style, placement, arrowProps }) => { const popperWrapperStyle = { ...style, ...transitionStyles, backgroundColor: colors.white.base, transform: `${style.transform || ""} ${ transitionStyles.transform || "" }`, transformOrigin: `${arrowProps.style.left || 0}px ${ arrowProps.style.top || 0 }px`, padding }; return (
{children({ toggle: this.toggleDropdown, isOpen: _isDropDownOpen })}
); }}
)}
); } } export default DropDown;