import PropTypes from 'prop-types'; import React, { Component } from 'react'; import ReactDOM from 'react-dom'; import TetherComponent from 'react-tether'; import { icons, kinds } from 'Helpers/Props'; import Icon from 'Components/Icon'; import SpinnerIcon from 'Components/SpinnerIcon'; import Link from 'Components/Link/Link'; import LoadingIndicator from 'Components/Loading/LoadingIndicator'; import TextInput from 'Components/Form/TextInput'; import ImportArtistSearchResultConnector from './ImportArtistSearchResultConnector'; import ImportArtistName from './ImportArtistName'; import styles from './ImportArtistSelectArtist.css'; const tetherOptions = { skipMoveElement: true, constraints: [ { to: 'window', attachment: 'together', pin: true } ], attachment: 'top center', targetAttachment: 'bottom center' }; class ImportArtistSelectArtist extends Component { // // Lifecycle constructor(props, context) { super(props, context); this._artistLookupTimeout = null; this.state = { term: props.id, isOpen: false }; } // // Control _setButtonRef = (ref) => { this._buttonRef = ref; } _setContentRef = (ref) => { this._contentRef = ref; } _addListener() { window.addEventListener('click', this.onWindowClick); } _removeListener() { window.removeEventListener('click', this.onWindowClick); } // // Listeners onWindowClick = (event) => { const button = ReactDOM.findDOMNode(this._buttonRef); const content = ReactDOM.findDOMNode(this._contentRef); if (!button) { return; } if (!button.contains(event.target) && content && !content.contains(event.target) && this.state.isOpen) { this.setState({ isOpen: false }); this._removeListener(); } } onPress = () => { if (this.state.isOpen) { this._removeListener(); } else { this._addListener(); } this.setState({ isOpen: !this.state.isOpen }); } onSearchInputChange = ({ value }) => { if (this._artistLookupTimeout) { clearTimeout(this._artistLookupTimeout); } this.setState({ term: value }, () => { this._artistLookupTimeout = setTimeout(() => { this.props.onSearchInputChange(value); }, 200); }); } onArtistSelect = (foreignArtistId) => { this.setState({ isOpen: false }); this.props.onArtistSelect(foreignArtistId); } // // Render render() { const { selectedArtist, isExistingArtist, isFetching, isPopulated, error, items, queued } = this.props; const errorMessage = error && error.responseJSON && error.responseJSON.message; return ( { queued && !isPopulated && } { isPopulated && selectedArtist && isExistingArtist && } { isPopulated && selectedArtist && } { isPopulated && !selectedArtist &&
No match found!
} { !isFetching && !!error &&
Search failed, please try again later.
}
{ this.state.isOpen &&
{ items.map((item) => { return ( ); }) }
}
); } } ImportArtistSelectArtist.propTypes = { id: PropTypes.string.isRequired, selectedArtist: PropTypes.object, isExistingArtist: PropTypes.bool.isRequired, isFetching: PropTypes.bool.isRequired, isPopulated: PropTypes.bool.isRequired, error: PropTypes.object, items: PropTypes.arrayOf(PropTypes.object).isRequired, queued: PropTypes.bool.isRequired, onSearchInputChange: PropTypes.func.isRequired, onArtistSelect: PropTypes.func.isRequired }; ImportArtistSelectArtist.defaultProps = { isFetching: true, isPopulated: false, items: [], queued: true }; export default ImportArtistSelectArtist;