react-native-keyboard-controller 1.4.2 → 1.4.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -3,6 +3,7 @@ package com.reactnativekeyboardcontroller
3
3
  import com.facebook.react.bridge.ReactApplicationContext
4
4
  import com.facebook.react.uimanager.ThemedReactContext
5
5
  import com.facebook.react.uimanager.ViewManagerDelegate
6
+ import com.facebook.react.uimanager.annotations.ReactProp
6
7
  import com.facebook.react.viewmanagers.KeyboardControllerViewManagerDelegate
7
8
  import com.facebook.react.viewmanagers.KeyboardControllerViewManagerInterface
8
9
  import com.facebook.react.views.view.ReactViewGroup
@@ -23,10 +24,16 @@ class KeyboardControllerViewManager(mReactContext: ReactApplicationContext) : Re
23
24
  return manager.createViewInstance(context)
24
25
  }
25
26
 
27
+ @ReactProp(name = "statusBarTranslucent")
26
28
  override fun setStatusBarTranslucent(view: ReactViewGroup, value: Boolean) {
27
29
  return manager.setStatusBarTranslucent(view, value)
28
30
  }
29
31
 
32
+ @ReactProp(name = "navigationBarTranslucent")
33
+ override fun setNavigationBarTranslucent(view: ReactViewGroup, value: Boolean) {
34
+ return manager.setNavigationBarTranslucent(view, value)
35
+ }
36
+
30
37
  override fun getExportedCustomDirectEventTypeConstants(): MutableMap<String, Any> {
31
38
  return manager.getExportedCustomDirectEventTypeConstants()
32
39
  }
@@ -11,9 +11,9 @@ import androidx.core.view.ViewCompat
11
11
  import androidx.core.view.WindowInsetsAnimationCompat
12
12
  import androidx.core.view.WindowInsetsCompat
13
13
  import com.facebook.react.bridge.Arguments
14
- import com.facebook.react.bridge.ReactApplicationContext
15
14
  import com.facebook.react.bridge.WritableMap
16
15
  import com.facebook.react.modules.core.DeviceEventManagerModule
16
+ import com.facebook.react.uimanager.ThemedReactContext
17
17
  import com.facebook.react.uimanager.UIManagerHelper
18
18
  import com.facebook.react.uimanager.events.Event
19
19
  import com.facebook.react.uimanager.events.EventDispatcher
@@ -26,7 +26,7 @@ class KeyboardAnimationCallback(
26
26
  val persistentInsetTypes: Int,
27
27
  val deferredInsetTypes: Int,
28
28
  dispatchMode: Int = DISPATCH_MODE_STOP,
29
- val context: ReactApplicationContext?,
29
+ val context: ThemedReactContext?,
30
30
  val onApplyWindowInsetsListener: OnApplyWindowInsetsListener,
31
31
  ) : WindowInsetsAnimationCompat.Callback(dispatchMode), OnApplyWindowInsetsListener {
32
32
  private val TAG = KeyboardAnimationCallback::class.qualifiedName
@@ -0,0 +1,29 @@
1
+ package com.reactnativekeyboardcontroller.extensions
2
+
3
+ import android.os.Build
4
+ import android.view.View
5
+
6
+ /**
7
+ * Call this everytime when using [ViewCompat.setOnApplyWindowInsetsListener]
8
+ * to ensure that insets are always received.
9
+ * @see https://stackoverflow.com/a/61909205/9272042
10
+ */
11
+ fun View.requestApplyInsetsWhenAttached() {
12
+ // https://chris.banes.dev/2019/04/12/insets-listeners-to-layouts/
13
+ if (Build.VERSION.SDK_INT > Build.VERSION_CODES.KITKAT && isAttachedToWindow) {
14
+ // We're already attached, just request as normal
15
+ requestApplyInsets()
16
+ } else {
17
+ // We're not attached to the hierarchy, add a listener to request when we are
18
+ addOnAttachStateChangeListener(object : View.OnAttachStateChangeListener {
19
+ override fun onViewAttachedToWindow(v: View) {
20
+ v.removeOnAttachStateChangeListener(this)
21
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT_WATCH) {
22
+ v.requestApplyInsets()
23
+ }
24
+ }
25
+
26
+ override fun onViewDetachedFromWindow(v: View) = Unit
27
+ })
28
+ }
29
+ }
@@ -11,16 +11,17 @@ import com.facebook.react.uimanager.ThemedReactContext
11
11
  import com.facebook.react.views.view.ReactViewGroup
12
12
  import com.reactnativekeyboardcontroller.KeyboardAnimationCallback
13
13
  import com.reactnativekeyboardcontroller.R
14
+ import com.reactnativekeyboardcontroller.extensions.requestApplyInsetsWhenAttached
14
15
  import com.reactnativekeyboardcontroller.views.EdgeToEdgeReactViewGroup
15
16
 
