{"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"]}