import React from 'react';
import { connect } from 'react-redux';
import { bindActionCreators } from 'redux';
import Modal from './Modal';
import Icon from '../../components/Icon';
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 * as pusherActions from '../../services/pusher/actions';
import {
uriSource,
uriType,
} from '../../util/helpers';
import { i18n, I18n } from '../../locale';
import TextField from '../../components/Fields/TextField';
import Button from '../../components/Button';
const SeedListItem = ({ seed, remove }) => (
{seed.unresolved ? (
{seed.uri}
) : (
{seed.name}
)}
{!seed.unresolved && (
{` (${uriType(seed.uri)})`}
)}
remove(seed.uri)}
tracking={{ category: 'Directory', action: 'Play' }}
>
);
class EditRadio extends React.Component {
constructor(props) {
super(props);
this.state = {
enabled: false,
seeds: [],
uri: '',
error_message: null,
};
}
componentDidMount() {
const {
uiActions: {
setWindowTitle,
},
radio,
} = this.props;
setWindowTitle(i18n('modal.edit_radio.title'));
if (radio && radio.enabled) {
this.loadRadio(radio);
}
}
componentDidUpdate = ({ radio: prev_radio }) => {
const { radio } = this.props;
if (!prev_radio && radio) this.loadRadio(radio);
}
onUriChange = (uri) => {
this.setState({ uri, error_message: null });
}
loadRadio = (radio) => {
const seeds = [...radio.seed_tracks, ...radio.seed_artists, ...radio.seed_genres];
this.setState({ seeds, enabled: radio.enabled });
}
handleStart(e) {
e.preventDefault();
let valid_seeds = true;
const seeds = this.mapSeeds();
for (let i = 0; i < seeds.length; i++) {
if (seeds[i].unresolved !== undefined) {
valid_seeds = false;
continue;
}
}
if (valid_seeds) {
this.props.pusherActions.startRadio(this.state.seeds);
window.history.back();
} else {
this.setState({ error_message: i18n('modal.edit_radio.invalid_seed_uri') });
}
}
handleUpdate(e) {
e.preventDefault();
let valid_seeds = true;
const seeds = this.mapSeeds();
for (let i = 0; i < seeds.length; i++) {
if (seeds[i].unresolved !== undefined) {
valid_seeds = false;
continue;
}
}
if (valid_seeds) {
this.props.pusherActions.updateRadio(this.state.seeds);
window.history.back();
} else {
this.setState({ error_message: i18n('modal.edit_radio.invalid_seed_uri') });
}
}
handleStop(e) {
e.preventDefault();
this.props.pusherActions.stopRadio();
this.props.uiActions.closeModal();
}
addSeed = (e) => {
const {
uri,
seeds,
} = this.state;
const {
coreActions: {
loadUri,
},
} = this.props;
e.preventDefault();
if (uri === '') {
this.setState({ error_message: i18n('errors.required') });
return;
}
this.setState({ error_message: null });
const validatedSeeds = Object.assign([], seeds);
let uris = uri.split(',');
if (uris.length >= 5) {
uris = uris.slice(0, 5);
this.setState({ error_message: i18n('modal.edit_radio.too_many_seeds') });
}
for (let i = 0; i < uris.length; i++) {
if (uriSource(uris[i]) !== 'spotify') {
this.setState({ error_message: i18n('modal.edit_radio.only_spotify_uris') });
return;
} if (seeds.indexOf(uris[i]) > -1) {
this.setState({ error_message: i18n('modal.edit_radio.too_many_seeds') });
} else {
validatedSeeds.push(uris[i]);
loadUri(uris[i]);
}
}
this.setState({
seeds: validatedSeeds,
uri: '',
});
}
removeSeed = (uri) => {
const {
seeds: prevSeeds,
} = this.state;
const seeds = prevSeeds.filter((seed) => seed !== uri);
this.setState({ seeds });
}
mapSeeds = () => {
const { seeds } = this.state;
const { items } = this.props;
if (!seeds) {
return [];
}
return seeds.slice(0, 5).map((uri) => items[uri] || { uri, unresolved: true });
}
render = () => {
const {
enabled,
uri,
error_message,
} = this.state;
const seeds = this.mapSeeds();
return (
);
}
}
const mapStateToProps = (state) => ({
radio: state.core.radio,
items: state.core.items,
});
const mapDispatchToProps = (dispatch) => ({
coreActions: bindActionCreators(coreActions, dispatch),
uiActions: bindActionCreators(uiActions, dispatch),
mopidyActions: bindActionCreators(mopidyActions, dispatch),
pusherActions: bindActionCreators(pusherActions, dispatch),
spotifyActions: bindActionCreators(spotifyActions, dispatch),
});
export default connect(mapStateToProps, mapDispatchToProps)(EditRadio);