ng-facebook
Version:
Angular service to handle facebook api
245 lines (219 loc) • 7.47 kB
JavaScript
/**
* Angular Facebook service
* ---------------------------
*
* Authored by AlmogBaku (GoDisco)
* almog@GoDisco.net
* http://www.GoDisco.net/
*
* 9/8/13 10:25 PM
*/
angular.module('ngFacebook', [])
.provider('$facebook', function() {
var config = {
permissions: 'email',
appId: null,
version: 'v1.0',
customInit: {}
};
this.setAppId = function(appId) {
config.appId=appId;
return this;
};
this.getAppId = function() {
return config.appId;
};
this.setVersion = function(version) {
config.version=version;
return this;
};
this.getVersion = function() {
return config.version;
};
this.setPermissions = function(permissions) {
if(permissions instanceof Array) {
permissions.join(',');
}
config.permissions=permissions;
return this;
};
this.getPermissions = function() {
return config.permissions;
};
this.setCustomInit = function(customInit) {
if(angular.isDefined(customInit.appId)) {
this.setAppId(customInit.appId);
}
config.customInit=customInit;
return this;
};
this.getCustomInit = function() {
return config.customInit;
};
this.$get = ['$q', '$rootScope', '$window', function($q, $rootScope, $window) {
var $facebook=$q.defer();
$facebook.config = function(property) {
return config[property];
};
//Initialization
$facebook.init = function() {
if($facebook.config('appId')==null)
throw "$facebookProvider: `appId` cannot be null";
$window.FB.init(
angular.extend({ appId: $facebook.config('appId'), version: $facebook.config('version') }, $facebook.config("customInit"))
);
$rootScope.$broadcast("fb.load", $window.FB);
};
$rootScope.$on("fb.load", function(e, FB) {
$facebook.resolve(FB);
//Define action events
angular.forEach([
'auth.login', 'auth.logout', 'auth.prompt',
'auth.sessionChange', 'auth.statusChange', 'auth.authResponseChange',
'xfbml.render', 'edge.create', 'edge.remove', 'comment.create',
'comment.remove', 'message.send'
],function(event) {
FB.Event.subscribe(event, function(response) {
$rootScope.$broadcast("fb."+event, response, FB);
if(!$rootScope.$$phase) $rootScope.$apply();
});
});
// Make sure 'fb.auth.authResponseChange' fires even if the user is not logged in.
$facebook.getLoginStatus();
});
/**
* Internal cache
*/
$facebook._cache={};
$facebook.setCache = function(attr,val) {
$facebook._cache[attr]=val;
};
$facebook.getCache = function(attr) {
if(angular.isUndefined($facebook._cache[attr])) return false;
return $facebook._cache[attr];
};
$facebook.clearCache = function() {
$facebook._cache = {};
};
/**
* Authentication
*/
var firstAuthResp=$q.defer();
var firstAuthRespReceived=false;
function resolveFirstAuthResp(FB) {
if (!firstAuthRespReceived) {
firstAuthRespReceived=true;
firstAuthResp.resolve(FB);
}
}
$facebook.setCache("connected", null);
$facebook.isConnected = function() {
return $facebook.getCache("connected");
};
$rootScope.$on("fb.auth.authResponseChange", function(event, response, FB) {
$facebook.clearCache();
if(response.status=="connected") {
$facebook.setCache("connected", true);
} else {
$facebook.setCache("connected", false);
}
resolveFirstAuthResp(FB);
});
$facebook.getAuthResponse = function () {
return FB.getAuthResponse();
};
$facebook.getLoginStatus = function (force) {
var deferred=$q.defer();
return $facebook.promise.then(function(FB) {
FB.getLoginStatus(function(response) {
if(response.error) deferred.reject(response.error);
else {
deferred.resolve(response);
if($facebook.isConnected()==null)
$rootScope.$broadcast("fb.auth.authResponseChange", response, FB);
}
if(!$rootScope.$$phase) $rootScope.$apply();
}, force);
return deferred.promise;
});
};
$facebook.login = function (permissions, rerequest) {
if(permissions==undefined) permissions=$facebook.config("permissions");
var deferred=$q.defer();
var loginOptions = { scope: permissions };
if (rerequest) {
loginOptions.auth_type = 'rerequest';
}
return $facebook.promise.then(function(FB) {
FB.login(function(response) {
if(response.error) deferred.reject(response.error);
else deferred.resolve(response);
if(!$rootScope.$$phase) $rootScope.$apply();
}, loginOptions);
return deferred.promise;
});
};
$facebook.logout = function () {
var deferred=$q.defer();
return $facebook.promise.then(function(FB) {
FB.logout(function(response) {
if(response.error) deferred.reject(response.error);
else deferred.resolve(response);
if(!$rootScope.$$phase) $rootScope.$apply();
});
return deferred.promise;
});
};
$facebook.ui = function (params) {
var deferred=$q.defer();
return $facebook.promise.then(function(FB) {
FB.ui(params, function(response) {
if(response && response.error_code) {
deferred.reject(response.error_message);
} else {
deferred.resolve(response);
}
if(!$rootScope.$$phase) $rootScope.$apply();
});
return deferred.promise;
});
};
$facebook.api = function () {
var deferred=$q.defer();
var args=arguments;
args[args.length++] = function(response) {
if(response.error) deferred.reject(response.error);
if(response.error_msg) deferred.reject(response);
else deferred.resolve(response);
if(!$rootScope.$$phase) $rootScope.$apply();
};
return firstAuthResp.promise.then(function(FB) {
FB.api.apply(FB, args);
return deferred.promise;
});
};
/**
* API cached request - cached request api with promise
*
* @param path
* @returns $q.defer.promise
*/
$facebook.cachedApi = function() {
if(typeof arguments[0] !== 'string')
throw "$facebook.cacheApi can works only with graph requests!";
var promise = $facebook.getCache(arguments[0]);
if(promise) return promise;
var result = $facebook.api.apply($facebook, arguments);
$facebook.setCache(arguments[0], result);
return result;
};
return $facebook;
}];
})
.run(['$rootScope', '$window', '$facebook', function($rootScope, $window, $facebook) {
$window.fbAsyncInit = function() {
$facebook.init();
if(!$rootScope.$$phase) $rootScope.$apply();
};
}])
;