UNPKG

ngx-social-button

Version:

Social login/share buttons for Angular 6, 7, 8

204 lines (203 loc) 17.4 kB
/** * @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; export class SocialServiceConfig { /** * @param {?=} providers */ constructor(providers) { this.providers = new Map(); if (providers) { for (let i = 0; i < providers.length; i++) { /** @type {?} */ const element = providers[i]; this.providers.set(element.provider.TYPE, element.provider); } } } /** * @return {?} */ getProviders() { return this.providers; } /** * @param {?} provider * @return {?} */ addProvider(provider) { if (!this.providers.get(provider.TYPE)) { this.providers.set(provider.TYPE, provider); } } /** * @param {?} clientId * @return {?} */ addFacebook(clientId) { this.addProvider(new FacebookLoginProvider(clientId)); return this; } /** * @param {?} clientId * @return {?} */ addGoogle(clientId) { this.addProvider(new GoogleLoginProvider(clientId)); return this; } /** * @param {?} clientId * @return {?} */ addLinkedIn(clientId) { this.addProvider(new LinkedinLoginProvider(clientId)); return this; } } if (false) { /** @type {?} */ SocialServiceConfig.prototype.providers; } export class SocialService { /** * @param {?} config */ constructor(config) { this._user = null; this._authState = new BehaviorSubject(null); this.providers = config.getProviders(); this.providers.forEach((provider, key) => { provider.initialize().then((user) => { user.provider = key; this._user = user; this._authState.next(user); }).catch((err) => { // this._authState.next(null); }); }); } /** * @return {?} */ get authState() { return this._authState.asObservable(); } /** * @return {?} */ isSocialLoggedIn() { return (this._user != null); } /** * @param {?} providerType * @param {?=} share * @return {?} */ sharing(providerType, share) { return new Promise((resolve, reject) => { /** @type {?} */ let providerObject = this.providers.get(providerType); if (providerObject) { providerObject.sharing(share).then(() => { resolve(true); }); } else { reject(SocialService.LOGIN_PROVIDER_NOT_FOUND); } }); } /** * @param {?=} share * @return {?} */ facebookSharing(share) { return this.sharing('facebook', share); } /** * @param {?} providerType * @param {?=} scopes * @return {?} */ signIn(providerType, scopes) { return new Promise((resolve, reject) => { /** @type {?} */ let providerObject = this.providers.get(providerType); if (providerObject) { providerObject.signIn(scopes).then((user) => { user.provider = providerType; resolve(user); this._user = user; this._authState.next(user); }).catch((err) => { reject(SocialService.USER_POPUP_CLOSE); }); } else { reject(SocialService.LOGIN_PROVIDER_NOT_FOUND); } }); } /** * @return {?} */ signOut() { return new Promise((resolve, reject) => { if (this._user && this._user.provider) { /** @type {?} */ let providerType = this._user.provider; /** @type {?} */ let providerObject = this.providers.get(providerType); providerObject.signOut().then(() => { this._user = null; this._authState.next(null); resolve(); }).catch((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 = () => [ { type: SocialServiceConfig } ]; /** @nocollapse */ SocialService.ngInjectableDef = i0.defineInjectable({ factory: function SocialService_Factory() { return new SocialService(i0.inject(SocialServiceConfig)); }, token: SocialService, providedIn: "root" }); 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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic29jaWFsLnNlcnZpY2UuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9uZ3gtc29jaWFsLWJ1dHRvbi8iLCJzb3VyY2VzIjpbImxpYi9zb2NpYWwuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7O0FBQUEsT0FBTyxFQUFDLFVBQVUsRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUV6QyxPQUFPLEVBQUMsZUFBZSxFQUFhLE1BQU0sTUFBTSxDQUFDO0FBR2pELE9BQU8sRUFBQyxxQkFBcUIsRUFBQyxNQUFNLDhCQUE4QixDQUFDO0FBQ25FLE9BQU8sRUFBQyxtQkFBbUIsRUFBQyxNQUFNLDRCQUE0QixDQUFDO0FBQy9ELE9BQU8sRUFBQyxxQkFBcUIsRUFBQyxNQUFNLDhCQUE4QixDQUFDOzs7Ozs7OztBQVNuRSxNQUFNOzs7O0lBR0YsWUFBWSxTQUFxQzt5QkFGRCxJQUFJLEdBQUcsRUFBeUI7UUFHNUUsRUFBRSxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQztZQUNaLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsU0FBUyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDOztnQkFDeEMsTUFBTSxPQUFPLEdBQUcsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUM3QixJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUM7YUFDL0Q7U0FDSjtLQUNKOzs7O0lBRUQsWUFBWTtRQUNSLE1BQU0sQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDO0tBQ3pCOzs7OztJQUVPLFdBQVcsQ0FBQyxRQUF1QjtRQUN2QyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDckMsSUFBSSxDQUFDLFNBQVMs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QyxDQUFDO2lCQUM5QixDQUFDLENBQUM7YUFDTjtZQUFDLElBQUksQ0FBQyxDQUFDO2dCQUNKLE1BQU0sQ0FBQyxhQUFhLENBQUMsd0JBQXdCLENBQUMsQ0FBQzthQUNsRDtTQUNKLENBQUMsQ0FBQztLQUNOOzt5Q0FyRmtELDBCQUEwQjtpQ0FDbEMsc0JBQXNCOztZQU5wRSxVQUFVLFNBQUM7Z0JBQ1IsVUFBVSxFQUFFLE1BQU07YUFDckI7Ozs7WUFldUIsbUJBQW1CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtJbmplY3RhYmxlfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuaW1wb3J0IHtCZWhhdmlvclN1YmplY3QsIE9ic2VydmFibGV9IGZyb20gJ3J4anMnO1xuXG5pbXBvcnQge0xvZ2luUHJvdmlkZXJ9IGZyb20gJy4vZW50aXRpZXMvbG9naW5Qcm92aWRlcic7XG5pbXBvcnQge0ZhY2Vib29rTG9naW5Qcm92aWRlcn0gZnJvbSAnLi9wcm92aWRlcnMvZmFjZWJvb2tQcm92aWRlcic7XG5pbXBvcnQge0dvb2dsZUxvZ2luUHJvdmlkZXJ9IGZyb20gJy4vcHJvdmlkZXJzL2dvb2dsZVByb3ZpZGVyJztcbmltcG9ydCB7TGlua2VkaW5Mb2dpblByb3ZpZGVyfSBmcm9tICcuL3Byb3ZpZGVycy9saW5rZWRpblByb3ZpZGVyJztcblxuaW1wb3J0IHtTb2NpYWxVc2VyfSBmcm9tICcuL2VudGl0aWVzL3VzZXInO1xuXG5leHBvcnQgaW50ZXJmYWNlIFNvY2lhbFNlcnZpY2VDb25maWdJdGVtIHtcbiAgICBwcm92aWRlcjogTG9naW5Qcm92aWRlcjtcbn1cblxuXG5leHBvcnQgY2xhc3MgU29jaWFsU2VydmljZUNvbmZpZyB7XG4gICAgcHJpdmF0ZSBwcm92aWRlcnM6IE1hcDxzdHJpbmcsIExvZ2luUHJvdmlkZXI+ID0gbmV3IE1hcDxzdHJpbmcsIExvZ2luUHJvdmlkZXI+KCk7XG5cbiAgICBjb25zdHJ1Y3Rvcihwcm92aWRlcnM/OiBTb2NpYWxTZXJ2aWNlQ29uZmlnSXRlbVtdKSB7XG4gICAgICAgIGlmIChwcm92aWRlcnMpIHtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcHJvdmlkZXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZWxlbWVudCA9IHByb3ZpZGVyc1tpXTtcbiAgICAgICAgICAgICAgICB0aGlzLnByb3ZpZGVycy5zZXQoZWxlbWVudC5wcm92aWRlci5UWVBFLCBlbGVtZW50LnByb3ZpZGVyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIGdldFByb3ZpZGVycygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucHJvdmlkZXJzO1xuICAgIH1cblxuICAgIHByaXZhdGUgYWRkUHJvdmlkZXIocHJvdmlkZXI6IExvZ2luUHJvdmlkZXIpIHtcbiAgICAgICAgaWYgKCF0aGlzLnByb3ZpZGVycy5nZXQocHJvdmlkZXIuVFlQRSkpIHtcbiAgICAgICAgICAgIHRoaXMucHJvdmlkZXJzLnNldChwcm92aWRlci5UWVBFLCBwcm92aWRlcik7XG4gICAgICAgIH1cblxuICAgIH1cblxuICAgIGFkZEZhY2Vib29rKGNsaWVudElkOiBzdHJpbmcpOiBTb2NpYWxTZXJ2aWNlQ29uZmlnIHtcbiAgICAgICAgdGhpcy5hZGRQcm92aWRlcihuZXcgRmFjZWJvb2tMb2dpblByb3ZpZGVyKGNsaWVudElkKSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIGFkZEdvb2dsZShjbGllbnRJZDogc3RyaW5nKTogU29jaWFsU2VydmljZUNvbmZpZyB7XG4gICAgICAgIHRoaXMuYWRkUHJvdmlkZXIobmV3IEdvb2dsZUxvZ2luUHJvdmlkZXIoY2xpZW50SWQpKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgYWRkTGlua2VkSW4oY2xpZW50SWQ6IHN0cmluZyk6IFNvY2lhbFNlcnZpY2VDb25maWcge1xuICAgICAgICB0aGlzLmFkZFByb3ZpZGVyKG5ldyBMaW5rZWRpbkxvZ2luUHJvdmlkZXIoY2xpZW50SWQpKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG59XG5cbkBJbmplY3RhYmxlKHtcbiAgICBwcm92aWRlZEluOiAncm9vdCdcbn0pXG5leHBvcnQgY2xhc3MgU29jaWFsU2VydmljZSB7XG5cbiAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBMT0dJTl9QUk9WSURFUl9OT1RfRk9VTkQgPSAnTG9naW4gcHJvdmlkZXIgbm90IGZvdW5kJztcbiAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBVU0VSX1BPUFVQX0NMT1NFID0gJ1VzZXIgY2xvc2UgdGhlIHBvcHVwJztcblxuICAgIHByaXZhdGUgcHJvdmlkZXJzOiBNYXA8c3RyaW5nLCBMb2dpblByb3ZpZGVyPjtcblxuICAgIHByaXZhdGUgX3VzZXI6IFNvY2lhbFVzZXIgPSBudWxsO1xuICAgIHByaXZhdGUgX2F1dGhTdGF0ZTogQmVoYXZpb3JTdWJqZWN0PFNvY2lhbFVzZXI+ID0gbmV3IEJlaGF2aW9yU3ViamVjdChudWxsKTtcblxuICAgIGdldCBhdXRoU3RhdGUoKTogT2JzZXJ2YWJsZTxTb2NpYWxVc2VyPiB7XG4gICAgICAgIHJldHVybiB0aGlzLl9hdXRoU3RhdGUuYXNPYnNlcnZhYmxlKCk7XG4gICAgfVxuXG4gICAgY29uc3RydWN0b3IoY29uZmlnOiBTb2NpYWxTZXJ2aWNlQ29uZmlnKSB7XG4gICAgICAgIHRoaXMucHJvdmlkZXJzID0gY29uZmlnLmdldFByb3ZpZGVycygpO1xuICAgICAgICB0aGlzLnByb3ZpZGVycy5mb3JFYWNoKChwcm92aWRlcjogTG9naW5Qcm92aWRlciwga2V5OiBzdHJpbmcpID0+IHtcbiAgICAgICAgICAgIHByb3ZpZGVyLmluaXRpYWxpemUoKS50aGVuKCh1c2VyOiBTb2NpYWxVc2VyKSA9PiB7XG4gICAgICAgICAgICAgICAgdXNlci5wcm92aWRlciA9IGtleTtcbiAgICAgICAgICAgICAgICB0aGlzLl91c2VyID0gdXNlcjtcbiAgICAgICAgICAgICAgICB0aGlzLl9hdXRoU3RhdGUubmV4dCh1c2VyKTtcbiAgICAgICAgICAgIH0pLmNhdGNoKChlcnIpID0+IHtcbiAgICAgICAgICAgICAgICAvLyB0aGlzLl9hdXRoU3RhdGUubmV4dChudWxsKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBpc1NvY2lhbExvZ2dlZEluKCkge1xuICAgICAgICByZXR1cm4gKHRoaXMuX3VzZXIgIT0gbnVsbCk7XG4gICAgfVxuXG5cbiAgICBzaGFyaW5nKHByb3ZpZGVyVHlwZTogc3RyaW5nLCBzaGFyZT86IGFueSkge1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgbGV0IHByb3ZpZGVyT2JqZWN0ID0gdGhpcy5wcm92aWRlcnMuZ2V0KHByb3ZpZGVyVHlwZSk7XG4gICAgICAgICAgICBpZiAocHJvdmlkZXJPYmplY3QpIHtcbiAgICAgICAgICAgICAgICBwcm92aWRlck9iamVjdC5zaGFyaW5nKHNoYXJlKS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSh0cnVlKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmVqZWN0KFNvY2lhbFNlcnZpY2UuTE9HSU5fUFJPVklERVJfTk9UX0ZPVU5EKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgZmFjZWJvb2tTaGFyaW5nKHNoYXJlPzogYW55KSB7XG4gICAgICAgIHJldHVybiB0aGlzLnNoYXJpbmcoJ2ZhY2Vib29rJywgc2hhcmUpO1xuICAgIH1cblxuICAgIC8vIGxpbmtlZGluU2hhcmluZyhzaGFyZT86IGFueSkge1xuICAgIC8vICAgICByZXR1cm4gdGhpcy5zaGFyaW5nKCdsaW5rZWRpbicsIHNoYXJlKTtcbiAgICAvLyB9XG5cbiAgICBzaWduSW4ocHJvdmlkZXJUeXBlOiBzdHJpbmcsIHNjb3Blcz86IFtzdHJpbmddKTogUHJvbWlzZTxTb2NpYWxVc2VyPiB7XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICBsZXQgcHJvdmlkZXJPYmplY3QgPSB0aGlzLnByb3ZpZGVycy5nZXQocHJvdmlkZXJUeXBlKTtcbiAgICAgICAgICAgIGlmIChwcm92aWRlck9iamVjdCkge1xuICAgICAgICAgICAgICAgIHByb3ZpZGVyT2JqZWN0LnNpZ25JbihzY29wZXMpLnRoZW4oKHVzZXI6IFNvY2lhbFVzZXIpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdXNlci5wcm92aWRlciA9IHByb3ZpZGVyVHlwZTtcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSh1c2VyKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fdXNlciA9IHVzZXI7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2F1dGhTdGF0ZS5uZXh0KHVzZXIpO1xuICAgICAgICAgICAgICAgIH0pLmNhdGNoKChlcnIpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcmVqZWN0KFNvY2lhbFNlcnZpY2UuVVNFUl9QT1BVUF9DTE9TRSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJlamVjdChTb2NpYWxTZXJ2aWNlLkxPR0lOX1BST1ZJREVSX05PVF9GT1VORCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHNpZ25PdXQoKTogUHJvbWlzZTxhbnk+IHtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgIGlmICh0aGlzLl91c2VyICYmIHRoaXMuX3VzZXIucHJvdmlkZXIpIHtcbiAgICAgICAgICAgICAgICBsZXQgcHJvdmlkZXJUeXBlID0gdGhpcy5fdXNlci5wcm92aWRlcjtcbiAgICAgICAgICAgICAgICBsZXQgcHJvdmlkZXJPYmplY3QgPSB0aGlzLnByb3ZpZGVycy5nZXQocHJvdmlkZXJUeXBlKTtcbiAgICAgICAgICAgICAgICBwcm92aWRlck9iamVjdC5zaWduT3V0KCkudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3VzZXIgPSBudWxsO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9hdXRoU3RhdGUubmV4dChudWxsKTtcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICAgICAgICAgIH0pLmNhdGNoKChlcnIpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fYXV0aFN0YXRlLm5leHQobnVsbCk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJlamVjdChTb2NpYWxTZXJ2aWNlLkxPR0lOX1BST1ZJREVSX05PVF9GT1VORCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxufVxuIl19