import React from 'react'; import { connect } from 'react-redux'; import { bindActionCreators } from 'redux'; import { Route, Link } from 'react-router-dom'; import ConfirmationButton from '../components/Fields/ConfirmationButton'; import PusherConnectionList from '../components/PusherConnectionList'; import SourcesPriority from '../components/Fields/SourcesPriority'; import Commands from '../components/Fields/Commands'; import TextField from '../components/Fields/TextField'; import Header from '../components/Header'; import Icon from '../components/Icon'; import Services from '../components/Services'; import * as helpers from '../helpers'; import * as coreActions from '../services/core/actions'; import * as uiActions from '../services/ui/actions'; import * as pusherActions from '../services/pusher/actions'; import * as mopidyActions from '../services/mopidy/actions'; import * as lastfmActions from '../services/lastfm/actions'; import * as spotifyActions from '../services/spotify/actions'; class Settings extends React.Component { constructor(props) { super(props); this.state = { mopidy_host: this.props.mopidy.host, mopidy_port: this.props.mopidy.port, mopidy_library_artists_uri: this.props.mopidy.library_artists_uri, mopidy_library_albums_uri: this.props.mopidy.library_albums_uri, pusher_username: this.props.pusher.username, input_in_focus: null, }; } componentDidMount() { this.props.uiActions.setWindowTitle('Settings'); } componentWillReceiveProps(nextProps) { let changed = false; const { state } = this; if (nextProps.pusher.username && nextProps.pusher.username != this.state.pusher_username && this.state.input_in_focus != 'pusher_username') { state.pusher_username = nextProps.pusher.username; changed = true; } if (changed) { this.setState(state); } } resetAllSettings() { localStorage.clear(); window.location = '#'; window.location.reload(true); return false; } resetServiceWorkerAndCache() { if ('serviceWorker' in navigator) { // Hose out all our caches caches.keys().then(function(cacheNames) { cacheNames.forEach(function(cacheName) { caches.delete(cacheName); }); }); // Unregister all service workers // This forces our SW to bugger off and a new one is registered on refresh navigator.serviceWorker.getRegistrations().then( (registrations) => { for (let registration of registrations) { registration.unregister(); } } ); window.location = '#'; window.location.reload(true); } else { this.props.coreActions.handleException('Service Worker not supported'); } } setConfig(e) { this.setState({ input_in_focus: null }); e.preventDefault(); this.props.mopidyActions.set({ host: this.state.mopidy_host, port: this.state.mopidy_port, }); window.location.reload(true); return false; } handleBlur(service, name, value) { this.setState({ input_in_focus: null }); const data = {}; data[name] = value; this.props[`${service}Actions`].set(data); // Any per-field actions switch (name) { case 'library_albums_uri': this.props.mopidyActions.clearLibraryAlbums(); break; case 'library_artists_uri': this.props.mopidyActions.clearLibraryArtists(); break; } } renderApplyButton() { if (this.props.mopidy.host == this.state.mopidy_host && this.props.mopidy.port == this.state.mopidy_port) { return null; } return (
); } renderServerStatus() { let colour = 'grey'; let icon = 'help'; let status = 'Unknown'; let className = null; if (this.props.mopidy.connecting || this.props.pusher.connecting) { icon = 'autorenew'; status = 'Connecting...'; className = 'icon--spin'; } else if (!this.props.mopidy.connected || !this.props.pusher.connected) { colour = 'red'; icon = 'close'; status = 'Disconnected'; } else if (this.props.mopidy.connected && this.props.pusher.connected) { colour = 'green'; icon = 'check'; status = 'Connected'; } return ( {' '} {status} ); } render() { const options = ( this.props.history.push('/settings/debug')}> Debug Help ); return (
Settings

Server

Status
{this.renderServerStatus()}
this.setConfig(e)}> {this.renderApplyButton()}

Services

Interface

Theme
Behavior
Sources priority
Drag-and-drop to prioritize search providers and results
{helpers.isHosted() ? null : (
Reporting
)}
Commands
this.props.pusherActions.runCommand(id, notify)} onChange={(commands) => this.props.pusherActions.setCommands(commands)} /> Add new

Advanced

Artist library URI
this.setState({ mopidy_library_artists_uri: e.target.value })} onBlur={(e) => this.handleBlur('mopidy', 'library_artists_uri', e.target.value)} />
URI used for collecting library artists
Connections
Version
{this.props.pusher.version.current} {' installed'} {this.props.pusher.version.upgrade_available ? ( {' Upgrade available'} ) : ( {' Up-to-date'} )}
Share configuration
{this.props.pusher.version.upgrade_available ? ( ) : null } this.resetAllSettings()} />

About

Iris {' '} is an open-source project by James Barnsley . It is provided free and with absolutely no warranty. If you paid someone for this software, please let me know.


{' '} Donate {' '} GitHub  Licence
); } } const mapStateToProps = (state, ownProps) => state; const mapDispatchToProps = (dispatch) => ({ coreActions: bindActionCreators(coreActions, dispatch), uiActions: bindActionCreators(uiActions, dispatch), pusherActions: bindActionCreators(pusherActions, dispatch), mopidyActions: bindActionCreators(mopidyActions, dispatch), lastfmActions: bindActionCreators(lastfmActions, dispatch), spotifyActions: bindActionCreators(spotifyActions, dispatch), }); export default connect(mapStateToProps, mapDispatchToProps)(Settings);