1/**
2 * Copyright (c) Meta Platforms, Inc. and affiliates.
3 *
4 * This source code is licensed under the MIT license found in the
5 * LICENSE file in the root directory of this source tree.
6 *
7 * @format
8 */
9
10import {NativeEventSubscription} from '../EventEmitter/RCTNativeAppEventEmitter';
11
12/**
13 * AppState can tell you if the app is in the foreground or background,
14 * and notify you when the state changes.
15 *
16 * AppState is frequently used to determine the intent and proper behavior
17 * when handling push notifications.
18 *
19 * App State Events
20 *      change - This even is received when the app state has changed.
21 *      focus [Android] - Received when the app gains focus (the user is interacting with the app).
22 *      blur [Android] - Received when the user is not actively interacting with the app.
23 *
24 * App States
25 *      active - The app is running in the foreground
26 *      background - The app is running in the background. The user is either in another app or on the home screen
27 *      inactive [iOS] - This is a transition state that currently never happens for typical React Native apps.
28 *      unknown [iOS] - Initial value until the current app state is determined
29 *      extension [iOS] - The app is running as an app extension
30 *
31 * For more information, see Apple's documentation: https://developer.apple.com/library/ios/documentation/iPhone/Conceptual/iPhoneOSProgrammingGuide/TheAppLifeCycle/TheAppLifeCycle.html
32 *
33 * @see https://reactnative.dev/docs/appstate#app-states
34 */
35export type AppStateEvent = 'change' | 'memoryWarning' | 'blur' | 'focus';
36export type AppStateStatus =
37  | 'active'
38  | 'background'
39  | 'inactive'
40  | 'unknown'
41  | 'extension';
42
43export interface AppStateStatic {
44  currentState: AppStateStatus;
45  isAvailable: boolean;
46
47  /**
48   * Add a handler to AppState changes by listening to the change event
49   * type and providing the handler
50   */
51  addEventListener(
52    type: AppStateEvent,
53    listener: (state: AppStateStatus) => void,
54  ): NativeEventSubscription;
55}
56
57export const AppState: AppStateStatic;
58export type AppState = AppStateStatic;
59