{"version":3,"file":"focusManager.mjs","sources":["../../../src/vanilla/focusManager.ts"],"sourcesContent":["import { createSubscribable } from './subscribable'\nimport { UNDEFINED, isBoolean, isServer } from './utils'\n\ntype SetupFn = (\n  setFocused: (focused?: boolean) => void\n) => (() => void) | undefined\n\nexport interface FocusManager extends ReturnType<typeof createFocusManager> {}\n\nexport const createFocusManager = () => {\n  let focused: boolean | undefined\n  let cleanup: (() => void) | undefined\n  let setup: SetupFn = onFocus => {\n    // addEventListener does not exist in React Native, but window does\n    if (!isServer && window.addEventListener) {\n      const listener = () => onFocus()\n      // Listen to visibilitychange\n      window.addEventListener('visibilitychange', listener, false)\n\n      return () => {\n        // Be sure to unsubscribe if a new handler is set\n        window.removeEventListener('visibilitychange', listener)\n      }\n    }\n  }\n\n  const [listeners, subscribe, hasListeners] = createSubscribable(\n    function onSubscribe() {\n      if (!cleanup) {\n        setEventListener(setup)\n      }\n    },\n    function onUnsubscribe() {\n      if (!hasListeners()) {\n        cleanup?.()\n        cleanup = UNDEFINED\n      }\n    }\n  )\n\n  const onFocus = () => {\n    listeners.forEach(listener => {\n      listener()\n    })\n  }\n\n  const setFocused = (isFocused?: boolean) => {\n    const changed = isFocused !== focused\n\n    if (changed) {\n      focused = isFocused\n      onFocus()\n    }\n  }\n\n  const setEventListener = (setupFn: SetupFn) => {\n    setup = setupFn\n    cleanup?.()\n    cleanup = setup((focused?: boolean) => {\n      if (isBoolean(focused)) {\n        setFocused(focused)\n      } else {\n        onFocus()\n      }\n    })\n  }\n\n  const isFocused = (): boolean => {\n    if (isBoolean(focused)) {\n      return focused\n    }\n\n    return globalThis.document?.visibilityState !== 'hidden'\n  }\n\n  return {\n    setEventListener,\n    setFocused,\n    isFocused,\n    subscribe,\n  }\n}\n\nexport const focusManager = createFocusManager()\n"],"names":["createFocusManager","focused","cleanup","setup","onFocus","isServer","window","addEventListener","listener","removeEventListener","listeners","subscribe","hasListeners","createSubscribable","onSubscribe","setEventListener","onUnsubscribe","UNDEFINED","forEach","setFocused","isFocused","changed","setupFn","isBoolean","_globalThis$document","globalThis","document","visibilityState","focusManager"],"mappings":";;;AASaA,MAAAA,kBAAkB,GAAGA,MAAM;AACtC,EAAA,IAAIC,OAA4B,CAAA;AAChC,EAAA,IAAIC,OAAiC,CAAA;EACrC,IAAIC,KAAc,GAAGC,OAAO,IAAI;AAC9B;AACA,IAAA,IAAI,CAACC,QAAQ,IAAIC,MAAM,CAACC,gBAAgB,EAAE;AACxC,MAAA,MAAMC,QAAQ,GAAGA,MAAMJ,OAAO,EAAE,CAAA;AAChC;MACAE,MAAM,CAACC,gBAAgB,CAAC,kBAAkB,EAAEC,QAAQ,EAAE,KAAK,CAAC,CAAA;AAE5D,MAAA,OAAO,MAAM;AACX;AACAF,QAAAA,MAAM,CAACG,mBAAmB,CAAC,kBAAkB,EAAED,QAAQ,CAAC,CAAA;OACzD,CAAA;AACH,KAAA;GACD,CAAA;AAED,EAAA,MAAM,CAACE,SAAS,EAAEC,SAAS,EAAEC,YAAY,CAAC,GAAGC,kBAAkB,CAC7D,SAASC,WAAWA,GAAG;IACrB,IAAI,CAACZ,OAAO,EAAE;MACZa,gBAAgB,CAACZ,KAAK,CAAC,CAAA;AACzB,KAAA;AACF,GAAC,EACD,SAASa,aAAaA,GAAG;AACvB,IAAA,IAAI,CAACJ,YAAY,EAAE,EAAE;MACnBV,OAAO,IAAA,IAAA,IAAPA,OAAO,EAAI,CAAA;AACXA,MAAAA,OAAO,GAAGe,SAAS,CAAA;AACrB,KAAA;AACF,GACF,CAAC,CAAA;EAED,MAAMb,OAAO,GAAGA,MAAM;AACpBM,IAAAA,SAAS,CAACQ,OAAO,CAACV,QAAQ,IAAI;AAC5BA,MAAAA,QAAQ,EAAE,CAAA;AACZ,KAAC,CAAC,CAAA;GACH,CAAA;EAED,MAAMW,UAAU,GAAIC,SAAmB,IAAK;AAC1C,IAAA,MAAMC,OAAO,GAAGD,SAAS,KAAKnB,OAAO,CAAA;AAErC,IAAA,IAAIoB,OAAO,EAAE;AACXpB,MAAAA,OAAO,GAAGmB,SAAS,CAAA;AACnBhB,MAAAA,OAAO,EAAE,CAAA;AACX,KAAA;GACD,CAAA;EAED,MAAMW,gBAAgB,GAAIO,OAAgB,IAAK;AAC7CnB,IAAAA,KAAK,GAAGmB,OAAO,CAAA;IACfpB,OAAO,IAAA,IAAA,IAAPA,OAAO,EAAI,CAAA;AACXA,IAAAA,OAAO,GAAGC,KAAK,CAAEF,OAAiB,IAAK;AACrC,MAAA,IAAIsB,SAAS,CAACtB,OAAO,CAAC,EAAE;QACtBkB,UAAU,CAAClB,OAAO,CAAC,CAAA;AACrB,OAAC,MAAM;AACLG,QAAAA,OAAO,EAAE,CAAA;AACX,OAAA;AACF,KAAC,CAAC,CAAA;GACH,CAAA;EAED,MAAMgB,SAAS,GAAGA,MAAe;AAAA,IAAA,IAAAI,oBAAA,CAAA;AAC/B,IAAA,IAAID,SAAS,CAACtB,OAAO,CAAC,EAAE;AACtB,MAAA,OAAOA,OAAO,CAAA;AAChB,KAAA;IAEA,OAAO,CAAA,CAAAuB,oBAAA,GAAAC,UAAU,CAACC,QAAQ,KAAA,IAAA,GAAA,KAAA,CAAA,GAAnBF,oBAAA,CAAqBG,eAAe,MAAK,QAAQ,CAAA;GACzD,CAAA;EAED,OAAO;IACLZ,gBAAgB;IAChBI,UAAU;IACVC,SAAS;AACTT,IAAAA,SAAAA;GACD,CAAA;AACH,EAAC;AAEYiB,MAAAA,YAAY,GAAG5B,kBAAkB;;;;"}