16
- class KeyboardControllerViewManagerImpl(reactContext: ReactApplicationContext) {
17
+ class KeyboardControllerViewManagerImpl(private val mReactContext: ReactApplicationContext) {
17
18
  private val TAG = KeyboardControllerViewManagerImpl::class.qualifiedName
18
- private var mReactContext = reactContext
19
19
  private var isStatusBarTranslucent = false
20
+ private var isNavigationBarTranslucent = false
20
21
 
21
22
  fun createViewInstance(reactContext: ThemedReactContext): ReactViewGroup {
22
23
  val view = EdgeToEdgeReactViewGroup(reactContext)
23
- val activity = mReactContext.currentActivity
24
+ val activity = reactContext.currentActivity
24
25
 
25
26
  if (activity == null) {
26
27
  Log.w(TAG, "Can not setup keyboard animation listener, since `currentActivity` is null")
@@ -34,17 +35,17 @@ class KeyboardControllerViewManagerImpl(reactContext: ReactApplicationContext) {
34
35
  // We explicitly allow dispatch to continue down to binding.messageHolder's
35
36
  // child views, so that step 2.5 below receives the call
36
37
  dispatchMode = WindowInsetsAnimationCompat.Callback.DISPATCH_MODE_CONTINUE_ON_SUBTREE,
37
- context = mReactContext,
38
+ context = reactContext,
38
39
  onApplyWindowInsetsListener = { v, insets ->
39
40
  val content =
40
- mReactContext.currentActivity?.window?.decorView?.rootView?.findViewById<FitWindowsLinearLayout>(
41
+ reactContext.currentActivity?.window?.decorView?.rootView?.findViewById<FitWindowsLinearLayout>(
41
42
  R.id.action_bar_root,
42
43
  )
43
44
  content?.setPadding(
44
45
  0,
45
46
  if (this.isStatusBarTranslucent) 0 else insets?.getInsets(WindowInsetsCompat.Type.systemBars())?.top ?: 0,
46
47
  0,
47
- insets?.getInsets(WindowInsetsCompat.Type.navigationBars())?.bottom ?: 0,
48
+ if (this.isNavigationBarTranslucent) 0 else insets?.getInsets(WindowInsetsCompat.Type.navigationBars())?.bottom ?: 0,
48
49
  )
49
50
 
50
51
  insets
@@ -52,6 +53,7 @@ class KeyboardControllerViewManagerImpl(reactContext: ReactApplicationContext) {
52
53
  )
53
54
  ViewCompat.setWindowInsetsAnimationCallback(view, callback)
54
55
  ViewCompat.setOnApplyWindowInsetsListener(view, callback)
56
+ view.requestApplyInsetsWhenAttached()
55
57
 
56
58
  return view
57
59
  }
@@ -60,6 +62,10 @@ class KeyboardControllerViewManagerImpl(reactContext: ReactApplicationContext) {
60
62
  this.isStatusBarTranslucent = isStatusBarTranslucent
61
63
  }
62
64
 
65
+ fun setNavigationBarTranslucent(view: ReactViewGroup, isNavigationBarTranslucent: Boolean) {
66
+ this.isNavigationBarTranslucent = isNavigationBarTranslucent
67
+ }
68
+
63
69
  fun getExportedCustomDirectEventTypeConstants(): MutableMap<String, Any> {
64
70
  val map: MutableMap<String, Any> = MapBuilder.of(
65
71
  "topKeyboardMove",
@@ -21,6 +21,11 @@ class KeyboardControllerViewManager(mReactContext: ReactApplicationContext) : Re
21
21
  manager.setStatusBarTranslucent(view, isStatusBarTranslucent)
22
22
  }
23
23
 
24
+ @ReactProp(name = "navigationBarTranslucent")
25
+ fun setNavigationBarTranslucent(view: ReactViewGroup, isNavigationBarTranslucent: Boolean) {
26
+ manager.setNavigationBarTranslucent(view, isNavigationBarTranslucent)
27
+ }
28
+
24
29
  override fun getExportedCustomDirectEventTypeConstants(): MutableMap<String, Any> {
25
30
  return manager.getExportedCustomDirectEventTypeConstants()
26
31
  }
@@ -36,7 +36,8 @@ const styles = _reactNative.StyleSheet.create({
36
36
  const KeyboardProvider = _ref => {
37
37
  let {
38
38
  children,
39
- statusBarTranslucent
39
+ statusBarTranslucent,
40
+ navigationBarTranslucent
40
41
  } = _ref;
41
42
  // animated values
42
43
  const progress = (0, _internal.useAnimatedValue)(0);
@@ -110,6 +111,7 @@ const KeyboardProvider = _ref => {
110
111
  onKeyboardMoveReanimated: handler,
111
112
  onKeyboardMoveStart: _reactNative.Platform.OS === 'ios' ? onKeyboardMove : undefined,
112
113
  onKeyboardMove: _reactNative.Platform.OS === 'android' ? onKeyboardMove : undefined,
114
+ navigationBarTranslucent: navigationBarTranslucent,
113
115
  statusBarTranslucent: statusBarTranslucent,
114
116
  style: styles.container
115
117
  }, /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/_react.default.createElement(_reactNative.Animated.View, {
@@ -1 +1 @@
1
- {"version":3,"names":["KeyboardControllerViewAnimated","Reanimated","createAnimatedComponent","Animated","KeyboardControllerView","styles","StyleSheet","create","container","flex","hidden","display","position","KeyboardProvider","children","statusBarTranslucent","progress","useAnimatedValue","height","progressSV","useSharedValue","heightSV","setHandlers","broadcast","useSharedHandlers","context","useMemo","animated","multiply","reanimated","style","transform","translateX","translateY","onKeyboardMove","event","nativeEvent","useNativeDriver","updateSharedValues","platforms","includes","Platform","OS","value","handler","useAnimatedKeyboardHandler","onKeyboardMoveStart","onKeyboardMoveEnd","undefined"],"sources":["animated.tsx"],"sourcesContent":["import React, { useMemo } from 'react';\nimport { Animated, Platform, StyleSheet, ViewStyle } from 'react-native';\nimport Reanimated, { useSharedValue } from 'react-native-reanimated';\n\nimport { KeyboardContext } from './context';\nimport {\n useAnimatedKeyboardHandler,\n useSharedHandlers,\n useAnimatedValue,\n} from './internal';\nimport { KeyboardControllerView } from './native';\n\nimport type {\n KeyboardControllerProps,\n KeyboardHandler,\n NativeEvent,\n} from './types';\n\nconst KeyboardControllerViewAnimated = Reanimated.createAnimatedComponent(\n Animated.createAnimatedComponent(\n KeyboardControllerView\n ) as React.FC<KeyboardControllerProps>\n);\n\ntype Styles = {\n container: ViewStyle;\n hidden: ViewStyle;\n};\n\nconst styles = StyleSheet.create<Styles>({\n container: {\n flex: 1,\n },\n hidden: {\n display: 'none',\n position: 'absolute',\n },\n});\n\ntype KeyboardProviderProps = {\n children: React.ReactNode;\n /**\n * Set the value to `true`, if you use translucent status bar on Android.\n * If you already control status bar translucency via `react-native-screens`\n * or `StatusBar` component from `react-native`, you can ignore it.\n * Defaults to `false`.\n *\n * @see https://github.com/kirillzyusko/react-native-keyboard-controller/issues/14\n * @platform android\n */\n statusBarTranslucent?: boolean;\n};\n\nexport const KeyboardProvider = ({\n children,\n statusBarTranslucent,\n}: KeyboardProviderProps) => {\n // animated values\n const progress = useAnimatedValue(0);\n const height = useAnimatedValue(0);\n // shared values\n const progressSV = useSharedValue(0);\n const heightSV = useSharedValue(0);\n const { setHandlers, broadcast } = useSharedHandlers<KeyboardHandler>();\n // memo\n const context = useMemo(\n () => ({\n animated: { progress: progress, height: Animated.multiply(height, -1) },\n reanimated: { progress: progressSV, height: heightSV },\n setHandlers,\n }),\n []\n );\n const style = useMemo(\n () => [\n styles.hidden,\n { transform: [{ translateX: height }, { translateY: progress }] },\n ],\n []\n );\n const onKeyboardMove = useMemo(\n () =>\n Animated.event(\n [\n {\n nativeEvent: {\n progress,\n height,\n },\n },\n ],\n { useNativeDriver: true }\n ),\n []\n );\n // handlers\n const updateSharedValues = (event: NativeEvent, platforms: string[]) => {\n 'worklet';\n\n if (platforms.includes(Platform.OS)) {\n progressSV.value = event.progress;\n heightSV.value = -event.height;\n }\n };\n const handler = useAnimatedKeyboardHandler(\n {\n onKeyboardMoveStart: (event: NativeEvent) => {\n 'worklet';\n\n broadcast('onStart', event);\n updateSharedValues(event, ['ios']);\n },\n onKeyboardMove: (event: NativeEvent) => {\n 'worklet';\n\n broadcast('onMove', event);\n updateSharedValues(event, ['android']);\n },\n onKeyboardMoveEnd: (event: NativeEvent) => {\n 'worklet';\n\n broadcast('onEnd', event);\n },\n },\n []\n );\n\n return (\n <KeyboardContext.Provider value={context}>\n <KeyboardControllerViewAnimated\n onKeyboardMoveReanimated={handler}\n onKeyboardMoveStart={Platform.OS === 'ios' ? onKeyboardMove : undefined}\n onKeyboardMove={Platform.OS === 'android' ? onKeyboardMove : undefined}\n statusBarTranslucent={statusBarTranslucent}\n style={styles.container}\n >\n <>\n <Animated.View\n // we are using this small hack, because if the component (where\n // animated value has been used) is unmounted, then animation will\n // stop receiving events (seems like it's react-native optimization).\n // So we need to keep a reference to the animated value, to keep it's\n // always mounted (keep a reference to an animated value).\n //\n // To test why it's needed, try to open screen which consumes Animated.Value\n // then close it and open it again (for example 'Animated transition').\n style={style}\n />\n {children}\n </>\n </KeyboardControllerViewAnimated>\n </KeyboardContext.Provider>\n );\n};\n"],"mappings":"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"}
1
+ {"version":3,"names":["KeyboardControllerViewAnimated","Reanimated","createAnimatedComponent","Animated","KeyboardControllerView","styles","StyleSheet","create","container","flex","hidden","display","position","KeyboardProvider","children","statusBarTranslucent","navigationBarTranslucent","progress","useAnimatedValue","height","progressSV","useSharedValue","heightSV","setHandlers","broadcast","useSharedHandlers","context","useMemo","animated","multiply","reanimated","style","transform","translateX","translateY","onKeyboardMove","event","nativeEvent","useNativeDriver","updateSharedValues","platforms","includes","Platform","OS","value","handler","useAnimatedKeyboardHandler","onKeyboardMoveStart","onKeyboardMoveEnd","undefined"],"sources":["animated.tsx"],"sourcesContent":["import React, { useMemo } from 'react';\nimport { Animated, Platform, StyleSheet, ViewStyle } from 'react-native';\nimport Reanimated, { useSharedValue } from 'react-native-reanimated';\n\nimport { KeyboardContext } from './context';\nimport {\n useAnimatedKeyboardHandler,\n useSharedHandlers,\n useAnimatedValue,\n} from './internal';\nimport { KeyboardControllerView } from './native';\n\nimport type {\n KeyboardControllerProps,\n KeyboardHandler,\n NativeEvent,\n} from './types';\n\nconst KeyboardControllerViewAnimated = Reanimated.createAnimatedComponent(\n Animated.createAnimatedComponent(\n KeyboardControllerView\n ) as React.FC<KeyboardControllerProps>\n);\n\ntype Styles = {\n container: ViewStyle;\n hidden: ViewStyle;\n};\n\nconst styles = StyleSheet.create<Styles>({\n container: {\n flex: 1,\n },\n hidden: {\n display: 'none',\n position: 'absolute',\n },\n});\n\ntype KeyboardProviderProps = {\n children: React.ReactNode;\n /**\n * Set the value to `true`, if you use translucent status bar on Android.\n * If you already control status bar translucency via `react-native-screens`\n * or `StatusBar` component from `react-native`, you can ignore it.\n * Defaults to `false`.\n *\n * @see https://github.com/kirillzyusko/react-native-keyboard-controller/issues/14\n * @platform android\n */\n statusBarTranslucent?: boolean;\n /**\n * Set the value to `true`, if you use translucent navigation bar on Android.\n * Defaults to `false`.\n *\n * @see https://github.com/kirillzyusko/react-native-keyboard-controller/issues/119\n * @platform android\n */\n navigationBarTranslucent?: boolean;\n};\n\nexport const KeyboardProvider = ({\n children,\n statusBarTranslucent,\n navigationBarTranslucent,\n}: KeyboardProviderProps) => {\n // animated values\n const progress = useAnimatedValue(0);\n const height = useAnimatedValue(0);\n // shared values\n const progressSV = useSharedValue(0);\n const heightSV = useSharedValue(0);\n const { setHandlers, broadcast } = useSharedHandlers<KeyboardHandler>();\n // memo\n const context = useMemo(\n () => ({\n animated: { progress: progress, height: Animated.multiply(height, -1) },\n reanimated: { progress: progressSV, height: heightSV },\n setHandlers,\n }),\n []\n );\n const style = useMemo(\n () => [\n styles.hidden,\n { transform: [{ translateX: height }, { translateY: progress }] },\n ],\n []\n );\n const onKeyboardMove = useMemo(\n () =>\n Animated.event(\n [\n {\n nativeEvent: {\n progress,\n height,\n },\n },\n ],\n { useNativeDriver: true }\n ),\n []\n );\n // handlers\n const updateSharedValues = (event: NativeEvent, platforms: string[]) => {\n 'worklet';\n\n if (platforms.includes(Platform.OS)) {\n progressSV.value = event.progress;\n heightSV.value = -event.height;\n }\n };\n const handler = useAnimatedKeyboardHandler(\n {\n onKeyboardMoveStart: (event: NativeEvent) => {\n 'worklet';\n\n broadcast('onStart', event);\n updateSharedValues(event, ['ios']);\n },\n onKeyboardMove: (event: NativeEvent) => {\n 'worklet';\n\n broadcast('onMove', event);\n updateSharedValues(event, ['android']);\n },\n onKeyboardMoveEnd: (event: NativeEvent) => {\n 'worklet';\n\n broadcast('onEnd', event);\n },\n },\n []\n );\n\n return (\n <KeyboardContext.Provider value={context}>\n <KeyboardControllerViewAnimated\n onKeyboardMoveReanimated={handler}\n onKeyboardMoveStart={Platform.OS === 'ios' ? onKeyboardMove : undefined}\n onKeyboardMove={Platform.OS === 'android' ? onKeyboardMove : undefined}\n navigationBarTranslucent={navigationBarTranslucent}\n statusBarTranslucent={statusBarTranslucent}\n style={styles.container}\n >\n <>\n <Animated.View\n // we are using this small hack, because if the component (where\n // animated value has been used) is unmounted, then animation will\n // stop receiving events (seems like it's react-native optimization).\n // So we need to keep a reference to the animated value, to keep it's\n // always mounted (keep a reference to an animated value).\n //\n // To test why it's needed, try to open screen which consumes Animated.Value\n // then close it and open it again (for example 'Animated transition').\n style={style}\n />\n {children}\n </>\n </KeyboardControllerViewAnimated>\n </KeyboardContext.Provider>\n );\n};\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"names":["codegenNativeComponent"],"sources":["KeyboardControllerViewNativeComponent.ts"],"sourcesContent":["import type { HostComponent } from 'react-native';\n// @ts-expect-error - no type definition\nimport type { ViewProps } from 'react-native/Libraries/Components/View/ViewPropTypes';\nimport type {\n DirectEventHandler,\n Float,\n Int32,\n} from 'react-native/Libraries/Types/CodegenTypes';\nimport codegenNativeComponent from 'react-native/Libraries/Utilities/codegenNativeComponent';\n\ntype KeyboardMoveEvent = Readonly<{\n height: Int32;\n progress: Float;\n}>;\n\nexport interface NativeProps extends ViewProps {\n // props\n statusBarTranslucent?: boolean;\n // callbacks\n onKeyboardMove?: DirectEventHandler<KeyboardMoveEvent>;\n onKeyboardMoveStart?: DirectEventHandler<KeyboardMoveEvent>;\n onKeyboardMoveEnd?: DirectEventHandler<KeyboardMoveEvent>;\n}\n\nexport default codegenNativeComponent<NativeProps>(\n 'KeyboardControllerView'\n) as HostComponent<NativeProps>;\n"],"mappings":";;;;;;;AAQA;;;;AAPA;eAuBe,IAAAA,+BAAA,EACb,wBADa,C"}
1
+ {"version":3,"names":["codegenNativeComponent"],"sources":["KeyboardControllerViewNativeComponent.ts"],"sourcesContent":["import type { HostComponent } from 'react-native';\n// @ts-expect-error - no type definition\nimport type { ViewProps } from 'react-native/Libraries/Components/View/ViewPropTypes';\nimport type {\n DirectEventHandler,\n Float,\n Int32,\n} from 'react-native/Libraries/Types/CodegenTypes';\nimport codegenNativeComponent from 'react-native/Libraries/Utilities/codegenNativeComponent';\n\ntype KeyboardMoveEvent = Readonly<{\n height: Int32;\n progress: Float;\n}>;\n\nexport interface NativeProps extends ViewProps {\n // props\n statusBarTranslucent?: boolean;\n navigationBarTranslucent?: boolean;\n // callbacks\n onKeyboardMove?: DirectEventHandler<KeyboardMoveEvent>;\n onKeyboardMoveStart?: DirectEventHandler<KeyboardMoveEvent>;\n onKeyboardMoveEnd?: DirectEventHandler<KeyboardMoveEvent>;\n}\n\nexport default codegenNativeComponent<NativeProps>(\n 'KeyboardControllerView'\n) as HostComponent<NativeProps>;\n"],"mappings":";;;;;;;AAQA;;;;AAPA;eAwBe,IAAAA,+BAAA,EACb,wBADa,C"}
@@ -1 +1 @@
1
- {"version":3,"names":[],"sources":["types.ts"],"sourcesContent":["import type { NativeSyntheticEvent, ViewProps } from 'react-native';\n\n// DirectEventHandler events declaration\n\nexport type NativeEvent = {\n progress: number;\n height: number;\n};\nexport type EventWithName<T> = {\n eventName: string;\n} & T;\n\n// native View/Module declarations\n\nexport type KeyboardControllerProps = {\n onKeyboardMoveStart?: (\n e: NativeSyntheticEvent<EventWithName<NativeEvent>>\n ) => void;\n onKeyboardMove?: (\n e: NativeSyntheticEvent<EventWithName<NativeEvent>>\n ) => void;\n onKeyboardMoveEnd?: (\n e: NativeSyntheticEvent<EventWithName<NativeEvent>>\n ) => void;\n // fake prop used to activate reanimated bindings\n onKeyboardMoveReanimated?: (\n e: NativeSyntheticEvent<EventWithName<NativeEvent>>\n ) => void;\n statusBarTranslucent?: boolean;\n} & ViewProps;\n\nexport type KeyboardControllerModule = {\n // android only\n setDefaultMode: () => void;\n setInputMode: (mode: number) => void;\n // native event module stuff\n addListener: (eventName: string) => void;\n removeListeners: (count: number) => void;\n};\n\n// Event module declarations\n\nexport type KeyboardControllerEvents =\n | 'keyboardWillShow'\n | 'keyboardDidShow'\n | 'keyboardWillHide'\n | 'keyboardDidHide';\nexport type KeyboardEventData = {\n height: number;\n};\n\n// package types\n\nexport type Handlers<T> = Record<string, T | undefined>;\nexport type KeyboardHandler = {\n onStart?: (e: NativeEvent) => void;\n onMove?: (e: NativeEvent) => void;\n onEnd?: (e: NativeEvent) => void;\n};\nexport type KeyboardHandlers = Handlers<KeyboardHandler>;\n"],"mappings":""}
1
+ {"version":3,"names":[],"sources":["types.ts"],"sourcesContent":["import type { NativeSyntheticEvent, ViewProps } from 'react-native';\n\n// DirectEventHandler events declaration\n\nexport type NativeEvent = {\n progress: number;\n height: number;\n};\nexport type EventWithName<T> = {\n eventName: string;\n} & T;\n\n// native View/Module declarations\n\nexport type KeyboardControllerProps = {\n onKeyboardMoveStart?: (\n e: NativeSyntheticEvent<EventWithName<NativeEvent>>\n ) => void;\n onKeyboardMove?: (\n e: NativeSyntheticEvent<EventWithName<NativeEvent>>\n ) => void;\n onKeyboardMoveEnd?: (\n e: NativeSyntheticEvent<EventWithName<NativeEvent>>\n ) => void;\n // fake prop used to activate reanimated bindings\n onKeyboardMoveReanimated?: (\n e: NativeSyntheticEvent<EventWithName<NativeEvent>>\n ) => void;\n statusBarTranslucent?: boolean;\n navigationBarTranslucent?: boolean;\n} & ViewProps;\n\nexport type KeyboardControllerModule = {\n // android only\n setDefaultMode: () => void;\n setInputMode: (mode: number) => void;\n // native event module stuff\n addListener: (eventName: string) => void;\n removeListeners: (count: number) => void;\n};\n\n// Event module declarations\n\nexport type KeyboardControllerEvents =\n | 'keyboardWillShow'\n | 'keyboardDidShow'\n | 'keyboardWillHide'\n | 'keyboardDidHide';\nexport type KeyboardEventData = {\n height: number;\n};\n\n// package types\n\nexport type Handlers<T> = Record<string, T | undefined>;\nexport type KeyboardHandler = {\n onStart?: (e: NativeEvent) => void;\n onMove?: (e: NativeEvent) => void;\n onEnd?: (e: NativeEvent) => void;\n};\nexport type KeyboardHandlers = Handlers<KeyboardHandler>;\n"],"mappings":""}
@@ -17,7 +17,8 @@ const styles = StyleSheet.create({
17
17
  export const KeyboardProvider = _ref => {
18
18
  let {
19
19
  children,
20
- statusBarTranslucent
20
+ statusBarTranslucent,
21
+ navigationBarTranslucent
21
22
  } = _ref;
22
23
  // animated values
23
24
  const progress = useAnimatedValue(0);
@@ -91,6 +92,7 @@ export const KeyboardProvider = _ref => {
91
92
  onKeyboardMoveReanimated: handler,
92
93
  onKeyboardMoveStart: Platform.OS === 'ios' ? onKeyboardMove : undefined,
93
94
  onKeyboardMove: Platform.OS === 'android' ? onKeyboardMove : undefined,
95
+ navigationBarTranslucent: navigationBarTranslucent,
94
96
  statusBarTranslucent: statusBarTranslucent,
95
97
  style: styles.container
96
98
  }, /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(Animated.View, {
@@ -1 +1 @@
1
- {"version":3,"names":["React","useMemo","Animated","Platform","StyleSheet","Reanimated","useSharedValue","KeyboardContext","useAnimatedKeyboardHandler","useSharedHandlers","useAnimatedValue","KeyboardControllerView","KeyboardControllerViewAnimated","createAnimatedComponent","styles","create","container","flex","hidden","display","position","KeyboardProvider","children","statusBarTranslucent","progress","height","progressSV","heightSV","setHandlers","broadcast","context","animated","multiply","reanimated","style","transform","translateX","translateY","onKeyboardMove","event","nativeEvent","useNativeDriver","updateSharedValues","platforms","includes","OS","value","handler","onKeyboardMoveStart","onKeyboardMoveEnd","undefined"],"sources":["animated.tsx"],"sourcesContent":["import React, { useMemo } from 'react';\nimport { Animated, Platform, StyleSheet, ViewStyle } from 'react-native';\nimport Reanimated, { useSharedValue } from 'react-native-reanimated';\n\nimport { KeyboardContext } from './context';\nimport {\n useAnimatedKeyboardHandler,\n useSharedHandlers,\n useAnimatedValue,\n} from './internal';\nimport { KeyboardControllerView } from './native';\n\nimport type {\n KeyboardControllerProps,\n KeyboardHandler,\n NativeEvent,\n} from './types';\n\nconst KeyboardControllerViewAnimated = Reanimated.createAnimatedComponent(\n Animated.createAnimatedComponent(\n KeyboardControllerView\n ) as React.FC<KeyboardControllerProps>\n);\n\ntype Styles = {\n container: ViewStyle;\n hidden: ViewStyle;\n};\n\nconst styles = StyleSheet.create<Styles>({\n container: {\n flex: 1,\n },\n hidden: {\n display: 'none',\n position: 'absolute',\n },\n});\n\ntype KeyboardProviderProps = {\n children: React.ReactNode;\n /**\n * Set the value to `true`, if you use translucent status bar on Android.\n * If you already control status bar translucency via `react-native-screens`\n * or `StatusBar` component from `react-native`, you can ignore it.\n * Defaults to `false`.\n *\n * @see https://github.com/kirillzyusko/react-native-keyboard-controller/issues/14\n * @platform android\n */\n statusBarTranslucent?: boolean;\n};\n\nexport const KeyboardProvider = ({\n children,\n statusBarTranslucent,\n}: KeyboardProviderProps) => {\n // animated values\n const progress = useAnimatedValue(0);\n const height = useAnimatedValue(0);\n // shared values\n const progressSV = useSharedValue(0);\n const heightSV = useSharedValue(0);\n const { setHandlers, broadcast } = useSharedHandlers<KeyboardHandler>();\n // memo\n const context = useMemo(\n () => ({\n animated: { progress: progress, height: Animated.multiply(height, -1) },\n reanimated: { progress: progressSV, height: heightSV },\n setHandlers,\n }),\n []\n );\n const style = useMemo(\n () => [\n styles.hidden,\n { transform: [{ translateX: height }, { translateY: progress }] },\n ],\n []\n );\n const onKeyboardMove = useMemo(\n () =>\n Animated.event(\n [\n {\n nativeEvent: {\n progress,\n height,\n },\n },\n ],\n { useNativeDriver: true }\n ),\n []\n );\n // handlers\n const updateSharedValues = (event: NativeEvent, platforms: string[]) => {\n 'worklet';\n\n if (platforms.includes(Platform.OS)) {\n progressSV.value = event.progress;\n heightSV.value = -event.height;\n }\n };\n const handler = useAnimatedKeyboardHandler(\n {\n onKeyboardMoveStart: (event: NativeEvent) => {\n 'worklet';\n\n broadcast('onStart', event);\n updateSharedValues(event, ['ios']);\n },\n onKeyboardMove: (event: NativeEvent) => {\n 'worklet';\n\n broadcast('onMove', event);\n updateSharedValues(event, ['android']);\n },\n onKeyboardMoveEnd: (event: NativeEvent) => {\n 'worklet';\n\n broadcast('onEnd', event);\n },\n },\n []\n );\n\n return (\n <KeyboardContext.Provider value={context}>\n <KeyboardControllerViewAnimated\n onKeyboardMoveReanimated={handler}\n onKeyboardMoveStart={Platform.OS === 'ios' ? onKeyboardMove : undefined}\n onKeyboardMove={Platform.OS === 'android' ? onKeyboardMove : undefined}\n statusBarTranslucent={statusBarTranslucent}\n style={styles.container}\n >\n <>\n <Animated.View\n // we are using this small hack, because if the component (where\n // animated value has been used) is unmounted, then animation will\n // stop receiving events (seems like it's react-native optimization).\n // So we need to keep a reference to the animated value, to keep it's\n // always mounted (keep a reference to an animated value).\n //\n // To test why it's needed, try to open screen which consumes Animated.Value\n // then close it and open it again (for example 'Animated transition').\n style={style}\n />\n {children}\n </>\n </KeyboardControllerViewAnimated>\n </KeyboardContext.Provider>\n );\n};\n"],"mappings":"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"}
1
+ {"version":3,"names":["React","useMemo","Animated","Platform","StyleSheet","Reanimated","useSharedValue","KeyboardContext","useAnimatedKeyboardHandler","useSharedHandlers","useAnimatedValue","KeyboardControllerView","KeyboardControllerViewAnimated","createAnimatedComponent","styles","create","container","flex","hidden","display","position","KeyboardProvider","children","statusBarTranslucent","navigationBarTranslucent","progress","height","progressSV","heightSV","setHandlers","broadcast","context","animated","multiply","reanimated","style","transform","translateX","translateY","onKeyboardMove","event","nativeEvent","useNativeDriver","updateSharedValues","platforms","includes","OS","value","handler","onKeyboardMoveStart","onKeyboardMoveEnd","undefined"],"sources":["animated.tsx"],"sourcesContent":["import React, { useMemo } from 'react';\nimport { Animated, Platform, StyleSheet, ViewStyle } from 'react-native';\nimport Reanimated, { useSharedValue } from 'react-native-reanimated';\n\nimport { KeyboardContext } from './context';\nimport {\n useAnimatedKeyboardHandler,\n useSharedHandlers,\n useAnimatedValue,\n} from './internal';\nimport { KeyboardControllerView } from './native';\n\nimport type {\n KeyboardControllerProps,\n KeyboardHandler,\n NativeEvent,\n} from './types';\n\nconst KeyboardControllerViewAnimated = Reanimated.createAnimatedComponent(\n Animated.createAnimatedComponent(\n KeyboardControllerView\n ) as React.FC<KeyboardControllerProps>\n);\n\ntype Styles = {\n container: ViewStyle;\n hidden: ViewStyle;\n};\n\nconst styles = StyleSheet.create<Styles>({\n container: {\n flex: 1,\n },\n hidden: {\n display: 'none',\n position: 'absolute',\n },\n});\n\ntype KeyboardProviderProps = {\n children: React.ReactNode;\n /**\n * Set the value to `true`, if you use translucent status bar on Android.\n * If you already control status bar translucency via `react-native-screens`\n * or `StatusBar` component from `react-native`, you can ignore it.\n * Defaults to `false`.\n *\n * @see https://github.com/kirillzyusko/react-native-keyboard-controller/issues/14\n * @platform android\n */\n statusBarTranslucent?: boolean;\n /**\n * Set the value to `true`, if you use translucent navigation bar on Android.\n * Defaults to `false`.\n *\n * @see https://github.com/kirillzyusko/react-native-keyboard-controller/issues/119\n * @platform android\n */\n navigationBarTranslucent?: boolean;\n};\n\nexport const KeyboardProvider = ({\n children,\n statusBarTranslucent,\n navigationBarTranslucent,\n}: KeyboardProviderProps) => {\n // animated values\n const progress = useAnimatedValue(0);\n const height = useAnimatedValue(0);\n // shared values\n const progressSV = useSharedValue(0);\n const heightSV = useSharedValue(0);\n const { setHandlers, broadcast } = useSharedHandlers<KeyboardHandler>();\n // memo\n const context = useMemo(\n () => ({\n animated: { progress: progress, height: Animated.multiply(height, -1) },\n reanimated: { progress: progressSV, height: heightSV },\n setHandlers,\n }),\n []\n );\n const style = useMemo(\n () => [\n styles.hidden,\n { transform: [{ translateX: height }, { translateY: progress }] },\n ],\n []\n );\n const onKeyboardMove = useMemo(\n () =>\n Animated.event(\n [\n {\n nativeEvent: {\n progress,\n height,\n },\n },\n ],\n { useNativeDriver: true }\n ),\n []\n );\n // handlers\n const updateSharedValues = (event: NativeEvent, platforms: string[]) => {\n 'worklet';\n\n if (platforms.includes(Platform.OS)) {\n progressSV.value = event.progress;\n heightSV.value = -event.height;\n }\n };\n const handler = useAnimatedKeyboardHandler(\n {\n onKeyboardMoveStart: (event: NativeEvent) => {\n 'worklet';\n\n broadcast('onStart', event);\n updateSharedValues(event, ['ios']);\n },\n onKeyboardMove: (event: NativeEvent) => {\n 'worklet';\n\n broadcast('onMove', event);\n updateSharedValues(event, ['android']);\n },\n onKeyboardMoveEnd: (event: NativeEvent) => {\n 'worklet';\n\n broadcast('onEnd', event);\n },\n },\n []\n );\n\n return (\n <KeyboardContext.Provider value={context}>\n <KeyboardControllerViewAnimated\n onKeyboardMoveReanimated={handler}\n onKeyboardMoveStart={Platform.OS === 'ios' ? onKeyboardMove : undefined}\n onKeyboardMove={Platform.OS === 'android' ? onKeyboardMove : undefined}\n navigationBarTranslucent={navigationBarTranslucent}\n statusBarTranslucent={statusBarTranslucent}\n style={styles.container}\n >\n <>\n <Animated.View\n // we are using this small hack, because if the component (where\n // animated value has been used) is unmounted, then animation will\n // stop receiving events (seems like it's react-native optimization).\n // So we need to keep a reference to the animated value, to keep it's\n // always mounted (keep a reference to an animated value).\n //\n // To test why it's needed, try to open screen which consumes Animated.Value\n // then close it and open it again (for example 'Animated transition').\n style={style}\n />\n {children}\n </>\n </KeyboardControllerViewAnimated>\n </KeyboardContext.Provider>\n );\n};\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"names":["codegenNativeComponent"],"sources":["KeyboardControllerViewNativeComponent.ts"],"sourcesContent":["import type { HostComponent } from 'react-native';\n// @ts-expect-error - no type definition\nimport type { ViewProps } from 'react-native/Libraries/Components/View/ViewPropTypes';\nimport type {\n DirectEventHandler,\n Float,\n Int32,\n} from 'react-native/Libraries/Types/CodegenTypes';\nimport codegenNativeComponent from 'react-native/Libraries/Utilities/codegenNativeComponent';\n\ntype KeyboardMoveEvent = Readonly<{\n height: Int32;\n progress: Float;\n}>;\n\nexport interface NativeProps extends ViewProps {\n // props\n statusBarTranslucent?: boolean;\n // callbacks\n onKeyboardMove?: DirectEventHandler<KeyboardMoveEvent>;\n onKeyboardMoveStart?: DirectEventHandler<KeyboardMoveEvent>;\n onKeyboardMoveEnd?: DirectEventHandler<KeyboardMoveEvent>;\n}\n\nexport default codegenNativeComponent<NativeProps>(\n 'KeyboardControllerView'\n) as HostComponent<NativeProps>;\n"],"mappings":"AACA;AAOA,OAAOA,sBAAP,MAAmC,yDAAnC;AAgBA,eAAeA,sBAAsB,CACnC,wBADmC,CAArC"}
1
+ {"version":3,"names":["codegenNativeComponent"],"sources":["KeyboardControllerViewNativeComponent.ts"],"sourcesContent":["import type { HostComponent } from 'react-native';\n// @ts-expect-error - no type definition\nimport type { ViewProps } from 'react-native/Libraries/Components/View/ViewPropTypes';\nimport type {\n DirectEventHandler,\n Float,\n Int32,\n} from 'react-native/Libraries/Types/CodegenTypes';\nimport codegenNativeComponent from 'react-native/Libraries/Utilities/codegenNativeComponent';\n\ntype KeyboardMoveEvent = Readonly<{\n height: Int32;\n progress: Float;\n}>;\n\nexport interface NativeProps extends ViewProps {\n // props\n statusBarTranslucent?: boolean;\n navigationBarTranslucent?: boolean;\n // callbacks\n onKeyboardMove?: DirectEventHandler<KeyboardMoveEvent>;\n onKeyboardMoveStart?: DirectEventHandler<KeyboardMoveEvent>;\n onKeyboardMoveEnd?: DirectEventHandler<KeyboardMoveEvent>;\n}\n\nexport default codegenNativeComponent<NativeProps>(\n 'KeyboardControllerView'\n) as HostComponent<NativeProps>;\n"],"mappings":"AACA;AAOA,OAAOA,sBAAP,MAAmC,yDAAnC;AAiBA,eAAeA,sBAAsB,CACnC,wBADmC,CAArC"}
@@ -1 +1 @@
1
- {"version":3,"names":[],"sources":["types.ts"],"sourcesContent":["import type { NativeSyntheticEvent, ViewProps } from 'react-native';\n\n// DirectEventHandler events declaration\n\nexport type NativeEvent = {\n progress: number;\n height: number;\n};\nexport type EventWithName<T> = {\n eventName: string;\n} & T;\n\n// native View/Module declarations\n\nexport type KeyboardControllerProps = {\n onKeyboardMoveStart?: (\n e: NativeSyntheticEvent<EventWithName<NativeEvent>>\n ) => void;\n onKeyboardMove?: (\n e: NativeSyntheticEvent<EventWithName<NativeEvent>>\n ) => void;\n onKeyboardMoveEnd?: (\n e: NativeSyntheticEvent<EventWithName<NativeEvent>>\n ) => void;\n // fake prop used to activate reanimated bindings\n onKeyboardMoveReanimated?: (\n e: NativeSyntheticEvent<EventWithName<NativeEvent>>\n ) => void;\n statusBarTranslucent?: boolean;\n} & ViewProps;\n\nexport type KeyboardControllerModule = {\n // android only\n setDefaultMode: () => void;\n setInputMode: (mode: number) => void;\n // native event module stuff\n addListener: (eventName: string) => void;\n removeListeners: (count: number) => void;\n};\n\n// Event module declarations\n\nexport type KeyboardControllerEvents =\n | 'keyboardWillShow'\n | 'keyboardDidShow'\n | 'keyboardWillHide'\n | 'keyboardDidHide';\nexport type KeyboardEventData = {\n height: number;\n};\n\n// package types\n\nexport type Handlers<T> = Record<string, T | undefined>;\nexport type KeyboardHandler = {\n onStart?: (e: NativeEvent) => void;\n onMove?: (e: NativeEvent) => void;\n onEnd?: (e: NativeEvent) => void;\n};\nexport type KeyboardHandlers = Handlers<KeyboardHandler>;\n"],"mappings":""}
1
+ {"version":3,"names":[],"sources":["types.ts"],"sourcesContent":["import type { NativeSyntheticEvent, ViewProps } from 'react-native';\n\n// DirectEventHandler events declaration\n\nexport type NativeEvent = {\n progress: number;\n height: number;\n};\nexport type EventWithName<T> = {\n eventName: string;\n} & T;\n\n// native View/Module declarations\n\nexport type KeyboardControllerProps = {\n onKeyboardMoveStart?: (\n e: NativeSyntheticEvent<EventWithName<NativeEvent>>\n ) => void;\n onKeyboardMove?: (\n e: NativeSyntheticEvent<EventWithName<NativeEvent>>\n ) => void;\n onKeyboardMoveEnd?: (\n e: NativeSyntheticEvent<EventWithName<NativeEvent>>\n ) => void;\n // fake prop used to activate reanimated bindings\n onKeyboardMoveReanimated?: (\n e: NativeSyntheticEvent<EventWithName<NativeEvent>>\n ) => void;\n statusBarTranslucent?: boolean;\n navigationBarTranslucent?: boolean;\n} & ViewProps;\n\nexport type KeyboardControllerModule = {\n // android only\n setDefaultMode: () => void;\n setInputMode: (mode: number) => void;\n // native event module stuff\n addListener: (eventName: string) => void;\n removeListeners: (count: number) => void;\n};\n\n// Event module declarations\n\nexport type KeyboardControllerEvents =\n | 'keyboardWillShow'\n | 'keyboardDidShow'\n | 'keyboardWillHide'\n | 'keyboardDidHide';\nexport type KeyboardEventData = {\n height: number;\n};\n\n// package types\n\nexport type Handlers<T> = Record<string, T | undefined>;\nexport type KeyboardHandler = {\n onStart?: (e: NativeEvent) => void;\n onMove?: (e: NativeEvent) => void;\n onEnd?: (e: NativeEvent) => void;\n};\nexport type KeyboardHandlers = Handlers<KeyboardHandler>;\n"],"mappings":""}
@@ -11,6 +11,14 @@ declare type KeyboardProviderProps = {
11
11
  * @platform android
12
12
  */
13
13
  statusBarTranslucent?: boolean;
14
+ /**
15
+ * Set the value to `true`, if you use translucent navigation bar on Android.
16
+ * Defaults to `false`.
17
+ *
18
+ * @see https://github.com/kirillzyusko/react-native-keyboard-controller/issues/119
19
+ * @platform android
20
+ */
21
+ navigationBarTranslucent?: boolean;
14
22
  };
15
- export declare const KeyboardProvider: ({ children, statusBarTranslucent, }: KeyboardProviderProps) => JSX.Element;
23
+ export declare const KeyboardProvider: ({ children, statusBarTranslucent, navigationBarTranslucent, }: KeyboardProviderProps) => JSX.Element;
16
24
  export {};
@@ -7,6 +7,7 @@ declare type KeyboardMoveEvent = Readonly<{
7
7
  }>;
8
8
  export interface NativeProps extends ViewProps {
9
9
  statusBarTranslucent?: boolean;
10
+ navigationBarTranslucent?: boolean;
10
11
  onKeyboardMove?: DirectEventHandler<KeyboardMoveEvent>;
11
12
  onKeyboardMoveStart?: DirectEventHandler<KeyboardMoveEvent>;
12
13
  onKeyboardMoveEnd?: DirectEventHandler<KeyboardMoveEvent>;
@@ -12,6 +12,7 @@ export declare type KeyboardControllerProps = {
12
12
  onKeyboardMoveEnd?: (e: NativeSyntheticEvent<EventWithName<NativeEvent>>) => void;
13
13
  onKeyboardMoveReanimated?: (e: NativeSyntheticEvent<EventWithName<NativeEvent>>) => void;
14
14
  statusBarTranslucent?: boolean;
15
+ navigationBarTranslucent?: boolean;
15
16
  } & ViewProps;
16
17
  export declare type KeyboardControllerModule = {
17
18
  setDefaultMode: () => void;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "react-native-keyboard-controller",
3
- "version": "1.4.2",
3
+ "version": "1.4.4",
4
4
  "description": "Keyboard manager which works in identical way on both iOS and Android",
5
5
  "main": "lib/commonjs/index",
6
6
  "module": "lib/module/index",
package/src/animated.tsx CHANGED
@@ -49,11 +49,20 @@ type KeyboardProviderProps = {
49
49
  * @platform android
50
50
  */
51
51
  statusBarTranslucent?: boolean;
52
+ /**
53
+ * Set the value to `true`, if you use translucent navigation bar on Android.
54
+ * Defaults to `false`.
55
+ *
56
+ * @see https://github.com/kirillzyusko/react-native-keyboard-controller/issues/119
57
+ * @platform android
58
+ */
59
+ navigationBarTranslucent?: boolean;
52
60
  };
53
61
 
54
62
  export const KeyboardProvider = ({
55
63
  children,
56
64
  statusBarTranslucent,
65
+ navigationBarTranslucent,
57
66
  }: KeyboardProviderProps) => {
58
67
  // animated values
59
68
  const progress = useAnimatedValue(0);
@@ -131,6 +140,7 @@ export const KeyboardProvider = ({
131
140
  onKeyboardMoveReanimated={handler}
132
141
  onKeyboardMoveStart={Platform.OS === 'ios' ? onKeyboardMove : undefined}
133
142
  onKeyboardMove={Platform.OS === 'android' ? onKeyboardMove : undefined}
143
+ navigationBarTranslucent={navigationBarTranslucent}
134
144
  statusBarTranslucent={statusBarTranslucent}
135
145
  style={styles.container}
136
146
  >
@@ -16,6 +16,7 @@ type KeyboardMoveEvent = Readonly<{
16
16
  export interface NativeProps extends ViewProps {
17
17
  // props
18
18
  statusBarTranslucent?: boolean;
19
+ navigationBarTranslucent?: boolean;
19
20
  // callbacks
20
21
  onKeyboardMove?: DirectEventHandler<KeyboardMoveEvent>;
21
22
  onKeyboardMoveStart?: DirectEventHandler<KeyboardMoveEvent>;
package/src/types.ts CHANGED
@@ -27,6 +27,7 @@ export type KeyboardControllerProps = {
27
27
  e: NativeSyntheticEvent<EventWithName<NativeEvent>>
28
28
  ) => void;
29
29
  statusBarTranslucent?: boolean;
30
+ navigationBarTranslucent?: boolean;
30
31
  } & ViewProps;
31
32
 
32
33
  export type KeyboardControllerModule = {