import React, { PureComponent } from 'react' import Downshift from 'downshift' import matchSorter from 'match-sorter' import ArrowDown from './svg/Arrowdown' import CheckMark from './svg/Checkmark' import { COLORS } from '../lib/constants' class Dropdown extends PureComponent { state = { inputValue: this.props.selected.name, itemsToShow: this.props.list } onUserAction = changes => { this.setState(({ inputValue, itemsToShow }) => { if (Object.prototype.hasOwnProperty.call(changes, 'inputValue')) { if (changes.type === Downshift.stateChangeTypes.keyDownEscape) { inputValue = this.userInputtedValue } else if (changes.type === Downshift.stateChangeTypes.changeInput) { inputValue = changes.inputValue this.userInputtedValue = changes.inputValue } else { inputValue = changes.inputValue } } itemsToShow = this.userInputtedValue ? matchSorter(this.props.list, this.userInputtedValue, { keys: ['name'] }) : this.props.list if ( Object.prototype.hasOwnProperty.call(changes, 'highlightedIndex') && (changes.type === Downshift.stateChangeTypes.keyDownArrowUp || changes.type === Downshift.stateChangeTypes.keyDownArrowDown) ) { inputValue = itemsToShow[changes.highlightedIndex].name this.props.onChange(itemsToShow[changes.highlightedIndex]) } if (Object.prototype.hasOwnProperty.call(changes, 'isOpen')) { this.userInputtedValue = '' // clear on open if (changes.isOpen) { inputValue = '' } // set on close if (changes.isOpen === false && !inputValue) { inputValue = this.props.selected.name } } return { inputValue, itemsToShow } }) } userInputtedValue = '' render() { const { button, color, selected, onChange } = this.props const { itemsToShow, inputValue } = this.state const minWidth = calcMinWidth(button, selected, itemsToShow) return ( it === selected)} itemToString={item => item.name} onChange={onChange} onUserAction={this.onUserAction} > {renderDropdown({ button, color, list: itemsToShow, selected, minWidth })} ) } } const renderDropdown = ({ button, color, list, minWidth }) => ({ isOpen, highlightedIndex, selectedItem, getRootProps, getToggleButtonProps, getInputProps, getItemProps }) => { return ( {selectedItem.name} {isOpen ? ( {list.map((item, index) => ( {item.name} ))} ) : null} ) } const DropdownContainer = ({ children, innerRef, minWidth, ...rest }) => { return (
{children}
) } const SelectedItem = ({ getToggleButtonProps, getInputProps, children, isOpen, color, button }) => { const itemColor = color || COLORS.SECONDARY return ( {button ? ( {children} ) : ( )}
) } const ListItems = ({ children, color }) => { return ( ) } const ListItem = ({ children, color, isHighlighted, isSelected, ...rest }) => { const itemColor = color || COLORS.SECONDARY return (
  • {children} {isSelected ? : null}
  • ) } function calcMinWidth(isButton, selected, list) { const items = isButton ? [...list, selected] : list return items.reduce((max, { name }) => { const wordSize = name.length * 10 + 32 return wordSize > max ? wordSize : max }, 0) } export default Dropdown