{"version":3,"file":"ngxtension-inject-document-visibility.mjs","sources":["../../../../libs/ngxtension/inject-document-visibility/src/inject-document-visibility.ts","../../../../libs/ngxtension/inject-document-visibility/src/ngxtension-inject-document-visibility.ts"],"sourcesContent":["import { DOCUMENT } from '@angular/common';\nimport {\n\tInjector,\n\tinject,\n\trunInInjectionContext,\n\ttype Signal,\n} from '@angular/core';\nimport { toSignal } from '@angular/core/rxjs-interop';\nimport { assertInjector } from 'ngxtension/assert-injector';\nimport { Observable, fromEvent, map, startWith } from 'rxjs';\n\nexport interface InjectDocumentVisibilityOptions {\n\t/*\n\t * Specify a custom `document` instance, e.g. working with iframes or in testing environments.\n\t */\n\tdocument?: Document;\n\n\t/*\n\t * Specify a custom `Injector` instance to use for dependency injection.\n\t */\n\tinjector?: Injector;\n}\n\nexport function injectDocumentVisibilityStream(\n\toptions?: InjectDocumentVisibilityOptions,\n): Observable<DocumentVisibilityState> {\n\tconst injector = assertInjector(\n\t\tinjectDocumentVisibilityStream,\n\t\toptions?.injector,\n\t);\n\n\treturn runInInjectionContext(injector, () => {\n\t\tconst doc: Document = options?.document ?? inject(DOCUMENT);\n\n\t\treturn fromEvent(doc, 'visibilitychange').pipe(\n\t\t\tstartWith(doc.visibilityState),\n\t\t\tmap(() => doc.visibilityState),\n\t\t);\n\t});\n}\n\n/**\n * Injects and monitors the current document visibility state. Emits the state initially and then emits on every change.\n *\n * This function is useful for scenarios like tracking user presence on a page (e.g., for analytics or pausing/resuming activities) and is adaptable for use with iframes or in testing environments.\n *\n * @example\n * ```ts\n const visibilityState = injectDocumentVisibility();\n effect(() => {\n   console.log(this.visibilityState());\n });\n * ```\n *\n * @param options An optional object with the following properties:\n *   - `document`: (Optional) Specifies a custom `Document` instance. This is useful when working with iframes or in testing environments where the global `document` might not be appropriate.\n *   - `injector`: (Optional) Specifies a custom `Injector` instance for dependency injection. This allows for more flexible and testable code by decoupling from a global state or context.\n *\n * @returns A signal that emits the current `DocumentVisibilityState` (`\"visible\"`, `\"hidden\"`, etc.) initially and whenever the document visibility state changes.\n */\nexport function injectDocumentVisibility(\n\toptions?: InjectDocumentVisibilityOptions,\n): Signal<DocumentVisibilityState> {\n\tconst docVisible$: Observable<DocumentVisibilityState> =\n\t\tinjectDocumentVisibilityStream(options);\n\treturn toSignal<DocumentVisibilityState>(docVisible$, {\n\t\trequireSync: true,\n\t});\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":";;;;;;AAuBM,SAAU,8BAA8B,CAC7C,OAAyC,EAAA;IAEzC,MAAM,QAAQ,GAAG,cAAc,CAC9B,8BAA8B,EAC9B,OAAO,EAAE,QAAQ,CACjB,CAAC;AAEF,IAAA,OAAO,qBAAqB,CAAC,QAAQ,EAAE,MAAK;QAC3C,MAAM,GAAG,GAAa,OAAO,EAAE,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,CAAC;QAE5D,OAAO,SAAS,CAAC,GAAG,EAAE,kBAAkB,CAAC,CAAC,IAAI,CAC7C,SAAS,CAAC,GAAG,CAAC,eAAe,CAAC,EAC9B,GAAG,CAAC,MAAM,GAAG,CAAC,eAAe,CAAC,CAC9B,CAAC;AACH,KAAC,CAAC,CAAC;AACJ,CAAC;AAED;;;;;;;;;;;;;;;;;;AAkBG;AACG,SAAU,wBAAwB,CACvC,OAAyC,EAAA;AAEzC,IAAA,MAAM,WAAW,GAChB,8BAA8B,CAAC,OAAO,CAAC,CAAC;IACzC,OAAO,QAAQ,CAA0B,WAAW,EAAE;AACrD,QAAA,WAAW,EAAE,IAAI;AACjB,KAAA,CAAC,CAAC;AACJ;;ACpEA;;AAEG;;;;"}