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,
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;
}
setMopidyConfig(e){
this.setState({input_in_focus: null})
e.preventDefault();
this.props.mopidyActions.setConfig({ host: this.state.mopidy_host, port: this.state.mopidy_port });
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) 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 (
this.props.uiActions.openModal('send_authorization', {}) }>
Share authentication
)
}
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 = (
hashHistory.push(global.baseURL+'settings/debug')}>
Debug
{this.props.ui && this.props.ui.test_mode ? Test mode : null}
Help
)
return (
Server
Status
{this.renderServerStatus()}
Localization
Spotify
Status
{this.renderSpotifyStatus()}
Current user
{ this.renderSpotifyUser() }
Authorization
{ this.renderSendAuthorizationButton() }
{this.props.spotify.refreshing_token ? Refreshing... : this.props.spotifyActions.refreshingToken()}>Force token refresh }
LastFM
{this.props.lastfm.session ?
Current user
{ this.renderLastfmUser() }
: null}
Advanced
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.
);
}
}
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)