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 ImportSeriesSearchResultConnector from './ImportSeriesSearchResultConnector'; import ImportSeriesTitle from './ImportSeriesTitle'; import styles from './ImportSeriesSelectSeries.css'; const tetherOptions = { skipMoveElement: true, constraints: [ { to: 'window', attachment: 'together', pin: true } ], attachment: 'top center', targetAttachment: 'bottom center' }; class ImportSeriesSelectSeries extends Component { // // Lifecycle constructor(props, context) { super(props, context); this._seriesLookupTimeout = 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._seriesLookupTimeout) { clearTimeout(this._seriesLookupTimeout); } this.setState({ term: value }, () => { this._seriesLookupTimeout = setTimeout(() => { this.props.onSearchInputChange(value); }, 200); }); } onSeriesSelect = (tvdbId) => { this.setState({ isOpen: false }); this.props.onSeriesSelect(tvdbId); } // // Render render() { const { selectedSeries, isExistingSeries, isFetching, isPopulated, error, items, queued, onSeriesSelect } = this.props; const errorMessage = error && error.responseJSON && error.responseJSON.message; return ( { queued && !isPopulated && } { isPopulated && selectedSeries && isExistingSeries && } { isPopulated && selectedSeries && } { isPopulated && !selectedSeries &&
No match found!
} { !isFetching && !!error &&
Search failed, please try again later.
}
{ this.state.isOpen &&
{ items.map((item) => { return ( ); }) }
}
); } } ImportSeriesSelectSeries.propTypes = { id: PropTypes.string.isRequired, selectedSeries: PropTypes.object, isExistingSeries: 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, onSeriesSelect: PropTypes.func.isRequired }; ImportSeriesSelectSeries.defaultProps = { isFetching: true, isPopulated: false, items: [], queued: true }; export default ImportSeriesSelectSeries;