@react-native-ohos/react-native-keyboard-controller 1.17.0-beta.2 → 1.17.1-rc.1

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.
Files changed (408) hide show
  1. package/LICENSE +21 -21
  2. package/README.OpenSource +11 -11
  3. package/README.md +686 -19
  4. package/harmony/keyboard_controller/BuildProfile.ets +16 -16
  5. package/harmony/keyboard_controller/Index.ets +29 -28
  6. package/harmony/keyboard_controller/build-profile.json5 +31 -31
  7. package/harmony/keyboard_controller/hvigorfile.ts +6 -6
  8. package/harmony/keyboard_controller/obfuscation-rules.txt +17 -17
  9. package/harmony/keyboard_controller/oh-package-lock.json5 +28 -18
  10. package/harmony/keyboard_controller/oh-package.json5 +10 -10
  11. package/harmony/keyboard_controller/src/main/cpp/CMakeLists.txt +7 -7
  12. package/harmony/keyboard_controller/src/main/cpp/ClippingScrollViewComponentDescriptor.h +86 -0
  13. package/harmony/keyboard_controller/src/main/cpp/ClippingScrollViewComponentInstance.cpp +104 -0
  14. package/harmony/keyboard_controller/src/main/cpp/ClippingScrollViewComponentInstance.h +64 -0
  15. package/harmony/keyboard_controller/src/main/cpp/ClippingScrollViewJSIBinder.h +60 -0
  16. package/harmony/keyboard_controller/src/main/cpp/EventEmitters.cpp +119 -96
  17. package/harmony/keyboard_controller/src/main/cpp/EventEmitters.h +111 -111
  18. package/harmony/keyboard_controller/src/main/cpp/KeyboardControllerViewComponentDescriptor.h +94 -94
  19. package/harmony/keyboard_controller/src/main/cpp/KeyboardControllerViewComponentInstance.cpp +852 -288
  20. package/harmony/keyboard_controller/src/main/cpp/KeyboardControllerViewComponentInstance.h +170 -103
  21. package/harmony/keyboard_controller/src/main/cpp/KeyboardControllerViewJSIBinder.h +65 -65
  22. package/harmony/keyboard_controller/src/main/cpp/KeyboardGestureAreaComponentDescriptor.h +79 -79
  23. package/harmony/keyboard_controller/src/main/cpp/KeyboardGestureAreaComponentInstance.cpp +108 -108
  24. package/harmony/keyboard_controller/src/main/cpp/KeyboardGestureAreaComponentInstance.h +83 -83
  25. package/harmony/keyboard_controller/src/main/cpp/KeyboardGestureAreaJSIBinder.h +60 -60
  26. package/harmony/keyboard_controller/src/main/cpp/KeyboardToolbarGroupViewComponentDescriptor.h +46 -0
  27. package/harmony/keyboard_controller/src/main/cpp/KeyboardToolbarGroupViewComponentInstance.cpp +37 -0
  28. package/harmony/keyboard_controller/src/main/cpp/KeyboardToolbarGroupViewComponentInstance.h +32 -0
  29. package/harmony/keyboard_controller/src/main/cpp/KeyboardToolbarGroupViewJSIBinder.h +23 -0
  30. package/harmony/keyboard_controller/src/main/cpp/RNKeyboardController.cpp +103 -46
  31. package/harmony/keyboard_controller/src/main/cpp/RNKeyboardController.h +48 -48
  32. package/harmony/keyboard_controller/src/main/cpp/RNKeyboardControllerPackage.h +20 -0
  33. package/harmony/keyboard_controller/src/main/cpp/RNStatusBarManagerCompat.cpp +45 -45
  34. package/harmony/keyboard_controller/src/main/cpp/RNStatusBarManagerCompat.h +49 -49
  35. package/harmony/keyboard_controller/src/main/cpp/ViewHierarchyNavigator.cpp +207 -186
  36. package/harmony/keyboard_controller/src/main/cpp/ViewHierarchyNavigator.h +131 -112
  37. package/harmony/keyboard_controller/src/main/cpp/keyboardControllerPackage.cpp +77 -64
  38. package/harmony/keyboard_controller/src/main/cpp/keyboardControllerPackage.h +85 -77
  39. package/harmony/keyboard_controller/src/main/ets/Logger.ts +66 -66
  40. package/harmony/keyboard_controller/src/main/ets/{RNKeyboardControllerPackage.ts → RNKeyboardControllerPackage.ets} +70 -66
  41. package/harmony/keyboard_controller/src/main/ets/RNKeyboardControllerTurboModule.ts +465 -273
  42. package/harmony/keyboard_controller/src/main/ets/RNStatusBarManagerCompatTurboModule.ts +128 -119
  43. package/harmony/keyboard_controller/src/main/ets/Type.ts +63 -62
  44. package/harmony/keyboard_controller/src/main/module.json5 +11 -11
  45. package/harmony/keyboard_controller/src/main/resources/base/element/string.json +8 -8
  46. package/harmony/keyboard_controller/src/main/resources/en_US/element/string.json +8 -8
  47. package/harmony/keyboard_controller/src/main/resources/zh_CN/element/string.json +8 -8
  48. package/harmony/keyboard_controller/{ts.ts → ts.ets} +29 -29
  49. package/harmony/keyboard_controller.har +0 -0
  50. package/lib/commonjs/animated.js +22 -11
  51. package/lib/commonjs/animated.js.map +1 -1
  52. package/lib/commonjs/architecture.js +8 -0
  53. package/lib/commonjs/architecture.js.map +1 -0
  54. package/lib/commonjs/bindings.js +40 -5
  55. package/lib/commonjs/bindings.js.map +1 -1
  56. package/lib/commonjs/bindings.native.js +28 -5
  57. package/lib/commonjs/bindings.native.js.map +1 -1
  58. package/lib/commonjs/compat.js +50 -0
  59. package/lib/commonjs/compat.js.map +1 -0
  60. package/lib/commonjs/components/KeyboardAvoidingView/hooks.js +21 -15
  61. package/lib/commonjs/components/KeyboardAvoidingView/hooks.js.map +1 -1
  62. package/lib/commonjs/components/KeyboardAvoidingView/index.js +39 -14
  63. package/lib/commonjs/components/KeyboardAvoidingView/index.js.map +1 -1
  64. package/lib/commonjs/components/KeyboardAwareScrollView/index.js +90 -56
  65. package/lib/commonjs/components/KeyboardAwareScrollView/index.js.map +1 -1
  66. package/lib/commonjs/components/KeyboardAwareScrollView/useSmoothKeyboardHandler.js +5 -5
  67. package/lib/commonjs/components/KeyboardAwareScrollView/useSmoothKeyboardHandler.js.map +1 -1
  68. package/lib/commonjs/components/KeyboardAwareScrollView/utils.js.map +1 -1
  69. package/lib/commonjs/components/KeyboardChatScrollView/hooks.js +13 -0
  70. package/lib/commonjs/components/KeyboardChatScrollView/hooks.js.map +1 -0
  71. package/lib/commonjs/components/KeyboardChatScrollView/index.js +122 -0
  72. package/lib/commonjs/components/KeyboardChatScrollView/index.js.map +1 -0
  73. package/lib/commonjs/components/KeyboardChatScrollView/types.js +6 -0
  74. package/lib/commonjs/components/KeyboardChatScrollView/types.js.map +1 -0
  75. package/lib/commonjs/components/KeyboardChatScrollView/useChatKeyboard/helpers.js +221 -0
  76. package/lib/commonjs/components/KeyboardChatScrollView/useChatKeyboard/helpers.js.map +1 -0
  77. package/lib/commonjs/components/KeyboardChatScrollView/useChatKeyboard/index.ios.js +149 -0
  78. package/lib/commonjs/components/KeyboardChatScrollView/useChatKeyboard/index.ios.js.map +1 -0
  79. package/lib/commonjs/components/KeyboardChatScrollView/useChatKeyboard/index.js +240 -0
  80. package/lib/commonjs/components/KeyboardChatScrollView/useChatKeyboard/index.js.map +1 -0
  81. package/lib/commonjs/components/KeyboardChatScrollView/useChatKeyboard/types.js +6 -0
  82. package/lib/commonjs/components/KeyboardChatScrollView/useChatKeyboard/types.js.map +1 -0
  83. package/lib/commonjs/components/KeyboardChatScrollView/useEndVisible.js +40 -0
  84. package/lib/commonjs/components/KeyboardChatScrollView/useEndVisible.js.map +1 -0
  85. package/lib/commonjs/components/KeyboardChatScrollView/useExtraContentPadding/index.js +92 -0
  86. package/lib/commonjs/components/KeyboardChatScrollView/useExtraContentPadding/index.js.map +1 -0
  87. package/lib/commonjs/components/KeyboardStickyView/index.js.map +1 -1
  88. package/lib/commonjs/components/KeyboardToolbar/Arrow.js +2 -3
  89. package/lib/commonjs/components/KeyboardToolbar/Arrow.js.map +1 -1
  90. package/lib/commonjs/components/KeyboardToolbar/Button.js +2 -3
  91. package/lib/commonjs/components/KeyboardToolbar/Button.js.map +1 -1
  92. package/lib/commonjs/components/KeyboardToolbar/colors.js.map +1 -1
  93. package/lib/commonjs/components/KeyboardToolbar/colors.native.js.map +1 -1
  94. package/lib/commonjs/components/KeyboardToolbar/compound/components/Background.js +13 -0
  95. package/lib/commonjs/components/KeyboardToolbar/compound/components/Background.js.map +1 -0
  96. package/lib/commonjs/components/KeyboardToolbar/compound/components/Content.js +25 -0
  97. package/lib/commonjs/components/KeyboardToolbar/compound/components/Content.js.map +1 -0
  98. package/lib/commonjs/components/KeyboardToolbar/compound/components/Done.js +58 -0
  99. package/lib/commonjs/components/KeyboardToolbar/compound/components/Done.js.map +1 -0
  100. package/lib/commonjs/components/KeyboardToolbar/compound/components/Next.js +49 -0
  101. package/lib/commonjs/components/KeyboardToolbar/compound/components/Next.js.map +1 -0
  102. package/lib/commonjs/components/KeyboardToolbar/compound/components/Prev.js +49 -0
  103. package/lib/commonjs/components/KeyboardToolbar/compound/components/Prev.js.map +1 -0
  104. package/lib/commonjs/components/KeyboardToolbar/compound/components/index.js +42 -0
  105. package/lib/commonjs/components/KeyboardToolbar/compound/components/index.js.map +1 -0
  106. package/lib/commonjs/components/KeyboardToolbar/compound/components/types.js +6 -0
  107. package/lib/commonjs/components/KeyboardToolbar/compound/components/types.js.map +1 -0
  108. package/lib/commonjs/components/KeyboardToolbar/compound/context.js +17 -0
  109. package/lib/commonjs/components/KeyboardToolbar/compound/context.js.map +1 -0
  110. package/lib/commonjs/components/KeyboardToolbar/constants.js +17 -0
  111. package/lib/commonjs/components/KeyboardToolbar/constants.js.map +1 -0
  112. package/lib/commonjs/components/KeyboardToolbar/index.js +98 -87
  113. package/lib/commonjs/components/KeyboardToolbar/index.js.map +1 -1
  114. package/lib/commonjs/components/KeyboardToolbar/types.js.map +1 -1
  115. package/lib/commonjs/components/ScrollViewWithBottomPadding/index.js +120 -0
  116. package/lib/commonjs/components/ScrollViewWithBottomPadding/index.js.map +1 -0
  117. package/lib/commonjs/components/ScrollViewWithBottomPadding/styles.js +15 -0
  118. package/lib/commonjs/components/ScrollViewWithBottomPadding/styles.js.map +1 -0
  119. package/lib/commonjs/components/hooks/useColorScheme.js.map +1 -1
  120. package/lib/commonjs/components/hooks/useCombinedRef.js +24 -0
  121. package/lib/commonjs/components/hooks/useCombinedRef.js.map +1 -0
  122. package/lib/commonjs/components/hooks/useScrollState.js +62 -0
  123. package/lib/commonjs/components/hooks/useScrollState.js.map +1 -0
  124. package/lib/commonjs/components/index.js +7 -0
  125. package/lib/commonjs/components/index.js.map +1 -1
  126. package/lib/commonjs/constants.js +3 -1
  127. package/lib/commonjs/constants.js.map +1 -1
  128. package/lib/commonjs/context.js +1 -0
  129. package/lib/commonjs/context.js.map +1 -1
  130. package/lib/commonjs/hooks/index.js +14 -1
  131. package/lib/commonjs/hooks/index.js.map +1 -1
  132. package/lib/commonjs/hooks/useKeyboardState/index.js +39 -0
  133. package/lib/commonjs/hooks/useKeyboardState/index.js.map +1 -0
  134. package/lib/commonjs/hooks/useWindowDimensions/index.android.js.map +1 -1
  135. package/lib/commonjs/hooks/useWindowDimensions/index.js.map +1 -1
  136. package/lib/commonjs/index.js +27 -1
  137. package/lib/commonjs/index.js.map +1 -1
  138. package/lib/commonjs/internal.js +54 -18
  139. package/lib/commonjs/internal.js.map +1 -1
  140. package/lib/commonjs/module.js +21 -12
  141. package/lib/commonjs/module.js.map +1 -1
  142. package/lib/commonjs/reanimated.js.map +1 -1
  143. package/lib/commonjs/reanimated.native.js.map +1 -1
  144. package/lib/commonjs/specs/ClippingScrollViewDecoratorViewNativeComponent.js +12 -0
  145. package/lib/commonjs/specs/ClippingScrollViewDecoratorViewNativeComponent.js.map +1 -0
  146. package/lib/commonjs/specs/KeyboardControllerViewNativeComponent.js +8 -2
  147. package/lib/commonjs/specs/KeyboardControllerViewNativeComponent.js.map +1 -1
  148. package/lib/commonjs/specs/KeyboardGestureAreaNativeComponent.js +2 -1
  149. package/lib/commonjs/specs/KeyboardGestureAreaNativeComponent.js.map +1 -1
  150. package/lib/commonjs/specs/KeyboardToolbarGroupViewNativeComponent.js +12 -0
  151. package/lib/commonjs/specs/KeyboardToolbarGroupViewNativeComponent.js.map +1 -0
  152. package/lib/commonjs/specs/NativeKeyboardController.js.map +1 -1
  153. package/lib/commonjs/specs/NativeStatusBarManagerCompat.js.map +1 -1
  154. package/lib/commonjs/specs/OverKeyboardViewNativeComponent.js.map +1 -1
  155. package/lib/commonjs/types.js.map +1 -1
  156. package/lib/commonjs/utils/findNodeHandle/index.js +9 -0
  157. package/lib/commonjs/utils/findNodeHandle/index.js.map +1 -0
  158. package/lib/commonjs/utils/findNodeHandle/index.native.js +13 -0
  159. package/lib/commonjs/utils/findNodeHandle/index.native.js.map +1 -0
  160. package/lib/commonjs/utils.js.map +1 -1
  161. package/lib/commonjs/views/KeyboardExtender/index.js +30 -0
  162. package/lib/commonjs/views/KeyboardExtender/index.js.map +1 -0
  163. package/lib/commonjs/views/OverKeyboardView/index.js.map +1 -1
  164. package/lib/commonjs/views/index.js +7 -0
  165. package/lib/commonjs/views/index.js.map +1 -1
  166. package/lib/module/animated.js +24 -13
  167. package/lib/module/animated.js.map +1 -1
  168. package/lib/module/architecture.js +2 -0
  169. package/lib/module/architecture.js.map +1 -0
  170. package/lib/module/bindings.js +39 -5
  171. package/lib/module/bindings.js.map +1 -1
  172. package/lib/module/bindings.native.js +27 -5
  173. package/lib/module/bindings.native.js.map +1 -1
  174. package/lib/module/compat.js +43 -0
  175. package/lib/module/compat.js.map +1 -0
  176. package/lib/module/components/KeyboardAvoidingView/hooks.js +22 -16
  177. package/lib/module/components/KeyboardAvoidingView/hooks.js.map +1 -1
  178. package/lib/module/components/KeyboardAvoidingView/index.js +38 -14
  179. package/lib/module/components/KeyboardAvoidingView/index.js.map +1 -1
  180. package/lib/module/components/KeyboardAwareScrollView/index.js +92 -58
  181. package/lib/module/components/KeyboardAwareScrollView/index.js.map +1 -1
  182. package/lib/module/components/KeyboardAwareScrollView/useSmoothKeyboardHandler.js +5 -5
  183. package/lib/module/components/KeyboardAwareScrollView/useSmoothKeyboardHandler.js.map +1 -1
  184. package/lib/module/components/KeyboardAwareScrollView/utils.js.map +1 -1
  185. package/lib/module/components/KeyboardChatScrollView/hooks.js +2 -0
  186. package/lib/module/components/KeyboardChatScrollView/hooks.js.map +1 -0
  187. package/lib/module/components/KeyboardChatScrollView/index.js +115 -0
  188. package/lib/module/components/KeyboardChatScrollView/index.js.map +1 -0
  189. package/lib/module/components/KeyboardChatScrollView/types.js +2 -0
  190. package/lib/module/components/KeyboardChatScrollView/types.js.map +1 -0
  191. package/lib/module/components/KeyboardChatScrollView/useChatKeyboard/helpers.js +207 -0
  192. package/lib/module/components/KeyboardChatScrollView/useChatKeyboard/helpers.js.map +1 -0
  193. package/lib/module/components/KeyboardChatScrollView/useChatKeyboard/index.ios.js +143 -0
  194. package/lib/module/components/KeyboardChatScrollView/useChatKeyboard/index.ios.js.map +1 -0
  195. package/lib/module/components/KeyboardChatScrollView/useChatKeyboard/index.js +234 -0
  196. package/lib/module/components/KeyboardChatScrollView/useChatKeyboard/index.js.map +1 -0
  197. package/lib/module/components/KeyboardChatScrollView/useChatKeyboard/types.js +2 -0
  198. package/lib/module/components/KeyboardChatScrollView/useChatKeyboard/types.js.map +1 -0
  199. package/lib/module/components/KeyboardChatScrollView/useEndVisible.js +33 -0
  200. package/lib/module/components/KeyboardChatScrollView/useEndVisible.js.map +1 -0
  201. package/lib/module/components/KeyboardChatScrollView/useExtraContentPadding/index.js +87 -0
  202. package/lib/module/components/KeyboardChatScrollView/useExtraContentPadding/index.js.map +1 -0
  203. package/lib/module/components/KeyboardStickyView/index.js.map +1 -1
  204. package/lib/module/components/KeyboardToolbar/Arrow.js +2 -2
  205. package/lib/module/components/KeyboardToolbar/Arrow.js.map +1 -1
  206. package/lib/module/components/KeyboardToolbar/Button.js +2 -2
  207. package/lib/module/components/KeyboardToolbar/Button.js.map +1 -1
  208. package/lib/module/components/KeyboardToolbar/colors.js.map +1 -1
  209. package/lib/module/components/KeyboardToolbar/colors.native.js.map +1 -1
  210. package/lib/module/components/KeyboardToolbar/compound/components/Background.js +6 -0
  211. package/lib/module/components/KeyboardToolbar/compound/components/Background.js.map +1 -0
  212. package/lib/module/components/KeyboardToolbar/compound/components/Content.js +18 -0
  213. package/lib/module/components/KeyboardToolbar/compound/components/Content.js.map +1 -0
  214. package/lib/module/components/KeyboardToolbar/compound/components/Done.js +50 -0
  215. package/lib/module/components/KeyboardToolbar/compound/components/Done.js.map +1 -0
  216. package/lib/module/components/KeyboardToolbar/compound/components/Next.js +41 -0
  217. package/lib/module/components/KeyboardToolbar/compound/components/Next.js.map +1 -0
  218. package/lib/module/components/KeyboardToolbar/compound/components/Prev.js +41 -0
  219. package/lib/module/components/KeyboardToolbar/compound/components/Prev.js.map +1 -0
  220. package/lib/module/components/KeyboardToolbar/compound/components/index.js +6 -0
  221. package/lib/module/components/KeyboardToolbar/compound/components/index.js.map +1 -0
  222. package/lib/module/components/KeyboardToolbar/compound/components/types.js +2 -0
  223. package/lib/module/components/KeyboardToolbar/compound/components/types.js.map +1 -0
  224. package/lib/module/components/KeyboardToolbar/compound/context.js +10 -0
  225. package/lib/module/components/KeyboardToolbar/compound/context.js.map +1 -0
  226. package/lib/module/components/KeyboardToolbar/constants.js +11 -0
  227. package/lib/module/components/KeyboardToolbar/constants.js.map +1 -0
  228. package/lib/module/components/KeyboardToolbar/index.js +98 -88
  229. package/lib/module/components/KeyboardToolbar/index.js.map +1 -1
  230. package/lib/module/components/KeyboardToolbar/types.js.map +1 -1
  231. package/lib/module/components/ScrollViewWithBottomPadding/index.js +112 -0
  232. package/lib/module/components/ScrollViewWithBottomPadding/index.js.map +1 -0
  233. package/lib/module/components/ScrollViewWithBottomPadding/styles.js +9 -0
  234. package/lib/module/components/ScrollViewWithBottomPadding/styles.js.map +1 -0
  235. package/lib/module/components/hooks/useColorScheme.js.map +1 -1
  236. package/lib/module/components/hooks/useCombinedRef.js +18 -0
  237. package/lib/module/components/hooks/useCombinedRef.js.map +1 -0
  238. package/lib/module/components/hooks/useScrollState.js +56 -0
  239. package/lib/module/components/hooks/useScrollState.js.map +1 -0
  240. package/lib/module/components/index.js +1 -0
  241. package/lib/module/components/index.js.map +1 -1
  242. package/lib/module/constants.js +3 -0
  243. package/lib/module/constants.js.map +1 -1
  244. package/lib/module/context.js +1 -0
  245. package/lib/module/context.js.map +1 -1
  246. package/lib/module/hooks/index.js +3 -1
  247. package/lib/module/hooks/index.js.map +1 -1
  248. package/lib/module/hooks/useKeyboardState/index.js +33 -0
  249. package/lib/module/hooks/useKeyboardState/index.js.map +1 -0
  250. package/lib/module/hooks/useWindowDimensions/index.android.js.map +1 -1
  251. package/lib/module/hooks/useWindowDimensions/index.js.map +1 -1
  252. package/lib/module/index.js +3 -2
  253. package/lib/module/index.js.map +1 -1
  254. package/lib/module/internal.js +53 -18
  255. package/lib/module/internal.js.map +1 -1
  256. package/lib/module/module.js +21 -12
  257. package/lib/module/module.js.map +1 -1
  258. package/lib/module/reanimated.js.map +1 -1
  259. package/lib/module/reanimated.native.js.map +1 -1
  260. package/lib/module/specs/ClippingScrollViewDecoratorViewNativeComponent.js +6 -0
  261. package/lib/module/specs/ClippingScrollViewDecoratorViewNativeComponent.js.map +1 -0
  262. package/lib/module/specs/KeyboardControllerViewNativeComponent.js +7 -1
  263. package/lib/module/specs/KeyboardControllerViewNativeComponent.js.map +1 -1
  264. package/lib/module/specs/KeyboardGestureAreaNativeComponent.js +2 -1
  265. package/lib/module/specs/KeyboardGestureAreaNativeComponent.js.map +1 -1
  266. package/lib/module/specs/KeyboardToolbarGroupViewNativeComponent.js +5 -0
  267. package/lib/module/specs/KeyboardToolbarGroupViewNativeComponent.js.map +1 -0
  268. package/lib/module/specs/NativeKeyboardController.js.map +1 -1
  269. package/lib/module/specs/NativeStatusBarManagerCompat.js.map +1 -1
  270. package/lib/module/specs/OverKeyboardViewNativeComponent.js.map +1 -1
  271. package/lib/module/types.js.map +1 -1
  272. package/lib/module/utils/findNodeHandle/index.js +2 -0
  273. package/lib/module/utils/findNodeHandle/index.js.map +1 -0
  274. package/lib/module/utils/findNodeHandle/index.native.js +3 -0
  275. package/lib/module/utils/findNodeHandle/index.native.js.map +1 -0
  276. package/lib/module/utils.js.map +1 -1
  277. package/lib/module/views/KeyboardExtender/index.js +23 -0
  278. package/lib/module/views/KeyboardExtender/index.js.map +1 -0
  279. package/lib/module/views/OverKeyboardView/index.js.map +1 -1
  280. package/lib/module/views/index.js +1 -0
  281. package/lib/module/views/index.js.map +1 -1
  282. package/lib/typescript/animated.d.ts +2 -38
  283. package/lib/typescript/architecture.d.ts +1 -0
  284. package/lib/typescript/bindings.d.ts +15 -1
  285. package/lib/typescript/bindings.native.d.ts +10 -1
  286. package/lib/typescript/compat.d.ts +12 -0
  287. package/lib/typescript/components/KeyboardAvoidingView/index.d.ts +5 -0
  288. package/lib/typescript/components/KeyboardAwareScrollView/index.d.ts +4 -1
  289. package/lib/typescript/components/KeyboardChatScrollView/hooks.d.ts +2 -0
  290. package/lib/typescript/components/KeyboardChatScrollView/index.d.ts +17 -0
  291. package/lib/typescript/components/KeyboardChatScrollView/types.d.ts +113 -0
  292. package/lib/typescript/components/KeyboardChatScrollView/useChatKeyboard/helpers.d.ts +132 -0
  293. package/lib/typescript/components/KeyboardChatScrollView/useChatKeyboard/index.d.ts +18 -0
  294. package/lib/typescript/components/KeyboardChatScrollView/useChatKeyboard/index.ios.d.ts +21 -0
  295. package/lib/typescript/components/KeyboardChatScrollView/useChatKeyboard/types.d.ts +37 -0
  296. package/lib/typescript/components/KeyboardChatScrollView/useEndVisible.d.ts +17 -0
  297. package/lib/typescript/components/KeyboardChatScrollView/useExtraContentPadding/index.d.ts +45 -0
  298. package/lib/typescript/components/KeyboardToolbar/Button.d.ts +2 -2
  299. package/lib/typescript/components/KeyboardToolbar/compound/components/Background.d.ts +6 -0
  300. package/lib/typescript/components/KeyboardToolbar/compound/components/Content.d.ts +7 -0
  301. package/lib/typescript/components/KeyboardToolbar/compound/components/Done.d.ts +7 -0
  302. package/lib/typescript/components/KeyboardToolbar/compound/components/Next.d.ts +4 -0
  303. package/lib/typescript/components/KeyboardToolbar/compound/components/Prev.d.ts +4 -0
  304. package/lib/typescript/components/KeyboardToolbar/compound/components/index.d.ts +5 -0
  305. package/lib/typescript/components/KeyboardToolbar/compound/components/types.d.ts +14 -0
  306. package/lib/typescript/components/KeyboardToolbar/compound/context.d.ts +9 -0
  307. package/lib/typescript/components/KeyboardToolbar/constants.d.ts +10 -0
  308. package/lib/typescript/components/KeyboardToolbar/index.d.ts +12 -45
  309. package/lib/typescript/components/KeyboardToolbar/types.d.ts +24 -1
  310. package/lib/typescript/components/ScrollViewWithBottomPadding/index.d.ts +30 -0
  311. package/lib/typescript/components/ScrollViewWithBottomPadding/styles.d.ts +7 -0
  312. package/lib/typescript/components/hooks/useCombinedRef.d.ts +3 -0
  313. package/lib/typescript/components/hooks/useScrollState.d.ts +17 -0
  314. package/lib/typescript/components/index.d.ts +3 -0
  315. package/lib/typescript/constants.d.ts +1 -0
  316. package/lib/typescript/context.d.ts +1 -0
  317. package/lib/typescript/hooks/index.d.ts +2 -0
  318. package/lib/typescript/hooks/useKeyboardState/index.d.ts +4 -0
  319. package/lib/typescript/index.d.ts +4 -3
  320. package/lib/typescript/internal.d.ts +4 -0
  321. package/lib/typescript/specs/ClippingScrollViewDecoratorViewNativeComponent.d.ts +10 -0
  322. package/lib/typescript/specs/KeyboardControllerViewNativeComponent.d.ts +4 -0
  323. package/lib/typescript/specs/KeyboardToolbarGroupViewNativeComponent.d.ts +6 -0
  324. package/lib/typescript/specs/NativeKeyboardController.d.ts +6 -2
  325. package/lib/typescript/types.d.ts +81 -5
  326. package/lib/typescript/utils/findNodeHandle/index.d.ts +4 -0
  327. package/lib/typescript/utils/findNodeHandle/index.native.d.ts +2 -0
  328. package/lib/typescript/views/KeyboardExtender/index.d.ts +5 -0
  329. package/lib/typescript/views/index.d.ts +1 -0
  330. package/package.json +183 -174
  331. package/src/animated.tsx +248 -255
  332. package/src/architecture.ts +1 -0
  333. package/src/bindings.native.ts +97 -62
  334. package/src/bindings.ts +81 -42
  335. package/src/compat.ts +44 -0
  336. package/src/components/KeyboardAvoidingView/hooks.ts +130 -123
  337. package/src/components/KeyboardAvoidingView/index.tsx +232 -188
  338. package/src/components/KeyboardAwareScrollView/index.tsx +443 -389
  339. package/src/components/KeyboardAwareScrollView/useSmoothKeyboardHandler.ts +133 -133
  340. package/src/components/KeyboardAwareScrollView/utils.ts +41 -41
  341. package/src/components/KeyboardChatScrollView/hooks.ts +2 -0
  342. package/src/components/KeyboardChatScrollView/index.tsx +164 -0
  343. package/src/components/KeyboardChatScrollView/types.ts +117 -0
  344. package/src/components/KeyboardChatScrollView/useChatKeyboard/helpers.ts +268 -0
  345. package/src/components/KeyboardChatScrollView/useChatKeyboard/index.ios.ts +260 -0
  346. package/src/components/KeyboardChatScrollView/useChatKeyboard/index.ts +374 -0
  347. package/src/components/KeyboardChatScrollView/useChatKeyboard/types.ts +39 -0
  348. package/src/components/KeyboardChatScrollView/useEndVisible.ts +66 -0
  349. package/src/components/KeyboardChatScrollView/useExtraContentPadding/index.ts +149 -0
  350. package/src/components/KeyboardStickyView/index.tsx +66 -66
  351. package/src/components/KeyboardToolbar/Arrow.tsx +80 -80
  352. package/src/components/KeyboardToolbar/Button.tsx +98 -98
  353. package/src/components/KeyboardToolbar/colors.native.ts +37 -37
  354. package/src/components/KeyboardToolbar/colors.ts +16 -16
  355. package/src/components/KeyboardToolbar/compound/components/Background.tsx +9 -0
  356. package/src/components/KeyboardToolbar/compound/components/Content.tsx +25 -0
  357. package/src/components/KeyboardToolbar/compound/components/Done.tsx +57 -0
  358. package/src/components/KeyboardToolbar/compound/components/Next.tsx +49 -0
  359. package/src/components/KeyboardToolbar/compound/components/Prev.tsx +49 -0
  360. package/src/components/KeyboardToolbar/compound/components/index.ts +5 -0
  361. package/src/components/KeyboardToolbar/compound/components/types.ts +15 -0
  362. package/src/components/KeyboardToolbar/compound/context.ts +25 -0
  363. package/src/components/KeyboardToolbar/constants.ts +14 -0
  364. package/src/components/KeyboardToolbar/index.tsx +220 -223
  365. package/src/components/KeyboardToolbar/types.ts +72 -40
  366. package/src/components/ScrollViewWithBottomPadding/index.tsx +216 -0
  367. package/src/components/ScrollViewWithBottomPadding/styles.ts +10 -0
  368. package/src/components/hooks/useColorScheme.ts +6 -6
  369. package/src/components/hooks/useCombinedRef.ts +22 -0
  370. package/src/components/hooks/useScrollState.ts +81 -0
  371. package/src/components/index.ts +14 -11
  372. package/src/constants.ts +23 -19
  373. package/src/context.ts +70 -68
  374. package/src/hooks/index.ts +91 -90
  375. package/src/hooks/useKeyboardState/index.ts +52 -0
  376. package/src/hooks/useWindowDimensions/index.android.ts +38 -38
  377. package/src/hooks/useWindowDimensions/index.ts +1 -1
  378. package/src/index.ts +27 -23
  379. package/src/internal.ts +146 -84
  380. package/src/module.ts +64 -52
  381. package/src/reanimated.native.ts +132 -132
  382. package/src/reanimated.ts +29 -29
  383. package/src/specs/ClippingScrollViewDecoratorViewNativeComponent.ts +19 -0
  384. package/src/specs/KeyboardControllerViewNativeComponent.ts +82 -71
  385. package/src/specs/KeyboardGestureAreaNativeComponent.ts +21 -20
  386. package/src/specs/KeyboardToolbarGroupViewNativeComponent.ts +10 -0
  387. package/src/specs/NativeKeyboardController.ts +23 -19
  388. package/src/specs/NativeStatusBarManagerCompat.ts +14 -14
  389. package/src/specs/OverKeyboardViewNativeComponent.ts +12 -12
  390. package/src/types.ts +330 -243
  391. package/src/utils/findNodeHandle/index.native.ts +3 -0
  392. package/src/utils/findNodeHandle/index.ts +6 -0
  393. package/src/utils.ts +1 -1
  394. package/src/views/KeyboardExtender/index.tsx +30 -0
  395. package/src/views/OverKeyboardView/index.tsx +43 -43
  396. package/src/views/index.ts +2 -1
  397. package/lib/commonjs/monkey-patch.android.js +0 -57
  398. package/lib/commonjs/monkey-patch.android.js.map +0 -1
  399. package/lib/commonjs/monkey-patch.js +0 -11
  400. package/lib/commonjs/monkey-patch.js.map +0 -1
  401. package/lib/module/monkey-patch.android.js +0 -47
  402. package/lib/module/monkey-patch.android.js.map +0 -1
  403. package/lib/module/monkey-patch.js +0 -5
  404. package/lib/module/monkey-patch.js.map +0 -1
  405. package/lib/typescript/monkey-patch.android.d.ts +0 -2
  406. package/lib/typescript/monkey-patch.d.ts +0 -2
  407. package/src/monkey-patch.android.ts +0 -44
  408. package/src/monkey-patch.ts +0 -4
