ngx-social-button
Version:
Social login/share buttons for Angular 6, 7, 8
252 lines (251 loc) • 19.2 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
*/
import { Injectable } from '@angular/core';
import { BehaviorSubject } from 'rxjs';
import { FacebookLoginProvider } from './providers/facebookProvider';
import { GoogleLoginProvider } from './providers/googleProvider';
import { LinkedinLoginProvider } from './providers/linkedinProvider';
import * as i0 from "@angular/core";
/**
* @record
*/
export function SocialServiceConfigItem() { }
/** @type {?} */
SocialServiceConfigItem.prototype.provider;
var SocialServiceConfig = /** @class */ (function () {
function SocialServiceConfig(providers) {
this.providers = new Map();
if (providers) {
for (var i = 0; i < providers.length; i++) {
/** @type {?} */
var element = providers[i];
this.providers.set(element.provider.TYPE, element.provider);
}
}
}
/**
* @return {?}
*/
SocialServiceConfig.prototype.getProviders = /**
* @return {?}
*/
function () {
return this.providers;
};
/**
* @param {?} provider
* @return {?}
*/
SocialServiceConfig.prototype.addProvider = /**
* @param {?} provider
* @return {?}
*/
function (provider) {
if (!this.providers.get(provider.TYPE)) {
this.providers.set(provider.TYPE, provider);
}
};
/**
* @param {?} clientId
* @return {?}
*/
SocialServiceConfig.prototype.addFacebook = /**
* @param {?} clientId
* @return {?}
*/
function (clientId) {
this.addProvider(new FacebookLoginProvider(clientId));
return this;
};
/**
* @param {?} clientId
* @return {?}
*/
SocialServiceConfig.prototype.addGoogle = /**
* @param {?} clientId
* @return {?}
*/
function (clientId) {
this.addProvider(new GoogleLoginProvider(clientId));
return this;
};
/**
* @param {?} clientId
* @return {?}
*/
SocialServiceConfig.prototype.addLinkedIn = /**
* @param {?} clientId
* @return {?}
*/
function (clientId) {
this.addProvider(new LinkedinLoginProvider(clientId));
return this;
};
return SocialServiceConfig;
}());
export { SocialServiceConfig };
if (false) {
/** @type {?} */
SocialServiceConfig.prototype.providers;
}
var SocialService = /** @class */ (function () {
function SocialService(config) {
var _this = this;
this._user = null;
this._authState = new BehaviorSubject(null);
this.providers = config.getProviders();
this.providers.forEach(function (provider, key) {
provider.initialize().then(function (user) {
user.provider = key;
_this._user = user;
_this._authState.next(user);
}).catch(function (err) {
// this._authState.next(null);
});
});
}
Object.defineProperty(SocialService.prototype, "authState", {
get: /**
* @return {?}
*/
function () {
return this._authState.asObservable();
},
enumerable: true,
configurable: true
});
/**
* @return {?}
*/
SocialService.prototype.isSocialLoggedIn = /**
* @return {?}
*/
function () {
return (this._user != null);
};
/**
* @param {?} providerType
* @param {?=} share
* @return {?}
*/
SocialService.prototype.sharing = /**
* @param {?} providerType
* @param {?=} share
* @return {?}
*/
function (providerType, share) {
var _this = this;
return new Promise(function (resolve, reject) {
/** @type {?} */
var providerObject = _this.providers.get(providerType);
if (providerObject) {
providerObject.sharing(share).then(function () {
resolve(true);
});
}
else {
reject(SocialService.LOGIN_PROVIDER_NOT_FOUND);
}
});
};
/**
* @param {?=} share
* @return {?}
*/
SocialService.prototype.facebookSharing = /**
* @param {?=} share
* @return {?}
*/
function (share) {
return this.sharing('facebook', share);
};
// linkedinSharing(share?: any) {
// return this.sharing('linkedin', share);
// }
/**
* @param {?} providerType
* @param {?=} scopes
* @return {?}
*/
SocialService.prototype.signIn = /**
* @param {?} providerType
* @param {?=} scopes
* @return {?}
*/
function (providerType, scopes) {
var _this = this;
return new Promise(function (resolve, reject) {
/** @type {?} */
var providerObject = _this.providers.get(providerType);
if (providerObject) {
providerObject.signIn(scopes).then(function (user) {
user.provider = providerType;
resolve(user);
_this._user = user;
_this._authState.next(user);
}).catch(function (err) {
reject(SocialService.USER_POPUP_CLOSE);
});
}
else {
reject(SocialService.LOGIN_PROVIDER_NOT_FOUND);
}
});
};
/**
* @return {?}
*/
SocialService.prototype.signOut = /**
* @return {?}
*/
function () {
var _this = this;
return new Promise(function (resolve, reject) {
if (_this._user && _this._user.provider) {
/** @type {?} */
var providerType = _this._user.provider;
/** @type {?} */
var providerObject = _this.providers.get(providerType);
providerObject.signOut().then(function () {
_this._user = null;
_this._authState.next(null);
resolve();
}).catch(function (err) {
_this._authState.next(null);
});
}
else {
reject(SocialService.LOGIN_PROVIDER_NOT_FOUND);
}
});
};
SocialService.LOGIN_PROVIDER_NOT_FOUND = 'Login provider not found';
SocialService.USER_POPUP_CLOSE = 'User close the popup';
SocialService.decorators = [
{ type: Injectable, args: [{
providedIn: 'root'
},] },
];
/** @nocollapse */
SocialService.ctorParameters = function () { return [
{ type: SocialServiceConfig }
]; };
/** @nocollapse */ SocialService.ngInjectableDef = i0.defineInjectable({ factory: function SocialService_Factory() { return new SocialService(i0.inject(SocialServiceConfig)); }, token: SocialService, providedIn: "root" });
return SocialService;
}());
export { SocialService };
if (false) {
/** @type {?} */
SocialService.LOGIN_PROVIDER_NOT_FOUND;
/** @type {?} */
SocialService.USER_POPUP_CLOSE;
/** @type {?} */
SocialService.prototype.providers;
/** @type {?} */
SocialService.prototype._user;
/** @type {?} */
SocialService.prototype._authState;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic29jaWFsLnNlcnZpY2UuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9uZ3gtc29jaWFsLWJ1dHRvbi8iLCJzb3VyY2VzIjpbImxpYi9zb2NpYWwuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7O0FBQUEsT0FBTyxFQUFDLFVBQVUsRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUV6QyxPQUFPLEVBQUMsZUFBZSxFQUFhLE1BQU0sTUFBTSxDQUFDO0FBR2pELE9BQU8sRUFBQyxxQkFBcUIsRUFBQyxNQUFNLDhCQUE4QixDQUFDO0FBQ25FLE9BQU8sRUFBQyxtQkFBbUIsRUFBQyxNQUFNLDRCQUE0QixDQUFDO0FBQy9ELE9BQU8sRUFBQyxxQkFBcUIsRUFBQyxNQUFNLDhCQUE4QixDQUFDOzs7Ozs7OztBQVNuRSxJQUFBO0lBR0ksNkJBQVksU0FBcUM7eUJBRkQsSUFBSSxHQUFHLEVBQXlCO1FBRzVFLEVBQUUsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUM7WUFDWixHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFNBQVMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQzs7Z0JBQ3hDLElBQU0sT0FBTyxHQUFHLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDN0IsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDO2FBQy9EO1NBQ0o7S0FDSjs7OztJQUVELDBDQUFZOzs7SUFBWjtRQUNJLE1BQU0sQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDO0tBQ3pCOzs7OztJQUVPLHlDQUFXOzs7O2NBQUMsUUFBdUI7UUFDdkMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3JDLElBQUks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RSxDQUFDO2lCQUNiLENBQUMsQ0FBQyxLQUFLLENBQUMsVUFBQyxHQUFHO29CQUNULEtBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO2lCQUM5QixDQUFDLENBQUM7YUFDTjtZQUFDLElBQUksQ0FBQyxDQUFDO2dCQUNKLE1BQU0sQ0FBQyxhQUFhLENBQUMsd0JBQXdCLENBQUMsQ0FBQzthQUNsRDtTQUNKLENBQUMsQ0FBQztLQUNOOzZDQXJGa0QsMEJBQTBCO3FDQUNsQyxzQkFBc0I7O2dCQU5wRSxVQUFVLFNBQUM7b0JBQ1IsVUFBVSxFQUFFLE1BQU07aUJBQ3JCOzs7O2dCQWV1QixtQkFBbUI7Ozt3QkF6RTNDOztTQTJEYSxhQUFhIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtJbmplY3RhYmxlfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuaW1wb3J0IHtCZWhhdmlvclN1YmplY3QsIE9ic2VydmFibGV9IGZyb20gJ3J4anMnO1xuXG5pbXBvcnQge0xvZ2luUHJvdmlkZXJ9IGZyb20gJy4vZW50aXRpZXMvbG9naW5Qcm92aWRlcic7XG5pbXBvcnQge0ZhY2Vib29rTG9naW5Qcm92aWRlcn0gZnJvbSAnLi9wcm92aWRlcnMvZmFjZWJvb2tQcm92aWRlcic7XG5pbXBvcnQge0dvb2dsZUxvZ2luUHJvdmlkZXJ9IGZyb20gJy4vcHJvdmlkZXJzL2dvb2dsZVByb3ZpZGVyJztcbmltcG9ydCB7TGlua2VkaW5Mb2dpblByb3ZpZGVyfSBmcm9tICcuL3Byb3ZpZGVycy9saW5rZWRpblByb3ZpZGVyJztcblxuaW1wb3J0IHtTb2NpYWxVc2VyfSBmcm9tICcuL2VudGl0aWVzL3VzZXInO1xuXG5leHBvcnQgaW50ZXJmYWNlIFNvY2lhbFNlcnZpY2VDb25maWdJdGVtIHtcbiAgICBwcm92aWRlcjogTG9naW5Qcm92aWRlcjtcbn1cblxuXG5leHBvcnQgY2xhc3MgU29jaWFsU2VydmljZUNvbmZpZyB7XG4gICAgcHJpdmF0ZSBwcm92aWRlcnM6IE1hcDxzdHJpbmcsIExvZ2luUHJvdmlkZXI+ID0gbmV3IE1hcDxzdHJpbmcsIExvZ2luUHJvdmlkZXI+KCk7XG5cbiAgICBjb25zdHJ1Y3Rvcihwcm92aWRlcnM/OiBTb2NpYWxTZXJ2aWNlQ29uZmlnSXRlbVtdKSB7XG4gICAgICAgIGlmIChwcm92aWRlcnMpIHtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcHJvdmlkZXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZWxlbWVudCA9IHByb3ZpZGVyc1tpXTtcbiAgICAgICAgICAgICAgICB0aGlzLnByb3ZpZGVycy5zZXQoZWxlbWVudC5wcm92aWRlci5UWVBFLCBlbGVtZW50LnByb3ZpZGVyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIGdldFByb3ZpZGVycygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucHJvdmlkZXJzO1xuICAgIH1cblxuICAgIHByaXZhdGUgYWRkUHJvdmlkZXIocHJvdmlkZXI6IExvZ2luUHJvdmlkZXIpIHtcbiAgICAgICAgaWYgKCF0aGlzLnByb3ZpZGVycy5nZXQocHJvdmlkZXIuVFlQRSkpIHtcbiAgICAgICAgICAgIHRoaXMucHJvdmlkZXJzLnNldChwcm92aWRlci5UWVBFLCBwcm92aWRlcik7XG4gICAgICAgIH1cblxuICAgIH1cblxuICAgIGFkZEZhY2Vib29rKGNsaWVudElkOiBzdHJpbmcpOiBTb2NpYWxTZXJ2aWNlQ29uZmlnIHtcbiAgICAgICAgdGhpcy5hZGRQcm92aWRlcihuZXcgRmFjZWJvb2tMb2dpblByb3ZpZGVyKGNsaWVudElkKSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIGFkZEdvb2dsZShjbGllbnRJZDogc3RyaW5nKTogU29jaWFsU2VydmljZUNvbmZpZyB7XG4gICAgICAgIHRoaXMuYWRkUHJvdmlkZXIobmV3IEdvb2dsZUxvZ2luUHJvdmlkZXIoY2xpZW50SWQpKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgYWRkTGlua2VkSW4oY2xpZW50SWQ6IHN0cmluZyk6IFNvY2lhbFNlcnZpY2VDb25maWcge1xuICAgICAgICB0aGlzLmFkZFByb3ZpZGVyKG5ldyBMaW5rZWRpbkxvZ2luUHJvdmlkZXIoY2xpZW50SWQpKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG59XG5cbkBJbmplY3RhYmxlKHtcbiAgICBwcm92aWRlZEluOiAncm9vdCdcbn0pXG5leHBvcnQgY2xhc3MgU29jaWFsU2VydmljZSB7XG5cbiAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBMT0dJTl9QUk9WSURFUl9OT1RfRk9VTkQgPSAnTG9naW4gcHJvdmlkZXIgbm90IGZvdW5kJztcbiAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBVU0VSX1BPUFVQX0NMT1NFID0gJ1VzZXIgY2xvc2UgdGhlIHBvcHVwJztcblxuICAgIHByaXZhdGUgcHJvdmlkZXJzOiBNYXA8c3RyaW5nLCBMb2dpblByb3ZpZGVyPjtcblxuICAgIHByaXZhdGUgX3VzZXI6IFNvY2lhbFVzZXIgPSBudWxsO1xuICAgIHByaXZhdGUgX2F1dGhTdGF0ZTogQmVoYXZpb3JTdWJqZWN0PFNvY2lhbFVzZXI+ID0gbmV3IEJlaGF2aW9yU3ViamVjdChudWxsKTtcblxuICAgIGdldCBhdXRoU3RhdGUoKTogT2JzZXJ2YWJsZTxTb2NpYWxVc2VyPiB7XG4gICAgICAgIHJldHVybiB0aGlzLl9hdXRoU3RhdGUuYXNPYnNlcnZhYmxlKCk7XG4gICAgfVxuXG4gICAgY29uc3RydWN0b3IoY29uZmlnOiBTb2NpYWxTZXJ2aWNlQ29uZmlnKSB7XG4gICAgICAgIHRoaXMucHJvdmlkZXJzID0gY29uZmlnLmdldFByb3ZpZGVycygpO1xuICAgICAgICB0aGlzLnByb3ZpZGVycy5mb3JFYWNoKChwcm92aWRlcjogTG9naW5Qcm92aWRlciwga2V5OiBzdHJpbmcpID0+IHtcbiAgICAgICAgICAgIHByb3ZpZGVyLmluaXRpYWxpemUoKS50aGVuKCh1c2VyOiBTb2NpYWxVc2VyKSA9PiB7XG4gICAgICAgICAgICAgICAgdXNlci5wcm92aWRlciA9IGtleTtcbiAgICAgICAgICAgICAgICB0aGlzLl91c2VyID0gdXNlcjtcbiAgICAgICAgICAgICAgICB0aGlzLl9hdXRoU3RhdGUubmV4dCh1c2VyKTtcbiAgICAgICAgICAgIH0pLmNhdGNoKChlcnIpID0+IHtcbiAgICAgICAgICAgICAgICAvLyB0aGlzLl9hdXRoU3RhdGUubmV4dChudWxsKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBpc1NvY2lhbExvZ2dlZEluKCkge1xuICAgICAgICByZXR1cm4gKHRoaXMuX3VzZXIgIT0gbnVsbCk7XG4gICAgfVxuXG5cbiAgICBzaGFyaW5nKHByb3ZpZGVyVHlwZTogc3RyaW5nLCBzaGFyZT86IGFueSkge1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgbGV0IHByb3ZpZGVyT2JqZWN0ID0gdGhpcy5wcm92aWRlcnMuZ2V0KHByb3ZpZGVyVHlwZSk7XG4gICAgICAgICAgICBpZiAocHJvdmlkZXJPYmplY3QpIHtcbiAgICAgICAgICAgICAgICBwcm92aWRlck9iamVjdC5zaGFyaW5nKHNoYXJlKS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSh0cnVlKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmVqZWN0KFNvY2lhbFNlcnZpY2UuTE9HSU5fUFJPVklERVJfTk9UX0ZPVU5EKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgZmFjZWJvb2tTaGFyaW5nKHNoYXJlPzogYW55KSB7XG4gICAgICAgIHJldHVybiB0aGlzLnNoYXJpbmcoJ2ZhY2Vib29rJywgc2hhcmUpO1xuICAgIH1cblxuICAgIC8vIGxpbmtlZGluU2hhcmluZyhzaGFyZT86IGFueSkge1xuICAgIC8vICAgICByZXR1cm4gdGhpcy5zaGFyaW5nKCdsaW5rZWRpbicsIHNoYXJlKTtcbiAgICAvLyB9XG5cbiAgICBzaWduSW4ocHJvdmlkZXJUeXBlOiBzdHJpbmcsIHNjb3Blcz86IFtzdHJpbmddKTogUHJvbWlzZTxTb2NpYWxVc2VyPiB7XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICBsZXQgcHJvdmlkZXJPYmplY3QgPSB0aGlzLnByb3ZpZGVycy5nZXQocHJvdmlkZXJUeXBlKTtcbiAgICAgICAgICAgIGlmIChwcm92aWRlck9iamVjdCkge1xuICAgICAgICAgICAgICAgIHByb3ZpZGVyT2JqZWN0LnNpZ25JbihzY29wZXMpLnRoZW4oKHVzZXI6IFNvY2lhbFVzZXIpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdXNlci5wcm92aWRlciA9IHByb3ZpZGVyVHlwZTtcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSh1c2VyKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fdXNlciA9IHVzZXI7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2F1dGhTdGF0ZS5uZXh0KHVzZXIpO1xuICAgICAgICAgICAgICAgIH0pLmNhdGNoKChlcnIpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcmVqZWN0KFNvY2lhbFNlcnZpY2UuVVNFUl9QT1BVUF9DTE9TRSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJlamVjdChTb2NpYWxTZXJ2aWNlLkxPR0lOX1BST1ZJREVSX05PVF9GT1VORCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHNpZ25PdXQoKTogUHJvbWlzZTxhbnk+IHtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgIGlmICh0aGlzLl91c2VyICYmIHRoaXMuX3VzZXIucHJvdmlkZXIpIHtcbiAgICAgICAgICAgICAgICBsZXQgcHJvdmlkZXJUeXBlID0gdGhpcy5fdXNlci5wcm92aWRlcjtcbiAgICAgICAgICAgICAgICBsZXQgcHJvdmlkZXJPYmplY3QgPSB0aGlzLnByb3ZpZGVycy5nZXQocHJvdmlkZXJUeXBlKTtcbiAgICAgICAgICAgICAgICBwcm92aWRlck9iamVjdC5zaWduT3V0KCkudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3VzZXIgPSBudWxsO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9hdXRoU3RhdGUubmV4dChudWxsKTtcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICAgICAgICAgIH0pLmNhdGNoKChlcnIpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fYXV0aFN0YXRlLm5leHQobnVsbCk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJlamVjdChTb2NpYWxTZXJ2aWNlLkxPR0lOX1BST1ZJREVSX05PVF9GT1VORCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxufVxuIl19