(function() {
'use strict';
angular.module('oauth.spotify', ['oauth.utils'])
.factory('$ngCordovaSpotify', spotify);
function spotify($q, $http, $cordovaOauthUtility) {
return { signin: oauthSpotify };
/*
* Sign into the Spotify service
*
* @param string clientId
* @param object options
* @return promise
*/
function oauthSpotify(clientId, appScope, options) {
var deferred = $q.defer();
if(window.cordova) {
if($cordovaOauthUtility.isInAppBrowserInstalled()) {
var redirect_uri = "http://localhost/callback";
var response_type = "token";
var state = "";
var show_dialog = "";
if(options !== undefined) {
if(options.hasOwnProperty("redirect_uri")) {
redirect_uri = options.redirect_uri;
}
if(options.hasOwnProperty("response_type")) {
response_type = options.response_type;
}
if(options.hasOwnProperty("state")) {
state = "&state=" + options.state;
}
if(options.hasOwnProperty("show_dialog")) {
show_dialog = "&show_dialog=" + options.show_dialog;
}
}
var browserRef = window.cordova.InAppBrowser.open('https://accounts.spotify.com/authorize?client_id=' + clientId + '&redirect_uri=' + redirect_uri + '&response_type=' + response_type + state + '&scope=' + appScope.join(" ") + show_dialog, '_blank', 'location=no,clearsessioncache=yes,clearcache=yes');
browserRef.addEventListener('loadstart', function(event) {
if((event.url).indexOf(redirect_uri) === 0) {
browserRef.removeEventListener("exit",function(event){});
browserRef.close();
var splitChar = (response_type === "code") ? "?" : "#";
var callbackResponse = (event.url).split(splitChar)[1];
var responseParameters = (callbackResponse).split("&");
var parameterMap = [];
for(var i = 0; i < responseParameters.length; i++) {
parameterMap[responseParameters[i].split("=")[0]] = responseParameters[i].split("=")[1];
}
if(response_type === "token" && parameterMap.access_token !== undefined && parameterMap.access_token !== null) {
deferred.resolve({ access_token: parameterMap.access_token, expires_in: parameterMap.expires_in, account_username: parameterMap.account_username });
} else if(response_type === "code" && parameterMap.code !== undefined && parameterMap.code !== null) {
deferred.resolve({ code: parameterMap.code, state: parameterMap.state });
} else {
deferred.reject("Problem authenticating");
}
}
});
browserRef.addEventListener('exit', function(event) {
deferred.reject("The sign in flow was canceled");
});
} else {
deferred.reject("Could not find InAppBrowser plugin");
}
} else {
deferred.reject("Cannot authenticate via a web browser");
}
return deferred.promise;
}
}
spotify.$inject = ['$q', '$http', '$cordovaOauthUtility'];
})();