@fastkit/visibility
Version:
A library to watch the visible state of the browser window.
1 lines • 8.03 kB
Source Map (JSON)
{"version":3,"sources":["../src/constants.ts","../src/visibility.ts","../src/index.ts"],"names":["IN_WINDOW"],"mappings":"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","file":"visibility.mjs","sourcesContent":["import { IN_WINDOW } from '@fastkit/helpers';\n\nlet _hidden = 'hidden';\nlet _visibilityChange = 'visibilitychange';\n\nif (IN_WINDOW) {\n if (document.hidden !== undefined) {\n _hidden = 'hidden';\n _visibilityChange = 'visibilitychange';\n } else if ((document as any).mozHidden !== undefined) {\n _hidden = 'mozHidden';\n _visibilityChange = 'mozvisibilitychange';\n } else if ((document as any).msHidden !== undefined) {\n _hidden = 'msHidden';\n _visibilityChange = 'msvisibilitychange';\n } else if ((document as any).webkitHidden !== undefined) {\n _hidden = 'webkitHidden';\n _visibilityChange = 'webkitvisibilitychange';\n }\n}\n\nexport const HIDDEN = _hidden as 'hidden';\nexport const VISIBILITY_CHANGE = _visibilityChange as 'visibilitychange';\n","import { IN_WINDOW } from '@fastkit/helpers';\nimport { HIDDEN, VISIBILITY_CHANGE } from './constants';\n\nexport type VisibilityTypedCallback = (event: Event) => any;\nexport type VisibilityStateListener = (\n state: VisibilityState,\n event: Event,\n) => any;\n\ninterface VisibilityTypedCallbacks {\n visible: VisibilityTypedCallback[];\n hidden: VisibilityTypedCallback[];\n}\n\nconst states = ['visible', 'hidden'] as const;\n\nexport type VisibilityState = (typeof states)[number];\n\nfunction getVisibilityState(): VisibilityState {\n if (!IN_WINDOW) return 'hidden';\n return document[HIDDEN] ? 'hidden' : 'visible';\n}\n\nexport class VisibilityManager {\n private _state: VisibilityState = getVisibilityState();\n\n private _stateListeners: VisibilityStateListener[] = [];\n\n private _typedCallbacks: VisibilityTypedCallbacks = {\n visible: [],\n hidden: [],\n };\n\n get state(): VisibilityState {\n return this._state;\n }\n\n get isVisible(): boolean {\n return this._state === 'visible';\n }\n\n get isHidden(): boolean {\n return this._state === 'hidden';\n }\n\n constructor() {\n if (IN_WINDOW) {\n document.addEventListener(\n VISIBILITY_CHANGE,\n (e) => {\n this._setState(getVisibilityState(), e);\n },\n false,\n );\n }\n }\n\n private _setState(state: VisibilityState, event: Event): void {\n if (this._state !== state) {\n this._state = state;\n this._triggerStateListeners(state, event);\n this._triggerTypedCallback(state, event);\n }\n }\n\n private _triggerStateListeners(state: VisibilityState, event: Event): void {\n const listeners = this._stateListeners.slice();\n listeners.forEach((listener) => {\n listener(state, event);\n });\n }\n\n private _triggerTypedCallback(state: VisibilityState, event: Event): void {\n const callbacks = this._typedCallbacks[state].slice();\n callbacks.forEach((callback) => {\n callback(event);\n });\n }\n\n change(listener: VisibilityStateListener): () => void {\n this._stateListeners.push(listener);\n const remover = () => {\n this.remove(listener, 'change');\n };\n return remover;\n }\n\n visible(callback: VisibilityTypedCallback): () => void {\n this._typedCallbacks.visible.push(callback);\n const remover = () => {\n this.remove(callback, 'visible');\n };\n return remover;\n }\n\n hidden(callback: VisibilityTypedCallback): () => void {\n this._typedCallbacks.hidden.push(callback);\n const remover = () => {\n this.remove(callback, 'hidden');\n };\n return remover;\n }\n\n remove(\n listenerOrCallback: VisibilityStateListener | VisibilityTypedCallback,\n targetState?: VisibilityState | 'change',\n ): void {\n if (!targetState || targetState === 'change') {\n const index = this._stateListeners.indexOf(\n <VisibilityStateListener>listenerOrCallback,\n );\n if (index !== -1) {\n this._stateListeners.splice(index, 1);\n return;\n }\n }\n\n for (const state of states) {\n if (targetState && state !== targetState) continue;\n const targets = this._typedCallbacks[state];\n const index = targets.indexOf(\n <VisibilityTypedCallback>listenerOrCallback,\n );\n if (index !== -1) {\n targets.splice(index, 1);\n return;\n }\n }\n }\n}\n","import { VisibilityManager } from './visibility';\n\nexport * from './visibility';\n\nexport const visibilityManager = new VisibilityManager();\n"]}