import React, { PropTypes } from 'react' import { connect } from 'react-redux' import { hashHistory, Link } from 'react-router' import { bindActionCreators } from 'redux' import ConfirmationButton from '../components/Fields/ConfirmationButton' import PusherConnectionList from '../components/PusherConnectionList' import SourcesPriority from '../components/Fields/SourcesPriority' import Header from '../components/Header' import Icon from '../components/Icon' import Thumbnail from '../components/Thumbnail' import URILink from '../components/URILink' 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_ssl: this.props.mopidy.ssl, 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){ var changed = false var state = this.state if (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; } setConfig(e){ this.setState({input_in_focus: null}); e.preventDefault(); this.props.mopidyActions.set({ host: this.state.mopidy_host, port: this.state.mopidy_port, ssl: this.state.mopidy_ssl }); window.location.reload(true); return false; } handleBlur(service, name, value){ this.setState({input_in_focus: null}); var 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; } } handleUsernameChange(username){ this.setState({pusher_username: username.replace(/\W/g, '')}) } handleUsernameBlur(e){ this.setState({input_in_focus: null}) this.props.pusherActions.setUsername(this.state.pusher_username) } renderApplyButton(){ if (this.props.mopidy.host == this.state.mopidy_host && this.props.mopidy.port == this.state.mopidy_port && this.props.mopidy.ssl == this.state.mopidy_ssl){ return null; } return (
) } renderServerStatus(){ var colour = 'grey'; var icon = 'help'; var status = 'Unknown'; if (this.props.mopidy.connecting || this.props.pusher.connecting){ icon = 'autorenew'; status = 'Connecting...' } 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(){ var options = ( Help ) if (this.props.mopidy.upgrading){ var upgrade_button = ( ); } else if (this.props.pusher.version.upgrade_available){ var upgrade_button = ; } else { var upgrade_button = null; } return (
Settings

Server

Status
{this.renderServerStatus()}
Username
this.handleUsernameChange(e.target.value)} onFocus={e => this.setState({input_in_focus: 'pusher_username'})} onBlur={e => this.handleUsernameBlur(e)} value={this.state.pusher_username } />
A non-unique string used to identify this client (no special characters)
this.setConfig(e)}>
Host
this.setState({mopidy_host: e.target.value})} onFocus={e => this.setState({input_in_focus: 'mopidy_host'})} onBlur={e => this.setState({input_in_focus: null})} value={ this.state.mopidy_host } />
Port
this.setState({mopidy_port: e.target.value})} onFocus={e => this.setState({input_in_focus: 'mopidy_port'})} onBlur={e => this.setState({input_in_focus: null})} value={ this.state.mopidy_port } />
Encryption
{this.renderApplyButton()}

Services

{helpers.isHosted() ? null :

Privacy

} {helpers.isHosted() ? null :
Reporting
Anonymous usage data is used to identify errors and potential features that make Iris better for everyone. Read the privacy policy.
}

Advanced

Theme
UI behavior
Sources priority Order of searching and search results
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
Album library URI
this.setState({mopidy_library_albums_uri: e.target.value})} onBlur={e => this.handleBlur('mopidy', 'library_albums_uri', e.target.value)} />
URI used for collecting library albums
Connections
Version
{this.props.pusher.version.current} installed {this.props.pusher.version.upgrade_available ? Upgrade available :   Up-to-date}
{upgrade_button} 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) => { return state; } const mapDispatchToProps = (dispatch) => { return { 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)