import React, { Component } from 'react'; import PropTypes from 'prop-types'; import '../css/single-selector.css'; const propTypes = { customSelectorToggle: PropTypes.object, menuCustomClass: PropTypes.string, isDropdownToggleShown: PropTypes.bool, currentSelectedOption: PropTypes.object, options: PropTypes.array.isRequired, selectOption: PropTypes.func.isRequired, operationBeforeSelect: PropTypes.func, toggleItemFreezed: PropTypes.func }; class Selector extends Component { constructor(props) { super(props); this.state = { isPopoverOpen: false }; } componentDidMount() { document.addEventListener('click', this.handleOutsideClick); } componentWillUnmount() { document.removeEventListener('click', this.handleOutsideClick); } handleOutsideClick = (e) => { const { isPopoverOpen } = this.state; if (isPopoverOpen && !this.selector.contains(e.target)) { this.togglePopover(); } }; togglePopover = () => { this.setState({ isPopoverOpen: !this.state.isPopoverOpen }, () => { if (this.props.toggleItemFreezed) { this.props.toggleItemFreezed(this.state.isPopoverOpen); } }); }; onToggleClick = (e) => { e.stopPropagation(); this.togglePopover(); }; selectItem = (e, targetItem) => { e.stopPropagation(); if (this.props.operationBeforeSelect) { this.props.operationBeforeSelect(); } else { this.props.selectOption(targetItem); } this.togglePopover(); }; render() { const { isPopoverOpen } = this.state; const { currentSelectedOption, options, isDropdownToggleShown, menuCustomClass = '', customSelectorToggle = null } = this.props; return (
{customSelectorToggle ? customSelectorToggle : ( {currentSelectedOption.text} {isDropdownToggleShown && } )}
{isPopoverOpen && (
this.selector = ref}>
)}
); } } Selector.propTypes = propTypes; export default Selector;