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 {NativeEventEmitter} from '../../EventEmitter/NativeEventEmitter';
11import {EmitterSubscription} from '../../vendor/emitter/EventEmitter';
12
13export type KeyboardEventName =
14  | 'keyboardWillShow'
15  | 'keyboardDidShow'
16  | 'keyboardWillHide'
17  | 'keyboardDidHide'
18  | 'keyboardWillChangeFrame'
19  | 'keyboardDidChangeFrame';
20
21export type KeyboardEventEasing =
22  | 'easeIn'
23  | 'easeInEaseOut'
24  | 'easeOut'
25  | 'linear'
26  | 'keyboard';
27
28type KeyboardMetrics = {
29  screenX: number;
30  screenY: number;
31  width: number;
32  height: number;
33};
34
35interface KeyboardEventIOS {
36  /**
37   * @platform ios
38   */
39  startCoordinates: KeyboardMetrics;
40  /**
41   * @platform ios
42   */
43  isEventFromThisApp: boolean;
44}
45
46export interface KeyboardEvent extends Partial<KeyboardEventIOS> {
47  /**
48   * Always set to 0 on Android.
49   */
50  duration: number;
51  /**
52   * Always set to "keyboard" on Android.
53   */
54  easing: KeyboardEventEasing;
55  endCoordinates: KeyboardMetrics;
56}
57
58type KeyboardEventListener = (event: KeyboardEvent) => void;
59
60export interface KeyboardStatic extends NativeEventEmitter {
61  /**
62   * Dismisses the active keyboard and removes focus.
63   */
64  dismiss: () => void;
65  /**
66   * The `addListener` function connects a JavaScript function to an identified native
67   * keyboard notification event.
68   *
69   * This function then returns the reference to the listener.
70   *
71   * {string} eventName The `nativeEvent` is the string that identifies the event you're listening for.  This
72   *can be any of the following:
73   *
74   * - `keyboardWillShow`
75   * - `keyboardDidShow`
76   * - `keyboardWillHide`
77   * - `keyboardDidHide`
78   * - `keyboardWillChangeFrame`
79   * - `keyboardDidChangeFrame`
80   *
81   * Note that if you set `android:windowSoftInputMode` to `adjustResize`  or `adjustNothing`,
82   * only `keyboardDidShow` and `keyboardDidHide` events will be available on Android.
83   * `keyboardWillShow` as well as `keyboardWillHide` are generally not available on Android
84   * since there is no native corresponding event.
85   *
86   * {function} callback function to be called when the event fires.
87   */
88  addListener: (
89    eventType: KeyboardEventName,
90    listener: KeyboardEventListener,
91  ) => EmitterSubscription;
92  /**
93   * Useful for syncing TextInput (or other keyboard accessory view) size of
94   * position changes with keyboard movements.
95   */
96  scheduleLayoutAnimation: (event: KeyboardEvent) => void;
97
98  /**
99   * Whether the keyboard is last known to be visible.
100   */
101  isVisible(): boolean;
102
103  /**
104   * Return the metrics of the soft-keyboard if visible.
105   */
106  metrics(): KeyboardMetrics | undefined;
107}
108
109export const Keyboard: KeyboardStatic;
110