@hxui/angular
Version:
* * *
212 lines • 18.1 kB
JavaScript
/**
* @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