UNPKG

@hxui/angular

Version:

* * *

212 lines 18.1 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,missingReturn,uselessCode} checked by tsc */ import { Injectable, NgZone, InjectionToken } from '@angular/core'; import { fromEvent } from 'rxjs'; import { map, distinctUntilChanged } from 'rxjs/operators'; import { BehaviorSubject } from 'rxjs/index'; /** * @record */ export function WindowSize() { } if (false) { /** @type {?} */ WindowSize.prototype.width; /** @type {?} */ WindowSize.prototype.height; } /** * @record */ export function Breakpoint() { } if (false) { /** @type {?|undefined} */ Breakpoint.prototype.min; /** @type {?|undefined} */ Breakpoint.prototype.max; } /** * @record */ export function BreakpointEvent() { } if (false) { /** @type {?} */ BreakpointEvent.prototype.name; /** @type {?} */ BreakpointEvent.prototype.breakpoint; /** @type {?} */ BreakpointEvent.prototype.size; } /** * @record */ export function BreakpointConfig() { } /** @type {?} */ export const defaultBreakpoints = { mobile: { max: 768 }, tablet: { min: 769, max: 1023 }, desktop: { min: 1024, max: 1215 }, widescreen: { min: 1216, max: 1407 }, fullhd: { min: 1408 } }; /** @type {?} */ const FALLBACK_BREAKPOINT = { min: 0, max: Number.MAX_SAFE_INTEGER }; /** @type {?} */ export const BREAKPOINTS_CONFIG = new InjectionToken('breakpoints.config'); /** * @param {?} ngZone * @param {?} breakpoints * @return {?} */ export function breakpointsFactory(ngZone, breakpoints) { return new BreakpointsService(ngZone, breakpoints); } /** * @param {?=} breakpoints * @return {?} */ export function breakpointsProviders(breakpoints = defaultBreakpoints) { return [ { provide: BREAKPOINTS_CONFIG, useValue: breakpoints }, { provide: BreakpointsService, useFactory: breakpointsFactory, deps: [NgZone, BREAKPOINTS_CONFIG] } ]; } export class BreakpointsService { /** * @param {?} ngZone * @param {?=} breakpoints */ constructor(ngZone, breakpoints) { this.ngZone = ngZone; this.lastBreakpoint = null; this.breakpoints = defaultBreakpoints; this.setBreakpoints(breakpoints); this.resize = fromEvent(window, 'resize') .pipe(map(this.getWindowSize), distinctUntilChanged()); /** @type {?} */ const initialBreakpoint = this.getBreakpoint(window.innerWidth); this.changesSubject = new BehaviorSubject(this.getBreakpointEvent(initialBreakpoint)); this.changes = this.changesSubject.pipe(distinctUntilChanged((x, y) => x.name === y.name)); this.subscribe(); } // Unsubscribe to the resize event /** * @return {?} */ unsubscribe() { if (this.subscription) { this.subscription.unsubscribe(); this.subscription = null; } } // Subscribe to the resize event /** * @return {?} */ subscribe() { if (this.subscription) { return; } // Make sure resize event doesn't trigger change detection by running outside of angular zone this.ngZone.runOutsideAngular(() => { this.subscription = this.resize.subscribe((size) => { /** @type {?} */ const breakpoint = this.getBreakpoint(size.width); if (breakpoint === this.lastBreakpoint) { return; } this.lastBreakpoint = breakpoint; // Emitting back in angular zone this.ngZone.run(() => { this.changesSubject.next(this.getBreakpointEvent(breakpoint)); }); }); }); } // Sets the customized breakpoints /** * @param {?=} breakpoints * @return {?} */ setBreakpoints(breakpoints) { if (breakpoints) { this.breakpoints = breakpoints; } } // Returns a breakpoint event, with the fallback breakpoint if none were found /** * @param {?} name * @return {?} */ getBreakpointEvent(name) { if (!name) { return { name: 'default', breakpoint: FALLBACK_BREAKPOINT, size: this.getWindowSize() }; } else { return { name: name, breakpoint: this.breakpoints[name], size: this.getWindowSize() }; } } // Returns the current window size /** * @return {?} */ getWindowSize() { return { width: window.innerWidth, height: window.innerHeight }; } // Returns the first breakpoint that match the current size /** * @param {?} currentSize * @return {?} */ getBreakpoint(currentSize) { /** @type {?} */ const keys = Object.keys(this.breakpoints); for (const key of keys) { /** @type {?} */ const value = this.breakpoints[key]; /** @type {?} */ const min = value.min || 0; /** @type {?} */ const max = value.max || Number.MAX_SAFE_INTEGER; if (currentSize >= min && currentSize < max) { return key; } } return null; } } BreakpointsService.decorators = [ { type: Injectable }, ]; /** @nocollapse */ BreakpointsService.ctorParameters = () => [ null, { type: undefined } ]; if (false) { /** @type {?} */ BreakpointsService.prototype.lastBreakpoint; /** @type {?} */ BreakpointsService.prototype.breakpoints; /** @type {?} */ BreakpointsService.prototype.changesSubject; /** @type {?} */ BreakpointsService.prototype.subscription; /** @type {?} */ BreakpointsService.prototype.changes; /** @type {?} */ BreakpointsService.prototype.resize; /** @type {?} */ BreakpointsService.prototype.ngZone; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnJlYWtwb2ludC5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6Im5nOi8vQGh4dWkvYW5ndWxhci8iLCJzb3VyY2VzIjpbImxpYi91dGlscy9icmVha3BvaW50LnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7OztBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLGNBQWMsRUFBWSxNQUFNLGVBQWUsQ0FBQztBQUM3RSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ2pDLE9BQU8sRUFBRSxHQUFHLEVBQVUsb0JBQW9CLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNuRSxPQUFPLEVBQUMsZUFBZSxFQUEyQixNQUFNLFlBQVksQ0FBQzs7OztBQXVCckUsZ0NBR0M7OztJQUZDLDJCQUFjOztJQUNkLDRCQUFlOzs7OztBQUdqQixnQ0FHQzs7O0lBRkMseUJBQWE7O0lBQ2IseUJBQWE7Ozs7O0FBR2YscUNBSUM7OztJQUhDLCtCQUFhOztJQUNiLHFDQUF1Qjs7SUFDdkIsK0JBQWlCOzs7OztBQUduQixzQ0FFQzs7QUFFRCxNQUFNLE9BQU8sa0JBQWtCLEdBQXFCO0lBQ2xELE1BQU0sRUFBRSxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUU7SUFDcEIsTUFBTSxFQUFFLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFO0lBQy9CLE9BQU8sRUFBRSxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRTtJQUNqQyxVQUFVLEVBQUUsRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUU7SUFDcEMsTUFBTSxFQUFFLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRTtDQUN0Qjs7TUFFSyxtQkFBbUIsR0FBRztJQUMxQixHQUFHLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxNQUFNLENBQUMsZ0JBQWdCO0NBQ3JDOztBQUVELE1BQU0sT0FBTyxrQkFB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LG9DQUErQjs7SUFFbEIsb0NBQWMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlLCBOZ1pvbmUsIEluamVjdGlvblRva2VuLCBQcm92aWRlciB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBmcm9tRXZlbnQgfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgbWFwLCBmaWx0ZXIsIGRpc3RpbmN0VW50aWxDaGFuZ2VkIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xyXG5pbXBvcnQge0JlaGF2aW9yU3ViamVjdCwgT2JzZXJ2YWJsZSwgU3Vic2NyaXB0aW9ufSBmcm9tICdyeGpzL2luZGV4JztcclxuXHJcblxyXG4vLyBAZXhhbXBsZVxyXG4vLyBpbXBvcnQgeyBicmVha3BvaW50c1Byb3ZpZGVyLCBCcmVha3BvaW50c1NlcnZpY2UsIEJyZWFrcG9pbnRFdmVudCB9IGZyb20gJ2FuZ3VsYXItYnJlYWtwb2ludHMnO1xyXG4vL1xyXG4vLyBAQ29tcG9uZW50KHtcclxuLy8gICAvLyAuLi5cclxuLy8gICBwcm92aWRlcnM6IFticmVha3BvaW50c1Byb3ZpZGVyKCldXHJcbi8vICAgLy8gLi4uXHJcbi8vIH0pXHJcbi8vIGV4cG9ydCBjbGFzcyBZb3VyQ29tcG9uZW50IHtcclxuLy9cclxuLy8gICBjb25zdHJ1Y3RvciAocHJpdmF0ZSBicmVha3BvaW50c1NlcnZpY2U6IEJyZWFrcG9pbnRzU2VydmljZSkge1xyXG4vL1xyXG4vLyAgICAgdGhpcy5icmVha3BvaW50c1NlcnZpY2UuY2hhbmdlcy5zdWJzY3JpYmUoKGV2ZW50OiBCcmVha3BvaW50RXZlbnQpID0+IHtcclxuLy9cclxuLy8gICAgICAgY29uc29sZS5sb2coZXZlbnQpO1xyXG4vLyAgICAgfSk7XHJcbi8vICAgfVxyXG4vLyB9XHJcblxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBXaW5kb3dTaXplIHtcclxuICB3aWR0aDogbnVtYmVyO1xyXG4gIGhlaWdodDogbnVtYmVyO1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIEJyZWFrcG9pbnQge1xyXG4gIG1pbj86IG51bWJlcjtcclxuICBtYXg/OiBudW1iZXI7XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgQnJlYWtwb2ludEV2ZW50IHtcclxuICBuYW1lOiBzdHJpbmc7XHJcbiAgYnJlYWtwb2ludDogQnJlYWtwb2ludDtcclxuICBzaXplOiBXaW5kb3dTaXplO1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIEJyZWFrcG9pbnRDb25maWcge1xyXG4gIFtuYW1lOiBzdHJpbmddOiBCcmVha3BvaW50O1xyXG59XHJcblxyXG5leHBvcnQgY29uc3QgZGVmYXVsdEJyZWFrcG9pbnRzOiBCcmVha3BvaW50Q29uZmlnID0ge1xyXG4gIG1vYmlsZTogeyBtYXg6IDc2OCB9LFxyXG4gIHRhYmxldDogeyBtaW46IDc2OSwgbWF4OiAxMDIzIH0sXHJcbiAgZGVza3RvcDogeyBtaW46IDEwMjQsIG1heDogMTIxNSB9LFxyXG4gIHdpZGVzY3JlZW46IHsgbWluOiAxMjE2LCBtYXg6IDE0MDcgfSxcclxuICBmdWxsaGQ6IHsgbWluOiAxNDA4IH1cclxufTtcclxuXHJcbmNvbnN0IEZBTExCQUNLX0JSRUFLUE9JTlQgPSB7XHJcbiAgbWluOiAwLCBtYXg6IE51bWJlci5NQVhfU0FGRV9JTlRFR0VSXHJcbn1cclxuXHJcbmV4cG9ydCBjb25zdCBCUkVBS1BPSU5UU19DT05GSUcgPSBuZXcgSW5qZWN0aW9uVG9rZW48QnJlYWtwb2ludENvbmZpZz4oJ2JyZWFrcG9pbnRzLmNvbmZpZycpO1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGJyZWFrcG9pbnRzRmFjdG9yeSAobmdab25lOiBOZ1pvbmUsIGJyZWFrcG9pbnRzOiBCcmVha3BvaW50Q29uZmlnKSB7XHJcbiAgcmV0dXJuIG5ldyBCcmVha3BvaW50c1NlcnZpY2Uobmdab25lLCBicmVha3BvaW50cylcclxufVxyXG5cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBicmVha3BvaW50c1Byb3ZpZGVycyAoYnJlYWtwb2ludHM6IEJyZWFrcG9pbnRDb25maWcgPSBkZWZhdWx0QnJlYWtwb2ludHMpOiBQcm92aWRlcltdIHtcclxuICByZXR1cm4gW1xyXG4gICAge1xyXG4gICAgICBwcm92aWRlOiBCUkVBS1BPSU5UU19DT05GSUcsXHJcbiAgICAgIHVzZVZhbHVlOiBicmVha3BvaW50c1xyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgcHJvdmlkZTogQnJlYWtwb2ludHNTZXJ2aWNlLFxyXG4gICAgICB1c2VGYWN0b3J5OiBicmVha3BvaW50c0ZhY3RvcnksXHJcbiAgICAgIGRlcHM6IFtOZ1pvbmUsIEJSRUFLUE9JTlRTX0NPTkZJR11cclxuICAgIH1cclxuICBdO1xyXG59XHJcblxyXG5cclxuQEluamVjdGFibGUoKVxyXG5leHBvcnQgY2xhc3MgQnJlYWtwb2ludHNTZXJ2aWNlICB7XHJcblxyXG4gIHByaXZhdGUgbGFzdEJyZWFrcG9pbnQ6IHN0cmluZyA9IG51bGw7XHJcbiAgcHJpdmF0ZSBicmVha3BvaW50czogQnJlYWtwb2ludENvbmZpZyA9IGRlZmF1bHRCcmVha3BvaW50cztcclxuICBwcml2YXRlIGNoYW5nZXNTdWJqZWN0OiBCZWhhdmlvclN1YmplY3Q8QnJlYWtwb2ludEV2ZW50PjtcclxuICBwcml2YXRlIHN1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uO1xyXG5cclxuICBjaGFuZ2VzOiBPYnNlcnZhYmxlPEJyZWFrcG9pbnRFdmVudD47XHJcbiAgcmVzaXplOiBPYnNlcnZhYmxlPFdpbmRvd1NpemU+O1xyXG5cclxuICBjb25zdHJ1Y3RvciAocHJpdmF0ZSBuZ1pvbmUsIGJyZWFrcG9pbnRzPzogQnJlYWtwb2ludENvbmZpZykge1xyXG5cclxuICAgIHRoaXMuc2V0QnJlYWtwb2ludHMoYnJlYWtwb2ludHMpO1xyXG5cclxuICAgIHRoaXMucmVzaXplID0gZnJvbUV2ZW50KHdpbmRvdywgJ3Jlc2l6ZScpXHJcbiAgICAgIC5waXBlKFxyXG4gICAgICAgIG1hcCh0aGlzLmdldFdpbmRvd1NpemUpLFxyXG4gICAgICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKClcclxuICAgICAgKTtcclxuXHJcbiAgICBjb25zdCBpbml0aWFsQnJlYWtwb2ludCA9IHRoaXMuZ2V0QnJlYWtwb2ludCh3aW5kb3cuaW5uZXJXaWR0aCk7XHJcbiAgICB0aGlzLmNoYW5nZXNTdWJqZWN0ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxCcmVha3BvaW50RXZlbnQ+KHRoaXMuZ2V0QnJlYWtwb2ludEV2ZW50KGluaXRpYWxCcmVha3BvaW50KSk7XHJcbiAgICB0aGlzLmNoYW5nZXMgPSB0aGlzLmNoYW5nZXNTdWJqZWN0LnBpcGUoZGlzdGluY3RVbnRpbENoYW5nZWQoKHgsIHkpID0+IHgubmFtZSA9PT0geS5uYW1lKSk7XHJcbiAgICB0aGlzLnN1YnNjcmliZSgpO1xyXG4gIH1cclxuXHJcbiAgLy8gVW5zdWJzY3JpYmUgdG8gdGhlIHJlc2l6ZSBldmVudFxyXG4gIHB1YmxpYyB1bnN1YnNjcmliZSAoKSB7XHJcblxyXG4gICAgaWYgKHRoaXMuc3Vic2NyaXB0aW9uKSB7XHJcbiAgICAgIHRoaXMuc3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XHJcbiAgICAgIHRoaXMuc3Vic2NyaXB0aW9uID0gbnVsbDtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vIFN1YnNjcmliZSB0byB0aGUgcmVzaXplIGV2ZW50XHJcbiAgcHVibGljIHN1YnNjcmliZSAoKSB7XHJcblxyXG4gICAgaWYgKHRoaXMuc3Vic2NyaXB0aW9uKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICAvLyBNYWtlIHN1cmUgcmVzaXplIGV2ZW50IGRvZXNuJ3QgdHJpZ2dlciBjaGFuZ2UgZGV0ZWN0aW9uIGJ5IHJ1bm5pbmcgb3V0c2lkZSBvZiBhbmd1bGFyIHpvbmVcclxuICAgIHRoaXMubmdab25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcclxuXHJcbiAgICAgIHRoaXMuc3Vic2NyaXB0aW9uID0gdGhpcy5yZXNpemUuc3Vic2NyaWJlKChzaXplOiBXaW5kb3dTaXplKSA9PiB7XHJcblxyXG4gICAgICAgIGNvbnN0IGJyZWFrcG9pbnQ6IHN0cmluZyA9IHRoaXMuZ2V0QnJlYWtwb2ludChzaXplLndpZHRoKTtcclxuXHJcbiAgICAgICAgaWYgKGJyZWFrcG9pbnQgPT09IHRoaXMubGFzdEJyZWFrcG9pbnQpIHtcclxuICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMubGFzdEJyZWFrcG9pbnQgPSBicmVha3BvaW50O1xyXG5cclxuICAgICAgICAvLyBFbWl0dGluZyBiYWNrIGluIGFuZ3VsYXIgem9uZVxyXG4gICAgICAgIHRoaXMubmdab25lLnJ1bigoKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLmNoYW5nZXNTdWJqZWN0Lm5leHQodGhpcy5nZXRCcmVha3BvaW50RXZlbnQoYnJlYWtwb2ludCkpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICB9KTtcclxuICAgIH0pO1xyXG5cclxuICB9XHJcblxyXG4gIC8vIFNldHMgdGhlIGN1c3RvbWl6ZWQgYnJlYWtwb2ludHNcclxuICBwcml2YXRlIHNldEJyZWFrcG9pbnRzIChicmVha3BvaW50cz86IEJyZWFrcG9pbnRDb25maWcpIHtcclxuXHJcbiAgICBpZiAoYnJlYWtwb2ludHMpIHtcclxuICAgICAgdGhpcy5icmVha3BvaW50cyA9IGJyZWFrcG9pbnRzO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcblxyXG4gIC8vIFJldHVybnMgYSBicmVha3BvaW50IGV2ZW50LCB3aXRoIHRoZSBmYWxsYmFjayBicmVha3BvaW50IGlmIG5vbmUgd2VyZSBmb3VuZFxyXG4gIHByaXZhdGUgZ2V0QnJlYWtwb2ludEV2ZW50IChuYW1lOiBzdHJpbmcpOiBCcmVha3BvaW50RXZlbnQge1xyXG5cclxuICAgIGlmICghbmFtZSkge1xyXG4gICAgICByZXR1cm4geyBuYW1lOiAnZGVmYXVsdCcsIGJyZWFrcG9pbnQ6IEZBTExCQUNLX0JSRUFLUE9JTlQsIHNpemU6IHRoaXMuZ2V0V2luZG93U2l6ZSgpIH07XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICByZXR1cm4geyBuYW1lOiBuYW1lLCBicmVha3BvaW50OiB0aGlzLmJyZWFrcG9pbnRzW25hbWVdLCBzaXplOiB0aGlzLmdldFdpbmRvd1NpemUoKSB9O1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8gUmV0dXJucyB0aGUgY3VycmVudCB3aW5kb3cgc2l6ZVxyXG4gIHByaXZhdGUgZ2V0V2luZG93U2l6ZSAoKTogV2luZG93U2l6ZSB7XHJcblxyXG4gICAgcmV0dXJuIHsgd2lkdGg6IHdpbmRvdy5pbm5lcldpZHRoLCBoZWlnaHQ6IHdpbmRvdy5pbm5lckhlaWdodCB9O1xyXG4gIH1cclxuXHJcblxyXG4gIC8vIFJldHVybnMgdGhlIGZpcnN0IGJyZWFrcG9pbnQgdGhhdCBtYXRjaCB0aGUgY3VycmVudCBzaXplXHJcbiAgcHJpdmF0ZSBnZXRCcmVha3BvaW50IChjdXJyZW50U2l6ZTogbnVtYmVyKTogc3RyaW5nIHtcclxuXHJcbiAgICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXModGhpcy5icmVha3BvaW50cyk7XHJcbiAgICBmb3IgKGNvbnN0IGtleSBvZiBrZXlzKSB7XHJcbiAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy5icmVha3BvaW50c1trZXldO1xyXG4gICAgICBjb25zdCBtaW4gPSB2YWx1ZS5taW4gfHwgMDtcclxuICAgICAgY29uc3QgbWF4ID0gdmFsdWUubWF4IHx8IE51bWJlci5NQVhfU0FGRV9JTlRFR0VSO1xyXG5cclxuICAgICAgaWYgKGN1cnJlbnRTaXplID49IG1pbiAmJiBjdXJyZW50U2l6ZSA8IG1heCkge1xyXG4gICAgICAgIHJldHVybiBrZXk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gbnVsbDtcclxuICB9XHJcbn1cclxuIl19