UNPKG

@odilo/buttons

Version:

Share buttons components for Angular and Ionic.

304 lines 20.6 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ import * as tslib_1 from "tslib"; import { Component, Input, Output, EventEmitter, ChangeDetectionStrategy } from '@angular/core'; import { ShareService, SHARE_BUTTONS } from '@odilo/core'; import { BehaviorSubject, Subscription } from 'rxjs'; import { map } from 'rxjs/operators'; /** * @record */ function ButtonsState() { } if (false) { /** @type {?|undefined} */ ButtonsState.prototype.includedButtons; /** @type {?|undefined} */ ButtonsState.prototype.excludedButtons; /** @type {?|undefined} */ ButtonsState.prototype.userButtons; /** @type {?|undefined} */ ButtonsState.prototype.selectedButtons; /** @type {?|undefined} */ ButtonsState.prototype.expanded; /** @type {?|undefined} */ ButtonsState.prototype.shownCount; /** @type {?|undefined} */ ButtonsState.prototype.moreIcon; /** @type {?|undefined} */ ButtonsState.prototype.lessIcon; } var ShareButtons = /** @class */ (function () { function ShareButtons(_share) { this._share = _share; this._state$ = new BehaviorSubject({ includedButtons: [], excludedButtons: [], userButtons: [], selectedButtons: [], expanded: true, shownCount: Object.keys(SHARE_BUTTONS).length }); this._configSub$ = Subscription.EMPTY; this.theme = this._share.config.theme; /** * Show buttons icons */ this.showIcon = true; /** * Show buttons text */ this.showText = false; /** * Show sharing count */ this.showCount = false; /** * Buttons size */ this.size = 0; /** * Share count event */ this.count = new EventEmitter(); /** * Share dialog opened event */ this.opened = new EventEmitter(); /** * Share dialog closed event */ this.closed = new EventEmitter(); } Object.defineProperty(ShareButtons.prototype, "includedButtons", { set: /** * @param {?} includedButtons * @return {?} */ function (includedButtons) { this.updateState({ includedButtons: includedButtons }); }, enumerable: true, configurable: true }); Object.defineProperty(ShareButtons.prototype, "excludedButtons", { set: /** * @param {?} excludedButtons * @return {?} */ function (excludedButtons) { this.updateState({ excludedButtons: excludedButtons }); }, enumerable: true, configurable: true }); Object.defineProperty(ShareButtons.prototype, "shownButtons", { set: /** * @param {?} shownCount * @return {?} */ function (shownCount) { this.updateState({ shownCount: shownCount }); }, enumerable: true, configurable: true }); /** * @return {?} */ ShareButtons.prototype.ngOnInit = /** * @return {?} */ function () { var _this = this; this.state$ = this._state$.pipe(map((/** * @param {?} state * @return {?} */ function (state) { // Use component include buttons, otherwise fallback to global include buttons /** @type {?} */ var includedButtons = state.includedButtons.length ? state.includedButtons : state.userButtons; /** @type {?} */ var userButtons = includedButtons.filter((/** * @param {?} btn * @return {?} */ function (btn) { return state.excludedButtons.indexOf(btn) < 0; })); /** @type {?} */ var selectedButtons = userButtons.slice(0, state.expanded ? userButtons.length : state.shownCount); return { userButtons: userButtons, selectedButtons: selectedButtons, expanded: state.expanded, shownCount: state.shownCount, moreIcon: state.moreIcon, lessIcon: state.lessIcon }; }))); // Subscribe to share buttons config changes, This updates the component whenever a new button is added this._configSub$ = this._share.config$.subscribe((/** * @param {?} config * @return {?} */ function (config) { // Use global include buttons, otherwise fallback to all buttons /** @type {?} */ var includedButtons = config.include.length ? config.include : Object.keys(SHARE_BUTTONS); /** @type {?} */ var userButtons = includedButtons.filter((/** * @param {?} btn * @return {?} */ function (btn) { return config.exclude.indexOf(btn) < 0; })); _this.updateState({ userButtons: userButtons, expanded: false, moreIcon: config.moreButtonIcon, lessIcon: config.lessButtonIcon }); })); }; /** * @return {?} */ ShareButtons.prototype.ngOnDestroy = /** * @return {?} */ function () { this._configSub$.unsubscribe(); this._state$.complete(); }; /** * @param {?} state * @return {?} */ ShareButtons.prototype.updateState = /** * @param {?} state * @return {?} */ function (state) { this._state$.next(tslib_1.__assign({}, this._state$.value, state)); }; ShareButtons.decorators = [ { type: Component, args: [{ selector: 'share-buttons', template: "<div *ngIf=\"state$ | async; let state\" class=\"sb-group sb-{{theme}}\">\n\n <share-button *ngFor=\"let button of state.selectedButtons\"\n [button]=\"button\"\n [theme]=\"theme\"\n [url]=\"url\"\n [title]=\"title\"\n [description]=\"description\"\n [image]=\"image\"\n [tags]=\"tags\"\n [autoSetMeta]=\"autoSetMeta\"\n [showCount]=\"showCount\"\n [showIcon]=\"showIcon\"\n [showText]=\"showText\"\n [size]=\"size\"\n (opened)=\"opened.emit($event)\"\n (closed)=\"closed.emit($event)\"\n (count)=\"count.emit($event)\"></share-button>\n\n <div class=\"sb-button sb-{{theme}}\">\n\n <expand-button *ngIf=\"state.shownCount < state.userButtons.length\"\n [expanded]=\"state.expanded\"\n [moreIcon]=\"state.moreIcon\"\n [lessIcon]=\"state.lessIcon\"\n [size]=\"(1 + size/20) * 14\"\n (toggle)=\"updateState({expanded: $event})\">\n </expand-button>\n\n </div>\n</div>\n", changeDetection: ChangeDetectionStrategy.OnPush, styles: [":host{display:inherit}"] }] } ]; /** @nocollapse */ ShareButtons.ctorParameters = function () { return [ { type: ShareService } ]; }; ShareButtons.propDecorators = { theme: [{ type: Input }], includedButtons: [{ type: Input, args: ['include',] }], excludedButtons: [{ type: Input, args: ['exclude',] }], shownButtons: [{ type: Input, args: ['show',] }], url: [{ type: Input }], title: [{ type: Input }], description: [{ type: Input }], image: [{ type: Input }], tags: [{ type: Input }], autoSetMeta: [{ type: Input }], showIcon: [{ type: Input }], showText: [{ type: Input }], showCount: [{ type: Input }], size: [{ type: Input }], count: [{ type: Output }], opened: [{ type: Output }], closed: [{ type: Output }] }; return ShareButtons; }()); export { ShareButtons }; if (false) { /** @type {?} */ ShareButtons.prototype.state$; /** * @type {?} * @private */ ShareButtons.prototype._state$; /** * @type {?} * @private */ ShareButtons.prototype._configSub$; /** @type {?} */ ShareButtons.prototype.theme; /** * The sharing link * @type {?} */ ShareButtons.prototype.url; /** * The title parameter * @type {?} */ ShareButtons.prototype.title; /** * The description parameter * @type {?} */ ShareButtons.prototype.description; /** * The image parameter for sharing on Pinterest * @type {?} */ ShareButtons.prototype.image; /** * The tags parameter for sharing on Twitter and Tumblr * @type {?} */ ShareButtons.prototype.tags; /** * Sets meta tags from document head, useful when SEO is available * @type {?} */ ShareButtons.prototype.autoSetMeta; /** * Show buttons icons * @type {?} */ ShareButtons.prototype.showIcon; /** * Show buttons text * @type {?} */ ShareButtons.prototype.showText; /** * Show sharing count * @type {?} */ ShareButtons.prototype.showCount; /** * Buttons size * @type {?} */ ShareButtons.prototype.size; /** * Share count event * @type {?} */ ShareButtons.prototype.count; /** * Share dialog opened event * @type {?} */ ShareButtons.prototype.opened; /** * Share dialog closed event * @type {?} */ ShareButtons.prototype.closed; /** * @type {?} * @private */ ShareButtons.prototype._share; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2hhcmUtYnV0dG9ucy5qcyIsInNvdXJjZVJvb3QiOiJuZzovL0BvZGlsby9idXR0b25zLyIsInNvdXJjZXMiOlsibGliL3NoYXJlLWJ1dHRvbnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQXFCLFlBQVksRUFBRSx1QkFBdUIsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNuSCxPQUFPLEVBQUUsWUFBWSxFQUFzQixhQUFhLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDOUUsT0FBTyxFQUFjLGVBQWUsRUFBRSxZQUFZLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDakUsT0FBTyxFQUFFLEdBQUcsRUFBRSxNQUFNLGdCQUFnQixDQUFDOzs7O0FBRXJDLDJCQVNDOzs7SUFSQyx1Q0FBMkI7O0lBQzNCLHVDQUEyQjs7SUFDM0IsbUNBQXVCOztJQUN2Qix1Q0FBMkI7O0lBQzNCLGdDQUFtQjs7SUFDbkIsa0NBQW9COztJQUNwQixnQ0FBZTs7SUFDZixnQ0FBZTs7QUFHakI7SUF5RUUsc0JBQW9CLE1BQW9CO1FBQXBCLFdBQU0sR0FBTixNQUFNLENBQWM7UUFoRWhDLFlBQU8sR0FBRyxJQUFJLGVBQWUsQ0FBZTtZQUNsRCxlQUFlLEVBQUUsRUFBRTtZQUNuQixlQUFlLEVBQUUsRUFBRTtZQUNuQixXQUFXLEVBQUUsRUFBRTtZQUNmLGVBQWUsRUFBRSxFQUFFO1lBQ25CLFFBQVEsRUFBRSxJQUFJO1lBQ2QsVUFBVSxFQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUMsTUFBTTtTQUM5QyxDQUFDLENBQUM7UUFFSyxnQkFBVyxHQUFHLFlBQVksQ0FBQyxLQUFLLENBQUM7UUFFaEMsVUFBSyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQzs7OztRQWlDakMsYUFBUSxHQUFHLElBQUksQ0FBQzs7OztRQUdoQixhQUFRLEdBQUcsS0FBSyxDQUFD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bkRlc3Ryb3ksIEV2ZW50RW1pdHRlciwgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFNoYXJlU2VydmljZSwgU2hhcmVCdXR0b25zQ29uZmlnLCBTSEFSRV9CVVRUT05TIH0gZnJvbSAnQG9kaWxvL2NvcmUnO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgQmVoYXZpb3JTdWJqZWN0LCBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IG1hcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcblxuaW50ZXJmYWNlIEJ1dHRvbnNTdGF0ZSB7XG4gIGluY2x1ZGVkQnV0dG9ucz86IHN0cmluZ1tdO1xuICBleGNsdWRlZEJ1dHRvbnM/OiBzdHJpbmdbXTtcbiAgdXNlckJ1dHRvbnM/OiBzdHJpbmdbXTtcbiAgc2VsZWN0ZWRCdXR0b25zPzogc3RyaW5nW107XG4gIGV4cGFuZGVkPzogYm9vbGVhbjtcbiAgc2hvd25Db3VudD86IG51bWJlcjtcbiAgbW9yZUljb24/OiBhbnk7XG4gIGxlc3NJY29uPzogYW55O1xufVxuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdzaGFyZS1idXR0b25zJyxcbiAgdGVtcGxhdGVVcmw6ICcuL3NoYXJlLWJ1dHRvbnMuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL3NoYXJlLWJ1dHRvbnMuc2NzcyddLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaFxufSlcbmV4cG9ydCBjbGFzcyBTaGFyZUJ1dHRvbnMgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XG5cbiAgc3RhdGUkOiBPYnNlcnZhYmxlPEJ1dHRvbnNTdGF0ZT47XG4gIHByaXZhdGUgX3N0YXRlJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8QnV0dG9uc1N0YXRlPih7XG4gICAgaW5jbHVkZWRCdXR0b25zOiBbXSxcbiAgICBleGNsdWRlZEJ1dHRvbnM6IFtdLFxuICAgIHVzZXJCdXR0b25zOiBbXSxcbiAgICBzZWxlY3RlZEJ1dHRvbnM6IFtdLFxuICAgIGV4cGFuZGVkOiB0cnVlLFxuICAgIHNob3duQ291bnQ6IE9iamVjdC5rZXlzKFNIQVJFX0JVVFRPTlMpLmxlbmd0aFxuICB9KTtcblxuICBwcml2YXRlIF9jb25maWdTdWIkID0gU3Vic2NyaXB0aW9uLkVNUFRZO1xuXG4gIEBJbnB1dCgpIHRoZW1lID0gdGhpcy5fc2hhcmUuY29uZmlnLnRoZW1lO1xuXG4gIEBJbnB1dCgnaW5jbHVkZScpIHNldCBpbmNsdWRlZEJ1dHRvbnMoaW5jbHVkZWRCdXR0b25zOiBzdHJpbmdbXSkge1xuICAgIHRoaXMudXBkYXRlU3RhdGUoe2luY2x1ZGVkQnV0dG9uc30pO1xuICB9XG5cbiAgQElucHV0KCdleGNsdWRlJykgc2V0IGV4Y2x1ZGVkQnV0dG9ucyhleGNsdWRlZEJ1dHRvbnM6IHN0cmluZ1tdKSB7XG4gICAgdGhpcy51cGRhdGVTdGF0ZSh7ZXhjbHVkZWRCdXR0b25zfSk7XG4gIH1cblxuICBASW5wdXQoJ3Nob3cnKSBzZXQgc2hvd25CdXR0b25zKHNob3duQ291bnQ6IG51bWJlcikge1xuICAgIHRoaXMudXBkYXRlU3RhdGUoe3Nob3duQ291bnR9KTtcbiAgfVxuXG4gIC8qKiBUaGUgc2hhcmluZyBsaW5rICovXG4gIEBJbnB1dCgpIHVybDogc3RyaW5nO1xuXG4gIC8qKiBUaGUgdGl0bGUgcGFyYW1ldGVyICovXG4gIEBJbnB1dCgpIHRpdGxlOiBzdHJpbmc7XG5cbiAgLyoqIFRoZSBkZXNjcmlwdGlvbiBwYXJhbWV0ZXIgKi9cbiAgQElucHV0KCkgZGVzY3JpcHRpb246IHN0cmluZztcblxuICAvKiogVGhlIGltYWdlIHBhcmFtZXRlciBmb3Igc2hhcmluZyBvbiBQaW50ZXJlc3QgKi9cbiAgQElucHV0KCkgaW1hZ2U6IHN0cmluZztcblxuICAvKiogVGhlIHRhZ3MgcGFyYW1ldGVyIGZvciBzaGFyaW5nIG9uIFR3aXR0ZXIgYW5kIFR1bWJsciAqL1xuICBASW5wdXQoKSB0YWdzOiBzdHJpbmc7XG5cbiAgLyoqIFNldHMgbWV0YSB0YWdzIGZyb20gZG9jdW1lbnQgaGVhZCwgdXNlZnVsIHdoZW4gU0VPIGlzIGF2YWlsYWJsZSAqL1xuICBASW5wdXQoKSBhdXRvU2V0TWV0YTogYm9vbGVhbjtcblxuICAvKiogU2hvdyBidXR0b25zIGljb25zICovXG4gIEBJbnB1dCgpIHNob3dJY29uID0gdHJ1ZTtcblxuICAvKiogU2hvdyBidXR0b25zIHRleHQgKi9cbiAgQElucHV0KCkgc2hvd1RleHQgPSBmYWxzZTtcblxuICAvKiogU2hvdyBzaGFyaW5nIGNvdW50ICovXG4gIEBJbnB1dCgpIHNob3dDb3VudCA9IGZhbHNlO1xuXG4gIC8qKiBCdXR0b25zIHNpemUgKi9cbiAgQElucHV0KCkgc2l6ZSA9IDA7XG5cbiAgLyoqIFNoYXJlIGNvdW50IGV2ZW50ICovXG4gIEBPdXRwdXQoKSBjb3VudCA9IG5ldyBFdmVudEVtaXR0ZXI8bnVtYmVyPigpO1xuXG4gIC8qKiBTaGFyZSBkaWFsb2cgb3BlbmVkIGV2ZW50ICovXG4gIEBPdXRwdXQoKSBvcGVuZWQgPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKTtcblxuICAvKiogU2hhcmUgZGlhbG9nIGNsb3NlZCBldmVudCAqL1xuICBAT3V0cHV0KCkgY2xvc2VkID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmc+KCk7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBfc2hhcmU6IFNoYXJlU2VydmljZSkge1xuICB9XG5cbiAgbmdPbkluaXQoKSB7XG4gICAgdGhpcy5zdGF0ZSQgPSB0aGlzLl9zdGF0ZSQucGlwZShcbiAgICAgIG1hcCgoc3RhdGU6IEJ1dHRvbnNTdGF0ZSkgPT4ge1xuICAgICAgICAvLyBVc2UgY29tcG9uZW50IGluY2x1ZGUgYnV0dG9ucywgb3RoZXJ3aXNlIGZhbGxiYWNrIHRvIGdsb2JhbCBpbmNsdWRlIGJ1dHRvbnNcbiAgICAgICAgY29uc3QgaW5jbHVkZWRCdXR0b25zID0gc3RhdGUuaW5jbHVkZWRCdXR0b25zLmxlbmd0aCA/IHN0YXRlLmluY2x1ZGVkQnV0dG9ucyA6IHN0YXRlLnVzZXJCdXR0b25zO1xuICAgICAgICBjb25zdCB1c2VyQnV0dG9ucyA9IGluY2x1ZGVkQnV0dG9ucy5maWx0ZXIoKGJ0bikgPT4gc3RhdGUuZXhjbHVkZWRCdXR0b25zLmluZGV4T2YoYnRuKSA8IDApO1xuICAgICAgICBjb25zdCBzZWxlY3RlZEJ1dHRvbnMgPSB1c2VyQnV0dG9ucy5zbGljZSgwLCBzdGF0ZS5leHBhbmRlZCA/IHVzZXJCdXR0b25zLmxlbmd0aCA6IHN0YXRlLnNob3duQ291bnQpO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHVzZXJCdXR0b25zLFxuICAgICAgICAgIHNlbGVjdGVkQnV0dG9ucyxcbiAgICAgICAgICBleHBhbmRlZDogc3RhdGUuZXhwYW5kZWQsXG4gICAgICAgICAgc2hvd25Db3VudDogc3RhdGUuc2hvd25Db3VudCxcbiAgICAgICAgICBtb3JlSWNvbjogc3RhdGUubW9yZUljb24sXG4gICAgICAgICAgbGVzc0ljb246IHN0YXRlLmxlc3NJY29uXG4gICAgICAgIH07XG4gICAgICB9KVxuICAgICk7XG5cbiAgICAvLyBTdWJzY3JpYmUgdG8gc2hhcmUgYnV0dG9ucyBjb25maWcgY2hhbmdlcywgVGhpcyB1cGRhdGVzIHRoZSBjb21wb25lbnQgd2hlbmV2ZXIgYSBuZXcgYnV0dG9uIGlzIGFkZGVkXG4gICAgdGhpcy5fY29uZmlnU3ViJCA9IHRoaXMuX3NoYXJlLmNvbmZpZyQuc3Vic2NyaWJlKChjb25maWc6IFNoYXJlQnV0dG9uc0NvbmZpZykgPT4ge1xuICAgICAgLy8gVXNlIGdsb2JhbCBpbmNsdWRlIGJ1dHRvbnMsIG90aGVyd2lzZSBmYWxsYmFjayB0byBhbGwgYnV0dG9uc1xuICAgICAgY29uc3QgaW5jbHVkZWRCdXR0b25zID0gY29uZmlnLmluY2x1ZGUubGVuZ3RoID8gY29uZmlnLmluY2x1ZGUgOiBPYmplY3Qua2V5cyhTSEFSRV9CVVRUT05TKTtcbiAgICAgIGNvbnN0IHVzZXJCdXR0b25zID0gaW5jbHVkZWRCdXR0b25zLmZpbHRlcigoYnRuKSA9PiBjb25maWcuZXhjbHVkZS5pbmRleE9mKGJ0bikgPCAwKTtcbiAgICAgIHRoaXMudXBkYXRlU3RhdGUoe1xuICAgICAgICB1c2VyQnV0dG9ucyxcbiAgICAgICAgZXhwYW5kZWQ6IGZhbHNlLFxuICAgICAgICBtb3JlSWNvbjogY29uZmlnLm1vcmVCdXR0b25JY29uLFxuICAgICAgICBsZXNzSWNvbjogY29uZmlnLmxlc3NCdXR0b25JY29uXG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCkge1xuICAgIHRoaXMuX2NvbmZpZ1N1YiQudW5zdWJzY3JpYmUoKTtcbiAgICB0aGlzLl9zdGF0ZSQuY29tcGxldGUoKTtcbiAgfVxuXG4gIHVwZGF0ZVN0YXRlKHN0YXRlOiBCdXR0b25zU3RhdGUpIHtcbiAgICB0aGlzLl9zdGF0ZSQubmV4dCh7Li4udGhpcy5fc3RhdGUkLnZhbHVlLCAuLi5zdGF0ZX0pO1xuICB9XG5cbn1cblxuLyoqXG4gKiBFeHBsYW5hdGlvbiBvZiB0aGUgYWJvdmUgY29kZTpcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIEluY2x1ZGUgYnV0dG9uczogaW5jbHVkZXMgb25seSB3YW50ZWQgYnV0dG9ucyBhbmQgZXhjbHVkZXMgdGhlIHJlc3RcbiBFeGNsdWRlIGJ1dHRvbnM6IGV4Y2x1ZGVzIG9ubHkgdGhlIHVud2FudGVkIGJ1dHRvbnNcbiBVc2VyIGJ1dHRvbnMgPSBJbmNsdWRlIGJ1dHRvbnMgLSBleGNsdWRlIGJ1dHRvbnNcbiBTZWxlY3RlZCBCdXR0b25zID0gVXNlciBidXR0b25zIFtzaG93biBudW1iZXJdXG4gKi9cbiJdfQ==