react-native-keyboard-controller 1.21.5 → 1.21.7

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 (65) hide show
  1. package/android/src/main/java/com/reactnativekeyboardcontroller/modules/KeyboardControllerModuleImpl.kt +11 -1
  2. package/android/src/main/java/com/reactnativekeyboardcontroller/views/ClippingScrollViewDecoratorView.kt +1 -1
  3. package/lib/commonjs/components/KeyboardChatScrollView/index.js +12 -2
  4. package/lib/commonjs/components/KeyboardChatScrollView/index.js.map +1 -1
  5. package/lib/commonjs/components/KeyboardChatScrollView/types.js.map +1 -1
  6. package/lib/commonjs/components/KeyboardChatScrollView/useChatKeyboard/index.ios.js +3 -3
  7. package/lib/commonjs/components/KeyboardChatScrollView/useChatKeyboard/index.ios.js.map +1 -1
  8. package/lib/commonjs/components/KeyboardChatScrollView/useChatKeyboard/index.js +4 -4
  9. package/lib/commonjs/components/KeyboardChatScrollView/useChatKeyboard/index.js.map +1 -1
  10. package/lib/commonjs/components/KeyboardChatScrollView/useChatKeyboard/types.js.map +1 -1
  11. package/lib/commonjs/components/KeyboardChatScrollView/useEndVisible.js +40 -0
  12. package/lib/commonjs/components/KeyboardChatScrollView/useEndVisible.js.map +1 -0
  13. package/lib/commonjs/components/KeyboardChatScrollView/useExtraContentPadding/index.js +2 -2
  14. package/lib/commonjs/components/KeyboardChatScrollView/useExtraContentPadding/index.js.map +1 -1
  15. package/lib/commonjs/components/KeyboardStickyView/index.js +10 -14
  16. package/lib/commonjs/components/KeyboardStickyView/index.js.map +1 -1
  17. package/lib/commonjs/components/KeyboardToolbar/index.js +12 -3
  18. package/lib/commonjs/components/KeyboardToolbar/index.js.map +1 -1
  19. package/lib/commonjs/components/ScrollViewWithBottomPadding/index.js +35 -23
  20. package/lib/commonjs/components/ScrollViewWithBottomPadding/index.js.map +1 -1
  21. package/lib/commonjs/hooks/useKeyboardState/index.js +1 -7
  22. package/lib/commonjs/hooks/useKeyboardState/index.js.map +1 -1
  23. package/lib/commonjs/module.js +1 -1
  24. package/lib/commonjs/module.js.map +1 -1
  25. package/lib/module/components/KeyboardChatScrollView/index.js +12 -2
  26. package/lib/module/components/KeyboardChatScrollView/index.js.map +1 -1
  27. package/lib/module/components/KeyboardChatScrollView/types.js.map +1 -1
  28. package/lib/module/components/KeyboardChatScrollView/useChatKeyboard/index.ios.js +3 -3
  29. package/lib/module/components/KeyboardChatScrollView/useChatKeyboard/index.ios.js.map +1 -1
  30. package/lib/module/components/KeyboardChatScrollView/useChatKeyboard/index.js +4 -4
  31. package/lib/module/components/KeyboardChatScrollView/useChatKeyboard/index.js.map +1 -1
  32. package/lib/module/components/KeyboardChatScrollView/useChatKeyboard/types.js.map +1 -1
  33. package/lib/module/components/KeyboardChatScrollView/useEndVisible.js +33 -0
  34. package/lib/module/components/KeyboardChatScrollView/useEndVisible.js.map +1 -0
  35. package/lib/module/components/KeyboardChatScrollView/useExtraContentPadding/index.js +2 -2
  36. package/lib/module/components/KeyboardChatScrollView/useExtraContentPadding/index.js.map +1 -1
  37. package/lib/module/components/KeyboardStickyView/index.js +11 -15
  38. package/lib/module/components/KeyboardStickyView/index.js.map +1 -1
  39. package/lib/module/components/KeyboardToolbar/index.js +12 -3
  40. package/lib/module/components/KeyboardToolbar/index.js.map +1 -1
  41. package/lib/module/components/ScrollViewWithBottomPadding/index.js +37 -25
  42. package/lib/module/components/ScrollViewWithBottomPadding/index.js.map +1 -1
  43. package/lib/module/hooks/useKeyboardState/index.js +1 -7
  44. package/lib/module/hooks/useKeyboardState/index.js.map +1 -1
  45. package/lib/module/module.js +1 -1
  46. package/lib/module/module.js.map +1 -1
  47. package/lib/typescript/components/KeyboardChatScrollView/index.d.ts +3 -1
  48. package/lib/typescript/components/KeyboardChatScrollView/types.d.ts +26 -2
  49. package/lib/typescript/components/KeyboardChatScrollView/useChatKeyboard/types.d.ts +1 -1
  50. package/lib/typescript/components/KeyboardChatScrollView/useEndVisible.d.ts +17 -0
  51. package/lib/typescript/components/KeyboardChatScrollView/useExtraContentPadding/index.d.ts +1 -1
  52. package/lib/typescript/components/ScrollViewWithBottomPadding/index.d.ts +12 -0
  53. package/package.json +1 -1
  54. package/src/components/KeyboardChatScrollView/index.tsx +15 -2
  55. package/src/components/KeyboardChatScrollView/types.ts +29 -2
  56. package/src/components/KeyboardChatScrollView/useChatKeyboard/index.ios.ts +3 -3
  57. package/src/components/KeyboardChatScrollView/useChatKeyboard/index.ts +4 -4
  58. package/src/components/KeyboardChatScrollView/useChatKeyboard/types.ts +1 -1
  59. package/src/components/KeyboardChatScrollView/useEndVisible.ts +66 -0
  60. package/src/components/KeyboardChatScrollView/useExtraContentPadding/index.ts +3 -3
  61. package/src/components/KeyboardStickyView/index.tsx +18 -19
  62. package/src/components/KeyboardToolbar/index.tsx +13 -4
  63. package/src/components/ScrollViewWithBottomPadding/index.tsx +67 -28
  64. package/src/hooks/useKeyboardState/index.ts +1 -8
  65. package/src/module.ts +1 -1
@@ -81,9 +81,11 @@ const KeyboardToolbar = props => {
81
81
  paddingLeft: insets === null || insets === void 0 ? void 0 : insets.left,
82
82
  paddingRight: insets === null || insets === void 0 ? void 0 : insets.right
83
83
  } : null, _constants.KEYBOARD_HAS_ROUNDED_CORNERS ? styles.floating : null], [colorScheme, opacity, theme, insets]);
