{"version":3,"file":"chunk-fzawyglc.js","sources":["packages/vanilla/lib/shared/idle/src/idle.service.ts"],"sourcesContent":["import { Injectable, inject } from '@angular/core';\n\nimport { Page, WINDOW } from '@frontend/vanilla/core';\nimport { Observable, ObservableInput, Subject, fromEvent, interval, merge } from 'rxjs';\nimport { multicast, refCount, switchMap } from 'rxjs/operators';\n\n/**\n * Additional options for {@link IdleService}\n *\n * @experimental\n */\nexport interface IdleOptions {\n /**\n * Additional event that will be used for idle check.\n */\n additionalActivityEvent?: ObservableInput;\n /**\n * Whether to start to watch for idle after the first activity. If true, it will wait for the first activity and then start check for idle.\n */\n watchForIdleAfterFirstActivity?: boolean;\n}\n\n/**\n * @whatItDoes Provides information about the user idle time.\n *\n * @howToUse\n *\n * ```\n * idleService.whenIdle(5000).subscribe(() => {});\n * ```\n *\n * @description\n *\n * # Overview\n *\n * This service is meant to be used for detecting user idle where idle means activity on the screen (click, keypress).\n * - Setup listener on DOM events for checking user activity\n * - Returns if a user is idle for some period of time, based on provided timeout in milliseconds\n *\n * @experimental\n */\n@Injectable({\n providedIn: 'root',\n})\nexport class IdleService {\n /**\n * Detect DOM events, click, keypress\n *\n * @stable\n */\n get activity(): Observable {\n return this.activityEvents;\n }\n\n private activityEvents: Observable;\n readonly #window = inject(WINDOW);\n\n constructor(private page: Page) {\n this.init(this.page.idleModeCaptureEnabled);\n }\n\n /**\n * Detect user activity based on the DOM events.\n */\n private init(capture: boolean) {\n if (!this.activityEvents) {\n this.activityEvents = merge(\n fromEvent(this.#window, 'click', {\n capture,\n }),\n fromEvent(this.#window, 'keypress', {\n capture,\n }),\n );\n }\n }\n\n /**\n * Detect if user is inactive for provided period of time.\n * @param timeout timeout in milliseconds\n * @param options optional idle options: {@link IdleOptions}\n *\n * @stable\n */\n whenIdle(timeout: number, options?: IdleOptions): Observable {\n const idleSubject: Subject = new Subject();\n // NOTE: Running the interval outside Angular ensures that e2e tests will not hang.\n const source = new Observable((observer) => {\n const watchForIdleImmediately: Subject = new Subject();\n const activity = options?.additionalActivityEvent\n ? merge(this.activityEvents, options.additionalActivityEvent, watchForIdleImmediately)\n : merge(this.activityEvents, watchForIdleImmediately);\n observer.add(activity.pipe(switchMap(() => interval(timeout))).subscribe(() => observer.next()));\n\n if (!options?.watchForIdleAfterFirstActivity) {\n watchForIdleImmediately.next();\n }\n });\n\n return source.pipe(multicast(idleSubject), refCount());\n }\n}\n"],"names":["IdleService","_window","constructor","page","__privateAdd","inject","WINDOW","init","idleModeCaptureEnabled","activity","activityEvents","capture","merge","fromEvent","__privateGet","whenIdle","timeout","options","idleSubject","Subject","Observable","observer","watchForIdleImmediately","additionalActivityEvent","add","pipe","switchMap","interval","subscribe","next","watchForIdleAfterFirstActivity","multicast","refCount","ɵɵinject","Page","factory","ɵfac","providedIn","_IdleService"],"mappings":"sJA4CA,IAAaA,CAAW,CAAA,CAAA,IAAA,CA5CxB,IAAAC,EA4CM,IAAOD,CAAAA,CAAP,MAAOA,CAAW,CAapBE,WAAoBC,CAAAA,CAAAA,CAAU,CAFrBC,CAAAA,CAAA,KAAAH,CAAUI,CAAAA,CAAAA,CAAOC,CAAM,CAAA,CAAA,CAEZ,KAAAH,IAAAA,CAAAA,CAAAA,CAChB,IAAKI,CAAAA,IAAAA,CAAK,KAAKJ,IAAKK,CAAAA,sBAAsB,EAC9C,CATA,IAAIC,QAAQ,EAAA,CACR,OAAO,IAAA,CAAKC,cAChB,CAYQH,IAAAA,CAAKI,CAAgB,CAAA,CACpB,IAAKD,CAAAA,cAAAA,GACN,IAAKA,CAAAA,cAAAA,CAAiBE,GAClBC,EAAUC,CAAAA,CAAAA,CAAA,IAAKb,CAAAA,CAAAA,CAAAA,CAAS,QAAS,CAC7BU,OAAAA,CAAAA,CACH,CAAA,CAAA,CACDE,GAAUC,CAAA,CAAA,IAAA,CAAKb,CAAS,CAAA,CAAA,UAAA,CAAY,CAChCU,OAAAA,CAAAA,CAAAA,CACH,CAAC,CAAA,EAGd,CASAI,QAASC,CAAAA,CAAAA,CAAiBC,CAAqB,CAAA,CAC3C,IAAMC,CAA6B,CAAA,IAAIC,CAcvC,CAAA,OAZe,IAAIC,CAAkBC,CAAAA,CAAAA,EAAY,CAC7C,IAAMC,CAAyC,CAAA,IAAIH,CAC7CV,CAAAA,CAAAA,CAAWQ,GAAAA,IAAAA,EAAAA,CAAAA,CAASM,uBACpBX,CAAAA,EAAAA,CAAM,KAAKF,cAAgBO,CAAAA,CAAAA,CAAQM,uBAAyBD,CAAAA,CAAuB,EACnFV,EAAM,CAAA,IAAA,CAAKF,cAAgBY,CAAAA,CAAuB,EACxDD,CAASG,CAAAA,GAAAA,CAAIf,CAASgB,CAAAA,IAAAA,CAAKC,GAAU,IAAMC,EAAAA,CAASX,CAAO,CAAC,CAAC,CAAEY,CAAAA,SAAAA,CAAU,IAAMP,CAAAA,CAASQ,MAAM,CAAC,CAE1FZ,CAAAA,CAAAA,EAAAA,MAAAA,CAASa,CAAAA,8BAAAA,EACVR,CAAwBO,CAAAA,IAAAA,GAEhC,CAAC,CAAA,CAEaJ,IAAKM,CAAAA,EAAAA,CAAUb,CAAW,CAAGc,CAAAA,EAAAA,EAAU,CACzD,GA7CS/B,CAAA,CAAA,IAAA,OAAA,CAAA,CAAA,CAAA,SAAA,CAAA,SAAA,CAAA,CAAA,CAAA,OAAA,IAAA,CAAA,EAXAD,CAAWiC,EAAAA,EAAAA,CAAAC,CAAA,CAAA,CAAA,CAAXlC,CAAAA,CAAAA,CAAAA,UAAAA,CAAAA,CAAAA,CAAAA,CAAAA,KAAAA,CAAAA,CAAAA,CAAWmC,QAAXnC,CAAWoC,CAAAA,SAAAA,CAAAC,UAFR,CAAA,MAAM,CAAA,CAEhB,CAAA,IAAOrC,CAAPsC,CAAAA,CAAAA,CAAAA,OAAOtC,CAAW,CAAA"}