import React, { PropTypes } from 'react' import { connect } from 'react-redux' import { hashHistory, Link } from 'react-router' import { bindActionCreators } from 'redux' import FontAwesome from 'react-fontawesome' import SpotifyAuthenticationFrame from '../components/SpotifyAuthenticationFrame' import LastfmAuthenticationFrame from '../components/LastfmAuthenticationFrame' import ConfirmationButton from '../components/ConfirmationButton' import PusherConnectionList from '../components/PusherConnectionList' import URISchemesList from '../components/URISchemesList' import VersionManager from '../components/VersionManager' import Header from '../components/Header' import Parallax from '../components/Parallax' import Icon from '../components/Icon' import Thumbnail from '../components/Thumbnail' import URILink from '../components/URILink' 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 = { country: this.props.core.country, locale: this.props.core.locale, mopidy_host: this.props.mopidy.host, mopidy_port: this.props.mopidy.port, mopidy_ssl: this.props.mopidy.ssl, pusher_username: this.props.pusher.username, input_in_focus: null } } componentDidMount(){ if (this.props.lastfm.session && this.props.core.users["lastfm:user:"+this.props.lastfm.session.name] === undefined){ this.props.lastfmActions.getMe(); } } componentWillReceiveProps(newProps){ var changed = false var state = this.state if (newProps.core.country != this.state.country && this.state.input_in_focus != 'country'){ state.country = newProps.core.country changed = true } if (newProps.core.locale != this.state.locale && this.state.input_in_focus != 'locale'){ state.locale = newProps.core.locale changed = true } if (newProps.pusher.username != this.state.pusher_username && this.state.input_in_focus != 'pusher_username'){ state.pusher_username = newProps.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.setConfig({ host: this.state.mopidy_host, port: this.state.mopidy_port, ssl: this.state.mopidy_ssl }); window.location.reload(true); return false; } handleBlur(name, value){ this.setState({input_in_focus: null}) var data = {} data[name] = value this.props.coreActions.set(data) } 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 (
) } renderSpotifyUser(){ var user = this.props.spotify.me; if (user){ return ( {user.display_name ? user.display_name : user.id} {!this.props.spotify.authorization ?   (Limited access) : null} ) } else { return ( Unknown ) } } renderLastfmUser(){ var user = this.props.core.users["lastfm:user:"+this.props.lastfm.session.name]; if (user){ return ( {user.realname ? user.realname : user.name} ) } else { return ( Unknown ) } } renderSendAuthorizationButton(){ if (!this.props.spotify.authorization) return null return ( ) } renderServerStatus(){ var colour = 'grey'; var icon = 'question-circle'; var status = 'Unknown'; if (this.props.mopidy.connecting || this.props.pusher.connecting){ icon = 'plug'; 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} ); } renderSpotifyStatus(){ var colour = 'grey'; var icon = 'question-circle'; var status = 'Unknown'; if (this.props.spotify.connecting){ icon = 'plug'; status = 'Connecting...' } else if (!this.props.spotify.connected){ colour = 'red'; icon = 'close'; status = 'Disconnected'; } else if (this.props.mopidy.connected){ colour = 'green'; icon = 'check'; status = 'Connected'; } if (!this.props.mopidy.uri_schemes || !this.props.mopidy.uri_schemes.includes('spotify:')){ colour = 'orange'; status += ' (Mopidy-Spotify extension not installed/enabled!)'; } return (   {status} ); } render(){ var options = (   Help ) return (

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()}

Localization

Country
this.setState({country: e.target.value})} onFocus={e => this.setState({input_in_focus: 'country'})} onBlur={e => this.handleBlur('country',e.target.value)} value={ this.state.country } />
An ISO 3166-1 alpha-2 country code (eg NZ)
Locale
this.setState({locale: e.target.value})} onFocus={e => this.setState({input_in_focus: 'locale'})} onBlur={e => this.handleBlur('locale',e.target.value)} value={this.state.locale} />
Lowercase ISO 639 language code and an uppercase ISO 3166-1 alpha-2 country code, joined by an underscore (eg en_NZ)

Spotify

Status
{this.renderSpotifyStatus()}
Current user
{ this.renderSpotifyUser() }
Authorization
{ this.renderSendAuthorizationButton() } {this.props.spotify.refreshing_token ? : }

LastFM

{this.props.lastfm.session ?
Current user
{ this.renderLastfmUser() }
: null}
Authorization

Advanced

UI behavior
Connections
Extensions
Version
Reset
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.

Google Analytics is used to help trace issues and provide valuable insight into how we can continue to make improvements. This may include personal information (eg Spotify Username). For more information, see terms and conditions.


 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)