focusManager.js 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. 'use strict';
  2. Object.defineProperty(exports, '__esModule', { value: true });
  3. var subscribable = require('./subscribable.js');
  4. var utils = require('./utils.js');
  5. class FocusManager extends subscribable.Subscribable {
  6. constructor() {
  7. super();
  8. this.setup = onFocus => {
  9. // addEventListener does not exist in React Native, but window does
  10. // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
  11. if (!utils.isServer && window.addEventListener) {
  12. const listener = () => onFocus(); // Listen to visibillitychange and focus
  13. window.addEventListener('visibilitychange', listener, false);
  14. window.addEventListener('focus', listener, false);
  15. return () => {
  16. // Be sure to unsubscribe if a new handler is set
  17. window.removeEventListener('visibilitychange', listener);
  18. window.removeEventListener('focus', listener);
  19. };
  20. }
  21. return;
  22. };
  23. }
  24. onSubscribe() {
  25. if (!this.cleanup) {
  26. this.setEventListener(this.setup);
  27. }
  28. }
  29. onUnsubscribe() {
  30. if (!this.hasListeners()) {
  31. var _this$cleanup;
  32. (_this$cleanup = this.cleanup) == null ? void 0 : _this$cleanup.call(this);
  33. this.cleanup = undefined;
  34. }
  35. }
  36. setEventListener(setup) {
  37. var _this$cleanup2;
  38. this.setup = setup;
  39. (_this$cleanup2 = this.cleanup) == null ? void 0 : _this$cleanup2.call(this);
  40. this.cleanup = setup(focused => {
  41. if (typeof focused === 'boolean') {
  42. this.setFocused(focused);
  43. } else {
  44. this.onFocus();
  45. }
  46. });
  47. }
  48. setFocused(focused) {
  49. const changed = this.focused !== focused;
  50. if (changed) {
  51. this.focused = focused;
  52. this.onFocus();
  53. }
  54. }
  55. onFocus() {
  56. this.listeners.forEach(({
  57. listener
  58. }) => {
  59. listener();
  60. });
  61. }
  62. isFocused() {
  63. if (typeof this.focused === 'boolean') {
  64. return this.focused;
  65. } // document global can be unavailable in react native
  66. if (typeof document === 'undefined') {
  67. return true;
  68. }
  69. return [undefined, 'visible', 'prerender'].includes(document.visibilityState);
  70. }
  71. }
  72. const focusManager = new FocusManager();
  73. exports.FocusManager = FocusManager;
  74. exports.focusManager = focusManager;
  75. //# sourceMappingURL=focusManager.js.map