{"version":3,"file":"al00x-screen-detector.mjs","sources":["../../../src/lib/screen-detector.service.ts","../../../src/public-api.ts","../../../src/al00x-screen-detector.ts"],"sourcesContent":["import {Inject, Injectable, InjectionToken, OnDestroy, Optional} from '@angular/core';\nimport {BehaviorSubject, debounceTime, fromEvent, Subscription} from 'rxjs';\n\ntype BreakpointKeys = 'xxl' | 'xl' | 'lg' | 'md' | 'sm' | 'xs';\nexport type BreakpointsConfig = {[key in BreakpointKeys]: number};\nexport interface AlxScreenDetectorConfig {\n  resizeDebounceTime?: number;\n  desktopBreakpoint?: BreakpointKeys;\n  breakpoints?: BreakpointsConfig;\n}\n\nexport const ALX_SCREEN_DETECTOR_CONFIG = new InjectionToken('Config for AlX Screen Detector package');\n\n/* The default breakpoints are the same as TailwindCSS sizes */\nconst DEFAULT_BREAKPOINTS: BreakpointsConfig = {\n  xxl: 1536,\n  xl: 1280,\n  lg: 1024,\n  md: 768,\n  sm: 640,\n  xs: 420,\n}\nconst DEFAULT_DESKTOP_BREAKPOINT = 'lg';\nconst DEFAULT_RESIZE_DEBOUNCE_TIME = 25;\n\n@Injectable({\n  providedIn: 'root',\n})\nexport class ScreenDetectorService implements OnDestroy {\n  public xxl$ = new BehaviorSubject<boolean>(false);\n  public xl$ = new BehaviorSubject<boolean>(false);\n  public lg$ = new BehaviorSubject<boolean>(false);\n  public md$ = new BehaviorSubject<boolean>(false);\n  public sm$ = new BehaviorSubject<boolean>(false);\n  public xs$ = new BehaviorSubject<boolean>(false);\n  public isDesktop$ = new BehaviorSubject<boolean>(false);\n  public state$ = new BehaviorSubject<{[key in BreakpointKeys | 'isDesktop']: boolean}>({\n    xxl: false,\n    xl: false,\n    lg: false,\n    md: false,\n    sm: false,\n    xs: false,\n    isDesktop: false,\n  });\n  public current$ = new BehaviorSubject<BreakpointKeys | undefined>(undefined);\n\n  private resizeSub$: Subscription;\n  private readonly breakpoints: BreakpointsConfig;\n  private readonly sortedBreakpointsEntry: [BreakpointKeys, number][];\n  private readonly desktopBreakpointKey: BreakpointKeys;\n  private readonly resizeDebounceTime: number;\n\n  constructor(@Optional() @Inject(ALX_SCREEN_DETECTOR_CONFIG) private config?: AlxScreenDetectorConfig) {\n    this.breakpoints = config?.breakpoints ?? DEFAULT_BREAKPOINTS;\n    this.sortedBreakpointsEntry = Object.entries(this.breakpoints).sort((a, b) => a[1] < b[1] ? 1 : -1) as any;\n    this.desktopBreakpointKey = config?.desktopBreakpoint ?? DEFAULT_DESKTOP_BREAKPOINT;\n    this.resizeDebounceTime = config?.resizeDebounceTime ?? DEFAULT_RESIZE_DEBOUNCE_TIME;\n\n    this.resizeSub$ = fromEvent(window, 'resize').pipe(debounceTime(this.resizeDebounceTime)).subscribe(() => {\n      this.updateState();\n    });\n    this.updateState();\n  }\n\n  public select<T>(values: {[p in BreakpointKeys]?: T}) {\n    if (!this.current$.value) return undefined;\n\n    const currentBreakpointWidth = this.breakpoints[this.current$.value];\n\n    for(const key of this.sortedBreakpointsEntry.filter(t => currentBreakpointWidth >= t[1]).map(t => t[0])) {\n      const value = values[key];\n      if (value) return value;\n    }\n\n    return undefined;\n  }\n\n  private updateState() {\n    const screenWidth = window.innerWidth;\n    const state: {[p in BreakpointKeys]: boolean} = {} as any;\n    let current: BreakpointKeys | undefined = undefined;\n\n    for(const [key, width] of this.sortedBreakpointsEntry) {\n      state[key] = screenWidth >= width;\n      if (!current && state[key]) {\n        current = key;\n      }\n    }\n\n    this.xs$.next(state['xs']);\n    this.sm$.next(state['sm']);\n    this.md$.next(state['md']);\n    this.lg$.next(state['lg']);\n    this.xl$.next(state['xl']);\n    this.xxl$.next(state['xxl']);\n\n    this.isDesktop$.next(state[this.desktopBreakpointKey]);\n\n    this.current$.next(current);\n\n    this.state$.next({\n      ...state,\n      isDesktop: this.isDesktop$.value,\n    })\n  }\n\n  ngOnDestroy() {\n    this.resizeSub$.unsubscribe();\n  }\n}\n","/*\r\n * Public API Surface of lib\r\n */\r\n\r\nexport * from './lib/';\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}