84
- const containerStyle = (0, _react.useMemo)(() => [_constants.KEYBOARD_HAS_ROUNDED_CORNERS ? {
85
- marginLeft: ((insets === null || insets === void 0 ? void 0 : insets.left) ?? 0) + 16,
86
- marginRight: ((insets === null || insets === void 0 ? void 0 : insets.right) ?? 0) + 16
84
+ const containerStyle = (0, _react.useMemo)(() => [
85
+ // CRUCIAL: gives the native view real bounds
86
+ styles.sticky, _constants.KEYBOARD_HAS_ROUNDED_CORNERS ? {
87
+ left: ((insets === null || insets === void 0 ? void 0 : insets.left) ?? 0) + 16,
88
+ right: ((insets === null || insets === void 0 ? void 0 : insets.right) ?? 0) + 16
87
89
  } : null], [insets]);
88
90
  const offset = (0, _react.useMemo)(() => ({
89
91
  closed: closed + _constants.KEYBOARD_TOOLBAR_HEIGHT,
@@ -159,6 +161,13 @@ const KeyboardToolbar = props => {
159
161
  }), backgroundElement, arrowsElement, contentContainer, doneElement)));
160
162
  };
161
163
  const styles = _reactNative.StyleSheet.create({
164
+ sticky: {
165
+ position: "absolute",
166
+ left: 0,
167
+ right: 0,
168
+ bottom: 0,
169
+ height: _constants.KEYBOARD_TOOLBAR_HEIGHT
170
+ },
162
171
  toolbar: {
163
172
  position: "absolute",
164
173
  bottom: 0,
@@ -1 +1 @@
1
- {"version":3,"names":["_react","_interopRequireWildcard","require","_reactNative","_bindings","_hooks","_KeyboardStickyView","_interopRequireDefault","_Arrow","_Button","_colors","_components","_context","_constants","e","__esModule","default","t","WeakMap","r","n","o","i","f","__proto__","has","get","set","hasOwnProperty","call","Object","defineProperty","getOwnPropertyDescriptor","_extends","assign","bind","arguments","length","apply","KeyboardToolbar","props","children","content","theme","colors","doneText","button","icon","showArrows","onNextCallback","onPrevCallback","onDoneCallback","blur","opacity","DEFAULT_OPACITY","offset","closed","opened","enabled","insets","rest","colorScheme","useKeyboardState","state","appearance","inputs","setInputs","useState","current","count","isPrevDisabled","isNextDisabled","buttonContainer","Button","iconContainer","Arrow","useEffect","subscription","FocusedInputEvents","addListener","remove","toolbarStyle","useMemo","styles","toolbar","backgroundColor","background","KEYBOARD_HAS_ROUNDED_CORNERS","paddingLeft","left","paddingRight","right","floating","containerStyle","marginLeft","marginRight","KEYBOARD_TOOLBAR_HEIGHT","OPENED_OFFSET","backgroundElement","arrowsElement","contentContainer","doneElement","prevChild","nextChild","contentChild","doneChild","backgroundChild","React","Children","forEach","child","isValidElement","type","Background","Content","Prev","Next","Done","createElement","View","style","arrows","onPress","text","contextValue","ToolbarContext","Provider","value","testID","TEST_ID_KEYBOARD_TOOLBAR","StyleSheet","create","position","bottom","alignItems","width","flexDirection","height","alignSelf","borderRadius","overflow","Group","RCTKeyboardToolbarGroupView","_default","exports"],"sources":["index.tsx"],"sourcesContent":["import React, { useEffect, useMemo, useState } from \"react\";\nimport { StyleSheet, View } from \"react-native\";\n\nimport {\n FocusedInputEvents,\n RCTKeyboardToolbarGroupView,\n} from \"../../bindings\";\nimport { useKeyboardState } from \"../../hooks\";\nimport KeyboardStickyView from \"../KeyboardStickyView\";\n\nimport Arrow from \"./Arrow\";\nimport Button from \"./Button\";\nimport { colors } from \"./colors\";\nimport { Background, Content, Done, Next, Prev } from \"./compound/components\";\nimport { ToolbarContext } from \"./compound/context\";\nimport {\n DEFAULT_OPACITY,\n KEYBOARD_HAS_ROUNDED_CORNERS,\n KEYBOARD_TOOLBAR_HEIGHT,\n OPENED_OFFSET,\n TEST_ID_KEYBOARD_TOOLBAR,\n} from \"./constants\";\n\nimport type { KeyboardToolbarProps } from \"./types\";\nimport type { ReactNode } from \"react\";\n\n/**\n * `KeyboardToolbar` is a component that is shown above the keyboard with `Prev`/`Next` buttons from left and\n * `Done` button from the right (to dismiss the keyboard). Allows to add customizable content (yours UI elements) in the middle.\n *\n * @param props - Component props.\n * @returns A component that is shown above the keyboard with `Prev`/`Next` and `Done` buttons.\n * @see {@link https://kirillzyusko.github.io/react-native-keyboard-controller/docs/api/components/keyboard-toolbar|Documentation} page for more details.\n * @example\n * ```tsx\n * <KeyboardToolbar>\n * <KeyboardToolbar.Done text=\"Close\" />\n * </KeyboardToolbar>\n * ```\n */\nconst KeyboardToolbar: React.FC<KeyboardToolbarProps> & {\n Background: typeof Background;\n Content: typeof Content;\n Prev: typeof Prev;\n Next: typeof Next;\n Done: typeof Done;\n Group: typeof RCTKeyboardToolbarGroupView;\n} = (props) => {\n const {\n children,\n content,\n theme = colors,\n doneText = \"Done\",\n button,\n icon,\n showArrows = true,\n onNextCallback,\n onPrevCallback,\n onDoneCallback,\n blur = null,\n opacity = DEFAULT_OPACITY,\n offset: { closed = 0, opened = 0 } = {},\n enabled = true,\n insets,\n ...rest\n } = props;\n const colorScheme = useKeyboardState((state) => state.appearance);\n const [inputs, setInputs] = useState({\n current: 0,\n count: 0,\n });\n const isPrevDisabled = inputs.current === 0;\n const isNextDisabled = inputs.current === inputs.count - 1;\n const buttonContainer = button ?? Button;\n const iconContainer = icon ?? Arrow;\n\n useEffect(() => {\n const subscription = FocusedInputEvents.addListener(\"focusDidSet\", (e) => {\n setInputs(e);\n });\n\n return subscription.remove;\n }, []);\n const toolbarStyle = useMemo(\n () => [\n styles.toolbar,\n {\n backgroundColor: `${theme[colorScheme].background}${opacity}`,\n },\n !KEYBOARD_HAS_ROUNDED_CORNERS\n ? {\n paddingLeft: insets?.left,\n paddingRight: insets?.right,\n }\n : null,\n KEYBOARD_HAS_ROUNDED_CORNERS ? styles.floating : null,\n ],\n [colorScheme, opacity, theme, insets],\n );\n const containerStyle = useMemo(\n () => [\n KEYBOARD_HAS_ROUNDED_CORNERS\n ? {\n marginLeft: (insets?.left ?? 0) + 16,\n marginRight: (insets?.right ?? 0) + 16,\n }\n : null,\n ],\n [insets],\n );\n const offset = useMemo(\n () => ({\n closed: closed + KEYBOARD_TOOLBAR_HEIGHT,\n opened: opened + OPENED_OFFSET,\n }),\n [closed, opened],\n );\n\n let backgroundElement: ReactNode = null;\n let arrowsElement: ReactNode = null;\n let contentContainer: ReactNode = null;\n let doneElement: ReactNode = null;\n\n if (children) {\n let prevChild: ReactNode = null;\n let nextChild: ReactNode = null;\n let contentChild: ReactNode = null;\n let doneChild: ReactNode = null;\n let backgroundChild: ReactNode = null;\n\n React.Children.forEach(children, (child) => {\n if (!React.isValidElement(child)) {\n return;\n }\n const type = child.type;\n\n if (type === Background) {\n backgroundChild = child;\n } else if (type === Content) {\n contentChild = child;\n } else if (type === Prev) {\n prevChild = child;\n } else if (type === Next) {\n nextChild = child;\n } else if (type === Done) {\n doneChild = child;\n }\n });\n\n backgroundElement = backgroundChild;\n doneElement = doneChild;\n arrowsElement =\n prevChild || nextChild ? (\n <View style={styles.arrows}>\n {prevChild}\n {nextChild}\n </View>\n ) : null;\n contentContainer = contentChild ?? <Content>{contentChild}</Content>;\n } else {\n backgroundElement = blur;\n arrowsElement = showArrows ? (\n <View style={styles.arrows}>\n <Prev\n button={buttonContainer}\n icon={iconContainer}\n onPress={onPrevCallback}\n />\n <Next\n button={buttonContainer}\n icon={iconContainer}\n onPress={onNextCallback}\n />\n </View>\n ) : null;\n contentContainer = <Content>{content}</Content>;\n doneElement = doneText ? (\n <Done button={buttonContainer} text={doneText} onPress={onDoneCallback} />\n ) : null;\n }\n\n const contextValue = useMemo(\n () => ({\n theme,\n isPrevDisabled,\n isNextDisabled,\n }),\n [theme, isPrevDisabled, isNextDisabled],\n );\n\n return (\n <ToolbarContext.Provider value={contextValue}>\n <KeyboardStickyView\n enabled={enabled}\n offset={offset}\n style={containerStyle}\n >\n <View {...rest} style={toolbarStyle} testID={TEST_ID_KEYBOARD_TOOLBAR}>\n {backgroundElement}\n {arrowsElement}\n {contentContainer}\n {doneElement}\n </View>\n </KeyboardStickyView>\n </ToolbarContext.Provider>\n );\n};\n\nconst styles = StyleSheet.create({\n toolbar: {\n position: \"absolute\",\n bottom: 0,\n alignItems: \"center\",\n width: \"100%\",\n flexDirection: \"row\",\n height: KEYBOARD_TOOLBAR_HEIGHT,\n },\n arrows: {\n flexDirection: \"row\",\n paddingLeft: 8,\n },\n floating: {\n alignSelf: \"center\",\n borderRadius: 20,\n overflow: \"hidden\",\n },\n});\n\nKeyboardToolbar.Background = Background;\nKeyboardToolbar.Content = Content;\nKeyboardToolbar.Prev = Prev;\nKeyboardToolbar.Next = Next;\nKeyboardToolbar.Done = Done;\nKeyboardToolbar.Group = RCTKeyboardToolbarGroupView;\n\nexport { colors as DefaultKeyboardToolbarTheme, KeyboardToolbarProps };\nexport default KeyboardToolbar;\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["_react","_interopRequireWildcard","require","_reactNative","_bindings","_hooks","_KeyboardStickyView","_interopRequireDefault","_Arrow","_Button","_colors","_components","_context","_constants","e","__esModule","default","t","WeakMap","r","n","o","i","f","__proto__","has","get","set","hasOwnProperty","call","Object","defineProperty","getOwnPropertyDescriptor","_extends","assign","bind","arguments","length","apply","KeyboardToolbar","props","children","content","theme","colors","doneText","button","icon","showArrows","onNextCallback","onPrevCallback","onDoneCallback","blur","opacity","DEFAULT_OPACITY","offset","closed","opened","enabled","insets","rest","colorScheme","useKeyboardState","state","appearance","inputs","setInputs","useState","current","count","isPrevDisabled","isNextDisabled","buttonContainer","Button","iconContainer","Arrow","useEffect","subscription","FocusedInputEvents","addListener","remove","toolbarStyle","useMemo","styles","toolbar","backgroundColor","background","KEYBOARD_HAS_ROUNDED_CORNERS","paddingLeft","left","paddingRight","right","floating","containerStyle","sticky","KEYBOARD_TOOLBAR_HEIGHT","OPENED_OFFSET","backgroundElement","arrowsElement","contentContainer","doneElement","prevChild","nextChild","contentChild","doneChild","backgroundChild","React","Children","forEach","child","isValidElement","type","Background","Content","Prev","Next","Done","createElement","View","style","arrows","onPress","text","contextValue","ToolbarContext","Provider","value","testID","TEST_ID_KEYBOARD_TOOLBAR","StyleSheet","create","position","bottom","height","alignItems","width","flexDirection","alignSelf","borderRadius","overflow","Group","RCTKeyboardToolbarGroupView","_default","exports"],"sources":["index.tsx"],"sourcesContent":["import React, { useEffect, useMemo, useState } from \"react\";\nimport { StyleSheet, View } from \"react-native\";\n\nimport {\n FocusedInputEvents,\n RCTKeyboardToolbarGroupView,\n} from \"../../bindings\";\nimport { useKeyboardState } from \"../../hooks\";\nimport KeyboardStickyView from \"../KeyboardStickyView\";\n\nimport Arrow from \"./Arrow\";\nimport Button from \"./Button\";\nimport { colors } from \"./colors\";\nimport { Background, Content, Done, Next, Prev } from \"./compound/components\";\nimport { ToolbarContext } from \"./compound/context\";\nimport {\n DEFAULT_OPACITY,\n KEYBOARD_HAS_ROUNDED_CORNERS,\n KEYBOARD_TOOLBAR_HEIGHT,\n OPENED_OFFSET,\n TEST_ID_KEYBOARD_TOOLBAR,\n} from \"./constants\";\n\nimport type { KeyboardToolbarProps } from \"./types\";\nimport type { ReactNode } from \"react\";\n\n/**\n * `KeyboardToolbar` is a component that is shown above the keyboard with `Prev`/`Next` buttons from left and\n * `Done` button from the right (to dismiss the keyboard). Allows to add customizable content (yours UI elements) in the middle.\n *\n * @param props - Component props.\n * @returns A component that is shown above the keyboard with `Prev`/`Next` and `Done` buttons.\n * @see {@link https://kirillzyusko.github.io/react-native-keyboard-controller/docs/api/components/keyboard-toolbar|Documentation} page for more details.\n * @example\n * ```tsx\n * <KeyboardToolbar>\n * <KeyboardToolbar.Done text=\"Close\" />\n * </KeyboardToolbar>\n * ```\n */\nconst KeyboardToolbar: React.FC<KeyboardToolbarProps> & {\n Background: typeof Background;\n Content: typeof Content;\n Prev: typeof Prev;\n Next: typeof Next;\n Done: typeof Done;\n Group: typeof RCTKeyboardToolbarGroupView;\n} = (props) => {\n const {\n children,\n content,\n theme = colors,\n doneText = \"Done\",\n button,\n icon,\n showArrows = true,\n onNextCallback,\n onPrevCallback,\n onDoneCallback,\n blur = null,\n opacity = DEFAULT_OPACITY,\n offset: { closed = 0, opened = 0 } = {},\n enabled = true,\n insets,\n ...rest\n } = props;\n const colorScheme = useKeyboardState((state) => state.appearance);\n const [inputs, setInputs] = useState({\n current: 0,\n count: 0,\n });\n const isPrevDisabled = inputs.current === 0;\n const isNextDisabled = inputs.current === inputs.count - 1;\n const buttonContainer = button ?? Button;\n const iconContainer = icon ?? Arrow;\n\n useEffect(() => {\n const subscription = FocusedInputEvents.addListener(\"focusDidSet\", (e) => {\n setInputs(e);\n });\n\n return subscription.remove;\n }, []);\n const toolbarStyle = useMemo(\n () => [\n styles.toolbar,\n {\n backgroundColor: `${theme[colorScheme].background}${opacity}`,\n },\n !KEYBOARD_HAS_ROUNDED_CORNERS\n ? {\n paddingLeft: insets?.left,\n paddingRight: insets?.right,\n }\n : null,\n KEYBOARD_HAS_ROUNDED_CORNERS ? styles.floating : null,\n ],\n [colorScheme, opacity, theme, insets],\n );\n const containerStyle = useMemo(\n () => [\n // CRUCIAL: gives the native view real bounds\n styles.sticky,\n KEYBOARD_HAS_ROUNDED_CORNERS\n ? ({\n left: (insets?.left ?? 0) + 16,\n right: (insets?.right ?? 0) + 16,\n } as const)\n : null,\n ],\n [insets],\n );\n const offset = useMemo(\n () => ({\n closed: closed + KEYBOARD_TOOLBAR_HEIGHT,\n opened: opened + OPENED_OFFSET,\n }),\n [closed, opened],\n );\n\n let backgroundElement: ReactNode = null;\n let arrowsElement: ReactNode = null;\n let contentContainer: ReactNode = null;\n let doneElement: ReactNode = null;\n\n if (children) {\n let prevChild: ReactNode = null;\n let nextChild: ReactNode = null;\n let contentChild: ReactNode = null;\n let doneChild: ReactNode = null;\n let backgroundChild: ReactNode = null;\n\n React.Children.forEach(children, (child) => {\n if (!React.isValidElement(child)) {\n return;\n }\n const type = child.type;\n\n if (type === Background) {\n backgroundChild = child;\n } else if (type === Content) {\n contentChild = child;\n } else if (type === Prev) {\n prevChild = child;\n } else if (type === Next) {\n nextChild = child;\n } else if (type === Done) {\n doneChild = child;\n }\n });\n\n backgroundElement = backgroundChild;\n doneElement = doneChild;\n arrowsElement =\n prevChild || nextChild ? (\n <View style={styles.arrows}>\n {prevChild}\n {nextChild}\n </View>\n ) : null;\n contentContainer = contentChild ?? <Content>{contentChild}</Content>;\n } else {\n backgroundElement = blur;\n arrowsElement = showArrows ? (\n <View style={styles.arrows}>\n <Prev\n button={buttonContainer}\n icon={iconContainer}\n onPress={onPrevCallback}\n />\n <Next\n button={buttonContainer}\n icon={iconContainer}\n onPress={onNextCallback}\n />\n </View>\n ) : null;\n contentContainer = <Content>{content}</Content>;\n doneElement = doneText ? (\n <Done button={buttonContainer} text={doneText} onPress={onDoneCallback} />\n ) : null;\n }\n\n const contextValue = useMemo(\n () => ({\n theme,\n isPrevDisabled,\n isNextDisabled,\n }),\n [theme, isPrevDisabled, isNextDisabled],\n );\n\n return (\n <ToolbarContext.Provider value={contextValue}>\n <KeyboardStickyView\n enabled={enabled}\n offset={offset}\n style={containerStyle}\n >\n <View {...rest} style={toolbarStyle} testID={TEST_ID_KEYBOARD_TOOLBAR}>\n {backgroundElement}\n {arrowsElement}\n {contentContainer}\n {doneElement}\n </View>\n </KeyboardStickyView>\n </ToolbarContext.Provider>\n );\n};\n\nconst styles = StyleSheet.create({\n sticky: {\n position: \"absolute\",\n left: 0,\n right: 0,\n bottom: 0,\n height: KEYBOARD_TOOLBAR_HEIGHT,\n },\n toolbar: {\n position: \"absolute\",\n bottom: 0,\n alignItems: \"center\",\n width: \"100%\",\n flexDirection: \"row\",\n height: KEYBOARD_TOOLBAR_HEIGHT,\n },\n arrows: {\n flexDirection: \"row\",\n paddingLeft: 8,\n },\n floating: {\n alignSelf: \"center\",\n borderRadius: 20,\n overflow: \"hidden\",\n },\n});\n\nKeyboardToolbar.Background = Background;\nKeyboardToolbar.Content = Content;\nKeyboardToolbar.Prev = Prev;\nKeyboardToolbar.Next = Next;\nKeyboardToolbar.Done = Done;\nKeyboardToolbar.Group = RCTKeyboardToolbarGroupView;\n\nexport { colors as DefaultKeyboardToolbarTheme, KeyboardToolbarProps };\nexport default KeyboardToolbar;\n"],"mappings":"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","ignoreList":[]}
@@ -23,26 +23,47 @@ const ScrollViewWithBottomPadding = /*#__PURE__*/(0, _react.forwardRef)(({
23
23
  inverted,
24
24
  contentOffsetY,
25
25
  applyWorkaroundForContentInsetHitTestBug,
26
+ onContentInsetChange,
26
27
  children,
27
28
  ...rest
28
29
  }, ref) => {
29
30
  const prevContentOffsetY = (0, _reactNativeReanimated.useSharedValue)(null);
31
+ const insets = (0, _reactNativeReanimated.useDerivedValue)(() => {
32
+ const dynamicTop = inverted ? bottomPadding.value : 0;
33
+ const dynamicBottom = !inverted ? bottomPadding.value : 0;
34
+ return {
35
+ dynamic: {
36
+ top: dynamicTop,
37
+ bottom: dynamicBottom
38
+ },
39
+ effective: {
40
+ top: dynamicTop + ((contentInset === null || contentInset === void 0 ? void 0 : contentInset.top) || 0),
41
+ bottom: dynamicBottom + ((contentInset === null || contentInset === void 0 ? void 0 : contentInset.bottom) || 0),
42
+ left: (contentInset === null || contentInset === void 0 ? void 0 : contentInset.left) || 0,
43
+ right: (contentInset === null || contentInset === void 0 ? void 0 : contentInset.right) || 0
44
+ }
45
+ };
46
+ }, [inverted, contentInset === null || contentInset === void 0 ? void 0 : contentInset.top, contentInset === null || contentInset === void 0 ? void 0 : contentInset.bottom, contentInset === null || contentInset === void 0 ? void 0 : contentInset.left, contentInset === null || contentInset === void 0 ? void 0 : contentInset.right]);
47
+ (0, _reactNativeReanimated.useAnimatedReaction)(() => insets.value.effective, (current, previous) => {
48
+ if (!onContentInsetChange) {
49
+ return;
50
+ }
51
+ if (previous && current.top === previous.top && current.bottom === previous.bottom && current.left === previous.left && current.right === previous.right) {
52
+ return;
53
+ }
54
+ (0, _reactNativeReanimated.runOnJS)(onContentInsetChange)(current);
55
+ }, [onContentInsetChange]);
30
56
  const animatedProps = (0, _reactNativeReanimated.useAnimatedProps)(() => {
31
- const insetTop = inverted ? bottomPadding.value : 0;
32
- const insetBottom = !inverted ? bottomPadding.value : 0;
33
- const bottom = insetBottom + ((contentInset === null || contentInset === void 0 ? void 0 : contentInset.bottom) || 0);
34
- const top = insetTop + ((contentInset === null || contentInset === void 0 ? void 0 : contentInset.top) || 0);
57
+ const {
58
+ dynamic,
59
+ effective
60
+ } = insets.value;
35
61
  const indicatorPadding = scrollIndicatorPadding ?? bottomPadding;
36
62
  const indicatorTop = (inverted ? indicatorPadding.value : 0) + ((scrollIndicatorInsets === null || scrollIndicatorInsets === void 0 ? void 0 : scrollIndicatorInsets.top) || 0);
37
63
  const indicatorBottom = (!inverted ? indicatorPadding.value : 0) + ((scrollIndicatorInsets === null || scrollIndicatorInsets === void 0 ? void 0 : scrollIndicatorInsets.bottom) || 0);
38
64
  const result = {
39
65
  // iOS prop
40
- contentInset: {
41
- bottom: bottom,
42
- top: top,
43
- right: contentInset === null || contentInset === void 0 ? void 0 : contentInset.right,
44
- left: contentInset === null || contentInset === void 0 ? void 0 : contentInset.left
45
- },
66
+ contentInset: effective,
46
67
  scrollIndicatorInsets: {
47
68
  bottom: indicatorBottom,
48
69
  top: indicatorTop,
@@ -50,8 +71,8 @@ const ScrollViewWithBottomPadding = /*#__PURE__*/(0, _react.forwardRef)(({
50
71
  left: scrollIndicatorInsets === null || scrollIndicatorInsets === void 0 ? void 0 : scrollIndicatorInsets.left
51
72
  },
52
73
  // Android prop
53
- contentInsetBottom: insetBottom,
54
- contentInsetTop: insetTop
74
+ contentInsetBottom: dynamic.bottom,
75
+ contentInsetTop: dynamic.top
55
76
  };
56
77
  if (contentOffsetY) {
57
78
  const curr = contentOffsetY.value;
@@ -65,7 +86,7 @@ const ScrollViewWithBottomPadding = /*#__PURE__*/(0, _react.forwardRef)(({
65
86
  }
66
87
  }
67
88
  return result;
68
- }, [contentInset === null || contentInset === void 0 ? void 0 : contentInset.bottom, contentInset === null || contentInset === void 0 ? void 0 : contentInset.top, contentInset === null || contentInset === void 0 ? void 0 : contentInset.right, contentInset === null || contentInset === void 0 ? void 0 : contentInset.left, scrollIndicatorInsets === null || scrollIndicatorInsets === void 0 ? void 0 : scrollIndicatorInsets.bottom, scrollIndicatorInsets === null || scrollIndicatorInsets === void 0 ? void 0 : scrollIndicatorInsets.top, scrollIndicatorInsets === null || scrollIndicatorInsets === void 0 ? void 0 : scrollIndicatorInsets.right, scrollIndicatorInsets === null || scrollIndicatorInsets === void 0 ? void 0 : scrollIndicatorInsets.left, inverted, contentOffsetY]);
89
+ }, [scrollIndicatorInsets === null || scrollIndicatorInsets === void 0 ? void 0 : scrollIndicatorInsets.bottom, scrollIndicatorInsets === null || scrollIndicatorInsets === void 0 ? void 0 : scrollIndicatorInsets.top, scrollIndicatorInsets === null || scrollIndicatorInsets === void 0 ? void 0 : scrollIndicatorInsets.right, scrollIndicatorInsets === null || scrollIndicatorInsets === void 0 ? void 0 : scrollIndicatorInsets.left, inverted, contentOffsetY]);
69
90
  return /*#__PURE__*/_react.default.createElement(ReanimatedClippingScrollView, {
70
91
  animatedProps: animatedProps,
71
92
  applyWorkaroundForContentInsetHitTestBug: applyWorkaroundForContentInsetHitTestBug,
@@ -73,16 +94,7 @@ const ScrollViewWithBottomPadding = /*#__PURE__*/(0, _react.forwardRef)(({
73
94
  }, /*#__PURE__*/_react.default.createElement(ScrollViewComponent, _extends({
74
95
  ref: ref,
75
96
  animatedProps: animatedProps
76
- }, rest), inverted ?
77
- /*#__PURE__*/
78
- // The only thing it can break is `StickyHeader`, but it's already broken in FlatList and other lists
79
- // don't support this functionality, so we can add additional view here
80
- // The correct fix would be to add a new prop in ScrollView that allows
81
- // to customize children extraction logic and skip custom view
82
- _react.default.createElement(_reactNative.View, {
83
- collapsable: false,
84
- nativeID: "container"
85
- }, children) : children));
97
+ }, rest), children));
86
98
  });
87
99
  var _default = exports.default = ScrollViewWithBottomPadding;
88
100
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["_react","_interopRequireWildcard","require","_reactNative","_reactNativeReanimated","_bindings","_styles","_interopRequireDefault","e","__esModule","default","t","WeakMap","r","n","o","i","f","__proto__","has","get","set","hasOwnProperty","call","Object","defineProperty","getOwnPropertyDescriptor","_extends","assign","bind","arguments","length","apply","OS","Platform","ReanimatedClippingScrollView","Reanimated","createAnimatedComponent","ClippingScrollView","ScrollViewWithBottomPadding","forwardRef","ScrollViewComponent","bottomPadding","scrollIndicatorPadding","contentInset","scrollIndicatorInsets","inverted","contentOffsetY","applyWorkaroundForContentInsetHitTestBug","children","rest","ref","prevContentOffsetY","useSharedValue","animatedProps","useAnimatedProps","insetTop","value","insetBottom","bottom","top","indicatorPadding","indicatorTop","indicatorBottom","result","right","left","contentInsetBottom","contentInsetTop","curr","contentOffset","x","y","createElement","style","styles","container","View","collapsable","nativeID","_default","exports"],"sources":["index.tsx"],"sourcesContent":["import React, { forwardRef } from \"react\";\nimport { Platform, View } from \"react-native\";\nimport Reanimated, {\n useAnimatedProps,\n useSharedValue,\n} from \"react-native-reanimated\";\n\nimport { ClippingScrollView } from \"../../bindings\";\n\nimport styles from \"./styles\";\n\nimport type { ScrollViewProps } from \"react-native\";\nimport type { SharedValue } from \"react-native-reanimated\";\n\nconst OS = Platform.OS;\nconst ReanimatedClippingScrollView =\n OS === \"android\"\n ? Reanimated.createAnimatedComponent(ClippingScrollView)\n : ClippingScrollView;\n\ntype AnimatedScrollViewProps = React.ComponentProps<\n typeof Reanimated.ScrollView\n>;\n\nexport type AnimatedScrollViewComponent = React.ForwardRefExoticComponent<\n AnimatedScrollViewProps & React.RefAttributes<Reanimated.ScrollView>\n>;\n\ntype ScrollViewWithBottomPaddingProps = {\n ScrollViewComponent: AnimatedScrollViewComponent;\n children?: React.ReactNode;\n inverted?: boolean;\n bottomPadding: SharedValue<number>;\n /** Padding for scroll indicator insets (excludes blankSpace). Falls back to bottomPadding when not provided. */\n scrollIndicatorPadding?: SharedValue<number>;\n /** Absolute Y content offset (iOS only, for KeyboardChatScrollView). */\n contentOffsetY?: SharedValue<number>;\n applyWorkaroundForContentInsetHitTestBug?: boolean;\n} & ScrollViewProps;\n\nconst ScrollViewWithBottomPadding = forwardRef<\n Reanimated.ScrollView,\n ScrollViewWithBottomPaddingProps\n>(\n (\n {\n ScrollViewComponent,\n bottomPadding,\n scrollIndicatorPadding,\n contentInset,\n scrollIndicatorInsets,\n inverted,\n contentOffsetY,\n applyWorkaroundForContentInsetHitTestBug,\n children,\n ...rest\n },\n ref,\n ) => {\n const prevContentOffsetY = useSharedValue<number | null>(null);\n\n const animatedProps = useAnimatedProps(() => {\n const insetTop = inverted ? bottomPadding.value : 0;\n const insetBottom = !inverted ? bottomPadding.value : 0;\n const bottom = insetBottom + (contentInset?.bottom || 0);\n const top = insetTop + (contentInset?.top || 0);\n\n const indicatorPadding = scrollIndicatorPadding ?? bottomPadding;\n const indicatorTop =\n (inverted ? indicatorPadding.value : 0) +\n (scrollIndicatorInsets?.top || 0);\n const indicatorBottom =\n (!inverted ? indicatorPadding.value : 0) +\n (scrollIndicatorInsets?.bottom || 0);\n\n const result: Record<string, unknown> = {\n // iOS prop\n contentInset: {\n bottom: bottom,\n top: top,\n right: contentInset?.right,\n left: contentInset?.left,\n },\n scrollIndicatorInsets: {\n bottom: indicatorBottom,\n top: indicatorTop,\n right: scrollIndicatorInsets?.right,\n left: scrollIndicatorInsets?.left,\n },\n // Android prop\n contentInsetBottom: insetBottom,\n contentInsetTop: insetTop,\n };\n\n if (contentOffsetY) {\n const curr = contentOffsetY.value;\n\n if (curr !== prevContentOffsetY.value) {\n // eslint-disable-next-line react-compiler/react-compiler\n prevContentOffsetY.value = curr;\n result.contentOffset = { x: 0, y: curr };\n }\n }\n\n return result;\n }, [\n contentInset?.bottom,\n contentInset?.top,\n contentInset?.right,\n contentInset?.left,\n scrollIndicatorInsets?.bottom,\n scrollIndicatorInsets?.top,\n scrollIndicatorInsets?.right,\n scrollIndicatorInsets?.left,\n inverted,\n contentOffsetY,\n ]);\n\n return (\n <ReanimatedClippingScrollView\n animatedProps={animatedProps}\n applyWorkaroundForContentInsetHitTestBug={\n applyWorkaroundForContentInsetHitTestBug\n }\n style={styles.container}\n >\n <ScrollViewComponent ref={ref} animatedProps={animatedProps} {...rest}>\n {inverted ? (\n // The only thing it can break is `StickyHeader`, but it's already broken in FlatList and other lists\n // don't support this functionality, so we can add additional view here\n // The correct fix would be to add a new prop in ScrollView that allows\n // to customize children extraction logic and skip custom view\n <View collapsable={false} nativeID=\"container\">\n {children}\n </View>\n ) : (\n children\n )}\n </ScrollViewComponent>\n </ReanimatedClippingScrollView>\n );\n },\n);\n\nexport default ScrollViewWithBottomPadding;\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["_react","_interopRequireWildcard","require","_reactNative","_reactNativeReanimated","_bindings","_styles","_interopRequireDefault","e","__esModule","default","t","WeakMap","r","n","o","i","f","__proto__","has","get","set","hasOwnProperty","call","Object","defineProperty","getOwnPropertyDescriptor","_extends","assign","bind","arguments","length","apply","OS","Platform","ReanimatedClippingScrollView","Reanimated","createAnimatedComponent","ClippingScrollView","ScrollViewWithBottomPadding","forwardRef","ScrollViewComponent","bottomPadding","scrollIndicatorPadding","contentInset","scrollIndicatorInsets","inverted","contentOffsetY","applyWorkaroundForContentInsetHitTestBug","onContentInsetChange","children","rest","ref","prevContentOffsetY","useSharedValue","insets","useDerivedValue","dynamicTop","value","dynamicBottom","dynamic","top","bottom","effective","left","right","useAnimatedReaction","current","previous","runOnJS","animatedProps","useAnimatedProps","indicatorPadding","indicatorTop","indicatorBottom","result","contentInsetBottom","contentInsetTop","curr","contentOffset","x","y","createElement","style","styles","container","_default","exports"],"sources":["index.tsx"],"sourcesContent":["import React, { forwardRef } from \"react\";\nimport { Platform } from \"react-native\";\nimport Reanimated, {\n runOnJS,\n useAnimatedProps,\n useAnimatedReaction,\n useDerivedValue,\n useSharedValue,\n} from \"react-native-reanimated\";\n\nimport { ClippingScrollView } from \"../../bindings\";\n\nimport styles from \"./styles\";\n\nimport type { ScrollViewProps } from \"react-native\";\nimport type { SharedValue } from \"react-native-reanimated\";\n\nconst OS = Platform.OS;\nconst ReanimatedClippingScrollView =\n OS === \"android\"\n ? Reanimated.createAnimatedComponent(ClippingScrollView)\n : ClippingScrollView;\n\ntype AnimatedScrollViewProps = React.ComponentProps<\n typeof Reanimated.ScrollView\n>;\n\nexport type AnimatedScrollViewComponent = React.ForwardRefExoticComponent<\n AnimatedScrollViewProps & React.RefAttributes<Reanimated.ScrollView>\n>;\n\nexport type ScrollViewContentInsets = {\n top: number;\n bottom: number;\n left: number;\n right: number;\n};\n\ntype ScrollViewWithBottomPaddingProps = {\n ScrollViewComponent: AnimatedScrollViewComponent;\n children?: React.ReactNode;\n inverted?: boolean;\n bottomPadding: SharedValue<number>;\n /** Padding for scroll indicator insets (excludes blankSpace). Falls back to bottomPadding when not provided. */\n scrollIndicatorPadding?: SharedValue<number>;\n /** Absolute Y content offset (iOS only, for KeyboardChatScrollView). */\n contentOffsetY?: SharedValue<number>;\n applyWorkaroundForContentInsetHitTestBug?: boolean;\n /**\n * Fires whenever the effective content inset changes (combines the static `contentInset`\n * prop with the dynamic keyboard-driven padding). Useful on Android where the synthetic\n * inset is not reflected in `onScroll` events.\n */\n onContentInsetChange?: (insets: ScrollViewContentInsets) => void;\n} & ScrollViewProps;\n\nconst ScrollViewWithBottomPadding = forwardRef<\n Reanimated.ScrollView,\n ScrollViewWithBottomPaddingProps\n>(\n (\n {\n ScrollViewComponent,\n bottomPadding,\n scrollIndicatorPadding,\n contentInset,\n scrollIndicatorInsets,\n inverted,\n contentOffsetY,\n applyWorkaroundForContentInsetHitTestBug,\n onContentInsetChange,\n children,\n ...rest\n },\n ref,\n ) => {\n const prevContentOffsetY = useSharedValue<number | null>(null);\n\n const insets = useDerivedValue(() => {\n const dynamicTop = inverted ? bottomPadding.value : 0;\n const dynamicBottom = !inverted ? bottomPadding.value : 0;\n\n return {\n dynamic: {\n top: dynamicTop,\n bottom: dynamicBottom,\n },\n effective: {\n top: dynamicTop + (contentInset?.top || 0),\n bottom: dynamicBottom + (contentInset?.bottom || 0),\n left: contentInset?.left || 0,\n right: contentInset?.right || 0,\n } as ScrollViewContentInsets,\n };\n }, [\n inverted,\n contentInset?.top,\n contentInset?.bottom,\n contentInset?.left,\n contentInset?.right,\n ]);\n\n useAnimatedReaction(\n () => insets.value.effective,\n (current, previous) => {\n if (!onContentInsetChange) {\n return;\n }\n if (\n previous &&\n current.top === previous.top &&\n current.bottom === previous.bottom &&\n current.left === previous.left &&\n current.right === previous.right\n ) {\n return;\n }\n runOnJS(onContentInsetChange)(current);\n },\n [onContentInsetChange],\n );\n\n const animatedProps = useAnimatedProps(() => {\n const { dynamic, effective } = insets.value;\n\n const indicatorPadding = scrollIndicatorPadding ?? bottomPadding;\n const indicatorTop =\n (inverted ? indicatorPadding.value : 0) +\n (scrollIndicatorInsets?.top || 0);\n const indicatorBottom =\n (!inverted ? indicatorPadding.value : 0) +\n (scrollIndicatorInsets?.bottom || 0);\n\n const result: Record<string, unknown> = {\n // iOS prop\n contentInset: effective,\n scrollIndicatorInsets: {\n bottom: indicatorBottom,\n top: indicatorTop,\n right: scrollIndicatorInsets?.right,\n left: scrollIndicatorInsets?.left,\n },\n // Android prop\n contentInsetBottom: dynamic.bottom,\n contentInsetTop: dynamic.top,\n };\n\n if (contentOffsetY) {\n const curr = contentOffsetY.value;\n\n if (curr !== prevContentOffsetY.value) {\n // eslint-disable-next-line react-compiler/react-compiler\n prevContentOffsetY.value = curr;\n result.contentOffset = { x: 0, y: curr };\n }\n }\n\n return result;\n }, [\n scrollIndicatorInsets?.bottom,\n scrollIndicatorInsets?.top,\n scrollIndicatorInsets?.right,\n scrollIndicatorInsets?.left,\n inverted,\n contentOffsetY,\n ]);\n\n return (\n <ReanimatedClippingScrollView\n animatedProps={animatedProps}\n applyWorkaroundForContentInsetHitTestBug={\n applyWorkaroundForContentInsetHitTestBug\n }\n style={styles.container}\n >\n <ScrollViewComponent ref={ref} animatedProps={animatedProps} {...rest}>\n {children}\n </ScrollViewComponent>\n </ReanimatedClippingScrollView>\n );\n },\n);\n\nexport default ScrollViewWithBottomPadding;\n"],"mappings":"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","ignoreList":[]}
@@ -7,7 +7,7 @@ exports.useKeyboardState = useKeyboardState;
7
7
  var _react = require("react");
8
8
  var _bindings = require("../../bindings");
9
9
  var _module = require("../../module");
10
- const EVENTS = ["keyboardDidShow", "keyboardDidHide"];
10
+ const EVENTS = ["keyboardWillShow", "keyboardDidHide"];
11
11
  const getLatestState = () => ({
12
12
  ..._module.KeyboardController.state(),
13
13
  isVisible: _module.KeyboardController.isVisible()
@@ -45,11 +45,6 @@ function useKeyboardState(selector = defaultSelector) {
45
45
  // state will be updated by global listener first,
46
46
  // so we simply read it and don't derive data from the event
47
47
  setState(selector(getLatestState()))));
48
- // update `appearance` prematurely
49
- const willShowSubscription = _bindings.KeyboardEvents.addListener("keyboardWillShow", e => setState(selector({
50
- ...getLatestState(),
51
- appearance: e.appearance
52
- })));
53
48
 
54
49
  // we might have missed an update between reading a value in render and
55
50
  // `addListener` in this handler, so we set it here. If there was
@@ -57,7 +52,6 @@ function useKeyboardState(selector = defaultSelector) {
57
52
  setState(selector(getLatestState()));
58
53
  return () => {
59
54
  subscriptions.forEach(subscription => subscription.remove());
60
- willShowSubscription.remove();
61
55
  };
62
56
  }, []);
63
57
  return state;
@@ -1 +1 @@
1
- {"version":3,"names":["_react","require","_bindings","_module","EVENTS","getLatestState","KeyboardController","state","isVisible","defaultSelector","useKeyboardState","selector","setState","useState","useEffect","subscriptions","map","event","KeyboardEvents","addListener","willShowSubscription","e","appearance","forEach","subscription","remove"],"sources":["index.ts"],"sourcesContent":["import { useEffect, useState } from \"react\";\n\nimport { KeyboardEvents } from \"../../bindings\";\nimport { KeyboardController } from \"../../module\";\n\nimport type { IKeyboardState } from \"../../types\";\n\nconst EVENTS = [\"keyboardDidShow\", \"keyboardDidHide\"] as const;\n\nconst getLatestState = () => ({\n ...KeyboardController.state(),\n isVisible: KeyboardController.isVisible(),\n});\n\ntype KeyboardStateSelector<T> = (state: IKeyboardState) => T;\n\nconst defaultSelector: KeyboardStateSelector<IKeyboardState> = (state) => state;\n\n/**\n * React Hook that represents the current keyboard state on iOS and Android.\n * It tracks keyboard visibility, height, appearance, type and other properties.\n * This hook subscribes to keyboard events and updates the state reactively.\n *\n * @template T - A type of the returned object from the `selector`.\n * @param selector - A function that receives the current keyboard state and picks only necessary properties to avoid frequent re-renders.\n * @returns Object {@link KeyboardState|containing} keyboard state information.\n * @see {@link https://kirillzyusko.github.io/react-native-keyboard-controller/docs/api/hooks/keyboard/use-keyboard-state|Documentation} page for more details.\n * @example\n * ```tsx\n * function MyComponent() {\n * const isVisible = useKeyboardState((state) => state.isVisible);\n * const height = useKeyboardState((state) => state.height);\n *\n * return (\n * <View>\n * <Text>Keyboard is {isVisible ? 'visible' : 'hidden'}</Text>\n * <Text>Keyboard height: {height}</Text>\n * </View>\n * );\n * }\n * ```\n */\nfunction useKeyboardState<T = IKeyboardState>(\n selector: KeyboardStateSelector<T> = defaultSelector as KeyboardStateSelector<T>,\n): T {\n const [state, setState] = useState<T>(() => selector(getLatestState()));\n\n useEffect(() => {\n const subscriptions = EVENTS.map((event) =>\n KeyboardEvents.addListener(event, () =>\n // state will be updated by global listener first,\n // so we simply read it and don't derive data from the event\n setState(selector(getLatestState())),\n ),\n );\n // update `appearance` prematurely\n const willShowSubscription = KeyboardEvents.addListener(\n \"keyboardWillShow\",\n (e) =>\n setState(selector({ ...getLatestState(), appearance: e.appearance })),\n );\n\n // we might have missed an update between reading a value in render and\n // `addListener` in this handler, so we set it here. If there was\n // no change, React will filter out this update as a no-op.\n setState(selector(getLatestState()));\n\n return () => {\n subscriptions.forEach((subscription) => subscription.remove());\n willShowSubscription.remove();\n };\n }, []);\n\n return state;\n}\n\nexport { useKeyboardState };\n"],"mappings":";;;;;;AAAA,IAAAA,MAAA,GAAAC,OAAA;AAEA,IAAAC,SAAA,GAAAD,OAAA;AACA,IAAAE,OAAA,GAAAF,OAAA;AAIA,MAAMG,MAAM,GAAG,CAAC,iBAAiB,EAAE,iBAAiB,CAAU;AAE9D,MAAMC,cAAc,GAAGA,CAAA,MAAO;EAC5B,GAAGC,0BAAkB,CAACC,KAAK,CAAC,CAAC;EAC7BC,SAAS,EAAEF,0BAAkB,CAACE,SAAS,CAAC;AAC1C,CAAC,CAAC;AAIF,MAAMC,eAAsD,GAAIF,KAAK,IAAKA,KAAK;;AAE/E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAASG,gBAAgBA,CACvBC,QAAkC,GAAGF,eAA2C,EAC7E;EACH,MAAM,CAACF,KAAK,EAAEK,QAAQ,CAAC,GAAG,IAAAC,eAAQ,EAAI,MAAMF,QAAQ,CAACN,cAAc,CAAC,CAAC,CAAC,CAAC;EAEvE,IAAAS,gBAAS,EAAC,MAAM;IACd,MAAMC,aAAa,GAAGX,MAAM,CAACY,GAAG,CAAEC,KAAK,IACrCC,wBAAc,CAACC,WAAW,CAACF,KAAK,EAAE;IAChC;IACA;IACAL,QAAQ,CAACD,QAAQ,CAACN,cAAc,CAAC,CAAC,CAAC,CACrC,CACF,CAAC;IACD;IACA,MAAMe,oBAAoB,GAAGF,wBAAc,CAACC,WAAW,CACrD,kBAAkB,EACjBE,CAAC,IACAT,QAAQ,CAACD,QAAQ,CAAC;MAAE,GAAGN,cAAc,CAAC,CAAC;MAAEiB,UAAU,EAAED,CAAC,CAACC;IAAW,CAAC,CAAC,CACxE,CAAC;;IAED;IACA;IACA;IACAV,QAAQ,CAACD,QAAQ,CAACN,cAAc,CAAC,CAAC,CAAC,CAAC;IAEpC,OAAO,MAAM;MACXU,aAAa,CAACQ,OAAO,CAAEC,YAAY,IAAKA,YAAY,CAACC,MAAM,CAAC,CAAC,CAAC;MAC9DL,oBAAoB,CAACK,MAAM,CAAC,CAAC;IAC/B,CAAC;EACH,CAAC,EAAE,EAAE,CAAC;EAEN,OAAOlB,KAAK;AACd","ignoreList":[]}
1
+ {"version":3,"names":["_react","require","_bindings","_module","EVENTS","getLatestState","KeyboardController","state","isVisible","defaultSelector","useKeyboardState","selector","setState","useState","useEffect","subscriptions","map","event","KeyboardEvents","addListener","forEach","subscription","remove"],"sources":["index.ts"],"sourcesContent":["import { useEffect, useState } from \"react\";\n\nimport { KeyboardEvents } from \"../../bindings\";\nimport { KeyboardController } from \"../../module\";\n\nimport type { IKeyboardState } from \"../../types\";\n\nconst EVENTS = [\"keyboardWillShow\", \"keyboardDidHide\"] as const;\n\nconst getLatestState = () => ({\n ...KeyboardController.state(),\n isVisible: KeyboardController.isVisible(),\n});\n\ntype KeyboardStateSelector<T> = (state: IKeyboardState) => T;\n\nconst defaultSelector: KeyboardStateSelector<IKeyboardState> = (state) => state;\n\n/**\n * React Hook that represents the current keyboard state on iOS and Android.\n * It tracks keyboard visibility, height, appearance, type and other properties.\n * This hook subscribes to keyboard events and updates the state reactively.\n *\n * @template T - A type of the returned object from the `selector`.\n * @param selector - A function that receives the current keyboard state and picks only necessary properties to avoid frequent re-renders.\n * @returns Object {@link KeyboardState|containing} keyboard state information.\n * @see {@link https://kirillzyusko.github.io/react-native-keyboard-controller/docs/api/hooks/keyboard/use-keyboard-state|Documentation} page for more details.\n * @example\n * ```tsx\n * function MyComponent() {\n * const isVisible = useKeyboardState((state) => state.isVisible);\n * const height = useKeyboardState((state) => state.height);\n *\n * return (\n * <View>\n * <Text>Keyboard is {isVisible ? 'visible' : 'hidden'}</Text>\n * <Text>Keyboard height: {height}</Text>\n * </View>\n * );\n * }\n * ```\n */\nfunction useKeyboardState<T = IKeyboardState>(\n selector: KeyboardStateSelector<T> = defaultSelector as KeyboardStateSelector<T>,\n): T {\n const [state, setState] = useState<T>(() => selector(getLatestState()));\n\n useEffect(() => {\n const subscriptions = EVENTS.map((event) =>\n KeyboardEvents.addListener(event, () =>\n // state will be updated by global listener first,\n // so we simply read it and don't derive data from the event\n setState(selector(getLatestState())),\n ),\n );\n\n // we might have missed an update between reading a value in render and\n // `addListener` in this handler, so we set it here. If there was\n // no change, React will filter out this update as a no-op.\n setState(selector(getLatestState()));\n\n return () => {\n subscriptions.forEach((subscription) => subscription.remove());\n };\n }, []);\n\n return state;\n}\n\nexport { useKeyboardState };\n"],"mappings":";;;;;;AAAA,IAAAA,MAAA,GAAAC,OAAA;AAEA,IAAAC,SAAA,GAAAD,OAAA;AACA,IAAAE,OAAA,GAAAF,OAAA;AAIA,MAAMG,MAAM,GAAG,CAAC,kBAAkB,EAAE,iBAAiB,CAAU;AAE/D,MAAMC,cAAc,GAAGA,CAAA,MAAO;EAC5B,GAAGC,0BAAkB,CAACC,KAAK,CAAC,CAAC;EAC7BC,SAAS,EAAEF,0BAAkB,CAACE,SAAS,CAAC;AAC1C,CAAC,CAAC;AAIF,MAAMC,eAAsD,GAAIF,KAAK,IAAKA,KAAK;;AAE/E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAASG,gBAAgBA,CACvBC,QAAkC,GAAGF,eAA2C,EAC7E;EACH,MAAM,CAACF,KAAK,EAAEK,QAAQ,CAAC,GAAG,IAAAC,eAAQ,EAAI,MAAMF,QAAQ,CAACN,cAAc,CAAC,CAAC,CAAC,CAAC;EAEvE,IAAAS,gBAAS,EAAC,MAAM;IACd,MAAMC,aAAa,GAAGX,MAAM,CAACY,GAAG,CAAEC,KAAK,IACrCC,wBAAc,CAACC,WAAW,CAACF,KAAK,EAAE;IAChC;IACA;IACAL,QAAQ,CAACD,QAAQ,CAACN,cAAc,CAAC,CAAC,CAAC,CACrC,CACF,CAAC;;IAED;IACA;IACA;IACAO,QAAQ,CAACD,QAAQ,CAACN,cAAc,CAAC,CAAC,CAAC,CAAC;IAEpC,OAAO,MAAM;MACXU,aAAa,CAACK,OAAO,CAAEC,YAAY,IAAKA,YAAY,CAACC,MAAM,CAAC,CAAC,CAAC;IAChE,CAAC;EACH,CAAC,EAAE,EAAE,CAAC;EAEN,OAAOf,KAAK;AACd","ignoreList":[]}
@@ -18,7 +18,7 @@ _bindings.KeyboardEvents.addListener("keyboardDidHide", e => {
18
18
  isClosed = true;
19
19
  lastState = e;
20
20
  });
21
- _bindings.KeyboardEvents.addListener("keyboardDidShow", e => {
21
+ _bindings.KeyboardEvents.addListener("keyboardWillShow", e => {
22
22
  isClosed = false;
23
23
  lastState = e;
24
24
  });
@@ -1 +1 @@
1
- {"version":3,"names":["_bindings","require","isClosed","lastState","height","duration","timestamp","Date","getTime","target","type","appearance","KeyboardEvents","addListener","e","dismiss","options","keepFocus","animated","Promise","resolve","subscription","undefined","remove","KeyboardControllerNative","isVisible","state","KeyboardController","exports","setDefaultMode","setInputMode","setFocusTo","preload"],"sources":["module.ts"],"sourcesContent":["import { KeyboardControllerNative, KeyboardEvents } from \"./bindings\";\n\nimport type {\n DismissOptions,\n KeyboardControllerModule,\n KeyboardEventData,\n} from \"./types\";\n\nlet isClosed = true;\nlet lastState: KeyboardEventData = {\n height: 0,\n duration: 0,\n timestamp: new Date().getTime(),\n target: -1,\n type: \"default\",\n appearance: \"light\",\n};\n\nKeyboardEvents.addListener(\"keyboardDidHide\", (e) => {\n isClosed = true;\n lastState = e;\n});\n\nKeyboardEvents.addListener(\"keyboardDidShow\", (e) => {\n isClosed = false;\n lastState = e;\n});\n\nconst dismiss = async (options?: Partial<DismissOptions>): Promise<void> => {\n const keepFocus = options?.keepFocus ?? false;\n const animated = options?.animated ?? true;\n\n return new Promise((resolve) => {\n if (isClosed) {\n resolve();\n\n return;\n }\n\n const subscription = KeyboardEvents.addListener(\"keyboardDidHide\", () => {\n resolve(undefined);\n subscription.remove();\n });\n\n KeyboardControllerNative.dismiss(keepFocus, animated);\n });\n};\nconst isVisible = () => !isClosed;\nconst state = () => lastState;\n\n/**\n * KeyboardController module. Helps to perform imperative actions/checks with keyboard.\n */\nexport const KeyboardController: KeyboardControllerModule = {\n setDefaultMode: KeyboardControllerNative.setDefaultMode,\n setInputMode: KeyboardControllerNative.setInputMode,\n setFocusTo: KeyboardControllerNative.setFocusTo,\n preload: KeyboardControllerNative.preload,\n dismiss,\n isVisible,\n state,\n};\n"],"mappings":";;;;;;AAAA,IAAAA,SAAA,GAAAC,OAAA;AAQA,IAAIC,QAAQ,GAAG,IAAI;AACnB,IAAIC,SAA4B,GAAG;EACjCC,MAAM,EAAE,CAAC;EACTC,QAAQ,EAAE,CAAC;EACXC,SAAS,EAAE,IAAIC,IAAI,CAAC,CAAC,CAACC,OAAO,CAAC,CAAC;EAC/BC,MAAM,EAAE,CAAC,CAAC;EACVC,IAAI,EAAE,SAAS;EACfC,UAAU,EAAE;AACd,CAAC;AAEDC,wBAAc,CAACC,WAAW,CAAC,iBAAiB,EAAGC,CAAC,IAAK;EACnDZ,QAAQ,GAAG,IAAI;EACfC,SAAS,GAAGW,CAAC;AACf,CAAC,CAAC;AAEFF,wBAAc,CAACC,WAAW,CAAC,iBAAiB,EAAGC,CAAC,IAAK;EACnDZ,QAAQ,GAAG,KAAK;EAChBC,SAAS,GAAGW,CAAC;AACf,CAAC,CAAC;AAEF,MAAMC,OAAO,GAAG,MAAOC,OAAiC,IAAoB;EAC1E,MAAMC,SAAS,GAAG,CAAAD,OAAO,aAAPA,OAAO,uBAAPA,OAAO,CAAEC,SAAS,KAAI,KAAK;EAC7C,MAAMC,QAAQ,GAAG,CAAAF,OAAO,aAAPA,OAAO,uBAAPA,OAAO,CAAEE,QAAQ,KAAI,IAAI;EAE1C,OAAO,IAAIC,OAAO,CAAEC,OAAO,IAAK;IAC9B,IAAIlB,QAAQ,EAAE;MACZkB,OAAO,CAAC,CAAC;MAET;IACF;IAEA,MAAMC,YAAY,GAAGT,wBAAc,CAACC,WAAW,CAAC,iBAAiB,EAAE,MAAM;MACvEO,OAAO,CAACE,SAAS,CAAC;MAClBD,YAAY,CAACE,MAAM,CAAC,CAAC;IACvB,CAAC,CAAC;IAEFC,kCAAwB,CAACT,OAAO,CAACE,SAAS,EAAEC,QAAQ,CAAC;EACvD,CAAC,CAAC;AACJ,CAAC;AACD,MAAMO,SAAS,GAAGA,CAAA,KAAM,CAACvB,QAAQ;AACjC,MAAMwB,KAAK,GAAGA,CAAA,KAAMvB,SAAS;;AAE7B;AACA;AACA;AACO,MAAMwB,kBAA4C,GAAAC,OAAA,CAAAD,kBAAA,GAAG;EAC1DE,cAAc,EAAEL,kCAAwB,CAACK,cAAc;EACvDC,YAAY,EAAEN,kCAAwB,CAACM,YAAY;EACnDC,UAAU,EAAEP,kCAAwB,CAACO,UAAU;EAC/CC,OAAO,EAAER,kCAAwB,CAACQ,OAAO;EACzCjB,OAAO;EACPU,SAAS;EACTC;AACF,CAAC","ignoreList":[]}
1
+ {"version":3,"names":["_bindings","require","isClosed","lastState","height","duration","timestamp","Date","getTime","target","type","appearance","KeyboardEvents","addListener","e","dismiss","options","keepFocus","animated","Promise","resolve","subscription","undefined","remove","KeyboardControllerNative","isVisible","state","KeyboardController","exports","setDefaultMode","setInputMode","setFocusTo","preload"],"sources":["module.ts"],"sourcesContent":["import { KeyboardControllerNative, KeyboardEvents } from \"./bindings\";\n\nimport type {\n DismissOptions,\n KeyboardControllerModule,\n KeyboardEventData,\n} from \"./types\";\n\nlet isClosed = true;\nlet lastState: KeyboardEventData = {\n height: 0,\n duration: 0,\n timestamp: new Date().getTime(),\n target: -1,\n type: \"default\",\n appearance: \"light\",\n};\n\nKeyboardEvents.addListener(\"keyboardDidHide\", (e) => {\n isClosed = true;\n lastState = e;\n});\n\nKeyboardEvents.addListener(\"keyboardWillShow\", (e) => {\n isClosed = false;\n lastState = e;\n});\n\nconst dismiss = async (options?: Partial<DismissOptions>): Promise<void> => {\n const keepFocus = options?.keepFocus ?? false;\n const animated = options?.animated ?? true;\n\n return new Promise((resolve) => {\n if (isClosed) {\n resolve();\n\n return;\n }\n\n const subscription = KeyboardEvents.addListener(\"keyboardDidHide\", () => {\n resolve(undefined);\n subscription.remove();\n });\n\n KeyboardControllerNative.dismiss(keepFocus, animated);\n });\n};\nconst isVisible = () => !isClosed;\nconst state = () => lastState;\n\n/**\n * KeyboardController module. Helps to perform imperative actions/checks with keyboard.\n */\nexport const KeyboardController: KeyboardControllerModule = {\n setDefaultMode: KeyboardControllerNative.setDefaultMode,\n setInputMode: KeyboardControllerNative.setInputMode,\n setFocusTo: KeyboardControllerNative.setFocusTo,\n preload: KeyboardControllerNative.preload,\n dismiss,\n isVisible,\n state,\n};\n"],"mappings":";;;;;;AAAA,IAAAA,SAAA,GAAAC,OAAA;AAQA,IAAIC,QAAQ,GAAG,IAAI;AACnB,IAAIC,SAA4B,GAAG;EACjCC,MAAM,EAAE,CAAC;EACTC,QAAQ,EAAE,CAAC;EACXC,SAAS,EAAE,IAAIC,IAAI,CAAC,CAAC,CAACC,OAAO,CAAC,CAAC;EAC/BC,MAAM,EAAE,CAAC,CAAC;EACVC,IAAI,EAAE,SAAS;EACfC,UAAU,EAAE;AACd,CAAC;AAEDC,wBAAc,CAACC,WAAW,CAAC,iBAAiB,EAAGC,CAAC,IAAK;EACnDZ,QAAQ,GAAG,IAAI;EACfC,SAAS,GAAGW,CAAC;AACf,CAAC,CAAC;AAEFF,wBAAc,CAACC,WAAW,CAAC,kBAAkB,EAAGC,CAAC,IAAK;EACpDZ,QAAQ,GAAG,KAAK;EAChBC,SAAS,GAAGW,CAAC;AACf,CAAC,CAAC;AAEF,MAAMC,OAAO,GAAG,MAAOC,OAAiC,IAAoB;EAC1E,MAAMC,SAAS,GAAG,CAAAD,OAAO,aAAPA,OAAO,uBAAPA,OAAO,CAAEC,SAAS,KAAI,KAAK;EAC7C,MAAMC,QAAQ,GAAG,CAAAF,OAAO,aAAPA,OAAO,uBAAPA,OAAO,CAAEE,QAAQ,KAAI,IAAI;EAE1C,OAAO,IAAIC,OAAO,CAAEC,OAAO,IAAK;IAC9B,IAAIlB,QAAQ,EAAE;MACZkB,OAAO,CAAC,CAAC;MAET;IACF;IAEA,MAAMC,YAAY,GAAGT,wBAAc,CAACC,WAAW,CAAC,iBAAiB,EAAE,MAAM;MACvEO,OAAO,CAACE,SAAS,CAAC;MAClBD,YAAY,CAACE,MAAM,CAAC,CAAC;IACvB,CAAC,CAAC;IAEFC,kCAAwB,CAACT,OAAO,CAACE,SAAS,EAAEC,QAAQ,CAAC;EACvD,CAAC,CAAC;AACJ,CAAC;AACD,MAAMO,SAAS,GAAGA,CAAA,KAAM,CAACvB,QAAQ;AACjC,MAAMwB,KAAK,GAAGA,CAAA,KAAMvB,SAAS;;AAE7B;AACA;AACA;AACO,MAAMwB,kBAA4C,GAAAC,OAAA,CAAAD,kBAAA,GAAG;EAC1DE,cAAc,EAAEL,kCAAwB,CAACK,cAAc;EACvDC,YAAY,EAAEN,kCAAwB,CAACM,YAAY;EACnDC,UAAU,EAAEP,kCAAwB,CAACO,UAAU;EAC/CC,OAAO,EAAER,kCAAwB,CAACQ,OAAO;EACzCjB,OAAO;EACPU,SAAS;EACTC;AACF,CAAC","ignoreList":[]}
@@ -6,6 +6,7 @@ import Reanimated from "react-native-reanimated";
6
6
  import useCombinedRef from "../hooks/useCombinedRef";
7
7
  import ScrollViewWithBottomPadding from "../ScrollViewWithBottomPadding";
8
8
  import { useChatKeyboard } from "./useChatKeyboard";
9
+ import { useEndVisible } from "./useEndVisible";
9
10
  import { useExtraContentPadding } from "./useExtraContentPadding";
10
11
  const ZERO_CONTENT_PADDING = makeMutable(0);
11
12
  const ZERO_BLANK_SPACE = makeMutable(0);
@@ -21,10 +22,12 @@ const KeyboardChatScrollView = /*#__PURE__*/forwardRef(({
21
22
  applyWorkaroundForContentInsetHitTestBug = false,
22
23
  onLayout: onLayoutProp,
23
24
  onContentSizeChange: onContentSizeChangeProp,
25
+ onEndVisible,
24
26
  ...rest
25
27
  }, ref) => {
26
28
  const scrollViewRef = useAnimatedRef();
27
29
  const onRef = useCombinedRef(ref, scrollViewRef);
30
+ const freezeSV = useDerivedValue(() => typeof freeze === "boolean" ? freeze : freeze.value);
28
31
  const {
29
32
  padding,
30
33
  currentHeight,
@@ -37,7 +40,7 @@ const KeyboardChatScrollView = /*#__PURE__*/forwardRef(({
37
40
  } = useChatKeyboard(scrollViewRef, {
38
41
  inverted,
39
42
  keyboardLiftBehavior,
40
- freeze,
43
+ freeze: freezeSV,
41
44
  offset,
42
45
  blankSpace,
43
46
  extraContentPadding
@@ -53,7 +56,14 @@ const KeyboardChatScrollView = /*#__PURE__*/forwardRef(({
53
56
  contentOffsetY,
54
57
  inverted,
55
58
  keyboardLiftBehavior,
56
- freeze
59
+ freeze: freezeSV
60
+ });
61
+ useEndVisible({
62
+ scroll,
63
+ layout,
64
+ size,
65
+ inverted,
66
+ onEndVisible
57
67
  });
58
68
  const totalPadding = useDerivedValue(() => Math.max(blankSpace.value, padding.value + extraContentPadding.value));
59
69
 
@@ -1 +1 @@
1
- {"version":3,"names":["React","forwardRef","useCallback","useMemo","StyleSheet","makeMutable","useAnimatedRef","useAnimatedStyle","useDerivedValue","Reanimated","useCombinedRef","ScrollViewWithBottomPadding","useChatKeyboard","useExtraContentPadding","ZERO_CONTENT_PADDING","ZERO_BLANK_SPACE","KeyboardChatScrollView","children","ScrollViewComponent","ScrollView","inverted","keyboardLiftBehavior","freeze","offset","extraContentPadding","blankSpace","applyWorkaroundForContentInsetHitTestBug","onLayout","onLayoutProp","onContentSizeChange","onContentSizeChangeProp","rest","ref","scrollViewRef","onRef","padding","currentHeight","contentOffsetY","scroll","layout","size","onLayoutInternal","onContentSizeChangeInternal","keyboardPadding","totalPadding","Math","max","value","indicatorPadding","e","w","h","commitStyle","transform","translateY","commit","styles","commitView","createElement","Fragment","_extends","bottomPadding","scrollIndicatorPadding","View","style","create","display","position"],"sources":["index.tsx"],"sourcesContent":["import React, { forwardRef, useCallback, useMemo } from \"react\";\nimport { StyleSheet } from \"react-native\";\nimport {\n makeMutable,\n useAnimatedRef,\n useAnimatedStyle,\n useDerivedValue,\n} from \"react-native-reanimated\";\nimport Reanimated from \"react-native-reanimated\";\n\nimport useCombinedRef from \"../hooks/useCombinedRef\";\nimport ScrollViewWithBottomPadding from \"../ScrollViewWithBottomPadding\";\n\nimport { useChatKeyboard } from \"./useChatKeyboard\";\nimport { useExtraContentPadding } from \"./useExtraContentPadding\";\n\nimport type { KeyboardChatScrollViewProps } from \"./types\";\nimport type { LayoutChangeEvent } from \"react-native\";\n\nconst ZERO_CONTENT_PADDING = makeMutable(0);\nconst ZERO_BLANK_SPACE = makeMutable(0);\n\nconst KeyboardChatScrollView = forwardRef<\n Reanimated.ScrollView,\n React.PropsWithChildren<KeyboardChatScrollViewProps>\n>(\n (\n {\n children,\n ScrollViewComponent = Reanimated.ScrollView,\n inverted = false,\n keyboardLiftBehavior = \"always\",\n freeze = false,\n offset = 0,\n extraContentPadding = ZERO_CONTENT_PADDING,\n blankSpace = ZERO_BLANK_SPACE,\n applyWorkaroundForContentInsetHitTestBug = false,\n onLayout: onLayoutProp,\n onContentSizeChange: onContentSizeChangeProp,\n ...rest\n },\n ref,\n ) => {\n const scrollViewRef = useAnimatedRef<Reanimated.ScrollView>();\n const onRef = useCombinedRef(ref, scrollViewRef);\n const {\n padding,\n currentHeight,\n contentOffsetY,\n scroll,\n layout,\n size,\n onLayout: onLayoutInternal,\n onContentSizeChange: onContentSizeChangeInternal,\n } = useChatKeyboard(scrollViewRef, {\n inverted,\n keyboardLiftBehavior,\n freeze,\n offset,\n blankSpace,\n extraContentPadding,\n });\n\n useExtraContentPadding({\n scrollViewRef,\n extraContentPadding,\n keyboardPadding: padding,\n blankSpace,\n scroll,\n layout,\n size,\n contentOffsetY,\n inverted,\n keyboardLiftBehavior,\n freeze,\n });\n\n const totalPadding = useDerivedValue(() =>\n Math.max(blankSpace.value, padding.value + extraContentPadding.value),\n );\n\n // Scroll indicator inset = keyboard + extraContentPadding (excludes blankSpace).\n // Apps that render into the unsafe area can supply a negative\n // scrollIndicatorInsets adjustment at the application layer.\n const indicatorPadding = useDerivedValue(\n () => padding.value + extraContentPadding.value,\n );\n\n const onLayout = useCallback(\n (e: LayoutChangeEvent) => {\n onLayoutInternal(e);\n onLayoutProp?.(e);\n },\n [onLayoutInternal, onLayoutProp],\n );\n\n const onContentSizeChange = useCallback(\n (w: number, h: number) => {\n onContentSizeChangeInternal(w, h);\n onContentSizeChangeProp?.(w, h);\n },\n [onContentSizeChangeInternal, onContentSizeChangeProp],\n );\n\n // Invisible view whose animated style changes every frame during keyboard\n // animation. On Fabric, this forces Reanimated to schedule a commit,\n // which flushes the scrollTo call in the same frame (fixing de-synchronization).\n // see https://github.com/software-mansion/react-native-reanimated/issues/9000\n const commitStyle = useAnimatedStyle(\n () => ({\n transform: [{ translateY: -currentHeight.value }],\n }),\n [],\n );\n const commit = useMemo(\n () => [styles.commitView, commitStyle],\n [commitStyle],\n );\n\n return (\n <>\n <ScrollViewWithBottomPadding\n ref={onRef}\n {...rest}\n applyWorkaroundForContentInsetHitTestBug={\n applyWorkaroundForContentInsetHitTestBug\n }\n bottomPadding={totalPadding}\n contentOffsetY={contentOffsetY}\n inverted={inverted}\n scrollIndicatorPadding={indicatorPadding}\n ScrollViewComponent={ScrollViewComponent}\n onContentSizeChange={onContentSizeChange}\n onLayout={onLayout}\n >\n {children}\n </ScrollViewWithBottomPadding>\n <Reanimated.View style={commit} />\n </>\n );\n },\n);\n\nconst styles = StyleSheet.create({\n commitView: {\n display: \"none\",\n position: \"absolute\",\n },\n});\n\nexport default KeyboardChatScrollView;\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["React","forwardRef","useCallback","useMemo","StyleSheet","makeMutable","useAnimatedRef","useAnimatedStyle","useDerivedValue","Reanimated","useCombinedRef","ScrollViewWithBottomPadding","useChatKeyboard","useEndVisible","useExtraContentPadding","ZERO_CONTENT_PADDING","ZERO_BLANK_SPACE","KeyboardChatScrollView","children","ScrollViewComponent","ScrollView","inverted","keyboardLiftBehavior","freeze","offset","extraContentPadding","blankSpace","applyWorkaroundForContentInsetHitTestBug","onLayout","onLayoutProp","onContentSizeChange","onContentSizeChangeProp","onEndVisible","rest","ref","scrollViewRef","onRef","freezeSV","value","padding","currentHeight","contentOffsetY","scroll","layout","size","onLayoutInternal","onContentSizeChangeInternal","keyboardPadding","totalPadding","Math","max","indicatorPadding","e","w","h","commitStyle","transform","translateY","commit","styles","commitView","createElement","Fragment","_extends","bottomPadding","scrollIndicatorPadding","View","style","create","display","position"],"sources":["index.tsx"],"sourcesContent":["import React, { forwardRef, useCallback, useMemo } from \"react\";\nimport { StyleSheet } from \"react-native\";\nimport {\n makeMutable,\n useAnimatedRef,\n useAnimatedStyle,\n useDerivedValue,\n} from \"react-native-reanimated\";\nimport Reanimated from \"react-native-reanimated\";\n\nimport useCombinedRef from \"../hooks/useCombinedRef\";\nimport ScrollViewWithBottomPadding from \"../ScrollViewWithBottomPadding\";\n\nimport { useChatKeyboard } from \"./useChatKeyboard\";\nimport { useEndVisible } from \"./useEndVisible\";\nimport { useExtraContentPadding } from \"./useExtraContentPadding\";\n\nimport type { KeyboardChatScrollViewProps } from \"./types\";\nimport type { LayoutChangeEvent } from \"react-native\";\n\nconst ZERO_CONTENT_PADDING = makeMutable(0);\nconst ZERO_BLANK_SPACE = makeMutable(0);\n\nconst KeyboardChatScrollView = forwardRef<\n Reanimated.ScrollView,\n React.PropsWithChildren<KeyboardChatScrollViewProps>\n>(\n (\n {\n children,\n ScrollViewComponent = Reanimated.ScrollView,\n inverted = false,\n keyboardLiftBehavior = \"always\",\n freeze = false,\n offset = 0,\n extraContentPadding = ZERO_CONTENT_PADDING,\n blankSpace = ZERO_BLANK_SPACE,\n applyWorkaroundForContentInsetHitTestBug = false,\n onLayout: onLayoutProp,\n onContentSizeChange: onContentSizeChangeProp,\n onEndVisible,\n ...rest\n },\n ref,\n ) => {\n const scrollViewRef = useAnimatedRef<Reanimated.ScrollView>();\n const onRef = useCombinedRef(ref, scrollViewRef);\n const freezeSV = useDerivedValue(() =>\n typeof freeze === \"boolean\" ? freeze : freeze.value,\n );\n const {\n padding,\n currentHeight,\n contentOffsetY,\n scroll,\n layout,\n size,\n onLayout: onLayoutInternal,\n onContentSizeChange: onContentSizeChangeInternal,\n } = useChatKeyboard(scrollViewRef, {\n inverted,\n keyboardLiftBehavior,\n freeze: freezeSV,\n offset,\n blankSpace,\n extraContentPadding,\n });\n\n useExtraContentPadding({\n scrollViewRef,\n extraContentPadding,\n keyboardPadding: padding,\n blankSpace,\n scroll,\n layout,\n size,\n contentOffsetY,\n inverted,\n keyboardLiftBehavior,\n freeze: freezeSV,\n });\n\n useEndVisible({\n scroll,\n layout,\n size,\n inverted,\n onEndVisible,\n });\n\n const totalPadding = useDerivedValue(() =>\n Math.max(blankSpace.value, padding.value + extraContentPadding.value),\n );\n\n // Scroll indicator inset = keyboard + extraContentPadding (excludes blankSpace).\n // Apps that render into the unsafe area can supply a negative\n // scrollIndicatorInsets adjustment at the application layer.\n const indicatorPadding = useDerivedValue(\n () => padding.value + extraContentPadding.value,\n );\n\n const onLayout = useCallback(\n (e: LayoutChangeEvent) => {\n onLayoutInternal(e);\n onLayoutProp?.(e);\n },\n [onLayoutInternal, onLayoutProp],\n );\n\n const onContentSizeChange = useCallback(\n (w: number, h: number) => {\n onContentSizeChangeInternal(w, h);\n onContentSizeChangeProp?.(w, h);\n },\n [onContentSizeChangeInternal, onContentSizeChangeProp],\n );\n\n // Invisible view whose animated style changes every frame during keyboard\n // animation. On Fabric, this forces Reanimated to schedule a commit,\n // which flushes the scrollTo call in the same frame (fixing de-synchronization).\n // see https://github.com/software-mansion/react-native-reanimated/issues/9000\n const commitStyle = useAnimatedStyle(\n () => ({\n transform: [{ translateY: -currentHeight.value }],\n }),\n [],\n );\n const commit = useMemo(\n () => [styles.commitView, commitStyle],\n [commitStyle],\n );\n\n return (\n <>\n <ScrollViewWithBottomPadding\n ref={onRef}\n {...rest}\n applyWorkaroundForContentInsetHitTestBug={\n applyWorkaroundForContentInsetHitTestBug\n }\n bottomPadding={totalPadding}\n contentOffsetY={contentOffsetY}\n inverted={inverted}\n scrollIndicatorPadding={indicatorPadding}\n ScrollViewComponent={ScrollViewComponent}\n onContentSizeChange={onContentSizeChange}\n onLayout={onLayout}\n >\n {children}\n </ScrollViewWithBottomPadding>\n <Reanimated.View style={commit} />\n </>\n );\n },\n);\n\nconst styles = StyleSheet.create({\n commitView: {\n display: \"none\",\n position: \"absolute\",\n },\n});\n\nexport default KeyboardChatScrollView;\n"],"mappings":";AAAA,OAAOA,KAAK,IAAIC,UAAU,EAAEC,WAAW,EAAEC,OAAO,QAAQ,OAAO;AAC/D,SAASC,UAAU,QAAQ,cAAc;AACzC,SACEC,WAAW,EACXC,cAAc,EACdC,gBAAgB,EAChBC,eAAe,QACV,yBAAyB;AAChC,OAAOC,UAAU,MAAM,yBAAyB;AAEhD,OAAOC,cAAc,MAAM,yBAAyB;AACpD,OAAOC,2BAA2B,MAAM,gCAAgC;AAExE,SAASC,eAAe,QAAQ,mBAAmB;AACnD,SAASC,aAAa,QAAQ,iBAAiB;AAC/C,SAASC,sBAAsB,QAAQ,0BAA0B;AAKjE,MAAMC,oBAAoB,GAAGV,WAAW,CAAC,CAAC,CAAC;AAC3C,MAAMW,gBAAgB,GAAGX,WAAW,CAAC,CAAC,CAAC;AAEvC,MAAMY,sBAAsB,gBAAGhB,UAAU,CAIvC,CACE;EACEiB,QAAQ;EACRC,mBAAmB,GAAGV,UAAU,CAACW,UAAU;EAC3CC,QAAQ,GAAG,KAAK;EAChBC,oBAAoB,GAAG,QAAQ;EAC/BC,MAAM,GAAG,KAAK;EACdC,MAAM,GAAG,CAAC;EACVC,mBAAmB,GAAGV,oBAAoB;EAC1CW,UAAU,GAAGV,gBAAgB;EAC7BW,wCAAwC,GAAG,KAAK;EAChDC,QAAQ,EAAEC,YAAY;EACtBC,mBAAmB,EAAEC,uBAAuB;EAC5CC,YAAY;EACZ,GAAGC;AACL,CAAC,EACDC,GAAG,KACA;EACH,MAAMC,aAAa,GAAG7B,cAAc,CAAwB,CAAC;EAC7D,MAAM8B,KAAK,GAAG1B,cAAc,CAACwB,GAAG,EAAEC,aAAa,CAAC;EAChD,MAAME,QAAQ,GAAG7B,eAAe,CAAC,MAC/B,OAAOe,MAAM,KAAK,SAAS,GAAGA,MAAM,GAAGA,MAAM,CAACe,KAChD,CAAC;EACD,MAAM;IACJC,OAAO;IACPC,aAAa;IACbC,cAAc;IACdC,MAAM;IACNC,MAAM;IACNC,IAAI;IACJhB,QAAQ,EAAEiB,gBAAgB;IAC1Bf,mBAAmB,EAAEgB;EACvB,CAAC,GAAGlC,eAAe,CAACuB,aAAa,EAAE;IACjCd,QAAQ;IACRC,oBAAoB;IACpBC,MAAM,EAAEc,QAAQ;IAChBb,MAAM;IACNE,UAAU;IACVD;EACF,CAAC,CAAC;EAEFX,sBAAsB,CAAC;IACrBqB,aAAa;IACbV,mBAAmB;IACnBsB,eAAe,EAAER,OAAO;IACxBb,UAAU;IACVgB,MAAM;IACNC,MAAM;IACNC,IAAI;IACJH,cAAc;IACdpB,QAAQ;IACRC,oBAAoB;IACpBC,MAAM,EAAEc;EACV,CAAC,CAAC;EAEFxB,aAAa,CAAC;IACZ6B,MAAM;IACNC,MAAM;IACNC,IAAI;IACJvB,QAAQ;IACRW;EACF,CAAC,CAAC;EAEF,MAAMgB,YAAY,GAAGxC,eAAe,CAAC,MACnCyC,IAAI,CAACC,GAAG,CAACxB,UAAU,CAACY,KAAK,EAAEC,OAAO,CAACD,KAAK,GAAGb,mBAAmB,CAACa,KAAK,CACtE,CAAC;;EAED;EACA;EACA;EACA,MAAMa,gBAAgB,GAAG3C,eAAe,CACtC,MAAM+B,OAAO,CAACD,KAAK,GAAGb,mBAAmB,CAACa,KAC5C,CAAC;EAED,MAAMV,QAAQ,GAAG1B,WAAW,CACzBkD,CAAoB,IAAK;IACxBP,gBAAgB,CAACO,CAAC,CAAC;IACnBvB,YAAY,aAAZA,YAAY,eAAZA,YAAY,CAAGuB,CAAC,CAAC;EACnB,CAAC,EACD,CAACP,gBAAgB,EAAEhB,YAAY,CACjC,CAAC;EAED,MAAMC,mBAAmB,GAAG5B,WAAW,CACrC,CAACmD,CAAS,EAAEC,CAAS,KAAK;IACxBR,2BAA2B,CAACO,CAAC,EAAEC,CAAC,CAAC;IACjCvB,uBAAuB,aAAvBA,uBAAuB,eAAvBA,uBAAuB,CAAGsB,CAAC,EAAEC,CAAC,CAAC;EACjC,CAAC,EACD,CAACR,2BAA2B,EAAEf,uBAAuB,CACvD,CAAC;;EAED;EACA;EACA;EACA;EACA,MAAMwB,WAAW,GAAGhD,gBAAgB,CAClC,OAAO;IACLiD,SAAS,EAAE,CAAC;MAAEC,UAAU,EAAE,CAACjB,aAAa,CAACF;IAAM,CAAC;EAClD,CAAC,CAAC,EACF,EACF,CAAC;EACD,MAAMoB,MAAM,GAAGvD,OAAO,CACpB,MAAM,CAACwD,MAAM,CAACC,UAAU,EAAEL,WAAW,CAAC,EACtC,CAACA,WAAW,CACd,CAAC;EAED,oBACEvD,KAAA,CAAA6D,aAAA,CAAA7D,KAAA,CAAA8D,QAAA,qBACE9D,KAAA,CAAA6D,aAAA,CAAClD,2BAA2B,EAAAoD,QAAA;IAC1B7B,GAAG,EAAEE;EAAM,GACPH,IAAI;IACRN,wCAAwC,EACtCA,wCACD;IACDqC,aAAa,EAAEhB,YAAa;IAC5BP,cAAc,EAAEA,cAAe;IAC/BpB,QAAQ,EAAEA,QAAS;IACnB4C,sBAAsB,EAAEd,gBAAiB;IACzChC,mBAAmB,EAAEA,mBAAoB;IACzCW,mBAAmB,EAAEA,mBAAoB;IACzCF,QAAQ,EAAEA;EAAS,IAElBV,QAC0B,CAAC,eAC9BlB,KAAA,CAAA6D,aAAA,CAACpD,UAAU,CAACyD,IAAI;IAACC,KAAK,EAAET;EAAO,CAAE,CACjC,CAAC;AAEP,CACF,CAAC;AAED,MAAMC,MAAM,GAAGvD,UAAU,CAACgE,MAAM,CAAC;EAC/BR,UAAU,EAAE;IACVS,OAAO,EAAE,MAAM;IACfC,QAAQ,EAAE;EACZ;AACF,CAAC,CAAC;AAEF,eAAerD,sBAAsB","ignoreList":[]}
@@ -1 +1 @@
1
- {"version":3,"names":[],"sources":["types.ts"],"sourcesContent":["import type { AnimatedScrollViewComponent } from \"../ScrollViewWithBottomPadding\";\nimport type { KeyboardLiftBehavior } from \"./useChatKeyboard/types\";\nimport type { ScrollViewProps } from \"react-native\";\nimport type { SharedValue } from \"react-native-reanimated\";\n\nexport type KeyboardChatScrollViewProps = {\n /** Custom component for `ScrollView`. Default is `ScrollView`. */\n ScrollViewComponent?: AnimatedScrollViewComponent;\n /** Whether list are using `inverted` prop. Default is `false`. */\n inverted?: boolean;\n /**\n * The distance between the bottom of the screen and the `ScrollView`.\n * When the keyboard appears, the `ScrollView` will only push content by the effective\n * distance (`keyboardHeight - offset`) instead of the full keyboard height.\n *\n * Useful when the input is not at the very bottom of the screen (e.g., above safe area, above\n * bottom tabs, etc. - in this case offset should be equal to the height of the elements between\n * `ScrollView` and bottom of the screen).\n *\n * Default is `0`.\n */\n offset?: number;\n /**\n * Determines how the chat content should behave when the keyboard appears, specifically whether\n * the scroll view should automatically lift its content to keep it visible above the keyboard.\n *\n * Possible values:\n * - `'always'`: The content always lifts along with the keyboard, ensuring the messages from the bottom part of screen\n * remain visible regardless of the current scroll position. This is the default behavior for most chat applications (used in Telegram).\n * - `'whenAtEnd'`: The content lifts only if the scroll view is at the end (i.e., the last message\n * is visible or near the bottom). This prevents unnecessary adjustments when the user is scrolling\n * through older messages (ChatGPT mobile app behavior).\n * - `'persistent'`: The content always lifts when the keyboard appears (similar to `'always'`), but\n * does not reset (lower) when the keyboard hides. This mimics behaviors where the view remains adjusted\n * after keyboard dismissal to maintain focus on the latest content without shifting back (Claude mobile app behavior).\n * - `'never'`: The content does not lift at all when the keyboard appears. Use this for scenarios\n * when you don't want to disturb user attention with animations (Perplexity mobile app behavior).\n *\n * Default is `'always'`.\n */\n keyboardLiftBehavior?: KeyboardLiftBehavior;\n /**\n * When `true`, freezes all keyboard-driven layout changes (padding, content offset, scroll position).\n * Useful when dismissing the keyboard to open a bottom sheet — prevents visual disruption\n * while the sheet is visible.\n *\n * Default is `false`.\n */\n freeze?: boolean;\n /**\n * A shared value representing additional padding from external elements\n * (e.g., a growing multiline `TextInput` in a `KeyboardStickyView`).\n *\n * When this value changes:\n * - The scrollable range is always extended/contracted (via `contentInset`).\n * - The scroll position is conditionally adjusted based on `keyboardLiftBehavior`.\n *\n * Default is `undefined` (no extra padding).\n */\n extraContentPadding?: SharedValue<number>;\n /**\n * When `true`, applies a runtime workaround for a React Native 0.81+ bug\n * where the ScrollView's `contentInset` area does not respond to touch/scroll\n * gestures (facebook/react-native#54123).\n *\n * This uses Objective-C runtime method swizzling on the ScrollView's container\n * view, which is inherently fragile. Only enable if you are affected by the\n * upstream bug and understand the risks.\n *\n * iOS only. Default is `false`.\n */\n applyWorkaroundForContentInsetHitTestBug?: boolean;\n /**\n * A shared value representing a minimum inset floor (in pixels).\n *\n * When set, the total bottom padding is computed as:\n * `max(blankSpace, keyboardPadding + extraContentPadding)`\n *\n * This means the keyboard \"absorbs\" into the minimum padding rather than adding to it:\n * - When `blankSpace >= keyboard + extraContentPadding`: content does NOT move on keyboard open/close.\n * - When `blankSpace < keyboard + extraContentPadding`: content moves, but only by the excess amount.\n *\n * Useful in AI chat apps where a sent message needs space below it (to push it to the top\n * of the viewport) while the AI response streams in, without that space causing extra movement\n * when the keyboard opens.\n *\n * Default is `undefined` (equivalent to `0` — no minimum floor).\n */\n blankSpace?: SharedValue<number>;\n} & ScrollViewProps;\n"],"mappings":"","ignoreList":[]}
1
+ {"version":3,"names":[],"sources":["types.ts"],"sourcesContent":["import type {\n AnimatedScrollViewComponent,\n ScrollViewContentInsets,\n} from \"../ScrollViewWithBottomPadding\";\nimport type { KeyboardLiftBehavior } from \"./useChatKeyboard/types\";\nimport type { ScrollViewProps } from \"react-native\";\nimport type { SharedValue } from \"react-native-reanimated\";\n\nexport type KeyboardChatScrollViewProps = {\n /** Custom component for `ScrollView`. Default is `ScrollView`. */\n ScrollViewComponent?: AnimatedScrollViewComponent;\n /** Whether list are using `inverted` prop. Default is `false`. */\n inverted?: boolean;\n /**\n * The distance between the bottom of the screen and the `ScrollView`.\n * When the keyboard appears, the `ScrollView` will only push content by the effective\n * distance (`keyboardHeight - offset`) instead of the full keyboard height.\n *\n * Useful when the input is not at the very bottom of the screen (e.g., above safe area, above\n * bottom tabs, etc. - in this case offset should be equal to the height of the elements between\n * `ScrollView` and bottom of the screen).\n *\n * Default is `0`.\n */\n offset?: number;\n /**\n * Determines how the chat content should behave when the keyboard appears, specifically whether\n * the scroll view should automatically lift its content to keep it visible above the keyboard.\n *\n * Possible values:\n * - `'always'`: The content always lifts along with the keyboard, ensuring the messages from the bottom part of screen\n * remain visible regardless of the current scroll position. This is the default behavior for most chat applications (used in Telegram).\n * - `'whenAtEnd'`: The content lifts only if the scroll view is at the end (i.e., the last message\n * is visible or near the bottom). This prevents unnecessary adjustments when the user is scrolling\n * through older messages (ChatGPT mobile app behavior).\n * - `'persistent'`: The content always lifts when the keyboard appears (similar to `'always'`), but\n * does not reset (lower) when the keyboard hides. This mimics behaviors where the view remains adjusted\n * after keyboard dismissal to maintain focus on the latest content without shifting back (Claude mobile app behavior).\n * - `'never'`: The content does not lift at all when the keyboard appears. Use this for scenarios\n * when you don't want to disturb user attention with animations (Perplexity mobile app behavior).\n *\n * Default is `'always'`.\n */\n keyboardLiftBehavior?: KeyboardLiftBehavior;\n /**\n * When `true`, freezes all keyboard-driven layout changes (padding, content offset, scroll position).\n * Useful when dismissing the keyboard to open a bottom sheet — prevents visual disruption\n * while the sheet is visible.\n *\n * Default is `false`.\n */\n freeze?: boolean | SharedValue<boolean>;\n /**\n * A shared value representing additional padding from external elements\n * (e.g., a growing multiline `TextInput` in a `KeyboardStickyView`).\n *\n * When this value changes:\n * - The scrollable range is always extended/contracted (via `contentInset`).\n * - The scroll position is conditionally adjusted based on `keyboardLiftBehavior`.\n *\n * Default is `undefined` (no extra padding).\n */\n extraContentPadding?: SharedValue<number>;\n /**\n * When `true`, applies a runtime workaround for a React Native 0.81+ bug\n * where the ScrollView's `contentInset` area does not respond to touch/scroll\n * gestures (facebook/react-native#54123).\n *\n * This uses Objective-C runtime method swizzling on the ScrollView's container\n * view, which is inherently fragile. Only enable if you are affected by the\n * upstream bug and understand the risks.\n *\n * iOS only. Default is `false`.\n */\n applyWorkaroundForContentInsetHitTestBug?: boolean;\n /**\n * A shared value representing a minimum inset floor (in pixels).\n *\n * When set, the total bottom padding is computed as:\n * `max(blankSpace, keyboardPadding + extraContentPadding)`\n *\n * This means the keyboard \"absorbs\" into the minimum padding rather than adding to it:\n * - When `blankSpace >= keyboard + extraContentPadding`: content does NOT move on keyboard open/close.\n * - When `blankSpace < keyboard + extraContentPadding`: content moves, but only by the excess amount.\n *\n * Useful in AI chat apps where a sent message needs space below it (to push it to the top\n * of the viewport) while the AI response streams in, without that space causing extra movement\n * when the keyboard opens.\n *\n * Default is `undefined` (equivalent to `0` — no minimum floor).\n */\n blankSpace?: SharedValue<number>;\n /**\n * Fires whenever the effective content inset changes — the static `contentInset`\n * prop combined with the dynamic keyboard-driven padding.\n *\n * Useful on Android, where the synthetic content inset is not reflected in the native\n * `onScroll` event payload. Consumers such as virtualized lists computing their own\n * `scrollToEnd` target can use this to track the current inset alongside scroll offsets.\n */\n onContentInsetChange?: (insets: ScrollViewContentInsets) => void;\n /**\n * Fires whenever the visibility of the content \"end\" changes — both when the user\n * arrives at the end and when they leave it. The boolean parameter reflects the new state.\n *\n * For non-inverted lists, the \"end\" is the bottom of the content. For inverted lists\n * (`inverted={true}`), the \"end\" is the top of the scroll view, where the latest messages\n * are rendered. The same internal detection drives `keyboardLiftBehavior=\"whenAtEnd\"`.\n *\n * The callback can be either a plain JS function or a Reanimated worklet — the type is\n * detected automatically. Worklets run on the UI thread; plain functions are dispatched\n * via `runOnJS`.\n *\n * Fires once on mount with the initial state (after the scroll view has been measured).\n */\n onEndVisible?: (visible: boolean) => void;\n} & ScrollViewProps;\n"],"mappings":"","ignoreList":[]}
@@ -43,7 +43,7 @@ function useChatKeyboard(scrollViewRef, options) {
43
43
  onStart: e => {
44
44
  "worklet";
45
45
 
46
- if (freeze) {
46
+ if (freeze.value) {
47
47
  return;
48
48
  }
49
49
  if (e.height > 0) {
@@ -121,13 +121,13 @@ function useChatKeyboard(scrollViewRef, options) {
121
121
  onEnd: e => {
122
122
  "worklet";
123
123
 
124
- if (freeze) {
124
+ if (freeze.value) {
125
125
  return;
126
126
  }
127
127
  const effective = getEffectiveHeight(e.height, targetKeyboardHeight.value, offset);
128
128
  padding.value = effective;
129
129
  }
130
- }, [inverted, keyboardLiftBehavior, freeze, offset, extraContentPadding]);
130
+ }, [inverted, keyboardLiftBehavior, offset, extraContentPadding]);
131
131
  return {
132
132
  padding,
133
133
  currentHeight,
@@ -1 +1 @@
1
- {"version":3,"names":["useSharedValue","useKeyboardHandler","useScrollState","computeIOSContentOffset","getEffectiveHeight","getScrollEffective","getVisibleMinimumPaddingFraction","isScrollAtEnd","shouldShiftContent","useChatKeyboard","scrollViewRef","options","inverted","keyboardLiftBehavior","freeze","offset","blankSpace","extraContentPadding","padding","currentHeight","contentOffsetY","targetKeyboardHeight","prevAbsorption","layout","size","scroll","onLayout","onContentSizeChange","onStart","e","height","value","effective","atEnd","visibleFraction","visiblePadding","minimumPaddingAbsorbed","Math","max","scrollEffective","actualTotalPadding","maxScroll","min","prevScrollEffective","relativeScroll","onMove","onEnd"],"sources":["index.ios.ts"],"sourcesContent":["import { useSharedValue } from \"react-native-reanimated\";\n\nimport { useKeyboardHandler } from \"../../../hooks\";\nimport useScrollState from \"../../hooks/useScrollState\";\n\nimport {\n computeIOSContentOffset,\n getEffectiveHeight,\n getScrollEffective,\n getVisibleMinimumPaddingFraction,\n isScrollAtEnd,\n shouldShiftContent,\n} from \"./helpers\";\n\nimport type { UseChatKeyboardOptions, UseChatKeyboardReturn } from \"./types\";\nimport type { AnimatedRef } from \"react-native-reanimated\";\nimport type Reanimated from \"react-native-reanimated\";\n\n/**\n * Hook that manages keyboard-driven scrolling for chat-style scroll views.\n * Calculates padding (extra scrollable space) and content shift values,\n * using iOS-specific strategy (contentOffset set once in onStart).\n *\n * @param scrollViewRef - Animated ref to the scroll view.\n * @param options - Configuration for inverted and keyboardLiftBehavior.\n * @returns Shared values for padding and contentOffsetY.\n * @example\n * ```tsx\n * const { padding, contentOffsetY } = useChatKeyboard(ref, {\n * inverted: false,\n * keyboardLiftBehavior: \"always\",\n * });\n * ```\n */\nfunction useChatKeyboard(\n scrollViewRef: AnimatedRef<Reanimated.ScrollView>,\n options: UseChatKeyboardOptions,\n): UseChatKeyboardReturn {\n const {\n inverted,\n keyboardLiftBehavior,\n freeze,\n offset,\n blankSpace,\n extraContentPadding,\n } = options;\n\n const padding = useSharedValue(0);\n const currentHeight = useSharedValue(0);\n const contentOffsetY = useSharedValue(0);\n const targetKeyboardHeight = useSharedValue(0);\n const prevAbsorption = useSharedValue(0);\n\n const {\n layout,\n size,\n offset: scroll,\n onLayout,\n onContentSizeChange,\n } = useScrollState(scrollViewRef);\n\n useKeyboardHandler(\n {\n onStart: (e) => {\n \"worklet\";\n\n if (freeze) {\n return;\n }\n\n if (e.height > 0) {\n // eslint-disable-next-line react-compiler/react-compiler\n targetKeyboardHeight.value = e.height;\n }\n\n const effective = getEffectiveHeight(\n e.height,\n targetKeyboardHeight.value,\n offset,\n );\n\n const atEnd = isScrollAtEnd(\n scroll.value,\n layout.value.height,\n size.value.height,\n inverted,\n );\n\n // Scale minimum padding absorption by how much of it is visible.\n // Fully visible → full absorption; fully off-screen → no absorption.\n const visibleFraction = getVisibleMinimumPaddingFraction(\n scroll.value,\n layout.value.height,\n size.value.height,\n blankSpace.value,\n inverted,\n );\n const visiblePadding = visibleFraction * blankSpace.value;\n const minimumPaddingAbsorbed = Math.max(\n 0,\n visiblePadding - extraContentPadding.value,\n );\n const scrollEffective = getScrollEffective(\n effective,\n minimumPaddingAbsorbed,\n );\n const actualTotalPadding = Math.max(\n blankSpace.value,\n effective + extraContentPadding.value,\n );\n\n // persistent mode: when keyboard shrinks, clamp to valid range\n if (\n keyboardLiftBehavior === \"persistent\" &&\n effective < padding.value\n ) {\n padding.value = effective;\n prevAbsorption.value = minimumPaddingAbsorbed;\n\n if (inverted) {\n const maxScroll = Math.max(\n size.value.height - layout.value.height,\n 0,\n );\n\n contentOffsetY.value = Math.max(\n -actualTotalPadding,\n Math.min(scroll.value, maxScroll),\n );\n } else {\n const maxScroll = Math.max(\n size.value.height - layout.value.height + actualTotalPadding,\n 0,\n );\n\n contentOffsetY.value = Math.max(\n 0,\n Math.min(scroll.value, maxScroll),\n );\n }\n\n return;\n }\n\n // never mode: when keyboard shrinks, clamp to valid range\n // to avoid ghost padding\n if (\n keyboardLiftBehavior === \"never\" &&\n effective < padding.value &&\n atEnd\n ) {\n padding.value = effective;\n prevAbsorption.value = minimumPaddingAbsorbed;\n\n if (inverted) {\n const maxScroll = Math.max(\n size.value.height - layout.value.height,\n 0,\n );\n\n contentOffsetY.value = Math.max(\n -actualTotalPadding,\n Math.min(scroll.value, maxScroll),\n );\n } else {\n const maxScroll = Math.max(\n size.value.height - layout.value.height + actualTotalPadding,\n 0,\n );\n\n contentOffsetY.value = Math.max(\n 0,\n Math.min(scroll.value, maxScroll),\n );\n }\n\n return;\n }\n\n // Undo only the scroll displacement that was actually applied\n // (not the full padding, which includes the absorbed portion).\n // Use the stored absorption from the previous event so that\n // the unwind matches the shift that was originally applied.\n const prevScrollEffective = getScrollEffective(\n padding.value,\n prevAbsorption.value,\n );\n const relativeScroll = inverted\n ? scroll.value + prevScrollEffective\n : scroll.value - prevScrollEffective;\n\n padding.value = effective;\n prevAbsorption.value = minimumPaddingAbsorbed;\n\n if (!shouldShiftContent(keyboardLiftBehavior, atEnd)) {\n // Preserve current scroll position so animated props\n // don't re-apply a stale contentOffset when padding changes\n contentOffsetY.value = scroll.value;\n\n return;\n }\n\n // When blankSpace fully absorbs the keyboard opening, preserve current scroll position\n // (only when keyboard is open — effective > 0 — not when closing)\n if (\n scrollEffective === 0 &&\n minimumPaddingAbsorbed > 0 &&\n effective > 0\n ) {\n contentOffsetY.value = scroll.value;\n\n return;\n }\n\n contentOffsetY.value = computeIOSContentOffset(\n relativeScroll,\n scrollEffective,\n size.value.height,\n layout.value.height,\n inverted,\n actualTotalPadding,\n );\n },\n onMove: () => {\n \"worklet\";\n\n // iOS doesn't need per-frame updates (contentOffset handles it)\n },\n onEnd: (e) => {\n \"worklet\";\n\n if (freeze) {\n return;\n }\n\n const effective = getEffectiveHeight(\n e.height,\n targetKeyboardHeight.value,\n offset,\n );\n\n padding.value = effective;\n },\n },\n [inverted, keyboardLiftBehavior, freeze, offset, extraContentPadding],\n );\n\n return {\n padding,\n currentHeight,\n contentOffsetY,\n scroll,\n layout,\n size,\n onLayout,\n onContentSizeChange,\n };\n}\n\nexport { useChatKeyboard };\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["useSharedValue","useKeyboardHandler","useScrollState","computeIOSContentOffset","getEffectiveHeight","getScrollEffective","getVisibleMinimumPaddingFraction","isScrollAtEnd","shouldShiftContent","useChatKeyboard","scrollViewRef","options","inverted","keyboardLiftBehavior","freeze","offset","blankSpace","extraContentPadding","padding","currentHeight","contentOffsetY","targetKeyboardHeight","prevAbsorption","layout","size","scroll","onLayout","onContentSizeChange","onStart","e","value","height","effective","atEnd","visibleFraction","visiblePadding","minimumPaddingAbsorbed","Math","max","scrollEffective","actualTotalPadding","maxScroll","min","prevScrollEffective","relativeScroll","onMove","onEnd"],"sources":["index.ios.ts"],"sourcesContent":["import { useSharedValue } from \"react-native-reanimated\";\n\nimport { useKeyboardHandler } from \"../../../hooks\";\nimport useScrollState from \"../../hooks/useScrollState\";\n\nimport {\n computeIOSContentOffset,\n getEffectiveHeight,\n getScrollEffective,\n getVisibleMinimumPaddingFraction,\n isScrollAtEnd,\n shouldShiftContent,\n} from \"./helpers\";\n\nimport type { UseChatKeyboardOptions, UseChatKeyboardReturn } from \"./types\";\nimport type { AnimatedRef } from \"react-native-reanimated\";\nimport type Reanimated from \"react-native-reanimated\";\n\n/**\n * Hook that manages keyboard-driven scrolling for chat-style scroll views.\n * Calculates padding (extra scrollable space) and content shift values,\n * using iOS-specific strategy (contentOffset set once in onStart).\n *\n * @param scrollViewRef - Animated ref to the scroll view.\n * @param options - Configuration for inverted and keyboardLiftBehavior.\n * @returns Shared values for padding and contentOffsetY.\n * @example\n * ```tsx\n * const { padding, contentOffsetY } = useChatKeyboard(ref, {\n * inverted: false,\n * keyboardLiftBehavior: \"always\",\n * });\n * ```\n */\nfunction useChatKeyboard(\n scrollViewRef: AnimatedRef<Reanimated.ScrollView>,\n options: UseChatKeyboardOptions,\n): UseChatKeyboardReturn {\n const {\n inverted,\n keyboardLiftBehavior,\n freeze,\n offset,\n blankSpace,\n extraContentPadding,\n } = options;\n\n const padding = useSharedValue(0);\n const currentHeight = useSharedValue(0);\n const contentOffsetY = useSharedValue(0);\n const targetKeyboardHeight = useSharedValue(0);\n const prevAbsorption = useSharedValue(0);\n\n const {\n layout,\n size,\n offset: scroll,\n onLayout,\n onContentSizeChange,\n } = useScrollState(scrollViewRef);\n\n useKeyboardHandler(\n {\n onStart: (e) => {\n \"worklet\";\n\n if (freeze.value) {\n return;\n }\n\n if (e.height > 0) {\n // eslint-disable-next-line react-compiler/react-compiler\n targetKeyboardHeight.value = e.height;\n }\n\n const effective = getEffectiveHeight(\n e.height,\n targetKeyboardHeight.value,\n offset,\n );\n\n const atEnd = isScrollAtEnd(\n scroll.value,\n layout.value.height,\n size.value.height,\n inverted,\n );\n\n // Scale minimum padding absorption by how much of it is visible.\n // Fully visible → full absorption; fully off-screen → no absorption.\n const visibleFraction = getVisibleMinimumPaddingFraction(\n scroll.value,\n layout.value.height,\n size.value.height,\n blankSpace.value,\n inverted,\n );\n const visiblePadding = visibleFraction * blankSpace.value;\n const minimumPaddingAbsorbed = Math.max(\n 0,\n visiblePadding - extraContentPadding.value,\n );\n const scrollEffective = getScrollEffective(\n effective,\n minimumPaddingAbsorbed,\n );\n const actualTotalPadding = Math.max(\n blankSpace.value,\n effective + extraContentPadding.value,\n );\n\n // persistent mode: when keyboard shrinks, clamp to valid range\n if (\n keyboardLiftBehavior === \"persistent\" &&\n effective < padding.value\n ) {\n padding.value = effective;\n prevAbsorption.value = minimumPaddingAbsorbed;\n\n if (inverted) {\n const maxScroll = Math.max(\n size.value.height - layout.value.height,\n 0,\n );\n\n contentOffsetY.value = Math.max(\n -actualTotalPadding,\n Math.min(scroll.value, maxScroll),\n );\n } else {\n const maxScroll = Math.max(\n size.value.height - layout.value.height + actualTotalPadding,\n 0,\n );\n\n contentOffsetY.value = Math.max(\n 0,\n Math.min(scroll.value, maxScroll),\n );\n }\n\n return;\n }\n\n // never mode: when keyboard shrinks, clamp to valid range\n // to avoid ghost padding\n if (\n keyboardLiftBehavior === \"never\" &&\n effective < padding.value &&\n atEnd\n ) {\n padding.value = effective;\n prevAbsorption.value = minimumPaddingAbsorbed;\n\n if (inverted) {\n const maxScroll = Math.max(\n size.value.height - layout.value.height,\n 0,\n );\n\n contentOffsetY.value = Math.max(\n -actualTotalPadding,\n Math.min(scroll.value, maxScroll),\n );\n } else {\n const maxScroll = Math.max(\n size.value.height - layout.value.height + actualTotalPadding,\n 0,\n );\n\n contentOffsetY.value = Math.max(\n 0,\n Math.min(scroll.value, maxScroll),\n );\n }\n\n return;\n }\n\n // Undo only the scroll displacement that was actually applied\n // (not the full padding, which includes the absorbed portion).\n // Use the stored absorption from the previous event so that\n // the unwind matches the shift that was originally applied.\n const prevScrollEffective = getScrollEffective(\n padding.value,\n prevAbsorption.value,\n );\n const relativeScroll = inverted\n ? scroll.value + prevScrollEffective\n : scroll.value - prevScrollEffective;\n\n padding.value = effective;\n prevAbsorption.value = minimumPaddingAbsorbed;\n\n if (!shouldShiftContent(keyboardLiftBehavior, atEnd)) {\n // Preserve current scroll position so animated props\n // don't re-apply a stale contentOffset when padding changes\n contentOffsetY.value = scroll.value;\n\n return;\n }\n\n // When blankSpace fully absorbs the keyboard opening, preserve current scroll position\n // (only when keyboard is open — effective > 0 — not when closing)\n if (\n scrollEffective === 0 &&\n minimumPaddingAbsorbed > 0 &&\n effective > 0\n ) {\n contentOffsetY.value = scroll.value;\n\n return;\n }\n\n contentOffsetY.value = computeIOSContentOffset(\n relativeScroll,\n scrollEffective,\n size.value.height,\n layout.value.height,\n inverted,\n actualTotalPadding,\n );\n },\n onMove: () => {\n \"worklet\";\n\n // iOS doesn't need per-frame updates (contentOffset handles it)\n },\n onEnd: (e) => {\n \"worklet\";\n\n if (freeze.value) {\n return;\n }\n\n const effective = getEffectiveHeight(\n e.height,\n targetKeyboardHeight.value,\n offset,\n );\n\n padding.value = effective;\n },\n },\n [inverted, keyboardLiftBehavior, offset, extraContentPadding],\n );\n\n return {\n padding,\n currentHeight,\n contentOffsetY,\n scroll,\n layout,\n size,\n onLayout,\n onContentSizeChange,\n };\n}\n\nexport { useChatKeyboard };\n"],"mappings":"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","ignoreList":[]}
@@ -51,7 +51,7 @@ function useChatKeyboard(scrollViewRef, options) {
51
51
  onStart: e => {
52
52
  "worklet";
53
53
 
54
- if (freeze) {
54
+ if (freeze.value) {
55
55
  return;
56
56
  }
57
57
  if (e.height > 0) {
@@ -106,7 +106,7 @@ function useChatKeyboard(scrollViewRef, options) {
106
106
  onMove: e => {
107
107
  "worklet";
108
108
 
109
- if (freeze) {
109
+ if (freeze.value) {
110
110
  return;
111
111
  }
112
112
  currentHeight.value = e.height;
@@ -207,7 +207,7 @@ function useChatKeyboard(scrollViewRef, options) {
207
207
  onEnd: e => {
208
208
  "worklet";
209
209
 
210
- if (freeze) {
210
+ if (freeze.value) {
211
211
  return;
212
212
  }
213
213
  const effective = getEffectiveHeight(e.height, targetKeyboardHeight.value, offset);
@@ -218,7 +218,7 @@ function useChatKeyboard(scrollViewRef, options) {
218
218
  actualOpenShift.value = scroll.value - offsetBeforeScroll.value;
219
219
  }
220
220
  }
221
- }, [inverted, keyboardLiftBehavior, freeze, offset]);
221
+ }, [inverted, keyboardLiftBehavior, offset]);
222
222
  return {
223
223
  padding,
224
224
  currentHeight,