react-native-keyboard-controller 1.17.5 → 1.18.0
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.
- package/README.md +4 -1
- package/android/src/base/java/com/reactnativekeyboardcontroller/KeyboardControllerPackage.kt +3 -2
- package/android/src/fabric/java/com/reactnativekeyboardcontroller/KeyboardBackgroundViewManager.kt +19 -0
- package/android/src/fabric/java/com/reactnativekeyboardcontroller/KeyboardControllerModule.kt +4 -0
- package/android/src/fabric/java/com/reactnativekeyboardcontroller/StatusBarManagerCompatModule.kt +3 -1
- package/android/src/main/java/com/reactnativekeyboardcontroller/extensions/Context.kt +20 -0
- package/android/src/main/java/com/reactnativekeyboardcontroller/extensions/ThemedReactContext.kt +2 -12
- package/android/src/main/java/com/reactnativekeyboardcontroller/managers/KeyboardBackgroundViewManagerImpl.kt +13 -0
- package/android/src/main/java/com/reactnativekeyboardcontroller/managers/KeyboardControllerViewManagerImpl.kt +1 -1
- package/android/src/main/java/com/reactnativekeyboardcontroller/modules/KeyboardControllerModuleImpl.kt +4 -0
- package/android/src/main/java/com/reactnativekeyboardcontroller/modules/{StatusBarManagerCompatModuleImpl.kt → statusbar/StatusBarManagerCompatModuleImpl.kt} +31 -5
- package/android/src/main/java/com/reactnativekeyboardcontroller/modules/statusbar/StatusBarModuleProxy.kt +86 -0
- package/android/src/main/java/com/reactnativekeyboardcontroller/views/EdgeToEdgeReactViewGroup.kt +9 -11
- package/android/src/main/java/com/reactnativekeyboardcontroller/views/background/KeyboardBackgroundViewGroup.kt +35 -0
- package/android/src/main/java/com/reactnativekeyboardcontroller/views/background/Skins.kt +91 -0
- package/android/src/main/jni/reactnativekeyboardcontroller.h +1 -0
- package/android/src/main/res/values/attrs.xml +7 -0
- package/android/src/main/res/values/colors.xml +35 -0
- package/android/src/main/res/values-v29/colors.xml +5 -0
- package/android/src/main/res/values-v30/colors.xml +17 -0
- package/android/src/main/res/values-v33/colors.xml +16 -0
- package/android/src/main/res/values-v34/colors.xml +18 -0
- package/android/src/main/res/values-v35/colors.xml +10 -0
- package/android/src/paper/java/com/reactnativekeyboardcontroller/KeyboardBackgroundViewManager.kt +15 -0
- package/android/src/paper/java/com/reactnativekeyboardcontroller/KeyboardControllerModule.kt +5 -0
- package/android/src/paper/java/com/reactnativekeyboardcontroller/StatusBarManagerCompatModule.kt +3 -1
- package/android/src/turbo/java/com/reactnativekeyboardcontroller/KeyboardControllerPackage.kt +2 -2
- package/common/cpp/react/renderer/components/reactnativekeyboardcontroller/RNKCKeyboardBackgroundViewComponentDescriptor.h +27 -0
- package/common/cpp/react/renderer/components/reactnativekeyboardcontroller/RNKCKeyboardBackgroundViewShadowNode.cpp +14 -0
- package/common/cpp/react/renderer/components/reactnativekeyboardcontroller/RNKCKeyboardBackgroundViewShadowNode.h +30 -0
- package/common/cpp/react/renderer/components/reactnativekeyboardcontroller/RNKCKeyboardBackgroundViewState.h +28 -0
- package/common/cpp/react/renderer/components/reactnativekeyboardcontroller/RNKCKeyboardExtenderComponentDescriptor.h +27 -0
- package/common/cpp/react/renderer/components/reactnativekeyboardcontroller/RNKCKeyboardExtenderShadowNode.cpp +14 -0
- package/common/cpp/react/renderer/components/reactnativekeyboardcontroller/RNKCKeyboardExtenderShadowNode.h +30 -0
- package/common/cpp/react/renderer/components/reactnativekeyboardcontroller/RNKCKeyboardExtenderState.h +28 -0
- package/ios/KeyboardControllerModule.mm +9 -0
- package/ios/delegates/KCTextInputCompositeDelegate.swift +5 -5
- package/ios/events/KeyboardEventEmitterPayload.swift +1 -1
- package/ios/extensions/UIResponder.swift +27 -0
- package/ios/interactive/KeyboardAreaExtender.swift +5 -5
- package/ios/observers/FocusedInputObserver.swift +14 -5
- package/ios/observers/KeyboardMovementObserver.swift +7 -1
- package/ios/protocols/TextInput.swift +22 -0
- package/ios/swizzling/UIResponderSwizzle.swift +3 -0
- package/ios/views/KeyboardBackgroundViewManager.h +29 -0
- package/ios/views/KeyboardBackgroundViewManager.mm +168 -0
- package/ios/views/KeyboardExtenderContainerView.swift +59 -0
- package/ios/views/KeyboardExtenderManager.h +29 -0
- package/ios/views/KeyboardExtenderManager.mm +287 -0
- package/jest/index.js +6 -1
- package/lib/commonjs/animated.js +7 -10
- package/lib/commonjs/animated.js.map +1 -1
- package/lib/commonjs/bindings.js +15 -1
- package/lib/commonjs/bindings.js.map +1 -1
- package/lib/commonjs/bindings.native.js +5 -1
- package/lib/commonjs/bindings.native.js.map +1 -1
- package/lib/commonjs/components/KeyboardAwareScrollView/index.js +49 -29
- package/lib/commonjs/components/KeyboardAwareScrollView/index.js.map +1 -1
- package/lib/commonjs/components/KeyboardToolbar/Arrow.js +2 -3
- package/lib/commonjs/components/KeyboardToolbar/Arrow.js.map +1 -1
- package/lib/commonjs/components/KeyboardToolbar/Button.js +2 -3
- package/lib/commonjs/components/KeyboardToolbar/Button.js.map +1 -1
- package/lib/commonjs/components/KeyboardToolbar/index.js +2 -2
- package/lib/commonjs/components/KeyboardToolbar/index.js.map +1 -1
- package/lib/commonjs/hooks/useKeyboardState/index.js +18 -8
- package/lib/commonjs/hooks/useKeyboardState/index.js.map +1 -1
- package/lib/commonjs/index.js +8 -1
- package/lib/commonjs/index.js.map +1 -1
- package/lib/commonjs/module.js +2 -1
- package/lib/commonjs/module.js.map +1 -1
- package/lib/commonjs/specs/KeyboardBackgroundViewNativeComponent.js +12 -0
- package/lib/commonjs/specs/KeyboardBackgroundViewNativeComponent.js.map +1 -0
- package/lib/commonjs/specs/KeyboardExtenderNativeComponent.js +13 -0
- package/lib/commonjs/specs/KeyboardExtenderNativeComponent.js.map +1 -0
- package/lib/commonjs/specs/NativeKeyboardController.js.map +1 -1
- package/lib/commonjs/types/module.js.map +1 -1
- package/lib/commonjs/types/views.js.map +1 -1
- package/lib/commonjs/views/KeyboardExtender/index.ios.js +43 -0
- package/lib/commonjs/views/KeyboardExtender/index.ios.js.map +1 -0
- package/lib/commonjs/views/KeyboardExtender/index.js +46 -0
- package/lib/commonjs/views/KeyboardExtender/index.js.map +1 -0
- package/lib/commonjs/views/index.js +7 -0
- package/lib/commonjs/views/index.js.map +1 -1
- package/lib/module/animated.js +8 -11
- package/lib/module/animated.js.map +1 -1
- package/lib/module/bindings.js +14 -0
- package/lib/module/bindings.js.map +1 -1
- package/lib/module/bindings.native.js +4 -0
- package/lib/module/bindings.native.js.map +1 -1
- package/lib/module/components/KeyboardAwareScrollView/index.js +50 -30
- package/lib/module/components/KeyboardAwareScrollView/index.js.map +1 -1
- package/lib/module/components/KeyboardToolbar/Arrow.js +2 -2
- package/lib/module/components/KeyboardToolbar/Arrow.js.map +1 -1
- package/lib/module/components/KeyboardToolbar/Button.js +2 -2
- package/lib/module/components/KeyboardToolbar/Button.js.map +1 -1
- package/lib/module/components/KeyboardToolbar/index.js +2 -2
- package/lib/module/components/KeyboardToolbar/index.js.map +1 -1
- package/lib/module/hooks/useKeyboardState/index.js +18 -6
- package/lib/module/hooks/useKeyboardState/index.js.map +1 -1
- package/lib/module/index.js +1 -1
- package/lib/module/index.js.map +1 -1
- package/lib/module/module.js +2 -1
- package/lib/module/module.js.map +1 -1
- package/lib/module/specs/KeyboardBackgroundViewNativeComponent.js +5 -0
- package/lib/module/specs/KeyboardBackgroundViewNativeComponent.js.map +1 -0
- package/lib/module/specs/KeyboardExtenderNativeComponent.js +6 -0
- package/lib/module/specs/KeyboardExtenderNativeComponent.js.map +1 -0
- package/lib/module/specs/NativeKeyboardController.js.map +1 -1
- package/lib/module/types/module.js.map +1 -1
- package/lib/module/types/views.js.map +1 -1
- package/lib/module/views/KeyboardExtender/index.ios.js +36 -0
- package/lib/module/views/KeyboardExtender/index.ios.js.map +1 -0
- package/lib/module/views/KeyboardExtender/index.js +39 -0
- package/lib/module/views/KeyboardExtender/index.js.map +1 -0
- package/lib/module/views/index.js +1 -0
- package/lib/module/views/index.js.map +1 -1
- package/lib/typescript/animated.d.ts +7 -0
- package/lib/typescript/bindings.d.ts +14 -1
- package/lib/typescript/bindings.native.d.ts +3 -1
- package/lib/typescript/components/KeyboardAwareScrollView/index.d.ts +2 -2
- package/lib/typescript/hooks/useKeyboardState/index.d.ts +8 -2
- package/lib/typescript/index.d.ts +1 -1
- package/lib/typescript/specs/KeyboardBackgroundViewNativeComponent.d.ts +6 -0
- package/lib/typescript/specs/KeyboardExtenderNativeComponent.d.ts +7 -0
- package/lib/typescript/specs/NativeKeyboardController.d.ts +1 -0
- package/lib/typescript/types/module.d.ts +15 -3
- package/lib/typescript/types/views.d.ts +5 -0
- package/lib/typescript/views/KeyboardExtender/index.d.ts +19 -0
- package/lib/typescript/views/KeyboardExtender/index.ios.d.ts +19 -0
- package/lib/typescript/views/index.d.ts +1 -0
- package/package.json +7 -3
- package/react-native.config.js +1 -0
- package/src/animated.tsx +14 -9
- package/src/bindings.native.ts +8 -0
- package/src/bindings.ts +18 -0
- package/src/components/KeyboardAwareScrollView/index.tsx +72 -47
- package/src/components/KeyboardToolbar/Arrow.tsx +2 -2
- package/src/components/KeyboardToolbar/Button.tsx +2 -2
- package/src/components/KeyboardToolbar/index.tsx +2 -2
- package/src/hooks/useKeyboardState/index.ts +25 -6
- package/src/index.ts +1 -1
- package/src/module.ts +2 -1
- package/src/specs/KeyboardBackgroundViewNativeComponent.ts +10 -0
- package/src/specs/KeyboardExtenderNativeComponent.ts +13 -0
- package/src/specs/NativeKeyboardController.ts +1 -0
- package/src/types/module.ts +17 -3
- package/src/types/views.ts +5 -0
- package/src/views/KeyboardExtender/index.ios.tsx +35 -0
- package/src/views/KeyboardExtender/index.tsx +42 -0
- package/src/views/index.ts +1 -0
- package/ios/extensions/UIKeyboardAppearance.swift +0 -21
- package/lib/commonjs/components/hooks/useColorScheme.js +0 -10
- package/lib/commonjs/components/hooks/useColorScheme.js.map +0 -1
- package/lib/commonjs/monkey-patch.android.js +0 -53
- package/lib/commonjs/monkey-patch.android.js.map +0 -1
- package/lib/commonjs/monkey-patch.js +0 -11
- package/lib/commonjs/monkey-patch.js.map +0 -1
- package/lib/module/components/hooks/useColorScheme.js +0 -4
- package/lib/module/components/hooks/useColorScheme.js.map +0 -1
- package/lib/module/monkey-patch.android.js +0 -42
- package/lib/module/monkey-patch.android.js.map +0 -1
- package/lib/module/monkey-patch.js +0 -5
- package/lib/module/monkey-patch.js.map +0 -1
- package/lib/typescript/components/hooks/useColorScheme.d.ts +0 -2
- package/lib/typescript/monkey-patch.android.d.ts +0 -2
- package/lib/typescript/monkey-patch.d.ts +0 -2
- package/src/components/hooks/useColorScheme.ts +0 -5
- package/src/monkey-patch.android.ts +0 -41
- package/src/monkey-patch.ts +0 -5
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["React","useLayoutEffect","useMemo","useRef","useState","Animated","Platform","StyleSheet","controlEdgeToEdgeValues","isEdgeToEdge","Reanimated","useSharedValue","KeyboardControllerView","KeyboardContext","focusedInputEventsMap","keyboardEventsMap","useAnimatedValue","useEventHandlerRegistration","applyMonkeyPatch","revertMonkeyPatch","useAnimatedKeyboardHandler","useFocusedInputLayoutHandler","IS_EDGE_TO_EDGE","KeyboardControllerViewAnimated","createAnimatedComponent","styles","create","container","flex","hidden","display","position","OS","KeyboardProvider","props","children","statusBarTranslucent","navigationBarTranslucent","preserveEdgeToEdge","enabled","initiallyEnabled","viewTagRef","setEnabled","progress","height","progressSV","heightSV","layout","setKeyboardHandlers","setInputHandlers","context","animated","multiply","reanimated","style","transform","translateX","translateY","onKeyboardMove","event","nativeEvent","useNativeDriver","updateSharedValues","platforms","includes","value","keyboardHandler","onKeyboardMoveStart","onKeyboardMoveInteractive","onKeyboardMoveEnd","inputLayoutHandler","onFocusedInputLayoutChanged","e","target","__DEV__","createElement","Provider","ref","onKeyboardMoveReanimated","undefined","onFocusedInputLayoutChangedReanimated","View"],"sources":["animated.tsx"],"sourcesContent":["/* eslint react/jsx-sort-props: off */\nimport React, { useLayoutEffect, useMemo, useRef, useState } from \"react\";\nimport { Animated, Platform, StyleSheet } from \"react-native\";\nimport {\n controlEdgeToEdgeValues,\n isEdgeToEdge,\n} from \"react-native-is-edge-to-edge\";\nimport Reanimated, { useSharedValue } from \"react-native-reanimated\";\n\nimport { KeyboardControllerView } from \"./bindings\";\nimport { KeyboardContext } from \"./context\";\nimport { focusedInputEventsMap, keyboardEventsMap } from \"./event-mappings\";\nimport { useAnimatedValue, useEventHandlerRegistration } from \"./internal\";\nimport { applyMonkeyPatch, revertMonkeyPatch } from \"./monkey-patch\";\nimport {\n useAnimatedKeyboardHandler,\n useFocusedInputLayoutHandler,\n} from \"./reanimated\";\n\nimport type { KeyboardAnimationContext } from \"./context\";\nimport type {\n FocusedInputHandler,\n FocusedInputLayoutChangedEvent,\n KeyboardControllerProps,\n KeyboardHandler,\n NativeEvent,\n} from \"./types\";\nimport type { ViewStyle } from \"react-native\";\n\nconst IS_EDGE_TO_EDGE = isEdgeToEdge();\n\nconst KeyboardControllerViewAnimated = Reanimated.createAnimatedComponent(\n Animated.createAnimatedComponent(KeyboardControllerView),\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 * @platform android\n * @see https://github.com/kirillzyusko/react-native-keyboard-controller/issues/14\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 * @platform android\n * @see https://github.com/kirillzyusko/react-native-keyboard-controller/issues/119\n */\n navigationBarTranslucent?: boolean;\n /**\n * A boolean property indicating whether to keep edge-to-edge mode always enabled (even when you disable the module).\n * Defaults to `false`.\n *\n * @platform android\n * @see https://github.com/kirillzyusko/react-native-keyboard-controller/issues/592\n */\n preserveEdgeToEdge?: boolean;\n /**\n * A boolean prop indicating whether the module is enabled. It indicate only initial state\n * (if you try to change this prop after component mount it will not have any effect).\n * To change the property in runtime use `useKeyboardController` hook and `setEnabled` method.\n * Defaults to `true`.\n */\n enabled?: boolean;\n};\n\n// capture `Platform.OS` in separate variable to avoid deep workletization of entire RN package\n// see https://github.com/kirillzyusko/react-native-keyboard-controller/issues/393 and https://github.com/kirillzyusko/react-native-keyboard-controller/issues/294 for more details\nconst OS = Platform.OS;\n\n/**\n * A component that wrap your app. Under the hood it works with {@link https://kirillzyusko.github.io/react-native-keyboard-controller/docs/api/keyboard-controller-view|KeyboardControllerView} to receive events during keyboard movements,\n * maps these events to `Animated`/`Reanimated` values and store them in context.\n *\n * @param props - Provider props, such as `statusBarTranslucent`, `navigationBarTranslucent`, etc.\n * @returns A component that should be mounted in root of your App layout.\n * @see {@link https://kirillzyusko.github.io/react-native-keyboard-controller/docs/api/keyboard-provider|Documentation} page for more details.\n * @example\n * ```tsx\n * <KeyboardProvider>\n * <NavigationContainer />\n * </KeyboardProvider>\n * ```\n */\nexport const KeyboardProvider = (props: KeyboardProviderProps) => {\n const {\n children,\n statusBarTranslucent,\n navigationBarTranslucent,\n preserveEdgeToEdge,\n enabled: initiallyEnabled = true,\n } = props;\n // ref\n const viewTagRef = useRef<React.Component<KeyboardControllerProps>>(null);\n // state\n const [enabled, setEnabled] = useState(initiallyEnabled);\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 layout = useSharedValue<FocusedInputLayoutChangedEvent | null>(null);\n const setKeyboardHandlers = useEventHandlerRegistration<KeyboardHandler>(\n keyboardEventsMap,\n viewTagRef,\n );\n const setInputHandlers = useEventHandlerRegistration<FocusedInputHandler>(\n focusedInputEventsMap,\n viewTagRef,\n );\n // memo\n const context = useMemo<KeyboardAnimationContext>(\n () => ({\n enabled,\n animated: { progress: progress, height: Animated.multiply(height, -1) },\n reanimated: { progress: progressSV, height: heightSV },\n layout,\n setKeyboardHandlers,\n setInputHandlers,\n setEnabled,\n }),\n [enabled],\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 // Setting useNativeDriver to true on web triggers a warning due to the absence of a native driver for web. Therefore, it is set to false.\n { useNativeDriver: Platform.OS !== \"web\" },\n ),\n [],\n );\n // handlers\n const updateSharedValues = (event: NativeEvent, platforms: string[]) => {\n \"worklet\";\n\n if (platforms.includes(OS)) {\n // eslint-disable-next-line react-compiler/react-compiler\n progressSV.value = event.progress;\n heightSV.value = -event.height;\n }\n };\n const keyboardHandler = useAnimatedKeyboardHandler(\n {\n onKeyboardMoveStart: (event: NativeEvent) => {\n \"worklet\";\n\n updateSharedValues(event, [\"ios\"]);\n },\n onKeyboardMove: (event: NativeEvent) => {\n \"worklet\";\n\n updateSharedValues(event, [\"android\"]);\n },\n onKeyboardMoveInteractive: (event: NativeEvent) => {\n \"worklet\";\n\n updateSharedValues(event, [\"android\", \"ios\"]);\n },\n onKeyboardMoveEnd: (event: NativeEvent) => {\n \"worklet\";\n\n updateSharedValues(event, [\"android\"]);\n },\n },\n [],\n );\n const inputLayoutHandler = useFocusedInputLayoutHandler(\n {\n onFocusedInputLayoutChanged: (e) => {\n \"worklet\";\n\n if (e.target !== -1) {\n layout.value = e;\n } else {\n layout.value = null;\n }\n },\n },\n [],\n );\n\n // layout effects\n useLayoutEffect(() => {\n if (enabled) {\n applyMonkeyPatch();\n } else {\n revertMonkeyPatch();\n }\n }, [enabled]);\n\n if (__DEV__) {\n controlEdgeToEdgeValues({\n statusBarTranslucent,\n navigationBarTranslucent,\n preserveEdgeToEdge,\n });\n }\n\n return (\n <KeyboardContext.Provider value={context}>\n <KeyboardControllerViewAnimated\n ref={viewTagRef}\n enabled={enabled}\n navigationBarTranslucent={IS_EDGE_TO_EDGE || navigationBarTranslucent}\n statusBarTranslucent={IS_EDGE_TO_EDGE || statusBarTranslucent}\n preserveEdgeToEdge={IS_EDGE_TO_EDGE || preserveEdgeToEdge}\n style={styles.container}\n // on*Reanimated prop must precede animated handlers to work correctly\n onKeyboardMoveReanimated={keyboardHandler}\n onKeyboardMoveStart={OS === \"ios\" ? onKeyboardMove : undefined}\n onKeyboardMove={OS === \"android\" ? onKeyboardMove : undefined}\n onKeyboardMoveInteractive={onKeyboardMove}\n onKeyboardMoveEnd={OS === \"android\" ? onKeyboardMove : undefined}\n onFocusedInputLayoutChangedReanimated={inputLayoutHandler}\n >\n {children}\n </KeyboardControllerViewAnimated>\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 </KeyboardContext.Provider>\n );\n};\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"names":["React","useEffect","useMemo","useRef","useState","Animated","Platform","StyleSheet","controlEdgeToEdgeValues","isEdgeToEdge","Reanimated","useSharedValue","KeyboardControllerView","KeyboardContext","focusedInputEventsMap","keyboardEventsMap","useAnimatedValue","useEventHandlerRegistration","KeyboardController","useAnimatedKeyboardHandler","useFocusedInputLayoutHandler","IS_EDGE_TO_EDGE","KeyboardControllerViewAnimated","createAnimatedComponent","styles","create","container","flex","hidden","display","position","OS","KeyboardProvider","props","children","statusBarTranslucent","navigationBarTranslucent","preserveEdgeToEdge","enabled","initiallyEnabled","preload","viewTagRef","setEnabled","progress","height","progressSV","heightSV","layout","setKeyboardHandlers","setInputHandlers","context","animated","multiply","reanimated","style","transform","translateX","translateY","onKeyboardMove","event","nativeEvent","useNativeDriver","updateSharedValues","platforms","includes","value","keyboardHandler","onKeyboardMoveStart","onKeyboardMoveInteractive","onKeyboardMoveEnd","inputLayoutHandler","onFocusedInputLayoutChanged","e","target","__DEV__","createElement","Provider","ref","onKeyboardMoveReanimated","undefined","onFocusedInputLayoutChangedReanimated","View"],"sources":["animated.tsx"],"sourcesContent":["/* eslint react/jsx-sort-props: off */\nimport React, { useEffect, useMemo, useRef, useState } from \"react\";\nimport { Animated, Platform, StyleSheet } from \"react-native\";\nimport {\n controlEdgeToEdgeValues,\n isEdgeToEdge,\n} from \"react-native-is-edge-to-edge\";\nimport Reanimated, { useSharedValue } from \"react-native-reanimated\";\n\nimport { KeyboardControllerView } from \"./bindings\";\nimport { KeyboardContext } from \"./context\";\nimport { focusedInputEventsMap, keyboardEventsMap } from \"./event-mappings\";\nimport { useAnimatedValue, useEventHandlerRegistration } from \"./internal\";\nimport { KeyboardController } from \"./module\";\nimport {\n useAnimatedKeyboardHandler,\n useFocusedInputLayoutHandler,\n} from \"./reanimated\";\n\nimport type { KeyboardAnimationContext } from \"./context\";\nimport type {\n FocusedInputHandler,\n FocusedInputLayoutChangedEvent,\n KeyboardControllerProps,\n KeyboardHandler,\n NativeEvent,\n} from \"./types\";\nimport type { ViewStyle } from \"react-native\";\n\nconst IS_EDGE_TO_EDGE = isEdgeToEdge();\n\nconst KeyboardControllerViewAnimated = Reanimated.createAnimatedComponent(\n Animated.createAnimatedComponent(KeyboardControllerView),\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 * @platform android\n * @see https://github.com/kirillzyusko/react-native-keyboard-controller/issues/14\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 * @platform android\n * @see https://github.com/kirillzyusko/react-native-keyboard-controller/issues/119\n */\n navigationBarTranslucent?: boolean;\n /**\n * A boolean property indicating whether to keep edge-to-edge mode always enabled (even when you disable the module).\n * Defaults to `false`.\n *\n * @platform android\n * @see https://github.com/kirillzyusko/react-native-keyboard-controller/issues/592\n */\n preserveEdgeToEdge?: boolean;\n /**\n * A boolean prop indicating whether the module is enabled. It indicate only initial state\n * (if you try to change this prop after component mount it will not have any effect).\n * To change the property in runtime use `useKeyboardController` hook and `setEnabled` method.\n * Defaults to `true`.\n */\n enabled?: boolean;\n /**\n * A boolean prop indicating whether to preload the keyboard to reduce time-to-interaction (TTI) on first input focus.\n * Defaults to `true`.\n *\n * @platform ios\n */\n preload?: boolean;\n};\n\n// capture `Platform.OS` in separate variable to avoid deep workletization of entire RN package\n// see https://github.com/kirillzyusko/react-native-keyboard-controller/issues/393 and https://github.com/kirillzyusko/react-native-keyboard-controller/issues/294 for more details\nconst OS = Platform.OS;\n\n/**\n * A component that wrap your app. Under the hood it works with {@link https://kirillzyusko.github.io/react-native-keyboard-controller/docs/api/keyboard-controller-view|KeyboardControllerView} to receive events during keyboard movements,\n * maps these events to `Animated`/`Reanimated` values and store them in context.\n *\n * @param props - Provider props, such as `statusBarTranslucent`, `navigationBarTranslucent`, etc.\n * @returns A component that should be mounted in root of your App layout.\n * @see {@link https://kirillzyusko.github.io/react-native-keyboard-controller/docs/api/keyboard-provider|Documentation} page for more details.\n * @example\n * ```tsx\n * <KeyboardProvider>\n * <NavigationContainer />\n * </KeyboardProvider>\n * ```\n */\nexport const KeyboardProvider = (props: KeyboardProviderProps) => {\n const {\n children,\n statusBarTranslucent,\n navigationBarTranslucent,\n preserveEdgeToEdge,\n enabled: initiallyEnabled = true,\n preload = true,\n } = props;\n // ref\n const viewTagRef = useRef<React.Component<KeyboardControllerProps>>(null);\n // state\n const [enabled, setEnabled] = useState(initiallyEnabled);\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 layout = useSharedValue<FocusedInputLayoutChangedEvent | null>(null);\n const setKeyboardHandlers = useEventHandlerRegistration<KeyboardHandler>(\n keyboardEventsMap,\n viewTagRef,\n );\n const setInputHandlers = useEventHandlerRegistration<FocusedInputHandler>(\n focusedInputEventsMap,\n viewTagRef,\n );\n // memo\n const context = useMemo<KeyboardAnimationContext>(\n () => ({\n enabled,\n animated: { progress: progress, height: Animated.multiply(height, -1) },\n reanimated: { progress: progressSV, height: heightSV },\n layout,\n setKeyboardHandlers,\n setInputHandlers,\n setEnabled,\n }),\n [enabled],\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 // Setting useNativeDriver to true on web triggers a warning due to the absence of a native driver for web. Therefore, it is set to false.\n { useNativeDriver: Platform.OS !== \"web\" },\n ),\n [],\n );\n // handlers\n const updateSharedValues = (event: NativeEvent, platforms: string[]) => {\n \"worklet\";\n\n if (platforms.includes(OS)) {\n // eslint-disable-next-line react-compiler/react-compiler\n progressSV.value = event.progress;\n heightSV.value = -event.height;\n }\n };\n const keyboardHandler = useAnimatedKeyboardHandler(\n {\n onKeyboardMoveStart: (event: NativeEvent) => {\n \"worklet\";\n\n updateSharedValues(event, [\"ios\"]);\n },\n onKeyboardMove: (event: NativeEvent) => {\n \"worklet\";\n\n updateSharedValues(event, [\"android\"]);\n },\n onKeyboardMoveInteractive: (event: NativeEvent) => {\n \"worklet\";\n\n updateSharedValues(event, [\"android\", \"ios\"]);\n },\n onKeyboardMoveEnd: (event: NativeEvent) => {\n \"worklet\";\n\n updateSharedValues(event, [\"android\"]);\n },\n },\n [],\n );\n const inputLayoutHandler = useFocusedInputLayoutHandler(\n {\n onFocusedInputLayoutChanged: (e) => {\n \"worklet\";\n\n if (e.target !== -1) {\n layout.value = e;\n } else {\n layout.value = null;\n }\n },\n },\n [],\n );\n\n useEffect(() => {\n if (preload) {\n KeyboardController.preload();\n }\n }, [preload]);\n\n if (__DEV__) {\n controlEdgeToEdgeValues({\n statusBarTranslucent,\n navigationBarTranslucent,\n preserveEdgeToEdge,\n });\n }\n\n return (\n <KeyboardContext.Provider value={context}>\n <KeyboardControllerViewAnimated\n ref={viewTagRef}\n enabled={enabled}\n navigationBarTranslucent={IS_EDGE_TO_EDGE || navigationBarTranslucent}\n statusBarTranslucent={IS_EDGE_TO_EDGE || statusBarTranslucent}\n preserveEdgeToEdge={IS_EDGE_TO_EDGE || preserveEdgeToEdge}\n style={styles.container}\n // on*Reanimated prop must precede animated handlers to work correctly\n onKeyboardMoveReanimated={keyboardHandler}\n onKeyboardMoveStart={OS === \"ios\" ? onKeyboardMove : undefined}\n onKeyboardMove={OS === \"android\" ? onKeyboardMove : undefined}\n onKeyboardMoveInteractive={onKeyboardMove}\n onKeyboardMoveEnd={OS === \"android\" ? onKeyboardMove : undefined}\n onFocusedInputLayoutChangedReanimated={inputLayoutHandler}\n >\n {children}\n </KeyboardControllerViewAnimated>\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 </KeyboardContext.Provider>\n );\n};\n"],"mappings":"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","ignoreList":[]}
|
package/lib/module/bindings.js
CHANGED
|
@@ -3,6 +3,7 @@ const NOOP = () => {};
|
|
|
3
3
|
export const KeyboardControllerNative = {
|
|
4
4
|
setDefaultMode: NOOP,
|
|
5
5
|
setInputMode: NOOP,
|
|
6
|
+
preload: NOOP,
|
|
6
7
|
dismiss: NOOP,
|
|
7
8
|
setFocusTo: NOOP,
|
|
8
9
|
addListener: NOOP,
|
|
@@ -49,4 +50,17 @@ export const KeyboardControllerView = View;
|
|
|
49
50
|
*/
|
|
50
51
|
export const KeyboardGestureArea = View;
|
|
51
52
|
export const RCTOverKeyboardView = View;
|
|
53
|
+
/**
|
|
54
|
+
* A view that matches keyboard background.
|
|
55
|
+
*
|
|
56
|
+
* @see {@link https://kirillzyusko.github.io/react-native-keyboard-controller/docs/api/keyboard-background-view|Documentation} page for more details.
|
|
57
|
+
*/
|
|
58
|
+
export const KeyboardBackgroundView = View;
|
|
59
|
+
/**
|
|
60
|
+
* A container that will embed its children into the keyboard
|
|
61
|
+
* and will always show them above the keyboard.
|
|
62
|
+
*
|
|
63
|
+
* @see {@link https://kirillzyusko.github.io/react-native-keyboard-controller/docs/api/keyboard-extender|Documentation} page for more details.
|
|
64
|
+
*/
|
|
65
|
+
export const RCTKeyboardExtender = View;
|
|
52
66
|
//# sourceMappingURL=bindings.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["View","NOOP","KeyboardControllerNative","setDefaultMode","setInputMode","dismiss","setFocusTo","addListener","removeListeners","KeyboardEvents","remove","FocusedInputEvents","WindowDimensionsEvents","KeyboardControllerView","KeyboardGestureArea","RCTOverKeyboardView"],"sources":["bindings.ts"],"sourcesContent":["import { View } from \"react-native\";\n\nimport type {\n FocusedInputEventsModule,\n KeyboardControllerNativeModule,\n KeyboardControllerProps,\n KeyboardEventsModule,\n KeyboardGestureAreaProps,\n OverKeyboardViewProps,\n WindowDimensionsEventsModule,\n} from \"./types\";\nimport type { EmitterSubscription } from \"react-native\";\n\nconst NOOP = () => {};\n\nexport const KeyboardControllerNative: KeyboardControllerNativeModule = {\n setDefaultMode: NOOP,\n setInputMode: NOOP,\n dismiss: NOOP,\n setFocusTo: NOOP,\n addListener: NOOP,\n removeListeners: NOOP,\n};\n/**\n * An event emitter that provides a way to subscribe to next keyboard events:\n * - `keyboardWillShow`;\n * - `keyboardDidShow`;\n * - `keyboardWillHide`;\n * - `keyboardDidHide`.\n *\n * Use `addListener` function to add your event listener for a specific keyboard event.\n */\nexport const KeyboardEvents: KeyboardEventsModule = {\n addListener: () => ({ remove: NOOP } as EmitterSubscription),\n};\n/**\n * This API is not documented, it's for internal usage only (for now), and is a subject to potential breaking changes in future.\n * Use it with cautious.\n */\nexport const FocusedInputEvents: FocusedInputEventsModule = {\n addListener: () => ({ remove: NOOP } as EmitterSubscription),\n};\nexport const WindowDimensionsEvents: WindowDimensionsEventsModule = {\n addListener: () => ({ remove: NOOP } as EmitterSubscription),\n};\n/**\n * A view that sends events whenever keyboard or focused events are happening.\n *\n * @see {@link https://kirillzyusko.github.io/react-native-keyboard-controller/docs/api/keyboard-controller-view|Documentation} page for more details.\n */\nexport const KeyboardControllerView =\n View as unknown as React.FC<KeyboardControllerProps>;\n/**\n * A view that defines a region on the screen, where gestures will control the keyboard position.\n *\n * @see {@link https://kirillzyusko.github.io/react-native-keyboard-controller/docs/api/keyboard-gesture-area|Documentation} page for more details.\n */\nexport const KeyboardGestureArea =\n View as unknown as React.FC<KeyboardGestureAreaProps>;\nexport const RCTOverKeyboardView =\n View as unknown as React.FC<OverKeyboardViewProps>;\n"],"mappings":"AAAA,SAASA,IAAI,QAAQ,cAAc;
|
|
1
|
+
{"version":3,"names":["View","NOOP","KeyboardControllerNative","setDefaultMode","setInputMode","preload","dismiss","setFocusTo","addListener","removeListeners","KeyboardEvents","remove","FocusedInputEvents","WindowDimensionsEvents","KeyboardControllerView","KeyboardGestureArea","RCTOverKeyboardView","KeyboardBackgroundView","RCTKeyboardExtender"],"sources":["bindings.ts"],"sourcesContent":["import { View } from \"react-native\";\n\nimport type {\n FocusedInputEventsModule,\n KeyboardBackgroundViewProps,\n KeyboardControllerNativeModule,\n KeyboardControllerProps,\n KeyboardEventsModule,\n KeyboardExtenderProps,\n KeyboardGestureAreaProps,\n OverKeyboardViewProps,\n WindowDimensionsEventsModule,\n} from \"./types\";\nimport type { EmitterSubscription } from \"react-native\";\n\nconst NOOP = () => {};\n\nexport const KeyboardControllerNative: KeyboardControllerNativeModule = {\n setDefaultMode: NOOP,\n setInputMode: NOOP,\n preload: NOOP,\n dismiss: NOOP,\n setFocusTo: NOOP,\n addListener: NOOP,\n removeListeners: NOOP,\n};\n/**\n * An event emitter that provides a way to subscribe to next keyboard events:\n * - `keyboardWillShow`;\n * - `keyboardDidShow`;\n * - `keyboardWillHide`;\n * - `keyboardDidHide`.\n *\n * Use `addListener` function to add your event listener for a specific keyboard event.\n */\nexport const KeyboardEvents: KeyboardEventsModule = {\n addListener: () => ({ remove: NOOP } as EmitterSubscription),\n};\n/**\n * This API is not documented, it's for internal usage only (for now), and is a subject to potential breaking changes in future.\n * Use it with cautious.\n */\nexport const FocusedInputEvents: FocusedInputEventsModule = {\n addListener: () => ({ remove: NOOP } as EmitterSubscription),\n};\nexport const WindowDimensionsEvents: WindowDimensionsEventsModule = {\n addListener: () => ({ remove: NOOP } as EmitterSubscription),\n};\n/**\n * A view that sends events whenever keyboard or focused events are happening.\n *\n * @see {@link https://kirillzyusko.github.io/react-native-keyboard-controller/docs/api/keyboard-controller-view|Documentation} page for more details.\n */\nexport const KeyboardControllerView =\n View as unknown as React.FC<KeyboardControllerProps>;\n/**\n * A view that defines a region on the screen, where gestures will control the keyboard position.\n *\n * @see {@link https://kirillzyusko.github.io/react-native-keyboard-controller/docs/api/keyboard-gesture-area|Documentation} page for more details.\n */\nexport const KeyboardGestureArea =\n View as unknown as React.FC<KeyboardGestureAreaProps>;\nexport const RCTOverKeyboardView =\n View as unknown as React.FC<OverKeyboardViewProps>;\n/**\n * A view that matches keyboard background.\n *\n * @see {@link https://kirillzyusko.github.io/react-native-keyboard-controller/docs/api/keyboard-background-view|Documentation} page for more details.\n */\nexport const KeyboardBackgroundView =\n View as unknown as React.FC<KeyboardBackgroundViewProps>;\n/**\n * A container that will embed its children into the keyboard\n * and will always show them above the keyboard.\n *\n * @see {@link https://kirillzyusko.github.io/react-native-keyboard-controller/docs/api/keyboard-extender|Documentation} page for more details.\n */\nexport const RCTKeyboardExtender =\n View as unknown as React.FC<KeyboardExtenderProps>;\n"],"mappings":"AAAA,SAASA,IAAI,QAAQ,cAAc;AAenC,MAAMC,IAAI,GAAGA,CAAA,KAAM,CAAC,CAAC;AAErB,OAAO,MAAMC,wBAAwD,GAAG;EACtEC,cAAc,EAAEF,IAAI;EACpBG,YAAY,EAAEH,IAAI;EAClBI,OAAO,EAAEJ,IAAI;EACbK,OAAO,EAAEL,IAAI;EACbM,UAAU,EAAEN,IAAI;EAChBO,WAAW,EAAEP,IAAI;EACjBQ,eAAe,EAAER;AACnB,CAAC;AACD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,MAAMS,cAAoC,GAAG;EAClDF,WAAW,EAAEA,CAAA,MAAO;IAAEG,MAAM,EAAEV;EAAK,CAAC;AACtC,CAAC;AACD;AACA;AACA;AACA;AACA,OAAO,MAAMW,kBAA4C,GAAG;EAC1DJ,WAAW,EAAEA,CAAA,MAAO;IAAEG,MAAM,EAAEV;EAAK,CAAC;AACtC,CAAC;AACD,OAAO,MAAMY,sBAAoD,GAAG;EAClEL,WAAW,EAAEA,CAAA,MAAO;IAAEG,MAAM,EAAEV;EAAK,CAAC;AACtC,CAAC;AACD;AACA;AACA;AACA;AACA;AACA,OAAO,MAAMa,sBAAsB,GACjCd,IAAoD;AACtD;AACA;AACA;AACA;AACA;AACA,OAAO,MAAMe,mBAAmB,GAC9Bf,IAAqD;AACvD,OAAO,MAAMgB,mBAAmB,GAC9BhB,IAAkD;AACpD;AACA;AACA;AACA;AACA;AACA,OAAO,MAAMiB,sBAAsB,GACjCjB,IAAwD;AAC1D;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,MAAMkB,mBAAmB,GAC9BlB,IAAkD","ignoreList":[]}
|
|
@@ -30,4 +30,8 @@ export const KeyboardGestureArea = Platform.OS === "android" && Platform.Version
|
|
|
30
30
|
children
|
|
31
31
|
}) => children;
|
|
32
32
|
export const RCTOverKeyboardView = require("./specs/OverKeyboardViewNativeComponent").default;
|
|
33
|
+
export const KeyboardBackgroundView = require("./specs/KeyboardBackgroundViewNativeComponent").default;
|
|
34
|
+
export const RCTKeyboardExtender = Platform.OS === "ios" ? require("./specs/KeyboardExtenderNativeComponent").default : ({
|
|
35
|
+
children
|
|
36
|
+
}) => children;
|
|
33
37
|
//# sourceMappingURL=bindings.native.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["NativeEventEmitter","Platform","LINKING_ERROR","select","ios","default","RCTKeyboardController","require","KeyboardControllerNative","Proxy","get","Error","KEYBOARD_CONTROLLER_NAMESPACE","eventEmitter","KeyboardEvents","addListener","name","cb","FocusedInputEvents","WindowDimensionsEvents","KeyboardControllerView","KeyboardGestureArea","OS","Version","children","RCTOverKeyboardView"],"sources":["bindings.native.ts"],"sourcesContent":["import { NativeEventEmitter, Platform } from \"react-native\";\n\nimport type {\n FocusedInputEventsModule,\n KeyboardControllerNativeModule,\n KeyboardControllerProps,\n KeyboardEventsModule,\n KeyboardGestureAreaProps,\n OverKeyboardViewProps,\n WindowDimensionsEventsModule,\n} from \"./types\";\n\nconst LINKING_ERROR =\n `The package 'react-native-keyboard-controller' doesn't seem to be linked. Make sure: \\n\\n` +\n Platform.select({ ios: \"- You have run 'pod install'\\n\", default: \"\" }) +\n \"- You rebuilt the app after installing the package\\n\" +\n \"- You are not using Expo Go\\n\";\n\nconst RCTKeyboardController =\n require(\"./specs/NativeKeyboardController\").default;\n\nexport const KeyboardControllerNative = (\n RCTKeyboardController\n ? RCTKeyboardController\n : new Proxy(\n {},\n {\n get() {\n throw new Error(LINKING_ERROR);\n },\n },\n )\n) as KeyboardControllerNativeModule;\n\nconst KEYBOARD_CONTROLLER_NAMESPACE = \"KeyboardController::\";\nconst eventEmitter = new NativeEventEmitter(KeyboardControllerNative);\n\nexport const KeyboardEvents: KeyboardEventsModule = {\n addListener: (name, cb) =>\n eventEmitter.addListener(KEYBOARD_CONTROLLER_NAMESPACE + name, cb),\n};\n\n/**\n * This API is not documented, it's for internal usage only (for now), and is a subject to potential breaking changes in future.\n * Use it with cautious.\n */\nexport const FocusedInputEvents: FocusedInputEventsModule = {\n addListener: (name, cb) =>\n eventEmitter.addListener(KEYBOARD_CONTROLLER_NAMESPACE + name, cb),\n};\nexport const WindowDimensionsEvents: WindowDimensionsEventsModule = {\n addListener: (name, cb) =>\n eventEmitter.addListener(KEYBOARD_CONTROLLER_NAMESPACE + name, cb),\n};\nexport const KeyboardControllerView: React.FC<KeyboardControllerProps> =\n require(\"./specs/KeyboardControllerViewNativeComponent\").default;\nexport const KeyboardGestureArea: React.FC<KeyboardGestureAreaProps> =\n (Platform.OS === \"android\" && Platform.Version >= 30) || Platform.OS === \"ios\"\n ? require(\"./specs/KeyboardGestureAreaNativeComponent\").default\n : ({ children }: KeyboardGestureAreaProps) => children;\nexport const RCTOverKeyboardView: React.FC<OverKeyboardViewProps> =\n require(\"./specs/OverKeyboardViewNativeComponent\").default;\n"],"mappings":"AAAA,SAASA,kBAAkB,EAAEC,QAAQ,QAAQ,cAAc;
|
|
1
|
+
{"version":3,"names":["NativeEventEmitter","Platform","LINKING_ERROR","select","ios","default","RCTKeyboardController","require","KeyboardControllerNative","Proxy","get","Error","KEYBOARD_CONTROLLER_NAMESPACE","eventEmitter","KeyboardEvents","addListener","name","cb","FocusedInputEvents","WindowDimensionsEvents","KeyboardControllerView","KeyboardGestureArea","OS","Version","children","RCTOverKeyboardView","KeyboardBackgroundView","RCTKeyboardExtender"],"sources":["bindings.native.ts"],"sourcesContent":["import { NativeEventEmitter, Platform } from \"react-native\";\n\nimport type {\n FocusedInputEventsModule,\n KeyboardBackgroundViewProps,\n KeyboardControllerNativeModule,\n KeyboardControllerProps,\n KeyboardEventsModule,\n KeyboardExtenderProps,\n KeyboardGestureAreaProps,\n OverKeyboardViewProps,\n WindowDimensionsEventsModule,\n} from \"./types\";\n\nconst LINKING_ERROR =\n `The package 'react-native-keyboard-controller' doesn't seem to be linked. Make sure: \\n\\n` +\n Platform.select({ ios: \"- You have run 'pod install'\\n\", default: \"\" }) +\n \"- You rebuilt the app after installing the package\\n\" +\n \"- You are not using Expo Go\\n\";\n\nconst RCTKeyboardController =\n require(\"./specs/NativeKeyboardController\").default;\n\nexport const KeyboardControllerNative = (\n RCTKeyboardController\n ? RCTKeyboardController\n : new Proxy(\n {},\n {\n get() {\n throw new Error(LINKING_ERROR);\n },\n },\n )\n) as KeyboardControllerNativeModule;\n\nconst KEYBOARD_CONTROLLER_NAMESPACE = \"KeyboardController::\";\nconst eventEmitter = new NativeEventEmitter(KeyboardControllerNative);\n\nexport const KeyboardEvents: KeyboardEventsModule = {\n addListener: (name, cb) =>\n eventEmitter.addListener(KEYBOARD_CONTROLLER_NAMESPACE + name, cb),\n};\n\n/**\n * This API is not documented, it's for internal usage only (for now), and is a subject to potential breaking changes in future.\n * Use it with cautious.\n */\nexport const FocusedInputEvents: FocusedInputEventsModule = {\n addListener: (name, cb) =>\n eventEmitter.addListener(KEYBOARD_CONTROLLER_NAMESPACE + name, cb),\n};\nexport const WindowDimensionsEvents: WindowDimensionsEventsModule = {\n addListener: (name, cb) =>\n eventEmitter.addListener(KEYBOARD_CONTROLLER_NAMESPACE + name, cb),\n};\nexport const KeyboardControllerView: React.FC<KeyboardControllerProps> =\n require(\"./specs/KeyboardControllerViewNativeComponent\").default;\nexport const KeyboardGestureArea: React.FC<KeyboardGestureAreaProps> =\n (Platform.OS === \"android\" && Platform.Version >= 30) || Platform.OS === \"ios\"\n ? require(\"./specs/KeyboardGestureAreaNativeComponent\").default\n : ({ children }: KeyboardGestureAreaProps) => children;\nexport const RCTOverKeyboardView: React.FC<OverKeyboardViewProps> =\n require(\"./specs/OverKeyboardViewNativeComponent\").default;\nexport const KeyboardBackgroundView: React.FC<KeyboardBackgroundViewProps> =\n require(\"./specs/KeyboardBackgroundViewNativeComponent\").default;\nexport const RCTKeyboardExtender: React.FC<KeyboardExtenderProps> =\n Platform.OS === \"ios\"\n ? require(\"./specs/KeyboardExtenderNativeComponent\").default\n : ({ children }: KeyboardExtenderProps) => children;\n"],"mappings":"AAAA,SAASA,kBAAkB,EAAEC,QAAQ,QAAQ,cAAc;AAc3D,MAAMC,aAAa,GACjB,2FAA2F,GAC3FD,QAAQ,CAACE,MAAM,CAAC;EAAEC,GAAG,EAAE,gCAAgC;EAAEC,OAAO,EAAE;AAAG,CAAC,CAAC,GACvE,sDAAsD,GACtD,+BAA+B;AAEjC,MAAMC,qBAAqB,GACzBC,OAAO,CAAC,kCAAkC,CAAC,CAACF,OAAO;AAErD,OAAO,MAAMG,wBAAwB,GACnCF,qBAAqB,GACjBA,qBAAqB,GACrB,IAAIG,KAAK,CACP,CAAC,CAAC,EACF;EACEC,GAAGA,CAAA,EAAG;IACJ,MAAM,IAAIC,KAAK,CAACT,aAAa,CAAC;EAChC;AACF,CACF,CAC6B;AAEnC,MAAMU,6BAA6B,GAAG,sBAAsB;AAC5D,MAAMC,YAAY,GAAG,IAAIb,kBAAkB,CAACQ,wBAAwB,CAAC;AAErE,OAAO,MAAMM,cAAoC,GAAG;EAClDC,WAAW,EAAEA,CAACC,IAAI,EAAEC,EAAE,KACpBJ,YAAY,CAACE,WAAW,CAACH,6BAA6B,GAAGI,IAAI,EAAEC,EAAE;AACrE,CAAC;;AAED;AACA;AACA;AACA;AACA,OAAO,MAAMC,kBAA4C,GAAG;EAC1DH,WAAW,EAAEA,CAACC,IAAI,EAAEC,EAAE,KACpBJ,YAAY,CAACE,WAAW,CAACH,6BAA6B,GAAGI,IAAI,EAAEC,EAAE;AACrE,CAAC;AACD,OAAO,MAAME,sBAAoD,GAAG;EAClEJ,WAAW,EAAEA,CAACC,IAAI,EAAEC,EAAE,KACpBJ,YAAY,CAACE,WAAW,CAACH,6BAA6B,GAAGI,IAAI,EAAEC,EAAE;AACrE,CAAC;AACD,OAAO,MAAMG,sBAAyD,GACpEb,OAAO,CAAC,+CAA+C,CAAC,CAACF,OAAO;AAClE,OAAO,MAAMgB,mBAAuD,GACjEpB,QAAQ,CAACqB,EAAE,KAAK,SAAS,IAAIrB,QAAQ,CAACsB,OAAO,IAAI,EAAE,IAAKtB,QAAQ,CAACqB,EAAE,KAAK,KAAK,GAC1Ef,OAAO,CAAC,4CAA4C,CAAC,CAACF,OAAO,GAC7D,CAAC;EAAEmB;AAAmC,CAAC,KAAKA,QAAQ;AAC1D,OAAO,MAAMC,mBAAoD,GAC/DlB,OAAO,CAAC,yCAAyC,CAAC,CAACF,OAAO;AAC5D,OAAO,MAAMqB,sBAA6D,GACxEnB,OAAO,CAAC,+CAA+C,CAAC,CAACF,OAAO;AAClE,OAAO,MAAMsB,mBAAoD,GAC/D1B,QAAQ,CAACqB,EAAE,KAAK,KAAK,GACjBf,OAAO,CAAC,yCAAyC,CAAC,CAACF,OAAO,GAC1D,CAAC;EAAEmB;AAAgC,CAAC,KAAKA,QAAQ","ignoreList":[]}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
function _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); }
|
|
2
2
|
import React, { forwardRef, useCallback, useEffect, useMemo } from "react";
|
|
3
|
-
import Reanimated, { interpolate, runOnUI, scrollTo, useAnimatedReaction, useAnimatedRef, useAnimatedStyle, useScrollViewOffset, useSharedValue } from "react-native-reanimated";
|
|
3
|
+
import Reanimated, { clamp, interpolate, runOnUI, scrollTo, useAnimatedReaction, useAnimatedRef, useAnimatedStyle, useScrollViewOffset, useSharedValue } from "react-native-reanimated";
|
|
4
4
|
import { useFocusedInputHandler, useReanimatedFocusedInput, useWindowDimensions } from "../../hooks";
|
|
5
5
|
import { findNodeHandle } from "../../utils/findNodeHandle";
|
|
6
6
|
import { useSmoothKeyboardHandler } from "./useSmoothKeyboardHandler";
|
|
@@ -83,6 +83,7 @@ const KeyboardAwareScrollView = /*#__PURE__*/forwardRef(({
|
|
|
83
83
|
input
|
|
84
84
|
} = useReanimatedFocusedInput();
|
|
85
85
|
const layout = useSharedValue(null);
|
|
86
|
+
const lastSelection = useSharedValue(null);
|
|
86
87
|
const {
|
|
87
88
|
height
|
|
88
89
|
} = useWindowDimensions();
|
|
@@ -125,9 +126,9 @@ const KeyboardAwareScrollView = /*#__PURE__*/forwardRef(({
|
|
|
125
126
|
scrollTo(scrollViewAnimatedRef, 0, targetScrollY, animated);
|
|
126
127
|
return interpolatedScrollTo;
|
|
127
128
|
}
|
|
128
|
-
if (
|
|
129
|
-
const positionOnScreen = visibleRect -
|
|
130
|
-
const topOfScreen = scrollPosition.value +
|
|
129
|
+
if (point < 0) {
|
|
130
|
+
const positionOnScreen = visibleRect - bottomOffset;
|
|
131
|
+
const topOfScreen = scrollPosition.value + point;
|
|
131
132
|
scrollTo(scrollViewAnimatedRef, 0, topOfScreen - positionOnScreen, animated);
|
|
132
133
|
}
|
|
133
134
|
return 0;
|
|
@@ -138,24 +139,35 @@ const KeyboardAwareScrollView = /*#__PURE__*/forwardRef(({
|
|
|
138
139
|
const keyboardFrame = interpolate(e.height, [0, keyboardHeight.value], [0, keyboardHeight.value + extraKeyboardSpace]);
|
|
139
140
|
currentKeyboardFrameHeight.value = keyboardFrame;
|
|
140
141
|
}, [extraKeyboardSpace]);
|
|
141
|
-
const
|
|
142
|
+
const updateLayoutFromSelection = useCallback(() => {
|
|
142
143
|
"worklet";
|
|
143
144
|
|
|
144
|
-
var _input$value;
|
|
145
|
-
const
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
return;
|
|
145
|
+
var _lastSelection$value, _input$value;
|
|
146
|
+
const customHeight = (_lastSelection$value = lastSelection.value) === null || _lastSelection$value === void 0 ? void 0 : _lastSelection$value.selection.end.y;
|
|
147
|
+
if (!((_input$value = input.value) !== null && _input$value !== void 0 && _input$value.layout) || !customHeight) {
|
|
148
|
+
return false;
|
|
149
149
|
}
|
|
150
|
-
|
|
151
|
-
// eslint-disable-next-line react-compiler/react-compiler
|
|
152
150
|
layout.value = {
|
|
153
151
|
...input.value,
|
|
154
152
|
layout: {
|
|
155
153
|
...input.value.layout,
|
|
156
|
-
|
|
154
|
+
// when we have multiline input with limited amount of lines, then custom height can be very big
|
|
155
|
+
// so we clamp it to max input height
|
|
156
|
+
height: clamp(customHeight, 0, input.value.layout.height)
|
|
157
157
|
}
|
|
158
158
|
};
|
|
159
|
+
return true;
|
|
160
|
+
}, [input, lastSelection, layout]);
|
|
161
|
+
const scrollFromCurrentPosition = useCallback(() => {
|
|
162
|
+
"worklet";
|
|
163
|
+
|
|
164
|
+
const prevScrollPosition = scrollPosition.value;
|
|
165
|
+
const prevLayout = layout.value;
|
|
166
|
+
if (!updateLayoutFromSelection()) {
|
|
167
|
+
return;
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
// eslint-disable-next-line react-compiler/react-compiler
|
|
159
171
|
scrollPosition.value = position.value;
|
|
160
172
|
maybeScroll(keyboardHeight.value, true);
|
|
161
173
|
scrollPosition.value = prevScrollPosition;
|
|
@@ -164,26 +176,35 @@ const KeyboardAwareScrollView = /*#__PURE__*/forwardRef(({
|
|
|
164
176
|
const onChangeText = useCallback(() => {
|
|
165
177
|
"worklet";
|
|
166
178
|
|
|
167
|
-
|
|
168
|
-
// because this event will be handled in `useAnimatedReaction` below
|
|
169
|
-
var _layout$value4, _input$value2;
|
|
170
|
-
if (((_layout$value4 = layout.value) === null || _layout$value4 === void 0 ? void 0 : _layout$value4.layout.height) !== ((_input$value2 = input.value) === null || _input$value2 === void 0 ? void 0 : _input$value2.layout.height)) {
|
|
171
|
-
return;
|
|
172
|
-
}
|
|
179
|
+
console.debug("maybeScroll - onChangeText");
|
|
173
180
|
scrollFromCurrentPosition();
|
|
174
181
|
}, [scrollFromCurrentPosition]);
|
|
182
|
+
const onChangeTextHandler = useMemo(() => debounce(onChangeText, 200), [onChangeText]);
|
|
175
183
|
const onSelectionChange = useCallback(e => {
|
|
176
184
|
"worklet";
|
|
177
185
|
|
|
186
|
+
var _lastSelection$value2, _lastSelection$value3;
|
|
187
|
+
const lastTarget = (_lastSelection$value2 = lastSelection.value) === null || _lastSelection$value2 === void 0 ? void 0 : _lastSelection$value2.target;
|
|
188
|
+
const latestSelection = (_lastSelection$value3 = lastSelection.value) === null || _lastSelection$value3 === void 0 ? void 0 : _lastSelection$value3.selection;
|
|
189
|
+
lastSelection.value = e;
|
|
190
|
+
if (e.target !== lastTarget) {
|
|
191
|
+
// ignore this event, because "focus changed" event handled in `useSmoothKeyboardHandler`
|
|
192
|
+
return;
|
|
193
|
+
}
|
|
194
|
+
// caret in the end + end coordinates has been changed -> we moved to a new line
|
|
195
|
+
// so input may grow
|
|
196
|
+
if (e.selection.end.position === e.selection.start.position && (latestSelection === null || latestSelection === void 0 ? void 0 : latestSelection.end.y) !== e.selection.end.y) {
|
|
197
|
+
return scrollFromCurrentPosition();
|
|
198
|
+
}
|
|
199
|
+
// selection has been changed
|
|
178
200
|
if (e.selection.start.position !== e.selection.end.position) {
|
|
179
|
-
scrollFromCurrentPosition(
|
|
201
|
+
return scrollFromCurrentPosition();
|
|
180
202
|
}
|
|
181
|
-
|
|
182
|
-
|
|
203
|
+
onChangeTextHandler();
|
|
204
|
+
}, [scrollFromCurrentPosition, onChangeTextHandler]);
|
|
183
205
|
useFocusedInputHandler({
|
|
184
|
-
onChangeText: onChangeTextHandler,
|
|
185
206
|
onSelectionChange: onSelectionChange
|
|
186
|
-
}, [
|
|
207
|
+
}, [onSelectionChange]);
|
|
187
208
|
useSmoothKeyboardHandler({
|
|
188
209
|
onStart: e => {
|
|
189
210
|
"worklet";
|
|
@@ -210,9 +231,8 @@ const KeyboardAwareScrollView = /*#__PURE__*/forwardRef(({
|
|
|
210
231
|
// focus was changed
|
|
211
232
|
if (focusWasChanged) {
|
|
212
233
|
tag.value = e.target;
|
|
213
|
-
|
|
214
234
|
// save position of focused text input when keyboard starts to move
|
|
215
|
-
|
|
235
|
+
updateLayoutFromSelection();
|
|
216
236
|
// save current scroll position - when keyboard will hide we'll reuse
|
|
217
237
|
// this value to achieve smooth hide effect
|
|
218
238
|
scrollBeforeKeyboardMovement.value = position.value;
|
|
@@ -246,10 +266,10 @@ const KeyboardAwareScrollView = /*#__PURE__*/forwardRef(({
|
|
|
246
266
|
}, [bottomOffset]);
|
|
247
267
|
useAnimatedReaction(() => input.value, (current, previous) => {
|
|
248
268
|
if ((current === null || current === void 0 ? void 0 : current.target) === (previous === null || previous === void 0 ? void 0 : previous.target) && (current === null || current === void 0 ? void 0 : current.layout.height) !== (previous === null || previous === void 0 ? void 0 : previous.layout.height)) {
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
269
|
+
// input has changed layout - let's check if we need to scroll
|
|
270
|
+
// may happen when you paste text, then onSelectionChange will be
|
|
271
|
+
// fired earlier than text actually changes its layout
|
|
272
|
+
scrollFromCurrentPosition();
|
|
253
273
|
}
|
|
254
274
|
}, []);
|
|
255
275
|
const view = useAnimatedStyle(() => enabled ? {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["React","forwardRef","useCallback","useEffect","useMemo","Reanimated","interpolate","runOnUI","scrollTo","useAnimatedReaction","useAnimatedRef","useAnimatedStyle","useScrollViewOffset","useSharedValue","useFocusedInputHandler","useReanimatedFocusedInput","useWindowDimensions","findNodeHandle","useSmoothKeyboardHandler","debounce","scrollDistanceWithRespectToSnapPoints","KeyboardAwareScrollView","children","onLayout","bottomOffset","disableScrollOnKeyboardHide","enabled","extraKeyboardSpace","ScrollViewComponent","ScrollView","snapToOffsets","rest","ref","scrollViewAnimatedRef","scrollViewTarget","scrollPosition","position","currentKeyboardFrameHeight","keyboardHeight","keyboardWillAppear","tag","initialKeyboardSize","scrollBeforeKeyboardMovement","input","layout","height","onRef","assignedRef","current","onScrollViewLayout","e","value","maybeScroll","animated","_layout$value","_layout$value2","_layout$value3","parentScrollViewTarget","visibleRect","absoluteY","inputHeight","point","relativeScrollTo","interpolatedScrollTo","targetScrollY","Math","max","positionOnScreen","topOfScreen","syncKeyboardFrame","keyboardFrame","scrollFromCurrentPosition","customHeight","_input$value","prevScrollPosition","prevLayout","onChangeText","_layout$value4","_input$value2","onSelectionChange","selection","start","end","y","onChangeTextHandler","onStart","keyboardWillChangeSize","keyboardWillHide","focusWasChanged","target","onMove","onEnd","previous","view","paddingBottom","createElement","_extends","scrollEventThrottle","View","style"],"sources":["index.tsx"],"sourcesContent":["import React, { forwardRef, useCallback, useEffect, useMemo } from \"react\";\nimport Reanimated, {\n interpolate,\n runOnUI,\n scrollTo,\n useAnimatedReaction,\n useAnimatedRef,\n useAnimatedStyle,\n useScrollViewOffset,\n useSharedValue,\n} from \"react-native-reanimated\";\n\nimport {\n useFocusedInputHandler,\n useReanimatedFocusedInput,\n useWindowDimensions,\n} from \"../../hooks\";\nimport { findNodeHandle } from \"../../utils/findNodeHandle\";\n\nimport { useSmoothKeyboardHandler } from \"./useSmoothKeyboardHandler\";\nimport { debounce, scrollDistanceWithRespectToSnapPoints } from \"./utils\";\n\nimport type {\n LayoutChangeEvent,\n ScrollView,\n ScrollViewProps,\n} from \"react-native\";\nimport type {\n FocusedInputLayoutChangedEvent,\n FocusedInputSelectionChangedEvent,\n NativeEvent,\n} from \"react-native-keyboard-controller\";\n\nexport type KeyboardAwareScrollViewProps = {\n /** The distance between keyboard and focused `TextInput` when keyboard is shown. Default is `0`. */\n bottomOffset?: number;\n /** Prevents automatic scrolling of the `ScrollView` when the keyboard gets hidden, maintaining the current screen position. Default is `false`. */\n disableScrollOnKeyboardHide?: boolean;\n /** Controls whether this `KeyboardAwareScrollView` instance should take effect. Default is `true`. */\n enabled?: boolean;\n /** Adjusting the bottom spacing of KeyboardAwareScrollView. Default is `0`. */\n extraKeyboardSpace?: number;\n /** Custom component for `ScrollView`. Default is `ScrollView`. */\n ScrollViewComponent?: React.ComponentType<ScrollViewProps>;\n} & ScrollViewProps;\n\n// Everything begins from `onStart` handler. This handler is called every time,\n// when keyboard changes its size or when focused `TextInput` was changed. In\n// this handler we are calculating/memoizing values which later will be used\n// during layout movement. For that we calculate:\n// - layout of focused field (`layout`) - to understand whether there will be overlap\n// - initial keyboard size (`initialKeyboardSize`) - used in scroll interpolation\n// - future keyboard height (`keyboardHeight`) - used in scroll interpolation\n// - current scroll position (`scrollPosition`) - used to scroll from this point\n//\n// Once we've calculated all necessary variables - we can actually start to use them.\n// It happens in `onMove` handler - this function simply calls `maybeScroll` with\n// current keyboard frame height. This functions makes the smooth transition.\n//\n// When the transition has finished we go to `onEnd` handler. In this handler\n// we verify, that the current field is not overlapped within a keyboard frame.\n// For full `onStart`/`onMove`/`onEnd` flow it may look like a redundant thing,\n// however there could be some cases, when `onMove` is not called:\n// - on iOS when TextInput was changed - keyboard transition is instant\n// - on Android when TextInput was changed and keyboard size wasn't changed\n// So `onEnd` handler handle the case, when `onMove` wasn't triggered.\n//\n// ====================================================================================================================+\n// -----------------------------------------------------Flow chart-----------------------------------------------------+\n// ====================================================================================================================+\n//\n// +============================+ +============================+ +==================================+\n// + User Press on TextInput + => + Keyboard starts showing + => + As keyboard moves frame by frame + =>\n// + + + (run `onStart`) + + `onMove` is getting called +\n// +============================+ +============================+ +==================================+\n//\n// +============================+ +============================+ +=====================================+\n// + Keyboard is shown and we + => + User moved focus to + => + Only `onStart`/`onEnd` maybe called +\n// + call `onEnd` handler + + another `TextInput` + + (without involving `onMove`) +\n// +============================+ +============================+ +=====================================+\n//\n\n/**\n * A ScrollView component that automatically handles keyboard appearance and disappearance\n * by adjusting its content position to ensure the focused input remains visible.\n *\n * The component uses a sophisticated animation system to smoothly handle keyboard transitions\n * and maintain proper scroll position during keyboard interactions.\n *\n * @returns A ScrollView component that handles keyboard interactions.\n * @see {@link https://kirillzyusko.github.io/react-native-keyboard-controller/docs/api/components/keyboard-aware-scroll-view|Documentation} page for more details.\n * @example\n * ```tsx\n * <KeyboardAwareScrollView bottomOffset={20}>\n * <TextInput placeholder=\"Enter text\" />\n * <TextInput placeholder=\"Another input\" />\n * </KeyboardAwareScrollView>\n * ```\n */\nconst KeyboardAwareScrollView = forwardRef<\n ScrollView,\n React.PropsWithChildren<KeyboardAwareScrollViewProps>\n>(\n (\n {\n children,\n onLayout,\n bottomOffset = 0,\n disableScrollOnKeyboardHide = false,\n enabled = true,\n extraKeyboardSpace = 0,\n ScrollViewComponent = Reanimated.ScrollView,\n snapToOffsets,\n ...rest\n },\n ref,\n ) => {\n const scrollViewAnimatedRef = useAnimatedRef<Reanimated.ScrollView>();\n const scrollViewTarget = useSharedValue<number | null>(null);\n const scrollPosition = useSharedValue(0);\n const position = useScrollViewOffset(scrollViewAnimatedRef);\n const currentKeyboardFrameHeight = useSharedValue(0);\n const keyboardHeight = useSharedValue(0);\n const keyboardWillAppear = useSharedValue(false);\n const tag = useSharedValue(-1);\n const initialKeyboardSize = useSharedValue(0);\n const scrollBeforeKeyboardMovement = useSharedValue(0);\n const { input } = useReanimatedFocusedInput();\n const layout = useSharedValue<FocusedInputLayoutChangedEvent | null>(null);\n\n const { height } = useWindowDimensions();\n\n const onRef = useCallback((assignedRef: Reanimated.ScrollView) => {\n if (typeof ref === \"function\") {\n ref(assignedRef);\n } else if (ref) {\n ref.current = assignedRef;\n }\n\n scrollViewAnimatedRef(assignedRef);\n }, []);\n const onScrollViewLayout = useCallback(\n (e: LayoutChangeEvent) => {\n scrollViewTarget.value = findNodeHandle(scrollViewAnimatedRef.current);\n\n onLayout?.(e);\n },\n [onLayout],\n );\n\n /**\n * Function that will scroll a ScrollView as keyboard gets moving.\n */\n const maybeScroll = useCallback(\n (e: number, animated: boolean = false) => {\n \"worklet\";\n\n if (!enabled) {\n return 0;\n }\n\n // input belongs to ScrollView\n if (layout.value?.parentScrollViewTarget !== scrollViewTarget.value) {\n return 0;\n }\n\n const visibleRect = height - keyboardHeight.value;\n const absoluteY = layout.value?.layout.absoluteY || 0;\n const inputHeight = layout.value?.layout.height || 0;\n const point = absoluteY + inputHeight;\n\n if (visibleRect - point <= bottomOffset) {\n const relativeScrollTo =\n keyboardHeight.value - (height - point) + bottomOffset;\n const interpolatedScrollTo = interpolate(\n e,\n [initialKeyboardSize.value, keyboardHeight.value],\n [\n 0,\n scrollDistanceWithRespectToSnapPoints(\n relativeScrollTo + scrollPosition.value,\n snapToOffsets,\n ) - scrollPosition.value,\n ],\n );\n const targetScrollY =\n Math.max(interpolatedScrollTo, 0) + scrollPosition.value;\n\n scrollTo(scrollViewAnimatedRef, 0, targetScrollY, animated);\n\n return interpolatedScrollTo;\n }\n\n if (absoluteY < 0) {\n const positionOnScreen = visibleRect - inputHeight - bottomOffset;\n const topOfScreen = scrollPosition.value + absoluteY;\n\n scrollTo(\n scrollViewAnimatedRef,\n 0,\n topOfScreen - positionOnScreen,\n animated,\n );\n }\n\n return 0;\n },\n [bottomOffset, enabled, height, snapToOffsets],\n );\n const syncKeyboardFrame = useCallback(\n (e: NativeEvent) => {\n \"worklet\";\n\n const keyboardFrame = interpolate(\n e.height,\n [0, keyboardHeight.value],\n [0, keyboardHeight.value + extraKeyboardSpace],\n );\n\n currentKeyboardFrameHeight.value = keyboardFrame;\n },\n [extraKeyboardSpace],\n );\n\n const scrollFromCurrentPosition = useCallback(\n (customHeight?: number) => {\n \"worklet\";\n\n const prevScrollPosition = scrollPosition.value;\n const prevLayout = layout.value;\n\n if (!input.value?.layout) {\n return;\n }\n\n // eslint-disable-next-line react-compiler/react-compiler\n layout.value = {\n ...input.value,\n layout: {\n ...input.value.layout,\n height: customHeight ?? input.value.layout.height,\n },\n };\n scrollPosition.value = position.value;\n maybeScroll(keyboardHeight.value, true);\n scrollPosition.value = prevScrollPosition;\n layout.value = prevLayout;\n },\n [maybeScroll],\n );\n const onChangeText = useCallback(() => {\n \"worklet\";\n\n // if typing a text caused layout shift, then we need to ignore this handler\n // because this event will be handled in `useAnimatedReaction` below\n if (layout.value?.layout.height !== input.value?.layout.height) {\n return;\n }\n\n scrollFromCurrentPosition();\n }, [scrollFromCurrentPosition]);\n const onSelectionChange = useCallback(\n (e: FocusedInputSelectionChangedEvent) => {\n \"worklet\";\n\n if (e.selection.start.position !== e.selection.end.position) {\n scrollFromCurrentPosition(e.selection.end.y);\n }\n },\n [scrollFromCurrentPosition],\n );\n\n const onChangeTextHandler = useMemo(\n () => debounce(onChangeText, 200),\n [onChangeText],\n );\n\n useFocusedInputHandler(\n {\n onChangeText: onChangeTextHandler,\n onSelectionChange: onSelectionChange,\n },\n [onChangeTextHandler, onSelectionChange],\n );\n\n useSmoothKeyboardHandler(\n {\n onStart: (e) => {\n \"worklet\";\n\n const keyboardWillChangeSize =\n keyboardHeight.value !== e.height && e.height > 0;\n\n keyboardWillAppear.value = e.height > 0 && keyboardHeight.value === 0;\n\n const keyboardWillHide = e.height === 0;\n const focusWasChanged =\n (tag.value !== e.target && e.target !== -1) ||\n keyboardWillChangeSize;\n\n if (keyboardWillChangeSize) {\n initialKeyboardSize.value = keyboardHeight.value;\n }\n\n if (keyboardWillHide) {\n // on back transition need to interpolate as [0, keyboardHeight]\n initialKeyboardSize.value = 0;\n scrollPosition.value = scrollBeforeKeyboardMovement.value;\n }\n\n if (\n keyboardWillAppear.value ||\n keyboardWillChangeSize ||\n focusWasChanged\n ) {\n // persist scroll value\n scrollPosition.value = position.value;\n // just persist height - later will be used in interpolation\n keyboardHeight.value = e.height;\n }\n\n // focus was changed\n if (focusWasChanged) {\n tag.value = e.target;\n\n // save position of focused text input when keyboard starts to move\n layout.value = input.value;\n // save current scroll position - when keyboard will hide we'll reuse\n // this value to achieve smooth hide effect\n scrollBeforeKeyboardMovement.value = position.value;\n }\n\n if (focusWasChanged && !keyboardWillAppear.value) {\n // update position on scroll value, so `onEnd` handler\n // will pick up correct values\n position.value += maybeScroll(e.height, true);\n }\n },\n onMove: (e) => {\n \"worklet\";\n\n syncKeyboardFrame(e);\n\n // if the user has set disableScrollOnKeyboardHide, only auto-scroll when the keyboard opens\n if (!disableScrollOnKeyboardHide || keyboardWillAppear.value) {\n maybeScroll(e.height);\n }\n },\n onEnd: (e) => {\n \"worklet\";\n\n keyboardHeight.value = e.height;\n scrollPosition.value = position.value;\n\n syncKeyboardFrame(e);\n },\n },\n [maybeScroll, disableScrollOnKeyboardHide, syncKeyboardFrame],\n );\n\n useEffect(() => {\n runOnUI(maybeScroll)(keyboardHeight.value, true);\n }, [bottomOffset]);\n\n useAnimatedReaction(\n () => input.value,\n (current, previous) => {\n if (\n current?.target === previous?.target &&\n current?.layout.height !== previous?.layout.height\n ) {\n const prevLayout = layout.value;\n\n layout.value = input.value;\n scrollPosition.value += maybeScroll(keyboardHeight.value, true);\n layout.value = prevLayout;\n }\n },\n [],\n );\n\n const view = useAnimatedStyle(\n () =>\n enabled\n ? {\n // animations become choppy when scrolling to the end of the `ScrollView` (when the last input is focused)\n // this happens because the layout recalculates on every frame. To avoid this we slightly increase padding\n // by `+1`. In this way we assure, that `scrollTo` will never scroll to the end, because it uses interpolation\n // from 0 to `keyboardHeight`, and here our padding is `keyboardHeight + 1`. It allows us not to re-run layout\n // re-calculation on every animation frame and it helps to achieve smooth animation.\n // see: https://github.com/kirillzyusko/react-native-keyboard-controller/pull/342\n paddingBottom: currentKeyboardFrameHeight.value + 1,\n }\n : {},\n [enabled],\n );\n\n return (\n <ScrollViewComponent\n ref={onRef}\n {...rest}\n scrollEventThrottle={16}\n onLayout={onScrollViewLayout}\n >\n {children}\n {enabled && <Reanimated.View style={view} />}\n </ScrollViewComponent>\n );\n },\n);\n\nexport default KeyboardAwareScrollView;\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"names":["React","forwardRef","useCallback","useEffect","useMemo","Reanimated","clamp","interpolate","runOnUI","scrollTo","useAnimatedReaction","useAnimatedRef","useAnimatedStyle","useScrollViewOffset","useSharedValue","useFocusedInputHandler","useReanimatedFocusedInput","useWindowDimensions","findNodeHandle","useSmoothKeyboardHandler","debounce","scrollDistanceWithRespectToSnapPoints","KeyboardAwareScrollView","children","onLayout","bottomOffset","disableScrollOnKeyboardHide","enabled","extraKeyboardSpace","ScrollViewComponent","ScrollView","snapToOffsets","rest","ref","scrollViewAnimatedRef","scrollViewTarget","scrollPosition","position","currentKeyboardFrameHeight","keyboardHeight","keyboardWillAppear","tag","initialKeyboardSize","scrollBeforeKeyboardMovement","input","layout","lastSelection","height","onRef","assignedRef","current","onScrollViewLayout","e","value","maybeScroll","animated","_layout$value","_layout$value2","_layout$value3","parentScrollViewTarget","visibleRect","absoluteY","inputHeight","point","relativeScrollTo","interpolatedScrollTo","targetScrollY","Math","max","positionOnScreen","topOfScreen","syncKeyboardFrame","keyboardFrame","updateLayoutFromSelection","_lastSelection$value","_input$value","customHeight","selection","end","y","scrollFromCurrentPosition","prevScrollPosition","prevLayout","onChangeText","console","debug","onChangeTextHandler","onSelectionChange","_lastSelection$value2","_lastSelection$value3","lastTarget","target","latestSelection","start","onStart","keyboardWillChangeSize","keyboardWillHide","focusWasChanged","onMove","onEnd","previous","view","paddingBottom","createElement","_extends","scrollEventThrottle","View","style"],"sources":["index.tsx"],"sourcesContent":["import React, { forwardRef, useCallback, useEffect, useMemo } from \"react\";\nimport Reanimated, {\n clamp,\n interpolate,\n runOnUI,\n scrollTo,\n useAnimatedReaction,\n useAnimatedRef,\n useAnimatedStyle,\n useScrollViewOffset,\n useSharedValue,\n} from \"react-native-reanimated\";\n\nimport {\n useFocusedInputHandler,\n useReanimatedFocusedInput,\n useWindowDimensions,\n} from \"../../hooks\";\nimport { findNodeHandle } from \"../../utils/findNodeHandle\";\n\nimport { useSmoothKeyboardHandler } from \"./useSmoothKeyboardHandler\";\nimport { debounce, scrollDistanceWithRespectToSnapPoints } from \"./utils\";\n\nimport type {\n LayoutChangeEvent,\n ScrollView,\n ScrollViewProps,\n} from \"react-native\";\nimport type {\n FocusedInputLayoutChangedEvent,\n FocusedInputSelectionChangedEvent,\n NativeEvent,\n} from \"react-native-keyboard-controller\";\n\nexport type KeyboardAwareScrollViewProps = {\n /** The distance between the keyboard and the caret inside a focused `TextInput` when the keyboard is shown. Default is `0`. */\n bottomOffset?: number;\n /** Prevents automatic scrolling of the `ScrollView` when the keyboard gets hidden, maintaining the current screen position. Default is `false`. */\n disableScrollOnKeyboardHide?: boolean;\n /** Controls whether this `KeyboardAwareScrollView` instance should take effect. Default is `true`. */\n enabled?: boolean;\n /** Adjusting the bottom spacing of KeyboardAwareScrollView. Default is `0`. */\n extraKeyboardSpace?: number;\n /** Custom component for `ScrollView`. Default is `ScrollView`. */\n ScrollViewComponent?: React.ComponentType<ScrollViewProps>;\n} & ScrollViewProps;\n\n// Everything begins from `onStart` handler. This handler is called every time,\n// when keyboard changes its size or when focused `TextInput` was changed. In\n// this handler we are calculating/memoizing values which later will be used\n// during layout movement. For that we calculate:\n// - layout of focused field (`layout`) - to understand whether there will be overlap\n// - initial keyboard size (`initialKeyboardSize`) - used in scroll interpolation\n// - future keyboard height (`keyboardHeight`) - used in scroll interpolation\n// - current scroll position (`scrollPosition`) - used to scroll from this point\n//\n// Once we've calculated all necessary variables - we can actually start to use them.\n// It happens in `onMove` handler - this function simply calls `maybeScroll` with\n// current keyboard frame height. This functions makes the smooth transition.\n//\n// When the transition has finished we go to `onEnd` handler. In this handler\n// we verify, that the current field is not overlapped within a keyboard frame.\n// For full `onStart`/`onMove`/`onEnd` flow it may look like a redundant thing,\n// however there could be some cases, when `onMove` is not called:\n// - on iOS when TextInput was changed - keyboard transition is instant\n// - on Android when TextInput was changed and keyboard size wasn't changed\n// So `onEnd` handler handle the case, when `onMove` wasn't triggered.\n//\n// ====================================================================================================================+\n// -----------------------------------------------------Flow chart-----------------------------------------------------+\n// ====================================================================================================================+\n//\n// +============================+ +============================+ +==================================+\n// + User Press on TextInput + => + Keyboard starts showing + => + As keyboard moves frame by frame + =>\n// + + + (run `onStart`) + + `onMove` is getting called +\n// +============================+ +============================+ +==================================+\n//\n// +============================+ +============================+ +=====================================+\n// + Keyboard is shown and we + => + User moved focus to + => + Only `onStart`/`onEnd` maybe called +\n// + call `onEnd` handler + + another `TextInput` + + (without involving `onMove`) +\n// +============================+ +============================+ +=====================================+\n//\n\n/**\n * A ScrollView component that automatically handles keyboard appearance and disappearance\n * by adjusting its content position to ensure the focused input remains visible.\n *\n * The component uses a sophisticated animation system to smoothly handle keyboard transitions\n * and maintain proper scroll position during keyboard interactions.\n *\n * @returns A ScrollView component that handles keyboard interactions.\n * @see {@link https://kirillzyusko.github.io/react-native-keyboard-controller/docs/api/components/keyboard-aware-scroll-view|Documentation} page for more details.\n * @example\n * ```tsx\n * <KeyboardAwareScrollView bottomOffset={20}>\n * <TextInput placeholder=\"Enter text\" />\n * <TextInput placeholder=\"Another input\" />\n * </KeyboardAwareScrollView>\n * ```\n */\nconst KeyboardAwareScrollView = forwardRef<\n ScrollView,\n React.PropsWithChildren<KeyboardAwareScrollViewProps>\n>(\n (\n {\n children,\n onLayout,\n bottomOffset = 0,\n disableScrollOnKeyboardHide = false,\n enabled = true,\n extraKeyboardSpace = 0,\n ScrollViewComponent = Reanimated.ScrollView,\n snapToOffsets,\n ...rest\n },\n ref,\n ) => {\n const scrollViewAnimatedRef = useAnimatedRef<Reanimated.ScrollView>();\n const scrollViewTarget = useSharedValue<number | null>(null);\n const scrollPosition = useSharedValue(0);\n const position = useScrollViewOffset(scrollViewAnimatedRef);\n const currentKeyboardFrameHeight = useSharedValue(0);\n const keyboardHeight = useSharedValue(0);\n const keyboardWillAppear = useSharedValue(false);\n const tag = useSharedValue(-1);\n const initialKeyboardSize = useSharedValue(0);\n const scrollBeforeKeyboardMovement = useSharedValue(0);\n const { input } = useReanimatedFocusedInput();\n const layout = useSharedValue<FocusedInputLayoutChangedEvent | null>(null);\n const lastSelection =\n useSharedValue<FocusedInputSelectionChangedEvent | null>(null);\n\n const { height } = useWindowDimensions();\n\n const onRef = useCallback((assignedRef: Reanimated.ScrollView) => {\n if (typeof ref === \"function\") {\n ref(assignedRef);\n } else if (ref) {\n ref.current = assignedRef;\n }\n\n scrollViewAnimatedRef(assignedRef);\n }, []);\n const onScrollViewLayout = useCallback(\n (e: LayoutChangeEvent) => {\n scrollViewTarget.value = findNodeHandle(scrollViewAnimatedRef.current);\n\n onLayout?.(e);\n },\n [onLayout],\n );\n\n /**\n * Function that will scroll a ScrollView as keyboard gets moving.\n */\n const maybeScroll = useCallback(\n (e: number, animated: boolean = false) => {\n \"worklet\";\n\n if (!enabled) {\n return 0;\n }\n\n // input belongs to ScrollView\n if (layout.value?.parentScrollViewTarget !== scrollViewTarget.value) {\n return 0;\n }\n\n const visibleRect = height - keyboardHeight.value;\n const absoluteY = layout.value?.layout.absoluteY || 0;\n const inputHeight = layout.value?.layout.height || 0;\n const point = absoluteY + inputHeight;\n\n if (visibleRect - point <= bottomOffset) {\n const relativeScrollTo =\n keyboardHeight.value - (height - point) + bottomOffset;\n const interpolatedScrollTo = interpolate(\n e,\n [initialKeyboardSize.value, keyboardHeight.value],\n [\n 0,\n scrollDistanceWithRespectToSnapPoints(\n relativeScrollTo + scrollPosition.value,\n snapToOffsets,\n ) - scrollPosition.value,\n ],\n );\n const targetScrollY =\n Math.max(interpolatedScrollTo, 0) + scrollPosition.value;\n\n scrollTo(scrollViewAnimatedRef, 0, targetScrollY, animated);\n\n return interpolatedScrollTo;\n }\n\n if (point < 0) {\n const positionOnScreen = visibleRect - bottomOffset;\n const topOfScreen = scrollPosition.value + point;\n\n scrollTo(\n scrollViewAnimatedRef,\n 0,\n topOfScreen - positionOnScreen,\n animated,\n );\n }\n\n return 0;\n },\n [bottomOffset, enabled, height, snapToOffsets],\n );\n const syncKeyboardFrame = useCallback(\n (e: NativeEvent) => {\n \"worklet\";\n\n const keyboardFrame = interpolate(\n e.height,\n [0, keyboardHeight.value],\n [0, keyboardHeight.value + extraKeyboardSpace],\n );\n\n currentKeyboardFrameHeight.value = keyboardFrame;\n },\n [extraKeyboardSpace],\n );\n\n const updateLayoutFromSelection = useCallback(() => {\n \"worklet\";\n\n const customHeight = lastSelection.value?.selection.end.y;\n\n if (!input.value?.layout || !customHeight) {\n return false;\n }\n\n layout.value = {\n ...input.value,\n layout: {\n ...input.value.layout,\n // when we have multiline input with limited amount of lines, then custom height can be very big\n // so we clamp it to max input height\n height: clamp(customHeight, 0, input.value.layout.height),\n },\n };\n\n return true;\n }, [input, lastSelection, layout]);\n const scrollFromCurrentPosition = useCallback(() => {\n \"worklet\";\n\n const prevScrollPosition = scrollPosition.value;\n const prevLayout = layout.value;\n\n if (!updateLayoutFromSelection()) {\n return;\n }\n\n // eslint-disable-next-line react-compiler/react-compiler\n scrollPosition.value = position.value;\n maybeScroll(keyboardHeight.value, true);\n scrollPosition.value = prevScrollPosition;\n layout.value = prevLayout;\n }, [maybeScroll]);\n const onChangeText = useCallback(() => {\n \"worklet\";\n\n console.debug(\"maybeScroll - onChangeText\");\n scrollFromCurrentPosition();\n }, [scrollFromCurrentPosition]);\n const onChangeTextHandler = useMemo(\n () => debounce(onChangeText, 200),\n [onChangeText],\n );\n const onSelectionChange = useCallback(\n (e: FocusedInputSelectionChangedEvent) => {\n \"worklet\";\n\n const lastTarget = lastSelection.value?.target;\n const latestSelection = lastSelection.value?.selection;\n\n lastSelection.value = e;\n\n if (e.target !== lastTarget) {\n // ignore this event, because \"focus changed\" event handled in `useSmoothKeyboardHandler`\n return;\n }\n // caret in the end + end coordinates has been changed -> we moved to a new line\n // so input may grow\n if (\n e.selection.end.position === e.selection.start.position &&\n latestSelection?.end.y !== e.selection.end.y\n ) {\n return scrollFromCurrentPosition();\n }\n // selection has been changed\n if (e.selection.start.position !== e.selection.end.position) {\n return scrollFromCurrentPosition();\n }\n\n onChangeTextHandler();\n },\n [scrollFromCurrentPosition, onChangeTextHandler],\n );\n\n useFocusedInputHandler(\n {\n onSelectionChange: onSelectionChange,\n },\n [onSelectionChange],\n );\n\n useSmoothKeyboardHandler(\n {\n onStart: (e) => {\n \"worklet\";\n\n const keyboardWillChangeSize =\n keyboardHeight.value !== e.height && e.height > 0;\n\n keyboardWillAppear.value = e.height > 0 && keyboardHeight.value === 0;\n\n const keyboardWillHide = e.height === 0;\n const focusWasChanged =\n (tag.value !== e.target && e.target !== -1) ||\n keyboardWillChangeSize;\n\n if (keyboardWillChangeSize) {\n initialKeyboardSize.value = keyboardHeight.value;\n }\n\n if (keyboardWillHide) {\n // on back transition need to interpolate as [0, keyboardHeight]\n initialKeyboardSize.value = 0;\n scrollPosition.value = scrollBeforeKeyboardMovement.value;\n }\n\n if (\n keyboardWillAppear.value ||\n keyboardWillChangeSize ||\n focusWasChanged\n ) {\n // persist scroll value\n scrollPosition.value = position.value;\n // just persist height - later will be used in interpolation\n keyboardHeight.value = e.height;\n }\n\n // focus was changed\n if (focusWasChanged) {\n tag.value = e.target;\n // save position of focused text input when keyboard starts to move\n updateLayoutFromSelection();\n // save current scroll position - when keyboard will hide we'll reuse\n // this value to achieve smooth hide effect\n scrollBeforeKeyboardMovement.value = position.value;\n }\n\n if (focusWasChanged && !keyboardWillAppear.value) {\n // update position on scroll value, so `onEnd` handler\n // will pick up correct values\n position.value += maybeScroll(e.height, true);\n }\n },\n onMove: (e) => {\n \"worklet\";\n\n syncKeyboardFrame(e);\n\n // if the user has set disableScrollOnKeyboardHide, only auto-scroll when the keyboard opens\n if (!disableScrollOnKeyboardHide || keyboardWillAppear.value) {\n maybeScroll(e.height);\n }\n },\n onEnd: (e) => {\n \"worklet\";\n\n keyboardHeight.value = e.height;\n scrollPosition.value = position.value;\n\n syncKeyboardFrame(e);\n },\n },\n [maybeScroll, disableScrollOnKeyboardHide, syncKeyboardFrame],\n );\n\n useEffect(() => {\n runOnUI(maybeScroll)(keyboardHeight.value, true);\n }, [bottomOffset]);\n\n useAnimatedReaction(\n () => input.value,\n (current, previous) => {\n if (\n current?.target === previous?.target &&\n current?.layout.height !== previous?.layout.height\n ) {\n // input has changed layout - let's check if we need to scroll\n // may happen when you paste text, then onSelectionChange will be\n // fired earlier than text actually changes its layout\n scrollFromCurrentPosition();\n }\n },\n [],\n );\n\n const view = useAnimatedStyle(\n () =>\n enabled\n ? {\n // animations become choppy when scrolling to the end of the `ScrollView` (when the last input is focused)\n // this happens because the layout recalculates on every frame. To avoid this we slightly increase padding\n // by `+1`. In this way we assure, that `scrollTo` will never scroll to the end, because it uses interpolation\n // from 0 to `keyboardHeight`, and here our padding is `keyboardHeight + 1`. It allows us not to re-run layout\n // re-calculation on every animation frame and it helps to achieve smooth animation.\n // see: https://github.com/kirillzyusko/react-native-keyboard-controller/pull/342\n paddingBottom: currentKeyboardFrameHeight.value + 1,\n }\n : {},\n [enabled],\n );\n\n return (\n <ScrollViewComponent\n ref={onRef}\n {...rest}\n scrollEventThrottle={16}\n onLayout={onScrollViewLayout}\n >\n {children}\n {enabled && <Reanimated.View style={view} />}\n </ScrollViewComponent>\n );\n },\n);\n\nexport default KeyboardAwareScrollView;\n"],"mappings":";AAAA,OAAOA,KAAK,IAAIC,UAAU,EAAEC,WAAW,EAAEC,SAAS,EAAEC,OAAO,QAAQ,OAAO;AAC1E,OAAOC,UAAU,IACfC,KAAK,EACLC,WAAW,EACXC,OAAO,EACPC,QAAQ,EACRC,mBAAmB,EACnBC,cAAc,EACdC,gBAAgB,EAChBC,mBAAmB,EACnBC,cAAc,QACT,yBAAyB;AAEhC,SACEC,sBAAsB,EACtBC,yBAAyB,EACzBC,mBAAmB,QACd,aAAa;AACpB,SAASC,cAAc,QAAQ,4BAA4B;AAE3D,SAASC,wBAAwB,QAAQ,4BAA4B;AACrE,SAASC,QAAQ,EAAEC,qCAAqC,QAAQ,SAAS;AA0BzE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAMC,uBAAuB,gBAAGrB,UAAU,CAIxC,CACE;EACEsB,QAAQ;EACRC,QAAQ;EACRC,YAAY,GAAG,CAAC;EAChBC,2BAA2B,GAAG,KAAK;EACnCC,OAAO,GAAG,IAAI;EACdC,kBAAkB,GAAG,CAAC;EACtBC,mBAAmB,GAAGxB,UAAU,CAACyB,UAAU;EAC3CC,aAAa;EACb,GAAGC;AACL,CAAC,EACDC,GAAG,KACA;EACH,MAAMC,qBAAqB,GAAGvB,cAAc,CAAwB,CAAC;EACrE,MAAMwB,gBAAgB,GAAGrB,cAAc,CAAgB,IAAI,CAAC;EAC5D,MAAMsB,cAAc,GAAGtB,cAAc,CAAC,CAAC,CAAC;EACxC,MAAMuB,QAAQ,GAAGxB,mBAAmB,CAACqB,qBAAqB,CAAC;EAC3D,MAAMI,0BAA0B,GAAGxB,cAAc,CAAC,CAAC,CAAC;EACpD,MAAMyB,cAAc,GAAGzB,cAAc,CAAC,CAAC,CAAC;EACxC,MAAM0B,kBAAkB,GAAG1B,cAAc,CAAC,KAAK,CAAC;EAChD,MAAM2B,GAAG,GAAG3B,cAAc,CAAC,CAAC,CAAC,CAAC;EAC9B,MAAM4B,mBAAmB,GAAG5B,cAAc,CAAC,CAAC,CAAC;EAC7C,MAAM6B,4BAA4B,GAAG7B,cAAc,CAAC,CAAC,CAAC;EACtD,MAAM;IAAE8B;EAAM,CAAC,GAAG5B,yBAAyB,CAAC,CAAC;EAC7C,MAAM6B,MAAM,GAAG/B,cAAc,CAAwC,IAAI,CAAC;EAC1E,MAAMgC,aAAa,GACjBhC,cAAc,CAA2C,IAAI,CAAC;EAEhE,MAAM;IAAEiC;EAAO,CAAC,GAAG9B,mBAAmB,CAAC,CAAC;EAExC,MAAM+B,KAAK,GAAG9C,WAAW,CAAE+C,WAAkC,IAAK;IAChE,IAAI,OAAOhB,GAAG,KAAK,UAAU,EAAE;MAC7BA,GAAG,CAACgB,WAAW,CAAC;IAClB,CAAC,MAAM,IAAIhB,GAAG,EAAE;MACdA,GAAG,CAACiB,OAAO,GAAGD,WAAW;IAC3B;IAEAf,qBAAqB,CAACe,WAAW,CAAC;EACpC,CAAC,EAAE,EAAE,CAAC;EACN,MAAME,kBAAkB,GAAGjD,WAAW,CACnCkD,CAAoB,IAAK;IACxBjB,gBAAgB,CAACkB,KAAK,GAAGnC,cAAc,CAACgB,qBAAqB,CAACgB,OAAO,CAAC;IAEtE1B,QAAQ,aAARA,QAAQ,eAARA,QAAQ,CAAG4B,CAAC,CAAC;EACf,CAAC,EACD,CAAC5B,QAAQ,CACX,CAAC;;EAED;AACJ;AACA;EACI,MAAM8B,WAAW,GAAGpD,WAAW,CAC7B,CAACkD,CAAS,EAAEG,QAAiB,GAAG,KAAK,KAAK;IACxC,SAAS;;IAAC,IAAAC,aAAA,EAAAC,cAAA,EAAAC,cAAA;IAEV,IAAI,CAAC/B,OAAO,EAAE;MACZ,OAAO,CAAC;IACV;;IAEA;IACA,IAAI,EAAA6B,aAAA,GAAAX,MAAM,CAACQ,KAAK,cAAAG,aAAA,uBAAZA,aAAA,CAAcG,sBAAsB,MAAKxB,gBAAgB,CAACkB,KAAK,EAAE;MACnE,OAAO,CAAC;IACV;IAEA,MAAMO,WAAW,GAAGb,MAAM,GAAGR,cAAc,CAACc,KAAK;IACjD,MAAMQ,SAAS,GAAG,EAAAJ,cAAA,GAAAZ,MAAM,CAACQ,KAAK,cAAAI,cAAA,uBAAZA,cAAA,CAAcZ,MAAM,CAACgB,SAAS,KAAI,CAAC;IACrD,MAAMC,WAAW,GAAG,EAAAJ,cAAA,GAAAb,MAAM,CAACQ,KAAK,cAAAK,cAAA,uBAAZA,cAAA,CAAcb,MAAM,CAACE,MAAM,KAAI,CAAC;IACpD,MAAMgB,KAAK,GAAGF,SAAS,GAAGC,WAAW;IAErC,IAAIF,WAAW,GAAGG,KAAK,IAAItC,YAAY,EAAE;MACvC,MAAMuC,gBAAgB,GACpBzB,cAAc,CAACc,KAAK,IAAIN,MAAM,GAAGgB,KAAK,CAAC,GAAGtC,YAAY;MACxD,MAAMwC,oBAAoB,GAAG1D,WAAW,CACtC6C,CAAC,EACD,CAACV,mBAAmB,CAACW,KAAK,EAAEd,cAAc,CAACc,KAAK,CAAC,EACjD,CACE,CAAC,EACDhC,qCAAqC,CACnC2C,gBAAgB,GAAG5B,cAAc,CAACiB,KAAK,EACvCtB,aACF,CAAC,GAAGK,cAAc,CAACiB,KAAK,CAE5B,CAAC;MACD,MAAMa,aAAa,GACjBC,IAAI,CAACC,GAAG,CAACH,oBAAoB,EAAE,CAAC,CAAC,GAAG7B,cAAc,CAACiB,KAAK;MAE1D5C,QAAQ,CAACyB,qBAAqB,EAAE,CAAC,EAAEgC,aAAa,EAAEX,QAAQ,CAAC;MAE3D,OAAOU,oBAAoB;IAC7B;IAEA,IAAIF,KAAK,GAAG,CAAC,EAAE;MACb,MAAMM,gBAAgB,GAAGT,WAAW,GAAGnC,YAAY;MACnD,MAAM6C,WAAW,GAAGlC,cAAc,CAACiB,KAAK,GAAGU,KAAK;MAEhDtD,QAAQ,CACNyB,qBAAqB,EACrB,CAAC,EACDoC,WAAW,GAAGD,gBAAgB,EAC9Bd,QACF,CAAC;IACH;IAEA,OAAO,CAAC;EACV,CAAC,EACD,CAAC9B,YAAY,EAAEE,OAAO,EAAEoB,MAAM,EAAEhB,aAAa,CAC/C,CAAC;EACD,MAAMwC,iBAAiB,GAAGrE,WAAW,CAClCkD,CAAc,IAAK;IAClB,SAAS;;IAET,MAAMoB,aAAa,GAAGjE,WAAW,CAC/B6C,CAAC,CAACL,MAAM,EACR,CAAC,CAAC,EAAER,cAAc,CAACc,KAAK,CAAC,EACzB,CAAC,CAAC,EAAEd,cAAc,CAACc,KAAK,GAAGzB,kBAAkB,CAC/C,CAAC;IAEDU,0BAA0B,CAACe,KAAK,GAAGmB,aAAa;EAClD,CAAC,EACD,CAAC5C,kBAAkB,CACrB,CAAC;EAED,MAAM6C,yBAAyB,GAAGvE,WAAW,CAAC,MAAM;IAClD,SAAS;;IAAC,IAAAwE,oBAAA,EAAAC,YAAA;IAEV,MAAMC,YAAY,IAAAF,oBAAA,GAAG5B,aAAa,CAACO,KAAK,cAAAqB,oBAAA,uBAAnBA,oBAAA,CAAqBG,SAAS,CAACC,GAAG,CAACC,CAAC;IAEzD,IAAI,GAAAJ,YAAA,GAAC/B,KAAK,CAACS,KAAK,cAAAsB,YAAA,eAAXA,YAAA,CAAa9B,MAAM,KAAI,CAAC+B,YAAY,EAAE;MACzC,OAAO,KAAK;IACd;IAEA/B,MAAM,CAACQ,KAAK,GAAG;MACb,GAAGT,KAAK,CAACS,KAAK;MACdR,MAAM,EAAE;QACN,GAAGD,KAAK,CAACS,KAAK,CAACR,MAAM;QACrB;QACA;QACAE,MAAM,EAAEzC,KAAK,CAACsE,YAAY,EAAE,CAAC,EAAEhC,KAAK,CAACS,KAAK,CAACR,MAAM,CAACE,MAAM;MAC1D;IACF,CAAC;IAED,OAAO,IAAI;EACb,CAAC,EAAE,CAACH,KAAK,EAAEE,aAAa,EAAED,MAAM,CAAC,CAAC;EAClC,MAAMmC,yBAAyB,GAAG9E,WAAW,CAAC,MAAM;IAClD,SAAS;;IAET,MAAM+E,kBAAkB,GAAG7C,cAAc,CAACiB,KAAK;IAC/C,MAAM6B,UAAU,GAAGrC,MAAM,CAACQ,KAAK;IAE/B,IAAI,CAACoB,yBAAyB,CAAC,CAAC,EAAE;MAChC;IACF;;IAEA;IACArC,cAAc,CAACiB,KAAK,GAAGhB,QAAQ,CAACgB,KAAK;IACrCC,WAAW,CAACf,cAAc,CAACc,KAAK,EAAE,IAAI,CAAC;IACvCjB,cAAc,CAACiB,KAAK,GAAG4B,kBAAkB;IACzCpC,MAAM,CAACQ,KAAK,GAAG6B,UAAU;EAC3B,CAAC,EAAE,CAAC5B,WAAW,CAAC,CAAC;EACjB,MAAM6B,YAAY,GAAGjF,WAAW,CAAC,MAAM;IACrC,SAAS;;IAETkF,OAAO,CAACC,KAAK,CAAC,4BAA4B,CAAC;IAC3CL,yBAAyB,CAAC,CAAC;EAC7B,CAAC,EAAE,CAACA,yBAAyB,CAAC,CAAC;EAC/B,MAAMM,mBAAmB,GAAGlF,OAAO,CACjC,MAAMgB,QAAQ,CAAC+D,YAAY,EAAE,GAAG,CAAC,EACjC,CAACA,YAAY,CACf,CAAC;EACD,MAAMI,iBAAiB,GAAGrF,WAAW,CAClCkD,CAAoC,IAAK;IACxC,SAAS;;IAAC,IAAAoC,qBAAA,EAAAC,qBAAA;IAEV,MAAMC,UAAU,IAAAF,qBAAA,GAAG1C,aAAa,CAACO,KAAK,cAAAmC,qBAAA,uBAAnBA,qBAAA,CAAqBG,MAAM;IAC9C,MAAMC,eAAe,IAAAH,qBAAA,GAAG3C,aAAa,CAACO,KAAK,cAAAoC,qBAAA,uBAAnBA,qBAAA,CAAqBZ,SAAS;IAEtD/B,aAAa,CAACO,KAAK,GAAGD,CAAC;IAEvB,IAAIA,CAAC,CAACuC,MAAM,KAAKD,UAAU,EAAE;MAC3B;MACA;IACF;IACA;IACA;IACA,IACEtC,CAAC,CAACyB,SAAS,CAACC,GAAG,CAACzC,QAAQ,KAAKe,CAAC,CAACyB,SAAS,CAACgB,KAAK,CAACxD,QAAQ,IACvD,CAAAuD,eAAe,aAAfA,eAAe,uBAAfA,eAAe,CAAEd,GAAG,CAACC,CAAC,MAAK3B,CAAC,CAACyB,SAAS,CAACC,GAAG,CAACC,CAAC,EAC5C;MACA,OAAOC,yBAAyB,CAAC,CAAC;IACpC;IACA;IACA,IAAI5B,CAAC,CAACyB,SAAS,CAACgB,KAAK,CAACxD,QAAQ,KAAKe,CAAC,CAACyB,SAAS,CAACC,GAAG,CAACzC,QAAQ,EAAE;MAC3D,OAAO2C,yBAAyB,CAAC,CAAC;IACpC;IAEAM,mBAAmB,CAAC,CAAC;EACvB,CAAC,EACD,CAACN,yBAAyB,EAAEM,mBAAmB,CACjD,CAAC;EAEDvE,sBAAsB,CACpB;IACEwE,iBAAiB,EAAEA;EACrB,CAAC,EACD,CAACA,iBAAiB,CACpB,CAAC;EAEDpE,wBAAwB,CACtB;IACE2E,OAAO,EAAG1C,CAAC,IAAK;MACd,SAAS;;MAET,MAAM2C,sBAAsB,GAC1BxD,cAAc,CAACc,KAAK,KAAKD,CAAC,CAACL,MAAM,IAAIK,CAAC,CAACL,MAAM,GAAG,CAAC;MAEnDP,kBAAkB,CAACa,KAAK,GAAGD,CAAC,CAACL,MAAM,GAAG,CAAC,IAAIR,cAAc,CAACc,KAAK,KAAK,CAAC;MAErE,MAAM2C,gBAAgB,GAAG5C,CAAC,CAACL,MAAM,KAAK,CAAC;MACvC,MAAMkD,eAAe,GAClBxD,GAAG,CAACY,KAAK,KAAKD,CAAC,CAACuC,MAAM,IAAIvC,CAAC,CAACuC,MAAM,KAAK,CAAC,CAAC,IAC1CI,sBAAsB;MAExB,IAAIA,sBAAsB,EAAE;QAC1BrD,mBAAmB,CAACW,KAAK,GAAGd,cAAc,CAACc,KAAK;MAClD;MAEA,IAAI2C,gBAAgB,EAAE;QACpB;QACAtD,mBAAmB,CAACW,KAAK,GAAG,CAAC;QAC7BjB,cAAc,CAACiB,KAAK,GAAGV,4BAA4B,CAACU,KAAK;MAC3D;MAEA,IACEb,kBAAkB,CAACa,KAAK,IACxB0C,sBAAsB,IACtBE,eAAe,EACf;QACA;QACA7D,cAAc,CAACiB,KAAK,GAAGhB,QAAQ,CAACgB,KAAK;QACrC;QACAd,cAAc,CAACc,KAAK,GAAGD,CAAC,CAACL,MAAM;MACjC;;MAEA;MACA,IAAIkD,eAAe,EAAE;QACnBxD,GAAG,CAACY,KAAK,GAAGD,CAAC,CAACuC,MAAM;QACpB;QACAlB,yBAAyB,CAAC,CAAC;QAC3B;QACA;QACA9B,4BAA4B,CAACU,KAAK,GAAGhB,QAAQ,CAACgB,KAAK;MACrD;MAEA,IAAI4C,eAAe,IAAI,CAACzD,kBAAkB,CAACa,KAAK,EAAE;QAChD;QACA;QACAhB,QAAQ,CAACgB,KAAK,IAAIC,WAAW,CAACF,CAAC,CAACL,MAAM,EAAE,IAAI,CAAC;MAC/C;IACF,CAAC;IACDmD,MAAM,EAAG9C,CAAC,IAAK;MACb,SAAS;;MAETmB,iBAAiB,CAACnB,CAAC,CAAC;;MAEpB;MACA,IAAI,CAAC1B,2BAA2B,IAAIc,kBAAkB,CAACa,KAAK,EAAE;QAC5DC,WAAW,CAACF,CAAC,CAACL,MAAM,CAAC;MACvB;IACF,CAAC;IACDoD,KAAK,EAAG/C,CAAC,IAAK;MACZ,SAAS;;MAETb,cAAc,CAACc,KAAK,GAAGD,CAAC,CAACL,MAAM;MAC/BX,cAAc,CAACiB,KAAK,GAAGhB,QAAQ,CAACgB,KAAK;MAErCkB,iBAAiB,CAACnB,CAAC,CAAC;IACtB;EACF,CAAC,EACD,CAACE,WAAW,EAAE5B,2BAA2B,EAAE6C,iBAAiB,CAC9D,CAAC;EAEDpE,SAAS,CAAC,MAAM;IACdK,OAAO,CAAC8C,WAAW,CAAC,CAACf,cAAc,CAACc,KAAK,EAAE,IAAI,CAAC;EAClD,CAAC,EAAE,CAAC5B,YAAY,CAAC,CAAC;EAElBf,mBAAmB,CACjB,MAAMkC,KAAK,CAACS,KAAK,EACjB,CAACH,OAAO,EAAEkD,QAAQ,KAAK;IACrB,IACE,CAAAlD,OAAO,aAAPA,OAAO,uBAAPA,OAAO,CAAEyC,MAAM,OAAKS,QAAQ,aAARA,QAAQ,uBAARA,QAAQ,CAAET,MAAM,KACpC,CAAAzC,OAAO,aAAPA,OAAO,uBAAPA,OAAO,CAAEL,MAAM,CAACE,MAAM,OAAKqD,QAAQ,aAARA,QAAQ,uBAARA,QAAQ,CAAEvD,MAAM,CAACE,MAAM,GAClD;MACA;MACA;MACA;MACAiC,yBAAyB,CAAC,CAAC;IAC7B;EACF,CAAC,EACD,EACF,CAAC;EAED,MAAMqB,IAAI,GAAGzF,gBAAgB,CAC3B,MACEe,OAAO,GACH;IACE;IACA;IACA;IACA;IACA;IACA;IACA2E,aAAa,EAAEhE,0BAA0B,CAACe,KAAK,GAAG;EACpD,CAAC,GACD,CAAC,CAAC,EACR,CAAC1B,OAAO,CACV,CAAC;EAED,oBACE3B,KAAA,CAAAuG,aAAA,CAAC1E,mBAAmB,EAAA2E,QAAA;IAClBvE,GAAG,EAAEe;EAAM,GACPhB,IAAI;IACRyE,mBAAmB,EAAE,EAAG;IACxBjF,QAAQ,EAAE2B;EAAmB,IAE5B5B,QAAQ,EACRI,OAAO,iBAAI3B,KAAA,CAAAuG,aAAA,CAAClG,UAAU,CAACqG,IAAI;IAACC,KAAK,EAAEN;EAAK,CAAE,CACxB,CAAC;AAE1B,CACF,CAAC;AAED,eAAe/E,uBAAuB","ignoreList":[]}
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
import React, { useMemo } from "react";
|
|
2
2
|
import { Animated, StyleSheet, View } from "react-native";
|
|
3
|
-
import
|
|
3
|
+
import { useKeyboardState } from "../../hooks";
|
|
4
4
|
const ArrowComponent = ({
|
|
5
5
|
type,
|
|
6
6
|
disabled,
|
|
7
7
|
theme
|
|
8
8
|
}) => {
|
|
9
|
-
const colorScheme =
|
|
9
|
+
const colorScheme = useKeyboardState(state => state.appearance);
|
|
10
10
|
const color = useMemo(() => ({
|
|
11
11
|
backgroundColor: disabled ? theme[colorScheme].disabled : theme[colorScheme].primary
|
|
12
12
|
}), [disabled, theme, colorScheme]);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["React","useMemo","Animated","StyleSheet","View","
|
|
1
|
+
{"version":3,"names":["React","useMemo","Animated","StyleSheet","View","useKeyboardState","ArrowComponent","type","disabled","theme","colorScheme","state","appearance","color","backgroundColor","primary","left","styles","arrowLeftLine","right","arrowRightLine","createElement","style","arrowDownContainer","arrowUpContainer","arrow","arrowLine","width","height","borderRadius","marginHorizontal","justifyContent","alignItems","create","transform","rotate","flexDirection"],"sources":["Arrow.tsx"],"sourcesContent":["import React, { useMemo } from \"react\";\nimport { Animated, StyleSheet, View } from \"react-native\";\n\nimport { useKeyboardState } from \"../../hooks\";\n\nimport type { KeyboardToolbarTheme } from \"./types\";\nimport type { ViewStyle } from \"react-native\";\n\ntype ArrowProps = {\n type: \"prev\" | \"next\";\n disabled?: boolean;\n theme: KeyboardToolbarTheme;\n};\n\nconst ArrowComponent: React.FC<ArrowProps> = ({ type, disabled, theme }) => {\n const colorScheme = useKeyboardState((state) => state.appearance);\n\n const color = useMemo(\n () => ({\n backgroundColor: disabled\n ? theme[colorScheme].disabled\n : theme[colorScheme].primary,\n }),\n [disabled, theme, colorScheme],\n );\n const left = useMemo(() => [styles.arrowLeftLine, color], [color]);\n const right = useMemo(() => [styles.arrowRightLine, color], [color]);\n\n return (\n <View\n style={\n type === \"next\" ? styles.arrowDownContainer : styles.arrowUpContainer\n }\n >\n <View style={styles.arrow}>\n <Animated.View style={left} />\n <Animated.View style={right} />\n </View>\n </View>\n );\n};\n\nconst arrowLine: ViewStyle = {\n width: 13,\n height: 2,\n borderRadius: 1,\n};\nconst arrowUpContainer: ViewStyle = {\n marginHorizontal: 5,\n width: 30,\n height: 30,\n justifyContent: \"center\",\n alignItems: \"center\",\n};\nconst styles = StyleSheet.create({\n arrowUpContainer: arrowUpContainer,\n arrowDownContainer: {\n ...arrowUpContainer,\n transform: [{ rotate: \"180deg\" }],\n },\n arrow: {\n width: 20,\n height: 20,\n flexDirection: \"row\",\n alignItems: \"center\",\n justifyContent: \"space-between\",\n },\n arrowLeftLine: {\n ...arrowLine,\n transform: [{ rotate: \"-45deg\" }],\n left: -0.5,\n },\n arrowRightLine: {\n ...arrowLine,\n transform: [{ rotate: \"45deg\" }],\n left: -5.5,\n },\n});\n\nexport default ArrowComponent;\n"],"mappings":"AAAA,OAAOA,KAAK,IAAIC,OAAO,QAAQ,OAAO;AACtC,SAASC,QAAQ,EAAEC,UAAU,EAAEC,IAAI,QAAQ,cAAc;AAEzD,SAASC,gBAAgB,QAAQ,aAAa;AAW9C,MAAMC,cAAoC,GAAGA,CAAC;EAAEC,IAAI;EAAEC,QAAQ;EAAEC;AAAM,CAAC,KAAK;EAC1E,MAAMC,WAAW,GAAGL,gBAAgB,CAAEM,KAAK,IAAKA,KAAK,CAACC,UAAU,CAAC;EAEjE,MAAMC,KAAK,GAAGZ,OAAO,CACnB,OAAO;IACLa,eAAe,EAAEN,QAAQ,GACrBC,KAAK,CAACC,WAAW,CAAC,CAACF,QAAQ,GAC3BC,KAAK,CAACC,WAAW,CAAC,CAACK;EACzB,CAAC,CAAC,EACF,CAACP,QAAQ,EAAEC,KAAK,EAAEC,WAAW,CAC/B,CAAC;EACD,MAAMM,IAAI,GAAGf,OAAO,CAAC,MAAM,CAACgB,MAAM,CAACC,aAAa,EAAEL,KAAK,CAAC,EAAE,CAACA,KAAK,CAAC,CAAC;EAClE,MAAMM,KAAK,GAAGlB,OAAO,CAAC,MAAM,CAACgB,MAAM,CAACG,cAAc,EAAEP,KAAK,CAAC,EAAE,CAACA,KAAK,CAAC,CAAC;EAEpE,oBACEb,KAAA,CAAAqB,aAAA,CAACjB,IAAI;IACHkB,KAAK,EACHf,IAAI,KAAK,MAAM,GAAGU,MAAM,CAACM,kBAAkB,GAAGN,MAAM,CAACO;EACtD,gBAEDxB,KAAA,CAAAqB,aAAA,CAACjB,IAAI;IAACkB,KAAK,EAAEL,MAAM,CAACQ;EAAM,gBACxBzB,KAAA,CAAAqB,aAAA,CAACnB,QAAQ,CAACE,IAAI;IAACkB,KAAK,EAAEN;EAAK,CAAE,CAAC,eAC9BhB,KAAA,CAAAqB,aAAA,CAACnB,QAAQ,CAACE,IAAI;IAACkB,KAAK,EAAEH;EAAM,CAAE,CAC1B,CACF,CAAC;AAEX,CAAC;AAED,MAAMO,SAAoB,GAAG;EAC3BC,KAAK,EAAE,EAAE;EACTC,MAAM,EAAE,CAAC;EACTC,YAAY,EAAE;AAChB,CAAC;AACD,MAAML,gBAA2B,GAAG;EAClCM,gBAAgB,EAAE,CAAC;EACnBH,KAAK,EAAE,EAAE;EACTC,MAAM,EAAE,EAAE;EACVG,cAAc,EAAE,QAAQ;EACxBC,UAAU,EAAE;AACd,CAAC;AACD,MAAMf,MAAM,GAAGd,UAAU,CAAC8B,MAAM,CAAC;EAC/BT,gBAAgB,EAAEA,gBAAgB;EAClCD,kBAAkB,EAAE;IAClB,GAAGC,gBAAgB;IACnBU,SAAS,EAAE,CAAC;MAAEC,MAAM,EAAE;IAAS,CAAC;EAClC,CAAC;EACDV,KAAK,EAAE;IACLE,KAAK,EAAE,EAAE;IACTC,MAAM,EAAE,EAAE;IACVQ,aAAa,EAAE,KAAK;IACpBJ,UAAU,EAAE,QAAQ;IACpBD,cAAc,EAAE;EAClB,CAAC;EACDb,aAAa,EAAE;IACb,GAAGQ,SAAS;IACZQ,SAAS,EAAE,CAAC;MAAEC,MAAM,EAAE;IAAS,CAAC,CAAC;IACjCnB,IAAI,EAAE,CAAC;EACT,CAAC;EACDI,cAAc,EAAE;IACd,GAAGM,SAAS;IACZQ,SAAS,EAAE,CAAC;MAAEC,MAAM,EAAE;IAAQ,CAAC,CAAC;IAChCnB,IAAI,EAAE,CAAC;EACT;AACF,CAAC,CAAC;AAEF,eAAeV,cAAc","ignoreList":[]}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import React, { useMemo } from "react";
|
|
2
2
|
import { Platform, TouchableNativeFeedback, TouchableOpacity, View } from "react-native";
|
|
3
|
-
import
|
|
3
|
+
import { useKeyboardState } from "../../hooks";
|
|
4
4
|
const ButtonIOS = ({
|
|
5
5
|
children,
|
|
6
6
|
onPress,
|
|
@@ -37,7 +37,7 @@ const ButtonAndroid = ({
|
|
|
37
37
|
style,
|
|
38
38
|
theme
|
|
39
39
|
}) => {
|
|
40
|
-
const colorScheme =
|
|
40
|
+
const colorScheme = useKeyboardState(state => state.appearance);
|
|
41
41
|
const accessibilityState = useMemo(() => ({
|
|
42
42
|
disabled
|
|
43
43
|
}), [disabled]);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["React","useMemo","Platform","TouchableNativeFeedback","TouchableOpacity","View","
|
|
1
|
+
{"version":3,"names":["React","useMemo","Platform","TouchableNativeFeedback","TouchableOpacity","View","useKeyboardState","ButtonIOS","children","onPress","disabled","accessibilityLabel","accessibilityHint","testID","style","Container","accessibilityState","createElement","accessibilityRole","ButtonAndroid","rippleRadius","theme","colorScheme","state","appearance","ripple","Ripple","background","select","android","default"],"sources":["Button.tsx"],"sourcesContent":["import React, { useMemo } from \"react\";\nimport {\n Platform,\n TouchableNativeFeedback,\n TouchableOpacity,\n View,\n} from \"react-native\";\n\nimport { useKeyboardState } from \"../../hooks\";\n\nimport type { KeyboardToolbarTheme } from \"./types\";\nimport type { PropsWithChildren } from \"react\";\nimport type { GestureResponderEvent, ViewStyle } from \"react-native\";\n\ntype ButtonProps = {\n disabled?: boolean;\n onPress: (event: GestureResponderEvent) => void;\n accessibilityLabel: string;\n accessibilityHint: string;\n testID: string;\n rippleRadius?: number;\n style?: ViewStyle;\n theme: KeyboardToolbarTheme;\n};\n\nconst ButtonIOS = ({\n children,\n onPress,\n disabled,\n accessibilityLabel,\n accessibilityHint,\n testID,\n style,\n}: PropsWithChildren<ButtonProps>) => {\n // immediately switch to plain view to avoid animation flickering\n // when fade out animation happens and view becomes disabled\n const Container = disabled\n ? (View as unknown as typeof TouchableOpacity)\n : TouchableOpacity;\n const accessibilityState = useMemo(() => ({ disabled }), [disabled]);\n\n return (\n <Container\n accessibilityHint={accessibilityHint}\n accessibilityLabel={accessibilityLabel}\n accessibilityRole=\"button\"\n accessibilityState={accessibilityState}\n style={style}\n testID={testID}\n onPress={onPress}\n >\n {children}\n </Container>\n );\n};\nconst ButtonAndroid = ({\n children,\n onPress,\n disabled,\n accessibilityLabel,\n accessibilityHint,\n testID,\n rippleRadius = 18,\n style,\n theme,\n}: PropsWithChildren<ButtonProps>) => {\n const colorScheme = useKeyboardState((state) => state.appearance);\n const accessibilityState = useMemo(() => ({ disabled }), [disabled]);\n const ripple = useMemo(\n () =>\n TouchableNativeFeedback.Ripple(\n theme[colorScheme].ripple,\n true,\n rippleRadius,\n ),\n [colorScheme, rippleRadius, theme],\n );\n\n return (\n <TouchableNativeFeedback\n accessibilityHint={accessibilityHint}\n accessibilityLabel={accessibilityLabel}\n accessibilityRole=\"button\"\n accessibilityState={accessibilityState}\n background={ripple}\n style={style}\n testID={testID}\n onPress={onPress}\n >\n <View style={style}>{children}</View>\n </TouchableNativeFeedback>\n );\n};\n\nexport default Platform.select({\n android: ButtonAndroid,\n default: ButtonIOS,\n});\n"],"mappings":"AAAA,OAAOA,KAAK,IAAIC,OAAO,QAAQ,OAAO;AACtC,SACEC,QAAQ,EACRC,uBAAuB,EACvBC,gBAAgB,EAChBC,IAAI,QACC,cAAc;AAErB,SAASC,gBAAgB,QAAQ,aAAa;AAiB9C,MAAMC,SAAS,GAAGA,CAAC;EACjBC,QAAQ;EACRC,OAAO;EACPC,QAAQ;EACRC,kBAAkB;EAClBC,iBAAiB;EACjBC,MAAM;EACNC;AAC8B,CAAC,KAAK;EACpC;EACA;EACA,MAAMC,SAAS,GAAGL,QAAQ,GACrBL,IAAI,GACLD,gBAAgB;EACpB,MAAMY,kBAAkB,GAAGf,OAAO,CAAC,OAAO;IAAES;EAAS,CAAC,CAAC,EAAE,CAACA,QAAQ,CAAC,CAAC;EAEpE,oBACEV,KAAA,CAAAiB,aAAA,CAACF,SAAS;IACRH,iBAAiB,EAAEA,iBAAkB;IACrCD,kBAAkB,EAAEA,kBAAmB;IACvCO,iBAAiB,EAAC,QAAQ;IAC1BF,kBAAkB,EAAEA,kBAAmB;IACvCF,KAAK,EAAEA,KAAM;IACbD,MAAM,EAAEA,MAAO;IACfJ,OAAO,EAAEA;EAAQ,GAEhBD,QACQ,CAAC;AAEhB,CAAC;AACD,MAAMW,aAAa,GAAGA,CAAC;EACrBX,QAAQ;EACRC,OAAO;EACPC,QAAQ;EACRC,kBAAkB;EAClBC,iBAAiB;EACjBC,MAAM;EACNO,YAAY,GAAG,EAAE;EACjBN,KAAK;EACLO;AAC8B,CAAC,KAAK;EACpC,MAAMC,WAAW,GAAGhB,gBAAgB,CAAEiB,KAAK,IAAKA,KAAK,CAACC,UAAU,CAAC;EACjE,MAAMR,kBAAkB,GAAGf,OAAO,CAAC,OAAO;IAAES;EAAS,CAAC,CAAC,EAAE,CAACA,QAAQ,CAAC,CAAC;EACpE,MAAMe,MAAM,GAAGxB,OAAO,CACpB,MACEE,uBAAuB,CAACuB,MAAM,CAC5BL,KAAK,CAACC,WAAW,CAAC,CAACG,MAAM,EACzB,IAAI,EACJL,YACF,CAAC,EACH,CAACE,WAAW,EAAEF,YAAY,EAAEC,KAAK,CACnC,CAAC;EAED,oBACErB,KAAA,CAAAiB,aAAA,CAACd,uBAAuB;IACtBS,iBAAiB,EAAEA,iBAAkB;IACrCD,kBAAkB,EAAEA,kBAAmB;IACvCO,iBAAiB,EAAC,QAAQ;IAC1BF,kBAAkB,EAAEA,kBAAmB;IACvCW,UAAU,EAAEF,MAAO;IACnBX,KAAK,EAAEA,KAAM;IACbD,MAAM,EAAEA,MAAO;IACfJ,OAAO,EAAEA;EAAQ,gBAEjBT,KAAA,CAAAiB,aAAA,CAACZ,IAAI;IAACS,KAAK,EAAEA;EAAM,GAAEN,QAAe,CACb,CAAC;AAE9B,CAAC;AAED,eAAeN,QAAQ,CAAC0B,MAAM,CAAC;EAC7BC,OAAO,EAAEV,aAAa;EACtBW,OAAO,EAAEvB;AACX,CAAC,CAAC","ignoreList":[]}
|
|
@@ -2,8 +2,8 @@ function _extends() { return _extends = Object.assign ? Object.assign.bind() : f
|
|
|
2
2
|
import React, { useCallback, useEffect, useMemo, useState } from "react";
|
|
3
3
|
import { StyleSheet, Text, View } from "react-native";
|
|
4
4
|
import { FocusedInputEvents } from "../../bindings";
|
|
5
|
+
import { useKeyboardState } from "../../hooks";
|
|
5
6
|
import { KeyboardController } from "../../module";
|
|
6
|
-
import useColorScheme from "../hooks/useColorScheme";
|
|
7
7
|
import KeyboardStickyView from "../KeyboardStickyView";
|
|
8
8
|
import Arrow from "./Arrow";
|
|
9
9
|
import Button from "./Button";
|
|
@@ -42,7 +42,7 @@ const KeyboardToolbar = props => {
|
|
|
42
42
|
insets,
|
|
43
43
|
...rest
|
|
44
44
|
} = props;
|
|
45
|
-
const colorScheme =
|
|
45
|
+
const colorScheme = useKeyboardState(state => state.appearance);
|
|
46
46
|
const [inputs, setInputs] = useState({
|
|
47
47
|
current: 0,
|
|
48
48
|
count: 0
|