import React from 'react'; import { connect } from 'react-redux'; import { bindActionCreators } from 'redux'; import Modal from './Modal'; import * as coreActions from '../../services/core/actions'; import * as uiActions from '../../services/ui/actions'; import * as mopidyActions from '../../services/mopidy/actions'; import * as spotifyActions from '../../services/spotify/actions'; import { I18n, i18n } from '../../locale'; import { uriType } from '../../util/helpers'; import Icon from '../../components/Icon'; import TextField from '../../components/Fields/TextField'; import LinksSentence from '../../components/LinksSentence'; import Button from '../../components/Button'; const UriListItem = ({ uri, items, random_tracks, remove, }) => { const type = uriType(uri); let item = items[uri]; if (!item) { item = random_tracks.find((track) => track.uri === uri); } return (
{item ? item.name : {uri}} {item && item.artists && ( )} {` (${type})`}
); }; class AddToQueue extends React.Component { constructor(props) { super(props); this.state = { text: '', error: '', next: false, }; } componentDidMount() { const { uiActions: { setWindowTitle, }, } = this.props; setWindowTitle(i18n('modal.add_to_queue.title')); } onSubmit = (e) => { const { next, } = this.state; const { mopidyActions: { enqueueURIs, }, view: { uris = [], }, } = this.props; e.preventDefault(); enqueueURIs(uris, null, next); this.reset(); window.history.back(); } onChange = (text) => { this.setState({ text }); } reset = () => { const { coreActions: { viewDataLoaded, }, } = this.props; viewDataLoaded({ uris: [], random_tracks: [] }); } addRandom = () => { const { mopidyActions: { view_getRandomTracks, }, } = this.props; view_getRandomTracks(20); } addUris = () => { const { text, } = this.state; const { view: { uris: prevUris = [], }, coreActions: { loadUri, viewDataLoaded, }, } = this.props; const uris = text.split(','); // TODO: Remove validation const validatedUris = uris.filter((uri) => uriType(uri)); validatedUris.forEach((uri) => { loadUri(uri); }); this.setState({ text: '' }); viewDataLoaded({ uris: [...prevUris, ...uris] }); // We add all uris (validated and otherwise) } removeUri = (uri) => { const { view: { uris = [], }, coreActions: { viewDataLoaded, }, } = this.props; viewDataLoaded({ uris: uris.filter((item) => item !== uri) }); } render = () => { const { items, view: { uris = [], random_tracks = [], }, } = this.props; const { text, error, next, } = this.state; return (

{error && {error}}
{uris.length ? (
{uris.map((uri, index) => ( ))}
) : ( )}
); } } const mapStateToProps = (state) => ({ items: state.core.items, view: state.core.view ? state.core.view : {}, }); const mapDispatchToProps = (dispatch) => ({ coreActions: bindActionCreators(coreActions, dispatch), uiActions: bindActionCreators(uiActions, dispatch), mopidyActions: bindActionCreators(mopidyActions, dispatch), spotifyActions: bindActionCreators(spotifyActions, dispatch), }); export default connect(mapStateToProps, mapDispatchToProps)(AddToQueue);