@@ -1,133 +1,133 @@
1
- import { Platform } from "react-native";
2
- import {
3
- Easing,
4
- useAnimatedReaction,
5
- useSharedValue,
6
- withTiming,
7
- } from "react-native-reanimated";
8
-
9
- import { useKeyboardHandler } from "../../hooks";
10
-
11
- const IS_ANDROID_ELEVEN_OR_HIGHER =
12
- Platform.OS === "android" && Platform.Version >= 30;
13
- // on these platforms keyboard transitions will be smooth
14
- const IS_ANDROID_ELEVEN_OR_HIGHER_OR_IOS =
15
- IS_ANDROID_ELEVEN_OR_HIGHER || Platform.OS === "ios" || Platform.OS as string === 'harmony';
16
- // on Android Telegram is not using androidx.core values and uses custom interpolation
17
- // duration is taken from here: https://github.com/DrKLO/Telegram/blob/e9a35cea54c06277c69d41b8e25d94b5d7ede065/TMessagesProj/src/main/java/org/telegram/ui/ActionBar/AdjustPanLayoutHelper.java#L39
18
- // and bezier is taken from: https://github.com/DrKLO/Telegram/blob/e9a35cea54c06277c69d41b8e25d94b5d7ede065/TMessagesProj/src/main/java/androidx/recyclerview/widget/ChatListItemAnimator.java#L40
19
- const TELEGRAM_ANDROID_TIMING_CONFIG = {
20
- duration: 250,
21
- easing: Easing.bezier(
22
- 0.19919472913616398,
23
- 0.010644531250000006,
24
- 0.27920937042459737,
25
- 0.91025390625,
26
- ),
27
- };
28
-
29
- /**
30
- * Hook that uses default transitions for iOS and Android > 11, and uses
31
- * custom interpolation on Android < 11 to achieve more smooth animation
32
- */
33
- export const useSmoothKeyboardHandler: typeof useKeyboardHandler = (
34
- handler,
35
- deps,
36
- ) => {
37
- const target = useSharedValue(-1);
38
- const height = useSharedValue(0);
39
- const persistedHeight = useSharedValue(0);
40
- const animatedKeyboardHeight = useSharedValue(0);
41
-
42
- useAnimatedReaction(
43
- () => {
44
- if (IS_ANDROID_ELEVEN_OR_HIGHER_OR_IOS) {
45
- return;
46
- }
47
- if (persistedHeight.value === 0) {
48
- return;
49
- }
50
- const event = {
51
- // it'll be always `TELEGRAM_ANDROID_TIMING_CONFIG.duration`, since we're running animation via `withTiming`
52
- duration: TELEGRAM_ANDROID_TIMING_CONFIG.duration,
53
- target: target.value,
54
- height: animatedKeyboardHeight.value,
55
- progress: animatedKeyboardHeight.value / persistedHeight.value,
56
- };
57
- return event;
58
- },
59
- (evt) => {
60
- if (!evt) {
61
- return;
62
- }
63
- handler.onMove?.(evt);
64
-
65
- // dispatch `onEnd`
66
- if (evt.height === height.value) {
67
- handler.onEnd?.(evt);
68
- // eslint-disable-next-line react-compiler/react-compiler
69
- persistedHeight.value = height.value;
70
- }
71
- },
72
- // REA uses own version of `DependencyList` and it's not compatible with the same type from React
73
- deps as unknown[],
74
- );
75
-
76
- useKeyboardHandler(
77
- {
78
- onStart: (e) => {
79
- "worklet";
80
-
81
- // immediately dispatch onStart/onEnd events if onStart dispatched with the same height
82
- // and don't wait for animation 250ms
83
- if (
84
- !IS_ANDROID_ELEVEN_OR_HIGHER_OR_IOS &&
85
- e.height === persistedHeight.value
86
- ) {
87
- handler.onStart?.(e);
88
- handler.onEnd?.(e);
89
-
90
- return;
91
- }
92
-
93
- target.value = e.target;
94
- height.value = e.height;
95
-
96
- if (e.height > 0) {
97
- persistedHeight.value = e.height;
98
- }
99
- // if we are running on Android < 9, then we are using custom interpolation
100
- // to achieve smoother animation and use `animatedKeyboardHeight` as animation
101
- // driver
102
- if (!IS_ANDROID_ELEVEN_OR_HIGHER_OR_IOS) {
103
- animatedKeyboardHeight.value = withTiming(
104
- e.height,
105
- TELEGRAM_ANDROID_TIMING_CONFIG,
106
- );
107
- }
108
-
109
- handler.onStart?.({
110
- ...e,
111
- duration: IS_ANDROID_ELEVEN_OR_HIGHER_OR_IOS
112
- ? e.duration
113
- : TELEGRAM_ANDROID_TIMING_CONFIG.duration,
114
- });
115
- },
116
- onMove: (e) => {
117
- "worklet";
118
-
119
- if (IS_ANDROID_ELEVEN_OR_HIGHER_OR_IOS) {
120
- handler.onMove?.(e);
121
- }
122
- },
123
- onEnd: (e) => {
124
- "worklet";
125
-
126
- if (IS_ANDROID_ELEVEN_OR_HIGHER_OR_IOS) {
127
- handler.onEnd?.(e);
128
- }
129
- },
130
- },
131
- deps,
132
- );
133
- };
1
+ import { Platform } from "react-native";
2
+ import {
3
+ Easing,
4
+ useAnimatedReaction,
5
+ useSharedValue,
6
+ withTiming,
7
+ } from "react-native-reanimated";
8
+
9
+ import { useKeyboardHandler } from "../../hooks";
10
+
11
+ const IS_ANDROID_ELEVEN_OR_HIGHER =
12
+ Platform.OS === "android" && Platform.Version >= 30;
13
+ // on these platforms keyboard transitions will be smooth
14
+ const IS_ANDROID_ELEVEN_OR_HIGHER_OR_IOS =
15
+ IS_ANDROID_ELEVEN_OR_HIGHER || Platform.OS === "ios" || Platform.OS as string === 'harmony';
16
+ // on Android Telegram is not using androidx.core values and uses custom interpolation
17
+ // duration is taken from here: https://github.com/DrKLO/Telegram/blob/e9a35cea54c06277c69d41b8e25d94b5d7ede065/TMessagesProj/src/main/java/org/telegram/ui/ActionBar/AdjustPanLayoutHelper.java#L39
18
+ // and bezier is taken from: https://github.com/DrKLO/Telegram/blob/e9a35cea54c06277c69d41b8e25d94b5d7ede065/TMessagesProj/src/main/java/androidx/recyclerview/widget/ChatListItemAnimator.java#L40
19
+ const TELEGRAM_ANDROID_TIMING_CONFIG = {
20
+ duration: 250,
21
+ easing: Easing.bezier(
22
+ 0.19919472913616398,
23
+ 0.010644531250000006,
24
+ 0.27920937042459737,
25
+ 0.91025390625,
26
+ ),
27
+ };
28
+
29
+ /**
30
+ * Hook that uses default transitions for iOS and Android > 11, and uses
31
+ * custom interpolation on Android < 11 to achieve more smooth animation
32
+ */
33
+ export const useSmoothKeyboardHandler: typeof useKeyboardHandler = (
34
+ handler,
35
+ deps,
36
+ ) => {
37
+ const target = useSharedValue(-1);
38
+ const height = useSharedValue(0);
39
+ const persistedHeight = useSharedValue(0);
40
+ const animatedKeyboardHeight = useSharedValue(0);
41
+
42
+ useAnimatedReaction(
43
+ () => {
44
+ if (IS_ANDROID_ELEVEN_OR_HIGHER_OR_IOS) {
45
+ return;
46
+ }
47
+ if (persistedHeight.value === 0) {
48
+ return;
49
+ }
50
+ const event = {
51
+ // it'll be always `TELEGRAM_ANDROID_TIMING_CONFIG.duration`, since we're running animation via `withTiming`
52
+ duration: TELEGRAM_ANDROID_TIMING_CONFIG.duration,
53
+ target: target.value,
54
+ height: animatedKeyboardHeight.value,
55
+ progress: animatedKeyboardHeight.value / persistedHeight.value,
56
+ };
57
+ return event;
58
+ },
59
+ (evt) => {
60
+ if (!evt) {
61
+ return;
62
+ }
63
+ handler.onMove?.(evt);
64
+
65
+ // dispatch `onEnd`
66
+ if (evt.height === height.value) {
67
+ handler.onEnd?.(evt);
68
+ // eslint-disable-next-line react-compiler/react-compiler
69
+ persistedHeight.value = height.value;
70
+ }
71
+ },
72
+ // create shallow copy (if deps specified) since `useAnimatedReaction` modifies them
73
+ deps ? [...deps] : deps,
74
+ );
75
+
76
+ useKeyboardHandler(
77
+ {
78
+ onStart: (e) => {
79
+ "worklet";
80
+
81
+ // immediately dispatch onStart/onEnd events if onStart dispatched with the same height
82
+ // and don't wait for animation 250ms
83
+ if (
84
+ !IS_ANDROID_ELEVEN_OR_HIGHER_OR_IOS &&
85
+ e.height === persistedHeight.value
86
+ ) {
87
+ handler.onStart?.(e);
88
+ handler.onEnd?.(e);
89
+
90
+ return;
91
+ }
92
+
93
+ target.value = e.target;
94
+ height.value = e.height;
95
+
96
+ if (e.height > 0) {
97
+ persistedHeight.value = e.height;
98
+ }
99
+ // if we are running on Android < 9, then we are using custom interpolation
100
+ // to achieve smoother animation and use `animatedKeyboardHeight` as animation
101
+ // driver
102
+ if (!IS_ANDROID_ELEVEN_OR_HIGHER_OR_IOS) {
103
+ animatedKeyboardHeight.value = withTiming(
104
+ e.height,
105
+ TELEGRAM_ANDROID_TIMING_CONFIG,
106
+ );
107
+ }
108
+
109
+ handler.onStart?.({
110
+ ...e,
111
+ duration: IS_ANDROID_ELEVEN_OR_HIGHER_OR_IOS
112
+ ? e.duration
113
+ : TELEGRAM_ANDROID_TIMING_CONFIG.duration,
114
+ });
115
+ },
116
+ onMove: (e) => {
117
+ "worklet";
118
+
119
+ if (IS_ANDROID_ELEVEN_OR_HIGHER_OR_IOS) {
120
+ handler.onMove?.(e);
121
+ }
122
+ },
123
+ onEnd: (e) => {
124
+ "worklet";
125
+
126
+ if (IS_ANDROID_ELEVEN_OR_HIGHER_OR_IOS) {
127
+ handler.onEnd?.(e);
128
+ }
129
+ },
130
+ },
131
+ deps,
132
+ );
133
+ };
@@ -1,41 +1,41 @@
1
- export const debounce = <F extends (...args: Parameters<F>) => ReturnType<F>>(
2
- worklet: F,
3
- wait = 0,
4
- ) => {
5
- "worklet";
6
-
7
- const value = {
8
- time: 0,
9
- };
10
-
11
- return (...args: Parameters<F>): ReturnType<F> | void => {
12
- "worklet";
13
-
14
- const t = Date.now();
15
- const now = t - value.time;
16
-
17
- if (now < wait) {
18
- value.time = t;
19
- return;
20
- }
21
-
22
- value.time = t;
23
-
24
- return worklet(...args);
25
- };
26
- };
27
-
28
- export const scrollDistanceWithRespectToSnapPoints = (
29
- defaultScrollValue: number,
30
- snapPoints?: number[],
31
- ) => {
32
- "worklet";
33
-
34
- let snapPoint: number | undefined;
35
-
36
- if (snapPoints) {
37
- snapPoint = snapPoints.find((offset) => offset >= defaultScrollValue);
38
- }
39
-
40
- return snapPoint ?? defaultScrollValue;
41
- };
1
+ export const debounce = <F extends (...args: Parameters<F>) => ReturnType<F>>(
2
+ worklet: F,
3
+ wait = 0,
4
+ ) => {
5
+ "worklet";
6
+
7
+ const value = {
8
+ time: 0,
9
+ };
10
+
11
+ return (...args: Parameters<F>): ReturnType<F> | void => {
12
+ "worklet";
13
+
14
+ const t = Date.now();
15
+ const now = t - value.time;
16
+
17
+ if (now < wait) {
18
+ value.time = t;
19
+ return;
20
+ }
21
+
22
+ value.time = t;
23
+
24
+ return worklet(...args);
25
+ };
26
+ };
27
+
28
+ export const scrollDistanceWithRespectToSnapPoints = (
29
+ defaultScrollValue: number,
30
+ snapPoints?: number[],
31
+ ) => {
32
+ "worklet";
33
+
34
+ let snapPoint: number | undefined;
35
+
36
+ if (snapPoints) {
37
+ snapPoint = snapPoints.find((offset) => offset >= defaultScrollValue);
38
+ }
39
+
40
+ return snapPoint ?? defaultScrollValue;
41
+ };
@@ -0,0 +1,2 @@
1
+ export { useChatKeyboard } from "./useChatKeyboard";
2
+ export type { KeyboardLiftBehavior } from "./useChatKeyboard/types";
@@ -0,0 +1,164 @@
1
+ import React, { forwardRef, useCallback, useMemo } from "react";
2
+ import { StyleSheet } from "react-native";
3
+ import {
4
+ makeMutable,
5
+ useAnimatedRef,
6
+ useAnimatedStyle,
7
+ useDerivedValue,
8
+ } from "react-native-reanimated";
9
+ import Reanimated from "react-native-reanimated";
10
+
11
+ import useCombinedRef from "../hooks/useCombinedRef";
12
+ import ScrollViewWithBottomPadding from "../ScrollViewWithBottomPadding";
13
+
14
+ import { useChatKeyboard } from "./useChatKeyboard";
15
+ import { useEndVisible } from "./useEndVisible";
16
+ import { useExtraContentPadding } from "./useExtraContentPadding";
17
+
18
+ import type { KeyboardChatScrollViewProps } from "./types";
19
+ import type { LayoutChangeEvent } from "react-native";
20
+
21
+ const ZERO_CONTENT_PADDING = makeMutable(0);
22
+ const ZERO_BLANK_SPACE = makeMutable(0);
23
+
24
+ const KeyboardChatScrollView = forwardRef<
25
+ Reanimated.ScrollView,
26
+ React.PropsWithChildren<KeyboardChatScrollViewProps>
27
+ >(
28
+ (
29
+ {
30
+ children,
31
+ ScrollViewComponent = Reanimated.ScrollView,
32
+ inverted = false,
33
+ keyboardLiftBehavior = "always",
34
+ freeze = false,
35
+ offset = 0,
36
+ extraContentPadding = ZERO_CONTENT_PADDING,
37
+ blankSpace = ZERO_BLANK_SPACE,
38
+ applyWorkaroundForContentInsetHitTestBug = false,
39
+ onLayout: onLayoutProp,
40
+ onContentSizeChange: onContentSizeChangeProp,
41
+ onEndVisible,
42
+ ...rest
43
+ },
44
+ ref,
45
+ ) => {
46
+ const scrollViewRef = useAnimatedRef<Reanimated.ScrollView>();
47
+ const onRef = useCombinedRef(ref, scrollViewRef);
48
+ const freezeSV = useDerivedValue(() =>
49
+ typeof freeze === "boolean" ? freeze : freeze.value,
50
+ );
51
+ const {
52
+ padding,
53
+ currentHeight,
54
+ contentOffsetY,
55
+ scroll,
56
+ layout,
57
+ size,
58
+ onLayout: onLayoutInternal,
59
+ onContentSizeChange: onContentSizeChangeInternal,
60
+ } = useChatKeyboard(scrollViewRef, {
61
+ inverted,
62
+ keyboardLiftBehavior,
63
+ freeze: freezeSV,
64
+ offset,
65
+ blankSpace,
66
+ extraContentPadding,
67
+ });
68
+
69
+ useExtraContentPadding({
70
+ scrollViewRef,
71
+ extraContentPadding,
72
+ keyboardPadding: padding,
73
+ blankSpace,
74
+ scroll,
75
+ layout,
76
+ size,
77
+ contentOffsetY,
78
+ inverted,
79
+ keyboardLiftBehavior,
80
+ freeze: freezeSV,
81
+ });
82
+
83
+ useEndVisible({
84
+ scroll,
85
+ layout,
86
+ size,
87
+ inverted,
88
+ onEndVisible,
89
+ });
90
+
91
+ const totalPadding = useDerivedValue(() =>
92
+ Math.max(blankSpace.value, padding.value + extraContentPadding.value),
93
+ );
94
+
95
+ // Scroll indicator inset = keyboard + extraContentPadding (excludes blankSpace).
96
+ // Apps that render into the unsafe area can supply a negative
97
+ // scrollIndicatorInsets adjustment at the application layer.
98
+ const indicatorPadding = useDerivedValue(
99
+ () => padding.value + extraContentPadding.value,
100
+ );
101
+
102
+ const onLayout = useCallback(
103
+ (e: LayoutChangeEvent) => {
104
+ onLayoutInternal(e);
105
+ onLayoutProp?.(e);
106
+ },
107
+ [onLayoutInternal, onLayoutProp],
108
+ );
109
+
110
+ const onContentSizeChange = useCallback(
111
+ (w: number, h: number) => {
112
+ onContentSizeChangeInternal(w, h);
113
+ onContentSizeChangeProp?.(w, h);
114
+ },
115
+ [onContentSizeChangeInternal, onContentSizeChangeProp],
116
+ );
117
+
118
+ // Invisible view whose animated style changes every frame during keyboard
119
+ // animation. On Fabric, this forces Reanimated to schedule a commit,
120
+ // which flushes the scrollTo call in the same frame (fixing de-synchronization).
121
+ // see https://github.com/software-mansion/react-native-reanimated/issues/9000
122
+ const commitStyle = useAnimatedStyle(
123
+ () => ({
124
+ transform: [{ translateY: -currentHeight.value }],
125
+ }),
126
+ [],
127
+ );
128
+ const commit = useMemo(
129
+ () => [styles.commitView, commitStyle],
130
+ [commitStyle],
131
+ );
132
+
133
+ return (
134
+ <>
135
+ <ScrollViewWithBottomPadding
136
+ ref={onRef}
137
+ {...rest}
138
+ applyWorkaroundForContentInsetHitTestBug={
139
+ applyWorkaroundForContentInsetHitTestBug
140
+ }
141
+ bottomPadding={totalPadding}
142
+ contentOffsetY={contentOffsetY}
143
+ inverted={inverted}
144
+ scrollIndicatorPadding={indicatorPadding}
145
+ ScrollViewComponent={ScrollViewComponent}
146
+ onContentSizeChange={onContentSizeChange}
147
+ onLayout={onLayout}
148
+ >
149
+ {children}
150
+ </ScrollViewWithBottomPadding>
151
+ <Reanimated.View style={commit} />
152
+ </>
153
+ );
154
+ },
155
+ );
156
+
157
+ const styles = StyleSheet.create({
158
+ commitView: {
159
+ display: "none",
160
+ position: "absolute",
161
+ },
162
+ });
163
+
164
+ export default KeyboardChatScrollView;
@@ -0,0 +1,117 @@
1
+ import type {
2
+ AnimatedScrollViewComponent,
3
+ ScrollViewContentInsets,
4
+ } from "../ScrollViewWithBottomPadding";
5
+ import type { KeyboardLiftBehavior } from "./useChatKeyboard/types";
6
+ import type { ScrollViewProps } from "react-native";
7
+ import type { SharedValue } from "react-native-reanimated";
8
+
9
+ export type KeyboardChatScrollViewProps = {
10
+ /** Custom component for `ScrollView`. Default is `ScrollView`. */
11
+ ScrollViewComponent?: AnimatedScrollViewComponent;
12
+ /** Whether list are using `inverted` prop. Default is `false`. */
13
+ inverted?: boolean;
14
+ /**
15
+ * The distance between the bottom of the screen and the `ScrollView`.
16
+ * When the keyboard appears, the `ScrollView` will only push content by the effective
17
+ * distance (`keyboardHeight - offset`) instead of the full keyboard height.
18
+ *
19
+ * Useful when the input is not at the very bottom of the screen (e.g., above safe area, above
20
+ * bottom tabs, etc. - in this case offset should be equal to the height of the elements between
21
+ * `ScrollView` and bottom of the screen).
22
+ *
23
+ * Default is `0`.
24
+ */
25
+ offset?: number;
26
+ /**
27
+ * Determines how the chat content should behave when the keyboard appears, specifically whether
28
+ * the scroll view should automatically lift its content to keep it visible above the keyboard.
29
+ *
30
+ * Possible values:
31
+ * - `'always'`: The content always lifts along with the keyboard, ensuring the messages from the bottom part of screen
32
+ * remain visible regardless of the current scroll position. This is the default behavior for most chat applications (used in Telegram).
33
+ * - `'whenAtEnd'`: The content lifts only if the scroll view is at the end (i.e., the last message
34
+ * is visible or near the bottom). This prevents unnecessary adjustments when the user is scrolling
35
+ * through older messages (ChatGPT mobile app behavior).
36
+ * - `'persistent'`: The content always lifts when the keyboard appears (similar to `'always'`), but
37
+ * does not reset (lower) when the keyboard hides. This mimics behaviors where the view remains adjusted
38
+ * after keyboard dismissal to maintain focus on the latest content without shifting back (Claude mobile app behavior).
39
+ * - `'never'`: The content does not lift at all when the keyboard appears. Use this for scenarios
40
+ * when you don't want to disturb user attention with animations (Perplexity mobile app behavior).
41
+ *
42
+ * Default is `'always'`.
43
+ */
44
+ keyboardLiftBehavior?: KeyboardLiftBehavior;
45
+ /**
46
+ * When `true`, freezes all keyboard-driven layout changes (padding, content offset, scroll position).
47
+ * Useful when dismissing the keyboard to open a bottom sheet — prevents visual disruption
48
+ * while the sheet is visible.
49
+ *
50
+ * Default is `false`.
51
+ */
52
+ freeze?: boolean | SharedValue<boolean>;
53
+ /**
54
+ * A shared value representing additional padding from external elements
55
+ * (e.g., a growing multiline `TextInput` in a `KeyboardStickyView`).
56
+ *
57
+ * When this value changes:
58
+ * - The scrollable range is always extended/contracted (via `contentInset`).
59
+ * - The scroll position is conditionally adjusted based on `keyboardLiftBehavior`.
60
+ *
61
+ * Default is `undefined` (no extra padding).
62
+ */
63
+ extraContentPadding?: SharedValue<number>;
64
+ /**
65
+ * When `true`, applies a runtime workaround for a React Native 0.81+ bug
66
+ * where the ScrollView's `contentInset` area does not respond to touch/scroll
67
+ * gestures (facebook/react-native#54123).
68
+ *
69
+ * This uses Objective-C runtime method swizzling on the ScrollView's container
70
+ * view, which is inherently fragile. Only enable if you are affected by the
71
+ * upstream bug and understand the risks.
72
+ *
73
+ * iOS only. Default is `false`.
74
+ */
75
+ applyWorkaroundForContentInsetHitTestBug?: boolean;
76
+ /**
77
+ * A shared value representing a minimum inset floor (in pixels).
78
+ *
79
+ * When set, the total bottom padding is computed as:
80
+ * `max(blankSpace, keyboardPadding + extraContentPadding)`
81
+ *
82
+ * This means the keyboard "absorbs" into the minimum padding rather than adding to it:
83
+ * - When `blankSpace >= keyboard + extraContentPadding`: content does NOT move on keyboard open/close.
84
+ * - When `blankSpace < keyboard + extraContentPadding`: content moves, but only by the excess amount.
85
+ *
86
+ * Useful in AI chat apps where a sent message needs space below it (to push it to the top
87
+ * of the viewport) while the AI response streams in, without that space causing extra movement
88
+ * when the keyboard opens.
89
+ *
90
+ * Default is `undefined` (equivalent to `0` — no minimum floor).
91
+ */
92
+ blankSpace?: SharedValue<number>;
93
+ /**
94
+ * Fires whenever the effective content inset changes — the static `contentInset`
95
+ * prop combined with the dynamic keyboard-driven padding.
96
+ *
97
+ * Useful on Android, where the synthetic content inset is not reflected in the native
98
+ * `onScroll` event payload. Consumers such as virtualized lists computing their own
99
+ * `scrollToEnd` target can use this to track the current inset alongside scroll offsets.
100
+ */
101
+ onContentInsetChange?: (insets: ScrollViewContentInsets) => void;
102
+ /**
103
+ * Fires whenever the visibility of the content "end" changes — both when the user
104
+ * arrives at the end and when they leave it. The boolean parameter reflects the new state.
105
+ *
106
+ * For non-inverted lists, the "end" is the bottom of the content. For inverted lists
107
+ * (`inverted={true}`), the "end" is the top of the scroll view, where the latest messages
108
+ * are rendered. The same internal detection drives `keyboardLiftBehavior="whenAtEnd"`.
109
+ *
110
+ * The callback can be either a plain JS function or a Reanimated worklet — the type is
111
+ * detected automatically. Worklets run on the UI thread; plain functions are dispatched
112
+ * via `runOnJS`.
113
+ *
114
+ * Fires once on mount with the initial state (after the scroll view has been measured).
115
+ */
116
+ onEndVisible?: (visible: boolean) => void;
117
+ } & ScrollViewProps;