All files / react-native-web/src/exports/AppState index.js

78.57% Statements 22/28
47.83% Branches 11/23
60% Functions 3/5
80.77% Lines 21/26

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83                                1x   1x 1x 1x   1x         1x     1x                                   3x 3x         2x 2x 2x 2x           6x 6x         5x 5x 5x       2x 2x 2x          
/**
 * Copyright (c) Nicolas Gallagher.
 * Copyright (c) Facebook, Inc. and its affiliates.
 *
 * This source code is licensed under the MIT license found in the
 * LICENSE file in the root directory of this source tree.
 *
 * @noflow
 */
 
import { canUseDOM } from 'fbjs/lib/ExecutionEnvironment';
import findIndex from 'array-find-index';
import invariant from 'fbjs/lib/invariant';
 
// Android 4.4 browser
const isPrefixed =
  canUseDOM && !document.hasOwnProperty('hidden') && document.hasOwnProperty('webkitHidden');
 
const EVENT_TYPES = ['change', 'memoryWarning'];
const VISIBILITY_CHANGE_EVENT = isPrefixed ? 'webkitvisibilitychange' : 'visibilitychange';
const VISIBILITY_STATE_PROPERTY = isPrefixed ? 'webkitVisibilityState' : 'visibilityState';
 
const AppStates = {
  BACKGROUND: 'background',
  ACTIVE: 'active'
};
 
const listeners = [];
 
export default class AppState {
  static isAvailable = canUseDOM && document[VISIBILITY_STATE_PROPERTY];
 
  static get currentState() {
    if (!AppState.isAvailable) {
      return AppStates.ACTIVE;
    }
 
    switch (document[VISIBILITY_STATE_PROPERTY]) {
      case 'hidden':
      case 'prerender':
      case 'unloaded':
        return AppStates.BACKGROUND;
      default:
        return AppStates.ACTIVE;
    }
  }
 
  static addEventListener(type: string, handler: Function) {
    Eif (AppState.isAvailable) {
      invariant(
        EVENT_TYPES.indexOf(type) !== -1,
        'Trying to subscribe to unknown event: "%s"',
        type
      );
      Eif (type === 'change') {
        const callback = () => handler(AppState.currentState);
        listeners.push([handler, callback]);
        document.addEventListener(VISIBILITY_CHANGE_EVENT, callback, false);
      }
    }
  }
 
  static removeEventListener(type: string, handler: Function) {
    Eif (AppState.isAvailable) {
      invariant(
        EVENT_TYPES.indexOf(type) !== -1,
        'Trying to remove listener for unknown event: "%s"',
        type
      );
      Eif (type === 'change') {
        const listenerIndex = findIndex(listeners, (pair) => pair[0] === handler);
        invariant(
          listenerIndex !== -1,
          'Trying to remove AppState listener for unregistered handler'
        );
        const callback = listeners[listenerIndex][1];
        document.removeEventListener(VISIBILITY_CHANGE_EVENT, callback, false);
        listeners.splice(listenerIndex, 1);
      }
    }
  }
}