import React, { PropTypes } from 'react' import { connect } from 'react-redux' import { Link } from 'react-router' import { createStore, bindActionCreators } from 'redux' import ReactGA from 'react-ga' import FontAwesome from 'react-fontawesome' import Thumbnail from './Thumbnail' import * as uiActions from '../services/ui/actions' import * as spotifyActions from '../services/spotify/actions' class SpotifyAuthenticationFrame extends React.Component{ constructor(props) { super(props); this.state = { authorizing: false } } componentDidMount(){ let self = this; // Listen for incoming messages from the authorization iframe // This is triggered when the popup posts a message, which is then passed to // the iframe, and then passed on to the parent frame (our application) window.addEventListener('message', function(event){ self.handleMessage(event) }, false); } handleMessage(event){ var data = JSON.parse(event.data) // Only allow incoming data from our authorized authenticator proxy var authorization_domain = this.props.authorization_url.substring(0,this.props.authorization_url.indexOf('/',8)) if (event.origin != authorization_domain){ this.props.uiActions.createNotification('Authorization failed. '+event.origin+' is not the configured authorization_url.','bad') return false } // Spotify bounced with an error if (typeof(data.error) !== 'undefined'){ this.props.uiActions.createNotification(data.error,'bad') // No errors? We're in! } else { this.props.spotifyActions.authorizationGranted(data) this.props.spotifyActions.getMe() } // Turn off our authorizing switch this.setState({authorizing: false}) } startAuthorization(){ var self = this this.setState({authorizing: true}) // Open an authentication request window (to spotify) var url = this.props.authorization_url+'?action=authorize' var scopes = [ 'playlist-modify-private', 'playlist-modify-public', 'playlist-read-private', 'playlist-modify-private', 'user-library-read', 'user-library-modify', 'user-follow-modify', 'user-follow-read', 'user-top-read', 'user-read-currently-playing', 'user-read-playback-state' ] var popup = window.open(url+'&scope='+scopes.join('%20'),"popup","height=680,width=400"); // Start timer to check our popup's state var timer = setInterval(checkPopup, 1000); function checkPopup(){ // Popup has been closed if (typeof(popup) !== 'undefined' && popup){ if (popup.closed){ self.setState({authorizing: false}) clearInterval(timer); } // Popup does not exist, so must have been blocked } else { self.props.uiActions.createNotification('Popup blocked. Please allow popups and try again.','bad') self.setState({authorizing: false}) clearInterval(timer); } } } renderAuthorizeButton(){ if (this.state.authorizing){ return ( ) } else if (this.props.authorized){ return ( ) } else { return ( ) } } renderRefreshButton(){ if (!this.props.authorized) return null if (this.props.refreshing_token){ return ( ); } else { return ( ) } } render(){ return ( { this.renderAuthorizeButton() } { this.renderRefreshButton() } ); } } const mapStateToProps = (state, ownProps) => { return { authorization_url: (state.ui.config && state.ui.config.authorization_url ? state.ui.config.authorization_url : 'https://jamesbarnsley.co.nz/auth.php'), authorized: state.spotify.authorized, authorizing: state.spotify.authorizing, refreshing_token: state.spotify.refreshing_token } } const mapDispatchToProps = (dispatch) => { return { uiActions: bindActionCreators(uiActions, dispatch), spotifyActions: bindActionCreators(spotifyActions, dispatch) } } export default connect(mapStateToProps, mapDispatchToProps)(SpotifyAuthenticationFrame)