react-native-keyboard-controller 1.22.0 → 1.22.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -0
- package/lib/commonjs/components/KeyboardAwareScrollView/index.js +5 -1
- package/lib/commonjs/components/KeyboardAwareScrollView/index.js.map +1 -1
- package/lib/module/components/KeyboardAwareScrollView/index.js +5 -1
- package/lib/module/components/KeyboardAwareScrollView/index.js.map +1 -1
- package/package.json +2 -1
- package/src/components/KeyboardAwareScrollView/index.tsx +8 -1
package/README.md
CHANGED
|
@@ -19,6 +19,7 @@ A universal keyboard handling solution for React Native — lightweight, fully c
|
|
|
19
19
|
- 🌐 Display anything over the keyboard (without dismissing it) using `OverKeyboardView`
|
|
20
20
|
- 🎨 Match keyboard background with `KeyboardBackgroundView`
|
|
21
21
|
- 🧩 Extend keyboard with custom buttons/UI via `KeyboardExtender`
|
|
22
|
+
- 🌈 Enhance keyboard UI with `KeyboardEffects`
|
|
22
23
|
- 💬 Build chat interfaces (messenger and 🤖 AI chats) easily with `KeyboardChatScrollView`
|
|
23
24
|
- 📝 Easy retrieval of focused input info
|
|
24
25
|
- 🧭 Compatible with any navigation library
|
|
@@ -199,7 +199,7 @@ const KeyboardAwareScrollView = /*#__PURE__*/(0, _react.forwardRef)(({
|
|
|
199
199
|
|
|
200
200
|
var _lastSelection$value, _input$value;
|
|
201
201
|
const customHeight = (_lastSelection$value = lastSelection.value) === null || _lastSelection$value === void 0 ? void 0 : _lastSelection$value.selection.end.y;
|
|
202
|
-
if (!((_input$value = input.value) !== null && _input$value !== void 0 && _input$value.layout) ||
|
|
202
|
+
if (!((_input$value = input.value) !== null && _input$value !== void 0 && _input$value.layout) || customHeight === undefined) {
|
|
203
203
|
return false;
|
|
204
204
|
}
|
|
205
205
|
layout.value = {
|
|
@@ -341,6 +341,10 @@ const KeyboardAwareScrollView = /*#__PURE__*/(0, _react.forwardRef)(({
|
|
|
341
341
|
onMove: e => {
|
|
342
342
|
"worklet";
|
|
343
343
|
|
|
344
|
+
var _lastSelection$value6;
|
|
345
|
+
if (pendingSelectionForFocus.value && ((_lastSelection$value6 = lastSelection.value) === null || _lastSelection$value6 === void 0 ? void 0 : _lastSelection$value6.target) !== tag.value) {
|
|
346
|
+
return;
|
|
347
|
+
}
|
|
344
348
|
if (removeGhostPadding(e.height)) {
|
|
345
349
|
return;
|
|
346
350
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["_react","_interopRequireWildcard","require","_reactNativeReanimated","_bindings","_hooks","_findNodeHandle","_useCombinedRef","_interopRequireDefault","_useScrollState","_ScrollViewWithBottomPadding","_useSmoothKeyboardHandler","_utils","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","KeyboardAwareScrollView","forwardRef","children","onLayout","bottomOffset","disableScrollOnKeyboardHide","enabled","extraKeyboardSpace","mode","ScrollViewComponent","Reanimated","ScrollView","snapToOffsets","rest","ref","scrollViewAnimatedRef","useAnimatedRef","scrollViewRef","React","useRef","onRef","useCombinedRef","scrollViewTarget","useSharedValue","scrollPosition","offset","position","layout","scrollViewLayout","size","scrollViewContentSize","useScrollState","currentKeyboardFrameHeight","keyboardHeight","keyboardWillAppear","tag","initialKeyboardSize","scrollBeforeKeyboardMovement","input","update","useReanimatedFocusedInput","lastSelection","ghostViewSpace","pendingSelectionForFocus","selectionUpdatedSinceHide","scrollViewPageY","height","useWindowDimensions","onScrollViewLayout","useCallback","handle","findNodeHandle","current","value","y","KeyboardControllerNative","viewPositionInWindow","maybeScroll","animated","_layout$value","_layout$value2","_layout$value3","parentScrollViewTarget","visibleRect","absoluteY","inputHeight","point","relativeScrollTo","interpolatedScrollTo","interpolate","scrollDistanceWithRespectToSnapPoints","targetScrollY","Math","max","scrollTo","positionOnScreen","topOfScreen","removeGhostPadding","performScrollWithPositionRestoration","newPosition","prevScroll","syncKeyboardFrame","keyboardFrame","updateLayoutFromSelection","_lastSelection$value","_input$value","customHeight","selection","end","clamp","scrollFromCurrentPosition","prevLayout","onChangeText","onChangeTextHandler","useMemo","debounce","onSelectionChange","_lastSelection$value2","_lastSelection$value3","lastTarget","target","latestSelection","start","useFocusedInputHandler","useSmoothKeyboardHandler","onStart","keyboardWillChangeSize","keyboardWillHide","focusWasChanged","_lastSelection$value4","_lastSelection$value5","onMove","onEnd","synchronize","requestAnimationFrame","runOnUI","useImperativeHandle","scrollView","scrollViewWithMethods","assureFocusedInputVisible","useEffect","useAnimatedReaction","previous","padding","useDerivedValue","layoutSpacerStyle","useAnimatedStyle","paddingBottom","createElement","scrollEventThrottle","View","style","bottomPadding","_default","exports"],"sources":["index.tsx"],"sourcesContent":["import React, {\n forwardRef,\n useCallback,\n useEffect,\n useImperativeHandle,\n useMemo,\n} from \"react\";\nimport Reanimated, {\n clamp,\n interpolate,\n runOnUI,\n scrollTo,\n useAnimatedReaction,\n useAnimatedRef,\n useAnimatedStyle,\n useDerivedValue,\n useSharedValue,\n} from \"react-native-reanimated\";\n\nimport { KeyboardControllerNative } from \"../../bindings\";\nimport {\n useFocusedInputHandler,\n useReanimatedFocusedInput,\n useWindowDimensions,\n} from \"../../hooks\";\nimport { findNodeHandle } from \"../../utils/findNodeHandle\";\nimport useCombinedRef from \"../hooks/useCombinedRef\";\nimport useScrollState from \"../hooks/useScrollState\";\nimport ScrollViewWithBottomPadding from \"../ScrollViewWithBottomPadding\";\n\nimport { useSmoothKeyboardHandler } from \"./useSmoothKeyboardHandler\";\nimport { debounce, scrollDistanceWithRespectToSnapPoints } from \"./utils\";\n\nimport type { LayoutChangeEvent, ScrollView } from \"react-native\";\nimport type {\n FocusedInputLayoutChangedEvent,\n FocusedInputSelectionChangedEvent,\n KeyboardAwareScrollViewProps,\n KeyboardAwareScrollViewRef,\n NativeEvent,\n} from \"react-native-keyboard-controller\";\n\n// Everything begins from `onStart` handler. This handler is called every time,\n// when keyboard changes its size or when focused `TextInput` was changed. In\n// this handler we are calculating/memoizing values which later will be used\n// during layout movement. For that we calculate:\n// - layout of focused field (`layout`) - to understand whether there will be overlap\n// - initial keyboard size (`initialKeyboardSize`) - used in scroll interpolation\n// - future keyboard height (`keyboardHeight`) - used in scroll interpolation\n// - current scroll position (`scrollPosition`) - used to scroll from this point\n//\n// Once we've calculated all necessary variables - we can actually start to use them.\n// It happens in `onMove` handler - this function simply calls `maybeScroll` with\n// current keyboard frame height. This functions makes the smooth transition.\n//\n// When the transition has finished we go to `onEnd` handler. In this handler\n// we verify, that the current field is not overlapped within a keyboard frame.\n// For full `onStart`/`onMove`/`onEnd` flow it may look like a redundant thing,\n// however there could be some cases, when `onMove` is not called:\n// - on iOS when TextInput was changed - keyboard transition is instant\n// - on Android when TextInput was changed and keyboard size wasn't changed\n// So `onEnd` handler handle the case, when `onMove` wasn't triggered.\n//\n// ====================================================================================================================+\n// -----------------------------------------------------Flow chart-----------------------------------------------------+\n// ====================================================================================================================+\n//\n// +============================+ +============================+ +==================================+\n// + User Press on TextInput + => + Keyboard starts showing + => + As keyboard moves frame by frame + =>\n// + + + (run `onStart`) + + `onMove` is getting called +\n// +============================+ +============================+ +==================================+\n//\n// +============================+ +============================+ +=====================================+\n// + Keyboard is shown and we + => + User moved focus to + => + Only `onStart`/`onEnd` maybe called +\n// + call `onEnd` handler + + another `TextInput` + + (without involving `onMove`) +\n// +============================+ +============================+ +=====================================+\n//\n\n/**\n * A ScrollView component that automatically handles keyboard appearance and disappearance\n * by adjusting its content position to ensure the focused input remains visible.\n *\n * The component uses a sophisticated animation system to smoothly handle keyboard transitions\n * and maintain proper scroll position during keyboard interactions.\n *\n * @returns A ScrollView component that handles keyboard interactions.\n * @see {@link https://kirillzyusko.github.io/react-native-keyboard-controller/docs/api/components/keyboard-aware-scroll-view|Documentation} page for more details.\n * @example\n * ```tsx\n * <KeyboardAwareScrollView bottomOffset={20}>\n * <TextInput placeholder=\"Enter text\" />\n * <TextInput placeholder=\"Another input\" />\n * </KeyboardAwareScrollView>\n * ```\n */\nconst KeyboardAwareScrollView = forwardRef<\n KeyboardAwareScrollViewRef,\n React.PropsWithChildren<KeyboardAwareScrollViewProps>\n>(\n (\n {\n children,\n onLayout,\n bottomOffset = 0,\n disableScrollOnKeyboardHide = false,\n enabled = true,\n extraKeyboardSpace = 0,\n mode = \"insets\",\n ScrollViewComponent = Reanimated.ScrollView,\n snapToOffsets,\n ...rest\n },\n ref,\n ) => {\n const scrollViewAnimatedRef = useAnimatedRef<Reanimated.ScrollView>();\n const scrollViewRef = React.useRef<ScrollView>(null);\n const onRef = useCombinedRef(scrollViewAnimatedRef, scrollViewRef);\n const scrollViewTarget = useSharedValue<number | null>(null);\n const scrollPosition = useSharedValue(0);\n const {\n offset: position,\n layout: scrollViewLayout,\n size: scrollViewContentSize,\n } = useScrollState(scrollViewAnimatedRef);\n const currentKeyboardFrameHeight = useSharedValue(0);\n const keyboardHeight = useSharedValue(0);\n const keyboardWillAppear = useSharedValue(false);\n const tag = useSharedValue(-1);\n const initialKeyboardSize = useSharedValue(0);\n const scrollBeforeKeyboardMovement = useSharedValue(0);\n const { input, update } = useReanimatedFocusedInput();\n const layout = useSharedValue<FocusedInputLayoutChangedEvent | null>(null);\n const lastSelection =\n useSharedValue<FocusedInputSelectionChangedEvent | null>(null);\n const ghostViewSpace = useSharedValue(-1);\n const pendingSelectionForFocus = useSharedValue(false);\n const selectionUpdatedSinceHide = useSharedValue(false);\n const scrollViewPageY = useSharedValue(0);\n\n const { height } = useWindowDimensions();\n\n const onScrollViewLayout = useCallback(\n async (e: LayoutChangeEvent) => {\n const handle = findNodeHandle(scrollViewAnimatedRef.current);\n\n scrollViewTarget.value = handle;\n\n onLayout?.(e);\n\n if (handle !== null) {\n try {\n const { y } = await KeyboardControllerNative.viewPositionInWindow(\n handle,\n );\n\n scrollViewPageY.value = y;\n } catch {\n // ignore\n }\n }\n },\n [onLayout],\n );\n\n /**\n * Function that will scroll a ScrollView as keyboard gets moving.\n */\n const maybeScroll = useCallback(\n (e: number, animated: boolean = false) => {\n \"worklet\";\n\n if (!enabled) {\n return 0;\n }\n\n // input belongs to ScrollView\n if (layout.value?.parentScrollViewTarget !== scrollViewTarget.value) {\n return 0;\n }\n\n const visibleRect = height - keyboardHeight.value;\n const absoluteY = layout.value?.layout.absoluteY || 0;\n const inputHeight = layout.value?.layout.height || 0;\n const point = absoluteY + inputHeight;\n\n if (visibleRect - point <= bottomOffset) {\n const relativeScrollTo =\n keyboardHeight.value - (height - point) + bottomOffset;\n const interpolatedScrollTo = interpolate(\n e,\n [initialKeyboardSize.value, keyboardHeight.value],\n [\n 0,\n scrollDistanceWithRespectToSnapPoints(\n relativeScrollTo + scrollPosition.value,\n snapToOffsets,\n ) - scrollPosition.value,\n ],\n );\n const targetScrollY =\n Math.max(interpolatedScrollTo, 0) + scrollPosition.value;\n\n scrollTo(scrollViewAnimatedRef, 0, targetScrollY, animated);\n\n return interpolatedScrollTo;\n }\n\n if (point < scrollViewPageY.value) {\n const positionOnScreen = visibleRect - bottomOffset;\n const topOfScreen = scrollPosition.value + point;\n\n scrollTo(\n scrollViewAnimatedRef,\n 0,\n topOfScreen - positionOnScreen,\n animated,\n );\n }\n\n return 0;\n },\n [bottomOffset, enabled, height, snapToOffsets],\n );\n const removeGhostPadding = useCallback(\n (e: number) => {\n \"worklet\";\n\n // layout mode: the spacer view participates in layout, so the ScrollView\n // reflows naturally when it shrinks — no manual scroll correction needed.\n if (mode === \"layout\") {\n return false;\n }\n\n // insets mode: `ScrollViewWithBottomPadding` extends scrollable area without\n // changing layout, so when the keyboard hides and we're at the end of the\n // ScrollView we must manually scroll back.\n if (!keyboardWillAppear.value && ghostViewSpace.value > 0) {\n scrollTo(\n scrollViewAnimatedRef,\n 0,\n scrollPosition.value -\n interpolate(\n e,\n [initialKeyboardSize.value, keyboardHeight.value],\n [ghostViewSpace.value, 0],\n ),\n false,\n );\n\n return true;\n }\n\n return false;\n },\n [mode],\n );\n const performScrollWithPositionRestoration = useCallback(\n (newPosition: number) => {\n \"worklet\";\n\n const prevScroll = scrollPosition.value;\n\n // eslint-disable-next-line react-compiler/react-compiler\n scrollPosition.value = newPosition;\n maybeScroll(keyboardHeight.value, true);\n scrollPosition.value = prevScroll;\n },\n [scrollPosition, keyboardHeight, maybeScroll],\n );\n const syncKeyboardFrame = useCallback(\n (e: NativeEvent) => {\n \"worklet\";\n\n const keyboardFrame = interpolate(\n e.height,\n [0, keyboardHeight.value],\n [0, keyboardHeight.value + extraKeyboardSpace],\n );\n\n currentKeyboardFrameHeight.value = keyboardFrame;\n },\n [extraKeyboardSpace],\n );\n\n const updateLayoutFromSelection = useCallback(() => {\n \"worklet\";\n\n const customHeight = lastSelection.value?.selection.end.y;\n\n if (!input.value?.layout || !customHeight) {\n return false;\n }\n\n layout.value = {\n ...input.value,\n layout: {\n ...input.value.layout,\n // when we have multiline input with limited amount of lines, then custom height can be very big\n // so we clamp it to max input height\n height: clamp(customHeight, 0, input.value.layout.height),\n },\n };\n\n return true;\n }, [input, lastSelection, layout]);\n const scrollFromCurrentPosition = useCallback(() => {\n \"worklet\";\n\n const prevLayout = layout.value;\n\n if (!updateLayoutFromSelection()) {\n return;\n }\n\n performScrollWithPositionRestoration(position.value);\n\n layout.value = prevLayout;\n }, [performScrollWithPositionRestoration]);\n const onChangeText = useCallback(() => {\n \"worklet\";\n scrollFromCurrentPosition();\n }, [scrollFromCurrentPosition]);\n const onChangeTextHandler = useMemo(\n () => debounce(onChangeText, 200),\n [onChangeText],\n );\n const onSelectionChange = useCallback(\n (e: FocusedInputSelectionChangedEvent) => {\n \"worklet\";\n\n const lastTarget = lastSelection.value?.target;\n const latestSelection = lastSelection.value?.selection;\n\n lastSelection.value = e;\n selectionUpdatedSinceHide.value = true;\n\n if (e.target !== lastTarget || pendingSelectionForFocus.value) {\n if (pendingSelectionForFocus.value) {\n // selection arrived after onStart - complete the deferred setup\n pendingSelectionForFocus.value = false;\n updateLayoutFromSelection();\n\n // if keyboard was already visible (focus change, no onMove expected),\n // perform the deferred scroll now\n if (!keyboardWillAppear.value && keyboardHeight.value > 0) {\n position.value += maybeScroll(keyboardHeight.value, true);\n }\n }\n\n return;\n }\n // caret in the end + end coordinates has been changed -> we moved to a new line\n // so input may grow\n if (\n e.selection.end.position === e.selection.start.position &&\n latestSelection?.end.y !== e.selection.end.y\n ) {\n return scrollFromCurrentPosition();\n }\n // selection has been changed\n if (e.selection.start.position !== e.selection.end.position) {\n return scrollFromCurrentPosition();\n }\n\n onChangeTextHandler();\n },\n [\n scrollFromCurrentPosition,\n onChangeTextHandler,\n updateLayoutFromSelection,\n maybeScroll,\n ],\n );\n\n useFocusedInputHandler(\n {\n onSelectionChange: onSelectionChange,\n },\n [onSelectionChange],\n );\n\n useSmoothKeyboardHandler(\n {\n onStart: (e) => {\n \"worklet\";\n\n const keyboardWillChangeSize =\n keyboardHeight.value !== e.height && e.height > 0;\n\n keyboardWillAppear.value = e.height > 0 && keyboardHeight.value === 0;\n\n const keyboardWillHide = e.height === 0;\n const focusWasChanged =\n (tag.value !== e.target && e.target !== -1) ||\n keyboardWillChangeSize;\n\n if (keyboardWillChangeSize) {\n initialKeyboardSize.value = keyboardHeight.value;\n }\n\n if (keyboardWillHide) {\n // on back transition need to interpolate as [0, keyboardHeight]\n initialKeyboardSize.value = 0;\n scrollPosition.value = scrollBeforeKeyboardMovement.value;\n pendingSelectionForFocus.value = false;\n }\n\n if (\n keyboardWillAppear.value ||\n keyboardWillChangeSize ||\n focusWasChanged\n ) {\n // persist scroll value\n scrollPosition.value = position.value;\n // just persist height - later will be used in interpolation\n keyboardHeight.value = e.height;\n\n // insets mode: set the full contentInset upfront so that maybeScroll\n // calculations are correct from the very first onMove frame.\n // layout mode: do NOT set it here — the spacer must grow frame-by-frame\n // in onMove to avoid a premature full-height jump before the keyboard moves.\n if (mode === \"insets\") {\n syncKeyboardFrame(e);\n }\n }\n\n // focus was changed\n if (focusWasChanged) {\n tag.value = e.target;\n\n if (\n lastSelection.value?.target === e.target &&\n selectionUpdatedSinceHide.value\n ) {\n // fresh selection arrived before onStart - use it to update layout\n updateLayoutFromSelection();\n pendingSelectionForFocus.value = false;\n } else {\n // selection hasn't arrived yet for the new target (iOS 15),\n // or it's stale from previous session (Android refocus same input).\n // Use stale selection as best-effort fallback if available for same target,\n // otherwise fall back to full input layout.\n // Will be corrected if a fresh onSelectionChange arrives.\n if (lastSelection.value?.target === e.target) {\n updateLayoutFromSelection();\n } else if (input.value) {\n layout.value = input.value;\n }\n pendingSelectionForFocus.value = true;\n }\n\n // save current scroll position - when keyboard will hide we'll reuse\n // this value to achieve smooth hide effect\n scrollBeforeKeyboardMovement.value = position.value;\n }\n\n if (focusWasChanged && !keyboardWillAppear.value) {\n if (!pendingSelectionForFocus.value) {\n // update position on scroll value, so `onEnd` handler\n // will pick up correct values\n position.value += maybeScroll(e.height, true);\n }\n }\n\n if (mode === \"insets\") {\n ghostViewSpace.value =\n position.value +\n scrollViewLayout.value.height -\n scrollViewContentSize.value.height;\n\n if (ghostViewSpace.value > 0) {\n scrollPosition.value = position.value;\n }\n }\n },\n onMove: (e) => {\n \"worklet\";\n\n if (removeGhostPadding(e.height)) {\n return;\n }\n\n // layout mode: drive the spacer view animation frame-by-frame\n if (mode === \"layout\") {\n syncKeyboardFrame(e);\n }\n\n // if the user has set disableScrollOnKeyboardHide, only auto-scroll when the keyboard opens\n if (!disableScrollOnKeyboardHide || keyboardWillAppear.value) {\n maybeScroll(e.height);\n }\n },\n onEnd: (e) => {\n \"worklet\";\n\n if (e.height === 0) {\n removeGhostPadding(e.height);\n }\n\n keyboardHeight.value = e.height;\n scrollPosition.value = position.value;\n\n if (e.height === 0) {\n selectionUpdatedSinceHide.value = false;\n } else if (keyboardWillAppear.value) {\n // keyboard fully shown after appearing from hidden state — clear\n // pending flag to prevent leaking into next focus-change session.\n // Only when the keyboard was actually appearing (not a focus switch\n // with same keyboard height), otherwise we'd clear the flag before\n // onSelectionChange has a chance to process it.\n pendingSelectionForFocus.value = false;\n }\n\n syncKeyboardFrame(e);\n },\n },\n [\n mode,\n maybeScroll,\n removeGhostPadding,\n disableScrollOnKeyboardHide,\n syncKeyboardFrame,\n ],\n );\n\n const synchronize = useCallback(async () => {\n await update();\n\n requestAnimationFrame(() => {\n runOnUI(() => {\n \"worklet\";\n\n scrollFromCurrentPosition();\n })();\n });\n }, [update, scrollFromCurrentPosition]);\n\n useImperativeHandle(\n ref,\n () => {\n const scrollView = scrollViewRef.current;\n\n if (scrollView) {\n const scrollViewWithMethods =\n scrollView as KeyboardAwareScrollViewRef;\n\n scrollViewWithMethods.assureFocusedInputVisible = () => {\n synchronize();\n };\n\n return scrollViewWithMethods;\n }\n\n return {\n assureFocusedInputVisible: () => {\n synchronize();\n },\n } as KeyboardAwareScrollViewRef;\n },\n [synchronize],\n );\n\n useEffect(() => {\n synchronize();\n }, [bottomOffset]);\n\n useAnimatedReaction(\n () => input.value,\n (current, previous) => {\n if (\n current?.target === previous?.target &&\n current?.layout.height !== previous?.layout.height\n ) {\n // input has changed layout - let's check if we need to scroll\n // may happen when you paste text, then onSelectionChange will be\n // fired earlier than text actually changes its layout\n scrollFromCurrentPosition();\n }\n },\n [],\n );\n\n const padding = useDerivedValue(\n () => (enabled ? currentKeyboardFrameHeight.value : 0),\n [enabled],\n );\n // layout mode only: a spacer view whose paddingBottom grows with the keyboard.\n // The `+ 1` ensures the scroll view never reaches its absolute end during animation,\n // avoiding the layout recalculation that triggers on every frame at the boundary.\n // see: https://github.com/kirillzyusko/react-native-keyboard-controller/pull/342\n const layoutSpacerStyle = useAnimatedStyle(\n () =>\n enabled && mode === \"layout\"\n ? { paddingBottom: currentKeyboardFrameHeight.value + 1 }\n : {},\n [enabled, mode],\n );\n\n if (mode === \"layout\") {\n return (\n <ScrollViewComponent\n ref={onRef}\n {...rest}\n scrollEventThrottle={16}\n onLayout={onScrollViewLayout}\n >\n {children}\n {enabled && <Reanimated.View style={layoutSpacerStyle} />}\n </ScrollViewComponent>\n );\n }\n\n return (\n <ScrollViewWithBottomPadding\n ref={onRef}\n {...rest}\n bottomPadding={padding}\n scrollEventThrottle={16}\n ScrollViewComponent={ScrollViewComponent}\n onLayout={onScrollViewLayout}\n >\n {children}\n </ScrollViewWithBottomPadding>\n );\n },\n);\n\nexport default KeyboardAwareScrollView;\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"names":["_react","_interopRequireWildcard","require","_reactNativeReanimated","_bindings","_hooks","_findNodeHandle","_useCombinedRef","_interopRequireDefault","_useScrollState","_ScrollViewWithBottomPadding","_useSmoothKeyboardHandler","_utils","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","KeyboardAwareScrollView","forwardRef","children","onLayout","bottomOffset","disableScrollOnKeyboardHide","enabled","extraKeyboardSpace","mode","ScrollViewComponent","Reanimated","ScrollView","snapToOffsets","rest","ref","scrollViewAnimatedRef","useAnimatedRef","scrollViewRef","React","useRef","onRef","useCombinedRef","scrollViewTarget","useSharedValue","scrollPosition","offset","position","layout","scrollViewLayout","size","scrollViewContentSize","useScrollState","currentKeyboardFrameHeight","keyboardHeight","keyboardWillAppear","tag","initialKeyboardSize","scrollBeforeKeyboardMovement","input","update","useReanimatedFocusedInput","lastSelection","ghostViewSpace","pendingSelectionForFocus","selectionUpdatedSinceHide","scrollViewPageY","height","useWindowDimensions","onScrollViewLayout","useCallback","handle","findNodeHandle","current","value","y","KeyboardControllerNative","viewPositionInWindow","maybeScroll","animated","_layout$value","_layout$value2","_layout$value3","parentScrollViewTarget","visibleRect","absoluteY","inputHeight","point","relativeScrollTo","interpolatedScrollTo","interpolate","scrollDistanceWithRespectToSnapPoints","targetScrollY","Math","max","scrollTo","positionOnScreen","topOfScreen","removeGhostPadding","performScrollWithPositionRestoration","newPosition","prevScroll","syncKeyboardFrame","keyboardFrame","updateLayoutFromSelection","_lastSelection$value","_input$value","customHeight","selection","end","undefined","clamp","scrollFromCurrentPosition","prevLayout","onChangeText","onChangeTextHandler","useMemo","debounce","onSelectionChange","_lastSelection$value2","_lastSelection$value3","lastTarget","target","latestSelection","start","useFocusedInputHandler","useSmoothKeyboardHandler","onStart","keyboardWillChangeSize","keyboardWillHide","focusWasChanged","_lastSelection$value4","_lastSelection$value5","onMove","_lastSelection$value6","onEnd","synchronize","requestAnimationFrame","runOnUI","useImperativeHandle","scrollView","scrollViewWithMethods","assureFocusedInputVisible","useEffect","useAnimatedReaction","previous","padding","useDerivedValue","layoutSpacerStyle","useAnimatedStyle","paddingBottom","createElement","scrollEventThrottle","View","style","bottomPadding","_default","exports"],"sources":["index.tsx"],"sourcesContent":["import React, {\n forwardRef,\n useCallback,\n useEffect,\n useImperativeHandle,\n useMemo,\n} from \"react\";\nimport Reanimated, {\n clamp,\n interpolate,\n runOnUI,\n scrollTo,\n useAnimatedReaction,\n useAnimatedRef,\n useAnimatedStyle,\n useDerivedValue,\n useSharedValue,\n} from \"react-native-reanimated\";\n\nimport { KeyboardControllerNative } from \"../../bindings\";\nimport {\n useFocusedInputHandler,\n useReanimatedFocusedInput,\n useWindowDimensions,\n} from \"../../hooks\";\nimport { findNodeHandle } from \"../../utils/findNodeHandle\";\nimport useCombinedRef from \"../hooks/useCombinedRef\";\nimport useScrollState from \"../hooks/useScrollState\";\nimport ScrollViewWithBottomPadding from \"../ScrollViewWithBottomPadding\";\n\nimport { useSmoothKeyboardHandler } from \"./useSmoothKeyboardHandler\";\nimport { debounce, scrollDistanceWithRespectToSnapPoints } from \"./utils\";\n\nimport type { LayoutChangeEvent, ScrollView } from \"react-native\";\nimport type {\n FocusedInputLayoutChangedEvent,\n FocusedInputSelectionChangedEvent,\n KeyboardAwareScrollViewProps,\n KeyboardAwareScrollViewRef,\n NativeEvent,\n} from \"react-native-keyboard-controller\";\n\n// Everything begins from `onStart` handler. This handler is called every time,\n// when keyboard changes its size or when focused `TextInput` was changed. In\n// this handler we are calculating/memoizing values which later will be used\n// during layout movement. For that we calculate:\n// - layout of focused field (`layout`) - to understand whether there will be overlap\n// - initial keyboard size (`initialKeyboardSize`) - used in scroll interpolation\n// - future keyboard height (`keyboardHeight`) - used in scroll interpolation\n// - current scroll position (`scrollPosition`) - used to scroll from this point\n//\n// Once we've calculated all necessary variables - we can actually start to use them.\n// It happens in `onMove` handler - this function simply calls `maybeScroll` with\n// current keyboard frame height. This functions makes the smooth transition.\n//\n// When the transition has finished we go to `onEnd` handler. In this handler\n// we verify, that the current field is not overlapped within a keyboard frame.\n// For full `onStart`/`onMove`/`onEnd` flow it may look like a redundant thing,\n// however there could be some cases, when `onMove` is not called:\n// - on iOS when TextInput was changed - keyboard transition is instant\n// - on Android when TextInput was changed and keyboard size wasn't changed\n// So `onEnd` handler handle the case, when `onMove` wasn't triggered.\n//\n// ====================================================================================================================+\n// -----------------------------------------------------Flow chart-----------------------------------------------------+\n// ====================================================================================================================+\n//\n// +============================+ +============================+ +==================================+\n// + User Press on TextInput + => + Keyboard starts showing + => + As keyboard moves frame by frame + =>\n// + + + (run `onStart`) + + `onMove` is getting called +\n// +============================+ +============================+ +==================================+\n//\n// +============================+ +============================+ +=====================================+\n// + Keyboard is shown and we + => + User moved focus to + => + Only `onStart`/`onEnd` maybe called +\n// + call `onEnd` handler + + another `TextInput` + + (without involving `onMove`) +\n// +============================+ +============================+ +=====================================+\n//\n\n/**\n * A ScrollView component that automatically handles keyboard appearance and disappearance\n * by adjusting its content position to ensure the focused input remains visible.\n *\n * The component uses a sophisticated animation system to smoothly handle keyboard transitions\n * and maintain proper scroll position during keyboard interactions.\n *\n * @returns A ScrollView component that handles keyboard interactions.\n * @see {@link https://kirillzyusko.github.io/react-native-keyboard-controller/docs/api/components/keyboard-aware-scroll-view|Documentation} page for more details.\n * @example\n * ```tsx\n * <KeyboardAwareScrollView bottomOffset={20}>\n * <TextInput placeholder=\"Enter text\" />\n * <TextInput placeholder=\"Another input\" />\n * </KeyboardAwareScrollView>\n * ```\n */\nconst KeyboardAwareScrollView = forwardRef<\n KeyboardAwareScrollViewRef,\n React.PropsWithChildren<KeyboardAwareScrollViewProps>\n>(\n (\n {\n children,\n onLayout,\n bottomOffset = 0,\n disableScrollOnKeyboardHide = false,\n enabled = true,\n extraKeyboardSpace = 0,\n mode = \"insets\",\n ScrollViewComponent = Reanimated.ScrollView,\n snapToOffsets,\n ...rest\n },\n ref,\n ) => {\n const scrollViewAnimatedRef = useAnimatedRef<Reanimated.ScrollView>();\n const scrollViewRef = React.useRef<ScrollView>(null);\n const onRef = useCombinedRef(scrollViewAnimatedRef, scrollViewRef);\n const scrollViewTarget = useSharedValue<number | null>(null);\n const scrollPosition = useSharedValue(0);\n const {\n offset: position,\n layout: scrollViewLayout,\n size: scrollViewContentSize,\n } = useScrollState(scrollViewAnimatedRef);\n const currentKeyboardFrameHeight = useSharedValue(0);\n const keyboardHeight = useSharedValue(0);\n const keyboardWillAppear = useSharedValue(false);\n const tag = useSharedValue(-1);\n const initialKeyboardSize = useSharedValue(0);\n const scrollBeforeKeyboardMovement = useSharedValue(0);\n const { input, update } = useReanimatedFocusedInput();\n const layout = useSharedValue<FocusedInputLayoutChangedEvent | null>(null);\n const lastSelection =\n useSharedValue<FocusedInputSelectionChangedEvent | null>(null);\n const ghostViewSpace = useSharedValue(-1);\n const pendingSelectionForFocus = useSharedValue(false);\n const selectionUpdatedSinceHide = useSharedValue(false);\n const scrollViewPageY = useSharedValue(0);\n\n const { height } = useWindowDimensions();\n\n const onScrollViewLayout = useCallback(\n async (e: LayoutChangeEvent) => {\n const handle = findNodeHandle(scrollViewAnimatedRef.current);\n\n scrollViewTarget.value = handle;\n\n onLayout?.(e);\n\n if (handle !== null) {\n try {\n const { y } = await KeyboardControllerNative.viewPositionInWindow(\n handle,\n );\n\n scrollViewPageY.value = y;\n } catch {\n // ignore\n }\n }\n },\n [onLayout],\n );\n\n /**\n * Function that will scroll a ScrollView as keyboard gets moving.\n */\n const maybeScroll = useCallback(\n (e: number, animated: boolean = false) => {\n \"worklet\";\n\n if (!enabled) {\n return 0;\n }\n\n // input belongs to ScrollView\n if (layout.value?.parentScrollViewTarget !== scrollViewTarget.value) {\n return 0;\n }\n\n const visibleRect = height - keyboardHeight.value;\n const absoluteY = layout.value?.layout.absoluteY || 0;\n const inputHeight = layout.value?.layout.height || 0;\n const point = absoluteY + inputHeight;\n\n if (visibleRect - point <= bottomOffset) {\n const relativeScrollTo =\n keyboardHeight.value - (height - point) + bottomOffset;\n const interpolatedScrollTo = interpolate(\n e,\n [initialKeyboardSize.value, keyboardHeight.value],\n [\n 0,\n scrollDistanceWithRespectToSnapPoints(\n relativeScrollTo + scrollPosition.value,\n snapToOffsets,\n ) - scrollPosition.value,\n ],\n );\n const targetScrollY =\n Math.max(interpolatedScrollTo, 0) + scrollPosition.value;\n\n scrollTo(scrollViewAnimatedRef, 0, targetScrollY, animated);\n\n return interpolatedScrollTo;\n }\n\n if (point < scrollViewPageY.value) {\n const positionOnScreen = visibleRect - bottomOffset;\n const topOfScreen = scrollPosition.value + point;\n\n scrollTo(\n scrollViewAnimatedRef,\n 0,\n topOfScreen - positionOnScreen,\n animated,\n );\n }\n\n return 0;\n },\n [bottomOffset, enabled, height, snapToOffsets],\n );\n const removeGhostPadding = useCallback(\n (e: number) => {\n \"worklet\";\n\n // layout mode: the spacer view participates in layout, so the ScrollView\n // reflows naturally when it shrinks — no manual scroll correction needed.\n if (mode === \"layout\") {\n return false;\n }\n\n // insets mode: `ScrollViewWithBottomPadding` extends scrollable area without\n // changing layout, so when the keyboard hides and we're at the end of the\n // ScrollView we must manually scroll back.\n if (!keyboardWillAppear.value && ghostViewSpace.value > 0) {\n scrollTo(\n scrollViewAnimatedRef,\n 0,\n scrollPosition.value -\n interpolate(\n e,\n [initialKeyboardSize.value, keyboardHeight.value],\n [ghostViewSpace.value, 0],\n ),\n false,\n );\n\n return true;\n }\n\n return false;\n },\n [mode],\n );\n const performScrollWithPositionRestoration = useCallback(\n (newPosition: number) => {\n \"worklet\";\n\n const prevScroll = scrollPosition.value;\n\n // eslint-disable-next-line react-compiler/react-compiler\n scrollPosition.value = newPosition;\n maybeScroll(keyboardHeight.value, true);\n scrollPosition.value = prevScroll;\n },\n [scrollPosition, keyboardHeight, maybeScroll],\n );\n const syncKeyboardFrame = useCallback(\n (e: NativeEvent) => {\n \"worklet\";\n\n const keyboardFrame = interpolate(\n e.height,\n [0, keyboardHeight.value],\n [0, keyboardHeight.value + extraKeyboardSpace],\n );\n\n currentKeyboardFrameHeight.value = keyboardFrame;\n },\n [extraKeyboardSpace],\n );\n\n const updateLayoutFromSelection = useCallback(() => {\n \"worklet\";\n\n const customHeight = lastSelection.value?.selection.end.y;\n\n if (!input.value?.layout || customHeight === undefined) {\n return false;\n }\n\n layout.value = {\n ...input.value,\n layout: {\n ...input.value.layout,\n // when we have multiline input with limited amount of lines, then custom height can be very big\n // so we clamp it to max input height\n height: clamp(customHeight, 0, input.value.layout.height),\n },\n };\n\n return true;\n }, [input, lastSelection, layout]);\n const scrollFromCurrentPosition = useCallback(() => {\n \"worklet\";\n\n const prevLayout = layout.value;\n\n if (!updateLayoutFromSelection()) {\n return;\n }\n\n performScrollWithPositionRestoration(position.value);\n\n layout.value = prevLayout;\n }, [performScrollWithPositionRestoration]);\n const onChangeText = useCallback(() => {\n \"worklet\";\n scrollFromCurrentPosition();\n }, [scrollFromCurrentPosition]);\n const onChangeTextHandler = useMemo(\n () => debounce(onChangeText, 200),\n [onChangeText],\n );\n const onSelectionChange = useCallback(\n (e: FocusedInputSelectionChangedEvent) => {\n \"worklet\";\n\n const lastTarget = lastSelection.value?.target;\n const latestSelection = lastSelection.value?.selection;\n\n lastSelection.value = e;\n selectionUpdatedSinceHide.value = true;\n\n if (e.target !== lastTarget || pendingSelectionForFocus.value) {\n if (pendingSelectionForFocus.value) {\n // selection arrived after onStart - complete the deferred setup\n pendingSelectionForFocus.value = false;\n updateLayoutFromSelection();\n\n // if keyboard was already visible (focus change, no onMove expected),\n // perform the deferred scroll now\n if (!keyboardWillAppear.value && keyboardHeight.value > 0) {\n position.value += maybeScroll(keyboardHeight.value, true);\n }\n }\n\n return;\n }\n // caret in the end + end coordinates has been changed -> we moved to a new line\n // so input may grow\n if (\n e.selection.end.position === e.selection.start.position &&\n latestSelection?.end.y !== e.selection.end.y\n ) {\n return scrollFromCurrentPosition();\n }\n // selection has been changed\n if (e.selection.start.position !== e.selection.end.position) {\n return scrollFromCurrentPosition();\n }\n\n onChangeTextHandler();\n },\n [\n scrollFromCurrentPosition,\n onChangeTextHandler,\n updateLayoutFromSelection,\n maybeScroll,\n ],\n );\n\n useFocusedInputHandler(\n {\n onSelectionChange: onSelectionChange,\n },\n [onSelectionChange],\n );\n\n useSmoothKeyboardHandler(\n {\n onStart: (e) => {\n \"worklet\";\n\n const keyboardWillChangeSize =\n keyboardHeight.value !== e.height && e.height > 0;\n\n keyboardWillAppear.value = e.height > 0 && keyboardHeight.value === 0;\n\n const keyboardWillHide = e.height === 0;\n const focusWasChanged =\n (tag.value !== e.target && e.target !== -1) ||\n keyboardWillChangeSize;\n\n if (keyboardWillChangeSize) {\n initialKeyboardSize.value = keyboardHeight.value;\n }\n\n if (keyboardWillHide) {\n // on back transition need to interpolate as [0, keyboardHeight]\n initialKeyboardSize.value = 0;\n scrollPosition.value = scrollBeforeKeyboardMovement.value;\n pendingSelectionForFocus.value = false;\n }\n\n if (\n keyboardWillAppear.value ||\n keyboardWillChangeSize ||\n focusWasChanged\n ) {\n // persist scroll value\n scrollPosition.value = position.value;\n // just persist height - later will be used in interpolation\n keyboardHeight.value = e.height;\n\n // insets mode: set the full contentInset upfront so that maybeScroll\n // calculations are correct from the very first onMove frame.\n // layout mode: do NOT set it here — the spacer must grow frame-by-frame\n // in onMove to avoid a premature full-height jump before the keyboard moves.\n if (mode === \"insets\") {\n syncKeyboardFrame(e);\n }\n }\n\n // focus was changed\n if (focusWasChanged) {\n tag.value = e.target;\n\n if (\n lastSelection.value?.target === e.target &&\n selectionUpdatedSinceHide.value\n ) {\n // fresh selection arrived before onStart - use it to update layout\n updateLayoutFromSelection();\n pendingSelectionForFocus.value = false;\n } else {\n // selection hasn't arrived yet for the new target (iOS 15),\n // or it's stale from previous session (Android refocus same input).\n // Use stale selection as best-effort fallback if available for same target,\n // otherwise fall back to full input layout.\n // Will be corrected if a fresh onSelectionChange arrives.\n if (lastSelection.value?.target === e.target) {\n updateLayoutFromSelection();\n } else if (input.value) {\n layout.value = input.value;\n }\n pendingSelectionForFocus.value = true;\n }\n\n // save current scroll position - when keyboard will hide we'll reuse\n // this value to achieve smooth hide effect\n scrollBeforeKeyboardMovement.value = position.value;\n }\n\n if (focusWasChanged && !keyboardWillAppear.value) {\n if (!pendingSelectionForFocus.value) {\n // update position on scroll value, so `onEnd` handler\n // will pick up correct values\n position.value += maybeScroll(e.height, true);\n }\n }\n\n if (mode === \"insets\") {\n ghostViewSpace.value =\n position.value +\n scrollViewLayout.value.height -\n scrollViewContentSize.value.height;\n\n if (ghostViewSpace.value > 0) {\n scrollPosition.value = position.value;\n }\n }\n },\n onMove: (e) => {\n \"worklet\";\n\n if (\n pendingSelectionForFocus.value &&\n lastSelection.value?.target !== tag.value\n ) {\n return;\n }\n\n if (removeGhostPadding(e.height)) {\n return;\n }\n\n // layout mode: drive the spacer view animation frame-by-frame\n if (mode === \"layout\") {\n syncKeyboardFrame(e);\n }\n\n // if the user has set disableScrollOnKeyboardHide, only auto-scroll when the keyboard opens\n if (!disableScrollOnKeyboardHide || keyboardWillAppear.value) {\n maybeScroll(e.height);\n }\n },\n onEnd: (e) => {\n \"worklet\";\n\n if (e.height === 0) {\n removeGhostPadding(e.height);\n }\n\n keyboardHeight.value = e.height;\n scrollPosition.value = position.value;\n\n if (e.height === 0) {\n selectionUpdatedSinceHide.value = false;\n } else if (keyboardWillAppear.value) {\n // keyboard fully shown after appearing from hidden state — clear\n // pending flag to prevent leaking into next focus-change session.\n // Only when the keyboard was actually appearing (not a focus switch\n // with same keyboard height), otherwise we'd clear the flag before\n // onSelectionChange has a chance to process it.\n pendingSelectionForFocus.value = false;\n }\n\n syncKeyboardFrame(e);\n },\n },\n [\n mode,\n maybeScroll,\n removeGhostPadding,\n disableScrollOnKeyboardHide,\n syncKeyboardFrame,\n ],\n );\n\n const synchronize = useCallback(async () => {\n await update();\n\n requestAnimationFrame(() => {\n runOnUI(() => {\n \"worklet\";\n\n scrollFromCurrentPosition();\n })();\n });\n }, [update, scrollFromCurrentPosition]);\n\n useImperativeHandle(\n ref,\n () => {\n const scrollView = scrollViewRef.current;\n\n if (scrollView) {\n const scrollViewWithMethods =\n scrollView as KeyboardAwareScrollViewRef;\n\n scrollViewWithMethods.assureFocusedInputVisible = () => {\n synchronize();\n };\n\n return scrollViewWithMethods;\n }\n\n return {\n assureFocusedInputVisible: () => {\n synchronize();\n },\n } as KeyboardAwareScrollViewRef;\n },\n [synchronize],\n );\n\n useEffect(() => {\n synchronize();\n }, [bottomOffset]);\n\n useAnimatedReaction(\n () => input.value,\n (current, previous) => {\n if (\n current?.target === previous?.target &&\n current?.layout.height !== previous?.layout.height\n ) {\n // input has changed layout - let's check if we need to scroll\n // may happen when you paste text, then onSelectionChange will be\n // fired earlier than text actually changes its layout\n scrollFromCurrentPosition();\n }\n },\n [],\n );\n\n const padding = useDerivedValue(\n () => (enabled ? currentKeyboardFrameHeight.value : 0),\n [enabled],\n );\n // layout mode only: a spacer view whose paddingBottom grows with the keyboard.\n // The `+ 1` ensures the scroll view never reaches its absolute end during animation,\n // avoiding the layout recalculation that triggers on every frame at the boundary.\n // see: https://github.com/kirillzyusko/react-native-keyboard-controller/pull/342\n const layoutSpacerStyle = useAnimatedStyle(\n () =>\n enabled && mode === \"layout\"\n ? { paddingBottom: currentKeyboardFrameHeight.value + 1 }\n : {},\n [enabled, mode],\n );\n\n if (mode === \"layout\") {\n return (\n <ScrollViewComponent\n ref={onRef}\n {...rest}\n scrollEventThrottle={16}\n onLayout={onScrollViewLayout}\n >\n {children}\n {enabled && <Reanimated.View style={layoutSpacerStyle} />}\n </ScrollViewComponent>\n );\n }\n\n return (\n <ScrollViewWithBottomPadding\n ref={onRef}\n {...rest}\n bottomPadding={padding}\n scrollEventThrottle={16}\n ScrollViewComponent={ScrollViewComponent}\n onLayout={onScrollViewLayout}\n >\n {children}\n </ScrollViewWithBottomPadding>\n );\n },\n);\n\nexport default KeyboardAwareScrollView;\n"],"mappings":";;;;;;AAAA,IAAAA,MAAA,GAAAC,uBAAA,CAAAC,OAAA;AAOA,IAAAC,sBAAA,GAAAF,uBAAA,CAAAC,OAAA;AAYA,IAAAE,SAAA,GAAAF,OAAA;AACA,IAAAG,MAAA,GAAAH,OAAA;AAKA,IAAAI,eAAA,GAAAJ,OAAA;AACA,IAAAK,eAAA,GAAAC,sBAAA,CAAAN,OAAA;AACA,IAAAO,eAAA,GAAAD,sBAAA,CAAAN,OAAA;AACA,IAAAQ,4BAAA,GAAAF,sBAAA,CAAAN,OAAA;AAEA,IAAAS,yBAAA,GAAAT,OAAA;AACA,IAAAU,MAAA,GAAAV,OAAA;AAA0E,SAAAM,uBAAAK,CAAA,WAAAA,CAAA,IAAAA,CAAA,CAAAC,UAAA,GAAAD,CAAA,KAAAE,OAAA,EAAAF,CAAA;AAAA,SAAAZ,wBAAAY,CAAA,EAAAG,CAAA,6BAAAC,OAAA,MAAAC,CAAA,OAAAD,OAAA,IAAAE,CAAA,OAAAF,OAAA,YAAAhB,uBAAA,YAAAA,CAAAY,CAAA,EAAAG,CAAA,SAAAA,CAAA,IAAAH,CAAA,IAAAA,CAAA,CAAAC,UAAA,SAAAD,CAAA,MAAAO,CAAA,EAAAC,CAAA,EAAAC,CAAA,KAAAC,SAAA,QAAAR,OAAA,EAAAF,CAAA,iBAAAA,CAAA,uBAAAA,CAAA,yBAAAA,CAAA,SAAAS,CAAA,MAAAF,CAAA,GAAAJ,CAAA,GAAAG,CAAA,GAAAD,CAAA,QAAAE,CAAA,CAAAI,GAAA,CAAAX,CAAA,UAAAO,CAAA,CAAAK,GAAA,CAAAZ,CAAA,GAAAO,CAAA,CAAAM,GAAA,CAAAb,CAAA,EAAAS,CAAA,gBAAAN,CAAA,IAAAH,CAAA,gBAAAG,CAAA,OAAAW,cAAA,CAAAC,IAAA,CAAAf,CAAA,EAAAG,CAAA,OAAAK,CAAA,IAAAD,CAAA,GAAAS,MAAA,CAAAC,cAAA,KAAAD,MAAA,CAAAE,wBAAA,CAAAlB,CAAA,EAAAG,CAAA,OAAAK,CAAA,CAAAI,GAAA,IAAAJ,CAAA,CAAAK,GAAA,IAAAN,CAAA,CAAAE,CAAA,EAAAN,CAAA,EAAAK,CAAA,IAAAC,CAAA,CAAAN,CAAA,IAAAH,CAAA,CAAAG,CAAA,WAAAM,CAAA,KAAAT,CAAA,EAAAG,CAAA;AAAA,SAAAgB,SAAA,WAAAA,QAAA,GAAAH,MAAA,CAAAI,MAAA,GAAAJ,MAAA,CAAAI,MAAA,CAAAC,IAAA,eAAAf,CAAA,aAAAN,CAAA,MAAAA,CAAA,GAAAsB,SAAA,CAAAC,MAAA,EAAAvB,CAAA,UAAAG,CAAA,GAAAmB,SAAA,CAAAtB,CAAA,YAAAK,CAAA,IAAAF,CAAA,OAAAW,cAAA,CAAAC,IAAA,CAAAZ,CAAA,EAAAE,CAAA,MAAAC,CAAA,CAAAD,CAAA,IAAAF,CAAA,CAAAE,CAAA,aAAAC,CAAA,KAAAa,QAAA,CAAAK,KAAA,OAAAF,SAAA;AAW1E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAMG,uBAAuB,gBAAG,IAAAC,iBAAU,EAIxC,CACE;EACEC,QAAQ;EACRC,QAAQ;EACRC,YAAY,GAAG,CAAC;EAChBC,2BAA2B,GAAG,KAAK;EACnCC,OAAO,GAAG,IAAI;EACdC,kBAAkB,GAAG,CAAC;EACtBC,IAAI,GAAG,QAAQ;EACfC,mBAAmB,GAAGC,8BAAU,CAACC,UAAU;EAC3CC,aAAa;EACb,GAAGC;AACL,CAAC,EACDC,GAAG,KACA;EACH,MAAMC,qBAAqB,GAAG,IAAAC,qCAAc,EAAwB,CAAC;EACrE,MAAMC,aAAa,GAAGC,cAAK,CAACC,MAAM,CAAa,IAAI,CAAC;EACpD,MAAMC,KAAK,GAAG,IAAAC,uBAAc,EAACN,qBAAqB,EAAEE,aAAa,CAAC;EAClE,MAAMK,gBAAgB,GAAG,IAAAC,qCAAc,EAAgB,IAAI,CAAC;EAC5D,MAAMC,cAAc,GAAG,IAAAD,qCAAc,EAAC,CAAC,CAAC;EACxC,MAAM;IACJE,MAAM,EAAEC,QAAQ;IAChBC,MAAM,EAAEC,gBAAgB;IACxBC,IAAI,EAAEC;EACR,CAAC,GAAG,IAAAC,uBAAc,EAAChB,qBAAqB,CAAC;EACzC,MAAMiB,0BAA0B,GAAG,IAAAT,qCAAc,EAAC,CAAC,CAAC;EACpD,MAAMU,cAAc,GAAG,IAAAV,qCAAc,EAAC,CAAC,CAAC;EACxC,MAAMW,kBAAkB,GAAG,IAAAX,qCAAc,EAAC,KAAK,CAAC;EAChD,MAAMY,GAAG,GAAG,IAAAZ,qCAAc,EAAC,CAAC,CAAC,CAAC;EAC9B,MAAMa,mBAAmB,GAAG,IAAAb,qCAAc,EAAC,CAAC,CAAC;EAC7C,MAAMc,4BAA4B,GAAG,IAAAd,qCAAc,EAAC,CAAC,CAAC;EACtD,MAAM;IAAEe,KAAK;IAAEC;EAAO,CAAC,GAAG,IAAAC,gCAAyB,EAAC,CAAC;EACrD,MAAMb,MAAM,GAAG,IAAAJ,qCAAc,EAAwC,IAAI,CAAC;EAC1E,MAAMkB,aAAa,GACjB,IAAAlB,qCAAc,EAA2C,IAAI,CAAC;EAChE,MAAMmB,cAAc,GAAG,IAAAnB,qCAAc,EAAC,CAAC,CAAC,CAAC;EACzC,MAAMoB,wBAAwB,GAAG,IAAApB,qCAAc,EAAC,KAAK,CAAC;EACtD,MAAMqB,yBAAyB,GAAG,IAAArB,qCAAc,EAAC,KAAK,CAAC;EACvD,MAAMsB,eAAe,GAAG,IAAAtB,qCAAc,EAAC,CAAC,CAAC;EAEzC,MAAM;IAAEuB;EAAO,CAAC,GAAG,IAAAC,0BAAmB,EAAC,CAAC;EAExC,MAAMC,kBAAkB,GAAG,IAAAC,kBAAW,EACpC,MAAO1E,CAAoB,IAAK;IAC9B,MAAM2E,MAAM,GAAG,IAAAC,8BAAc,EAACpC,qBAAqB,CAACqC,OAAO,CAAC;IAE5D9B,gBAAgB,CAAC+B,KAAK,GAAGH,MAAM;IAE/B/C,QAAQ,aAARA,QAAQ,eAARA,QAAQ,CAAG5B,CAAC,CAAC;IAEb,IAAI2E,MAAM,KAAK,IAAI,EAAE;MACnB,IAAI;QACF,MAAM;UAAEI;QAAE,CAAC,GAAG,MAAMC,kCAAwB,CAACC,oBAAoB,CAC/DN,MACF,CAAC;QAEDL,eAAe,CAACQ,KAAK,GAAGC,CAAC;MAC3B,CAAC,CAAC,MAAM;QACN;MAAA;IAEJ;EACF,CAAC,EACD,CAACnD,QAAQ,CACX,CAAC;;EAED;AACJ;AACA;EACI,MAAMsD,WAAW,GAAG,IAAAR,kBAAW,EAC7B,CAAC1E,CAAS,EAAEmF,QAAiB,GAAG,KAAK,KAAK;IACxC,SAAS;;IAAC,IAAAC,aAAA,EAAAC,cAAA,EAAAC,cAAA;IAEV,IAAI,CAACvD,OAAO,EAAE;MACZ,OAAO,CAAC;IACV;;IAEA;IACA,IAAI,EAAAqD,aAAA,GAAAhC,MAAM,CAAC0B,KAAK,cAAAM,aAAA,uBAAZA,aAAA,CAAcG,sBAAsB,MAAKxC,gBAAgB,CAAC+B,KAAK,EAAE;MACnE,OAAO,CAAC;IACV;IAEA,MAAMU,WAAW,GAAGjB,MAAM,GAAGb,cAAc,CAACoB,KAAK;IACjD,MAAMW,SAAS,GAAG,EAAAJ,cAAA,GAAAjC,MAAM,CAAC0B,KAAK,cAAAO,cAAA,uBAAZA,cAAA,CAAcjC,MAAM,CAACqC,SAAS,KAAI,CAAC;IACrD,MAAMC,WAAW,GAAG,EAAAJ,cAAA,GAAAlC,MAAM,CAAC0B,KAAK,cAAAQ,cAAA,uBAAZA,cAAA,CAAclC,MAAM,CAACmB,MAAM,KAAI,CAAC;IACpD,MAAMoB,KAAK,GAAGF,SAAS,GAAGC,WAAW;IAErC,IAAIF,WAAW,GAAGG,KAAK,IAAI9D,YAAY,EAAE;MACvC,MAAM+D,gBAAgB,GACpBlC,cAAc,CAACoB,KAAK,IAAIP,MAAM,GAAGoB,KAAK,CAAC,GAAG9D,YAAY;MACxD,MAAMgE,oBAAoB,GAAG,IAAAC,kCAAW,EACtC9F,CAAC,EACD,CAAC6D,mBAAmB,CAACiB,KAAK,EAAEpB,cAAc,CAACoB,KAAK,CAAC,EACjD,CACE,CAAC,EACD,IAAAiB,4CAAqC,EACnCH,gBAAgB,GAAG3C,cAAc,CAAC6B,KAAK,EACvCzC,aACF,CAAC,GAAGY,cAAc,CAAC6B,KAAK,CAE5B,CAAC;MACD,MAAMkB,aAAa,GACjBC,IAAI,CAACC,GAAG,CAACL,oBAAoB,EAAE,CAAC,CAAC,GAAG5C,cAAc,CAAC6B,KAAK;MAE1D,IAAAqB,+BAAQ,EAAC3D,qBAAqB,EAAE,CAAC,EAAEwD,aAAa,EAAEb,QAAQ,CAAC;MAE3D,OAAOU,oBAAoB;IAC7B;IAEA,IAAIF,KAAK,GAAGrB,eAAe,CAACQ,KAAK,EAAE;MACjC,MAAMsB,gBAAgB,GAAGZ,WAAW,GAAG3D,YAAY;MACnD,MAAMwE,WAAW,GAAGpD,cAAc,CAAC6B,KAAK,GAAGa,KAAK;MAEhD,IAAAQ,+BAAQ,EACN3D,qBAAqB,EACrB,CAAC,EACD6D,WAAW,GAAGD,gBAAgB,EAC9BjB,QACF,CAAC;IACH;IAEA,OAAO,CAAC;EACV,CAAC,EACD,CAACtD,YAAY,EAAEE,OAAO,EAAEwC,MAAM,EAAElC,aAAa,CAC/C,CAAC;EACD,MAAMiE,kBAAkB,GAAG,IAAA5B,kBAAW,EACnC1E,CAAS,IAAK;IACb,SAAS;;IAET;IACA;IACA,IAAIiC,IAAI,KAAK,QAAQ,EAAE;MACrB,OAAO,KAAK;IACd;;IAEA;IACA;IACA;IACA,IAAI,CAAC0B,kBAAkB,CAACmB,KAAK,IAAIX,cAAc,CAACW,KAAK,GAAG,CAAC,EAAE;MACzD,IAAAqB,+BAAQ,EACN3D,qBAAqB,EACrB,CAAC,EACDS,cAAc,CAAC6B,KAAK,GAClB,IAAAgB,kCAAW,EACT9F,CAAC,EACD,CAAC6D,mBAAmB,CAACiB,KAAK,EAAEpB,cAAc,CAACoB,KAAK,CAAC,EACjD,CAACX,cAAc,CAACW,KAAK,EAAE,CAAC,CAC1B,CAAC,EACH,KACF,CAAC;MAED,OAAO,IAAI;IACb;IAEA,OAAO,KAAK;EACd,CAAC,EACD,CAAC7C,IAAI,CACP,CAAC;EACD,MAAMsE,oCAAoC,GAAG,IAAA7B,kBAAW,EACrD8B,WAAmB,IAAK;IACvB,SAAS;;IAET,MAAMC,UAAU,GAAGxD,cAAc,CAAC6B,KAAK;;IAEvC;IACA7B,cAAc,CAAC6B,KAAK,GAAG0B,WAAW;IAClCtB,WAAW,CAACxB,cAAc,CAACoB,KAAK,EAAE,IAAI,CAAC;IACvC7B,cAAc,CAAC6B,KAAK,GAAG2B,UAAU;EACnC,CAAC,EACD,CAACxD,cAAc,EAAES,cAAc,EAAEwB,WAAW,CAC9C,CAAC;EACD,MAAMwB,iBAAiB,GAAG,IAAAhC,kBAAW,EAClC1E,CAAc,IAAK;IAClB,SAAS;;IAET,MAAM2G,aAAa,GAAG,IAAAb,kCAAW,EAC/B9F,CAAC,CAACuE,MAAM,EACR,CAAC,CAAC,EAAEb,cAAc,CAACoB,KAAK,CAAC,EACzB,CAAC,CAAC,EAAEpB,cAAc,CAACoB,KAAK,GAAG9C,kBAAkB,CAC/C,CAAC;IAEDyB,0BAA0B,CAACqB,KAAK,GAAG6B,aAAa;EAClD,CAAC,EACD,CAAC3E,kBAAkB,CACrB,CAAC;EAED,MAAM4E,yBAAyB,GAAG,IAAAlC,kBAAW,EAAC,MAAM;IAClD,SAAS;;IAAC,IAAAmC,oBAAA,EAAAC,YAAA;IAEV,MAAMC,YAAY,IAAAF,oBAAA,GAAG3C,aAAa,CAACY,KAAK,cAAA+B,oBAAA,uBAAnBA,oBAAA,CAAqBG,SAAS,CAACC,GAAG,CAAClC,CAAC;IAEzD,IAAI,GAAA+B,YAAA,GAAC/C,KAAK,CAACe,KAAK,cAAAgC,YAAA,eAAXA,YAAA,CAAa1D,MAAM,KAAI2D,YAAY,KAAKG,SAAS,EAAE;MACtD,OAAO,KAAK;IACd;IAEA9D,MAAM,CAAC0B,KAAK,GAAG;MACb,GAAGf,KAAK,CAACe,KAAK;MACd1B,MAAM,EAAE;QACN,GAAGW,KAAK,CAACe,KAAK,CAAC1B,MAAM;QACrB;QACA;QACAmB,MAAM,EAAE,IAAA4C,4BAAK,EAACJ,YAAY,EAAE,CAAC,EAAEhD,KAAK,CAACe,KAAK,CAAC1B,MAAM,CAACmB,MAAM;MAC1D;IACF,CAAC;IAED,OAAO,IAAI;EACb,CAAC,EAAE,CAACR,KAAK,EAAEG,aAAa,EAAEd,MAAM,CAAC,CAAC;EAClC,MAAMgE,yBAAyB,GAAG,IAAA1C,kBAAW,EAAC,MAAM;IAClD,SAAS;;IAET,MAAM2C,UAAU,GAAGjE,MAAM,CAAC0B,KAAK;IAE/B,IAAI,CAAC8B,yBAAyB,CAAC,CAAC,EAAE;MAChC;IACF;IAEAL,oCAAoC,CAACpD,QAAQ,CAAC2B,KAAK,CAAC;IAEpD1B,MAAM,CAAC0B,KAAK,GAAGuC,UAAU;EAC3B,CAAC,EAAE,CAACd,oCAAoC,CAAC,CAAC;EAC1C,MAAMe,YAAY,GAAG,IAAA5C,kBAAW,EAAC,MAAM;IACrC,SAAS;;IACT0C,yBAAyB,CAAC,CAAC;EAC7B,CAAC,EAAE,CAACA,yBAAyB,CAAC,CAAC;EAC/B,MAAMG,mBAAmB,GAAG,IAAAC,cAAO,EACjC,MAAM,IAAAC,eAAQ,EAACH,YAAY,EAAE,GAAG,CAAC,EACjC,CAACA,YAAY,CACf,CAAC;EACD,MAAMI,iBAAiB,GAAG,IAAAhD,kBAAW,EAClC1E,CAAoC,IAAK;IACxC,SAAS;;IAAC,IAAA2H,qBAAA,EAAAC,qBAAA;IAEV,MAAMC,UAAU,IAAAF,qBAAA,GAAGzD,aAAa,CAACY,KAAK,cAAA6C,qBAAA,uBAAnBA,qBAAA,CAAqBG,MAAM;IAC9C,MAAMC,eAAe,IAAAH,qBAAA,GAAG1D,aAAa,CAACY,KAAK,cAAA8C,qBAAA,uBAAnBA,qBAAA,CAAqBZ,SAAS;IAEtD9C,aAAa,CAACY,KAAK,GAAG9E,CAAC;IACvBqE,yBAAyB,CAACS,KAAK,GAAG,IAAI;IAEtC,IAAI9E,CAAC,CAAC8H,MAAM,KAAKD,UAAU,IAAIzD,wBAAwB,CAACU,KAAK,EAAE;MAC7D,IAAIV,wBAAwB,CAACU,KAAK,EAAE;QAClC;QACAV,wBAAwB,CAACU,KAAK,GAAG,KAAK;QACtC8B,yBAAyB,CAAC,CAAC;;QAE3B;QACA;QACA,IAAI,CAACjD,kBAAkB,CAACmB,KAAK,IAAIpB,cAAc,CAACoB,KAAK,GAAG,CAAC,EAAE;UACzD3B,QAAQ,CAAC2B,KAAK,IAAII,WAAW,CAACxB,cAAc,CAACoB,KAAK,EAAE,IAAI,CAAC;QAC3D;MACF;MAEA;IACF;IACA;IACA;IACA,IACE9E,CAAC,CAACgH,SAAS,CAACC,GAAG,CAAC9D,QAAQ,KAAKnD,CAAC,CAACgH,SAAS,CAACgB,KAAK,CAAC7E,QAAQ,IACvD,CAAA4E,eAAe,aAAfA,eAAe,uBAAfA,eAAe,CAAEd,GAAG,CAAClC,CAAC,MAAK/E,CAAC,CAACgH,SAAS,CAACC,GAAG,CAAClC,CAAC,EAC5C;MACA,OAAOqC,yBAAyB,CAAC,CAAC;IACpC;IACA;IACA,IAAIpH,CAAC,CAACgH,SAAS,CAACgB,KAAK,CAAC7E,QAAQ,KAAKnD,CAAC,CAACgH,SAAS,CAACC,GAAG,CAAC9D,QAAQ,EAAE;MAC3D,OAAOiE,yBAAyB,CAAC,CAAC;IACpC;IAEAG,mBAAmB,CAAC,CAAC;EACvB,CAAC,EACD,CACEH,yBAAyB,EACzBG,mBAAmB,EACnBX,yBAAyB,EACzB1B,WAAW,CAEf,CAAC;EAED,IAAA+C,6BAAsB,EACpB;IACEP,iBAAiB,EAAEA;EACrB,CAAC,EACD,CAACA,iBAAiB,CACpB,CAAC;EAED,IAAAQ,kDAAwB,EACtB;IACEC,OAAO,EAAGnI,CAAC,IAAK;MACd,SAAS;;MAET,MAAMoI,sBAAsB,GAC1B1E,cAAc,CAACoB,KAAK,KAAK9E,CAAC,CAACuE,MAAM,IAAIvE,CAAC,CAACuE,MAAM,GAAG,CAAC;MAEnDZ,kBAAkB,CAACmB,KAAK,GAAG9E,CAAC,CAACuE,MAAM,GAAG,CAAC,IAAIb,cAAc,CAACoB,KAAK,KAAK,CAAC;MAErE,MAAMuD,gBAAgB,GAAGrI,CAAC,CAACuE,MAAM,KAAK,CAAC;MACvC,MAAM+D,eAAe,GAClB1E,GAAG,CAACkB,KAAK,KAAK9E,CAAC,CAAC8H,MAAM,IAAI9H,CAAC,CAAC8H,MAAM,KAAK,CAAC,CAAC,IAC1CM,sBAAsB;MAExB,IAAIA,sBAAsB,EAAE;QAC1BvE,mBAAmB,CAACiB,KAAK,GAAGpB,cAAc,CAACoB,KAAK;MAClD;MAEA,IAAIuD,gBAAgB,EAAE;QACpB;QACAxE,mBAAmB,CAACiB,KAAK,GAAG,CAAC;QAC7B7B,cAAc,CAAC6B,KAAK,GAAGhB,4BAA4B,CAACgB,KAAK;QACzDV,wBAAwB,CAACU,KAAK,GAAG,KAAK;MACxC;MAEA,IACEnB,kBAAkB,CAACmB,KAAK,IACxBsD,sBAAsB,IACtBE,eAAe,EACf;QACA;QACArF,cAAc,CAAC6B,KAAK,GAAG3B,QAAQ,CAAC2B,KAAK;QACrC;QACApB,cAAc,CAACoB,KAAK,GAAG9E,CAAC,CAACuE,MAAM;;QAE/B;QACA;QACA;QACA;QACA,IAAItC,IAAI,KAAK,QAAQ,EAAE;UACrByE,iBAAiB,CAAC1G,CAAC,CAAC;QACtB;MACF;;MAEA;MACA,IAAIsI,eAAe,EAAE;QAAA,IAAAC,qBAAA;QACnB3E,GAAG,CAACkB,KAAK,GAAG9E,CAAC,CAAC8H,MAAM;QAEpB,IACE,EAAAS,qBAAA,GAAArE,aAAa,CAACY,KAAK,cAAAyD,qBAAA,uBAAnBA,qBAAA,CAAqBT,MAAM,MAAK9H,CAAC,CAAC8H,MAAM,IACxCzD,yBAAyB,CAACS,KAAK,EAC/B;UACA;UACA8B,yBAAyB,CAAC,CAAC;UAC3BxC,wBAAwB,CAACU,KAAK,GAAG,KAAK;QACxC,CAAC,MAAM;UAAA,IAAA0D,qBAAA;UACL;UACA;UACA;UACA;UACA;UACA,IAAI,EAAAA,qBAAA,GAAAtE,aAAa,CAACY,KAAK,cAAA0D,qBAAA,uBAAnBA,qBAAA,CAAqBV,MAAM,MAAK9H,CAAC,CAAC8H,MAAM,EAAE;YAC5ClB,yBAAyB,CAAC,CAAC;UAC7B,CAAC,MAAM,IAAI7C,KAAK,CAACe,KAAK,EAAE;YACtB1B,MAAM,CAAC0B,KAAK,GAAGf,KAAK,CAACe,KAAK;UAC5B;UACAV,wBAAwB,CAACU,KAAK,GAAG,IAAI;QACvC;;QAEA;QACA;QACAhB,4BAA4B,CAACgB,KAAK,GAAG3B,QAAQ,CAAC2B,KAAK;MACrD;MAEA,IAAIwD,eAAe,IAAI,CAAC3E,kBAAkB,CAACmB,KAAK,EAAE;QAChD,IAAI,CAACV,wBAAwB,CAACU,KAAK,EAAE;UACnC;UACA;UACA3B,QAAQ,CAAC2B,KAAK,IAAII,WAAW,CAAClF,CAAC,CAACuE,MAAM,EAAE,IAAI,CAAC;QAC/C;MACF;MAEA,IAAItC,IAAI,KAAK,QAAQ,EAAE;QACrBkC,cAAc,CAACW,KAAK,GAClB3B,QAAQ,CAAC2B,KAAK,GACdzB,gBAAgB,CAACyB,KAAK,CAACP,MAAM,GAC7BhB,qBAAqB,CAACuB,KAAK,CAACP,MAAM;QAEpC,IAAIJ,cAAc,CAACW,KAAK,GAAG,CAAC,EAAE;UAC5B7B,cAAc,CAAC6B,KAAK,GAAG3B,QAAQ,CAAC2B,KAAK;QACvC;MACF;IACF,CAAC;IACD2D,MAAM,EAAGzI,CAAC,IAAK;MACb,SAAS;;MAAC,IAAA0I,qBAAA;MAEV,IACEtE,wBAAwB,CAACU,KAAK,IAC9B,EAAA4D,qBAAA,GAAAxE,aAAa,CAACY,KAAK,cAAA4D,qBAAA,uBAAnBA,qBAAA,CAAqBZ,MAAM,MAAKlE,GAAG,CAACkB,KAAK,EACzC;QACA;MACF;MAEA,IAAIwB,kBAAkB,CAACtG,CAAC,CAACuE,MAAM,CAAC,EAAE;QAChC;MACF;;MAEA;MACA,IAAItC,IAAI,KAAK,QAAQ,EAAE;QACrByE,iBAAiB,CAAC1G,CAAC,CAAC;MACtB;;MAEA;MACA,IAAI,CAAC8B,2BAA2B,IAAI6B,kBAAkB,CAACmB,KAAK,EAAE;QAC5DI,WAAW,CAAClF,CAAC,CAACuE,MAAM,CAAC;MACvB;IACF,CAAC;IACDoE,KAAK,EAAG3I,CAAC,IAAK;MACZ,SAAS;;MAET,IAAIA,CAAC,CAACuE,MAAM,KAAK,CAAC,EAAE;QAClB+B,kBAAkB,CAACtG,CAAC,CAACuE,MAAM,CAAC;MAC9B;MAEAb,cAAc,CAACoB,KAAK,GAAG9E,CAAC,CAACuE,MAAM;MAC/BtB,cAAc,CAAC6B,KAAK,GAAG3B,QAAQ,CAAC2B,KAAK;MAErC,IAAI9E,CAAC,CAACuE,MAAM,KAAK,CAAC,EAAE;QAClBF,yBAAyB,CAACS,KAAK,GAAG,KAAK;MACzC,CAAC,MAAM,IAAInB,kBAAkB,CAACmB,KAAK,EAAE;QACnC;QACA;QACA;QACA;QACA;QACAV,wBAAwB,CAACU,KAAK,GAAG,KAAK;MACxC;MAEA4B,iBAAiB,CAAC1G,CAAC,CAAC;IACtB;EACF,CAAC,EACD,CACEiC,IAAI,EACJiD,WAAW,EACXoB,kBAAkB,EAClBxE,2BAA2B,EAC3B4E,iBAAiB,CAErB,CAAC;EAED,MAAMkC,WAAW,GAAG,IAAAlE,kBAAW,EAAC,YAAY;IAC1C,MAAMV,MAAM,CAAC,CAAC;IAEd6E,qBAAqB,CAAC,MAAM;MAC1B,IAAAC,8BAAO,EAAC,MAAM;QACZ,SAAS;;QAET1B,yBAAyB,CAAC,CAAC;MAC7B,CAAC,CAAC,CAAC,CAAC;IACN,CAAC,CAAC;EACJ,CAAC,EAAE,CAACpD,MAAM,EAAEoD,yBAAyB,CAAC,CAAC;EAEvC,IAAA2B,0BAAmB,EACjBxG,GAAG,EACH,MAAM;IACJ,MAAMyG,UAAU,GAAGtG,aAAa,CAACmC,OAAO;IAExC,IAAImE,UAAU,EAAE;MACd,MAAMC,qBAAqB,GACzBD,UAAwC;MAE1CC,qBAAqB,CAACC,yBAAyB,GAAG,MAAM;QACtDN,WAAW,CAAC,CAAC;MACf,CAAC;MAED,OAAOK,qBAAqB;IAC9B;IAEA,OAAO;MACLC,yBAAyB,EAAEA,CAAA,KAAM;QAC/BN,WAAW,CAAC,CAAC;MACf;IACF,CAAC;EACH,CAAC,EACD,CAACA,WAAW,CACd,CAAC;EAED,IAAAO,gBAAS,EAAC,MAAM;IACdP,WAAW,CAAC,CAAC;EACf,CAAC,EAAE,CAAC/G,YAAY,CAAC,CAAC;EAElB,IAAAuH,0CAAmB,EACjB,MAAMrF,KAAK,CAACe,KAAK,EACjB,CAACD,OAAO,EAAEwE,QAAQ,KAAK;IACrB,IACE,CAAAxE,OAAO,aAAPA,OAAO,uBAAPA,OAAO,CAAEiD,MAAM,OAAKuB,QAAQ,aAARA,QAAQ,uBAARA,QAAQ,CAAEvB,MAAM,KACpC,CAAAjD,OAAO,aAAPA,OAAO,uBAAPA,OAAO,CAAEzB,MAAM,CAACmB,MAAM,OAAK8E,QAAQ,aAARA,QAAQ,uBAARA,QAAQ,CAAEjG,MAAM,CAACmB,MAAM,GAClD;MACA;MACA;MACA;MACA6C,yBAAyB,CAAC,CAAC;IAC7B;EACF,CAAC,EACD,EACF,CAAC;EAED,MAAMkC,OAAO,GAAG,IAAAC,sCAAe,EAC7B,MAAOxH,OAAO,GAAG0B,0BAA0B,CAACqB,KAAK,GAAG,CAAE,EACtD,CAAC/C,OAAO,CACV,CAAC;EACD;EACA;EACA;EACA;EACA,MAAMyH,iBAAiB,GAAG,IAAAC,uCAAgB,EACxC,MACE1H,OAAO,IAAIE,IAAI,KAAK,QAAQ,GACxB;IAAEyH,aAAa,EAAEjG,0BAA0B,CAACqB,KAAK,GAAG;EAAE,CAAC,GACvD,CAAC,CAAC,EACR,CAAC/C,OAAO,EAAEE,IAAI,CAChB,CAAC;EAED,IAAIA,IAAI,KAAK,QAAQ,EAAE;IACrB,oBACE9C,MAAA,CAAAe,OAAA,CAAAyJ,aAAA,CAACzH,mBAAmB,EAAAf,QAAA;MAClBoB,GAAG,EAAEM;IAAM,GACPP,IAAI;MACRsH,mBAAmB,EAAE,EAAG;MACxBhI,QAAQ,EAAE6C;IAAmB,IAE5B9C,QAAQ,EACRI,OAAO,iBAAI5C,MAAA,CAAAe,OAAA,CAAAyJ,aAAA,CAACrK,sBAAA,CAAAY,OAAU,CAAC2J,IAAI;MAACC,KAAK,EAAEN;IAAkB,CAAE,CACrC,CAAC;EAE1B;EAEA,oBACErK,MAAA,CAAAe,OAAA,CAAAyJ,aAAA,CAAC9J,4BAAA,CAAAK,OAA2B,EAAAiB,QAAA;IAC1BoB,GAAG,EAAEM;EAAM,GACPP,IAAI;IACRyH,aAAa,EAAET,OAAQ;IACvBM,mBAAmB,EAAE,EAAG;IACxB1H,mBAAmB,EAAEA,mBAAoB;IACzCN,QAAQ,EAAE6C;EAAmB,IAE5B9C,QAC0B,CAAC;AAElC,CACF,CAAC;AAAC,IAAAqI,QAAA,GAAAC,OAAA,CAAA/J,OAAA,GAEauB,uBAAuB","ignoreList":[]}
|
|
@@ -191,7 +191,7 @@ const KeyboardAwareScrollView = /*#__PURE__*/forwardRef(({
|
|
|
191
191
|
|
|
192
192
|
var _lastSelection$value, _input$value;
|
|
193
193
|
const customHeight = (_lastSelection$value = lastSelection.value) === null || _lastSelection$value === void 0 ? void 0 : _lastSelection$value.selection.end.y;
|
|
194
|
-
if (!((_input$value = input.value) !== null && _input$value !== void 0 && _input$value.layout) ||
|
|
194
|
+
if (!((_input$value = input.value) !== null && _input$value !== void 0 && _input$value.layout) || customHeight === undefined) {
|
|
195
195
|
return false;
|
|
196
196
|
}
|
|
197
197
|
layout.value = {
|
|
@@ -333,6 +333,10 @@ const KeyboardAwareScrollView = /*#__PURE__*/forwardRef(({
|
|
|
333
333
|
onMove: e => {
|
|
334
334
|
"worklet";
|
|
335
335
|
|
|
336
|
+
var _lastSelection$value6;
|
|
337
|
+
if (pendingSelectionForFocus.value && ((_lastSelection$value6 = lastSelection.value) === null || _lastSelection$value6 === void 0 ? void 0 : _lastSelection$value6.target) !== tag.value) {
|
|
338
|
+
return;
|
|
339
|
+
}
|
|
336
340
|
if (removeGhostPadding(e.height)) {
|
|
337
341
|
return;
|
|
338
342
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["React","forwardRef","useCallback","useEffect","useImperativeHandle","useMemo","Reanimated","clamp","interpolate","runOnUI","scrollTo","useAnimatedReaction","useAnimatedRef","useAnimatedStyle","useDerivedValue","useSharedValue","KeyboardControllerNative","useFocusedInputHandler","useReanimatedFocusedInput","useWindowDimensions","findNodeHandle","useCombinedRef","useScrollState","ScrollViewWithBottomPadding","useSmoothKeyboardHandler","debounce","scrollDistanceWithRespectToSnapPoints","KeyboardAwareScrollView","children","onLayout","bottomOffset","disableScrollOnKeyboardHide","enabled","extraKeyboardSpace","mode","ScrollViewComponent","ScrollView","snapToOffsets","rest","ref","scrollViewAnimatedRef","scrollViewRef","useRef","onRef","scrollViewTarget","scrollPosition","offset","position","layout","scrollViewLayout","size","scrollViewContentSize","currentKeyboardFrameHeight","keyboardHeight","keyboardWillAppear","tag","initialKeyboardSize","scrollBeforeKeyboardMovement","input","update","lastSelection","ghostViewSpace","pendingSelectionForFocus","selectionUpdatedSinceHide","scrollViewPageY","height","onScrollViewLayout","e","handle","current","value","y","viewPositionInWindow","maybeScroll","animated","_layout$value","_layout$value2","_layout$value3","parentScrollViewTarget","visibleRect","absoluteY","inputHeight","point","relativeScrollTo","interpolatedScrollTo","targetScrollY","Math","max","positionOnScreen","topOfScreen","removeGhostPadding","performScrollWithPositionRestoration","newPosition","prevScroll","syncKeyboardFrame","keyboardFrame","updateLayoutFromSelection","_lastSelection$value","_input$value","customHeight","selection","end","scrollFromCurrentPosition","prevLayout","onChangeText","onChangeTextHandler","onSelectionChange","_lastSelection$value2","_lastSelection$value3","lastTarget","target","latestSelection","start","onStart","keyboardWillChangeSize","keyboardWillHide","focusWasChanged","_lastSelection$value4","_lastSelection$value5","onMove","onEnd","synchronize","requestAnimationFrame","scrollView","scrollViewWithMethods","assureFocusedInputVisible","previous","padding","layoutSpacerStyle","paddingBottom","createElement","_extends","scrollEventThrottle","View","style","bottomPadding"],"sources":["index.tsx"],"sourcesContent":["import React, {\n forwardRef,\n useCallback,\n useEffect,\n useImperativeHandle,\n useMemo,\n} from \"react\";\nimport Reanimated, {\n clamp,\n interpolate,\n runOnUI,\n scrollTo,\n useAnimatedReaction,\n useAnimatedRef,\n useAnimatedStyle,\n useDerivedValue,\n useSharedValue,\n} from \"react-native-reanimated\";\n\nimport { KeyboardControllerNative } from \"../../bindings\";\nimport {\n useFocusedInputHandler,\n useReanimatedFocusedInput,\n useWindowDimensions,\n} from \"../../hooks\";\nimport { findNodeHandle } from \"../../utils/findNodeHandle\";\nimport useCombinedRef from \"../hooks/useCombinedRef\";\nimport useScrollState from \"../hooks/useScrollState\";\nimport ScrollViewWithBottomPadding from \"../ScrollViewWithBottomPadding\";\n\nimport { useSmoothKeyboardHandler } from \"./useSmoothKeyboardHandler\";\nimport { debounce, scrollDistanceWithRespectToSnapPoints } from \"./utils\";\n\nimport type { LayoutChangeEvent, ScrollView } from \"react-native\";\nimport type {\n FocusedInputLayoutChangedEvent,\n FocusedInputSelectionChangedEvent,\n KeyboardAwareScrollViewProps,\n KeyboardAwareScrollViewRef,\n NativeEvent,\n} from \"react-native-keyboard-controller\";\n\n// Everything begins from `onStart` handler. This handler is called every time,\n// when keyboard changes its size or when focused `TextInput` was changed. In\n// this handler we are calculating/memoizing values which later will be used\n// during layout movement. For that we calculate:\n// - layout of focused field (`layout`) - to understand whether there will be overlap\n// - initial keyboard size (`initialKeyboardSize`) - used in scroll interpolation\n// - future keyboard height (`keyboardHeight`) - used in scroll interpolation\n// - current scroll position (`scrollPosition`) - used to scroll from this point\n//\n// Once we've calculated all necessary variables - we can actually start to use them.\n// It happens in `onMove` handler - this function simply calls `maybeScroll` with\n// current keyboard frame height. This functions makes the smooth transition.\n//\n// When the transition has finished we go to `onEnd` handler. In this handler\n// we verify, that the current field is not overlapped within a keyboard frame.\n// For full `onStart`/`onMove`/`onEnd` flow it may look like a redundant thing,\n// however there could be some cases, when `onMove` is not called:\n// - on iOS when TextInput was changed - keyboard transition is instant\n// - on Android when TextInput was changed and keyboard size wasn't changed\n// So `onEnd` handler handle the case, when `onMove` wasn't triggered.\n//\n// ====================================================================================================================+\n// -----------------------------------------------------Flow chart-----------------------------------------------------+\n// ====================================================================================================================+\n//\n// +============================+ +============================+ +==================================+\n// + User Press on TextInput + => + Keyboard starts showing + => + As keyboard moves frame by frame + =>\n// + + + (run `onStart`) + + `onMove` is getting called +\n// +============================+ +============================+ +==================================+\n//\n// +============================+ +============================+ +=====================================+\n// + Keyboard is shown and we + => + User moved focus to + => + Only `onStart`/`onEnd` maybe called +\n// + call `onEnd` handler + + another `TextInput` + + (without involving `onMove`) +\n// +============================+ +============================+ +=====================================+\n//\n\n/**\n * A ScrollView component that automatically handles keyboard appearance and disappearance\n * by adjusting its content position to ensure the focused input remains visible.\n *\n * The component uses a sophisticated animation system to smoothly handle keyboard transitions\n * and maintain proper scroll position during keyboard interactions.\n *\n * @returns A ScrollView component that handles keyboard interactions.\n * @see {@link https://kirillzyusko.github.io/react-native-keyboard-controller/docs/api/components/keyboard-aware-scroll-view|Documentation} page for more details.\n * @example\n * ```tsx\n * <KeyboardAwareScrollView bottomOffset={20}>\n * <TextInput placeholder=\"Enter text\" />\n * <TextInput placeholder=\"Another input\" />\n * </KeyboardAwareScrollView>\n * ```\n */\nconst KeyboardAwareScrollView = forwardRef<\n KeyboardAwareScrollViewRef,\n React.PropsWithChildren<KeyboardAwareScrollViewProps>\n>(\n (\n {\n children,\n onLayout,\n bottomOffset = 0,\n disableScrollOnKeyboardHide = false,\n enabled = true,\n extraKeyboardSpace = 0,\n mode = \"insets\",\n ScrollViewComponent = Reanimated.ScrollView,\n snapToOffsets,\n ...rest\n },\n ref,\n ) => {\n const scrollViewAnimatedRef = useAnimatedRef<Reanimated.ScrollView>();\n const scrollViewRef = React.useRef<ScrollView>(null);\n const onRef = useCombinedRef(scrollViewAnimatedRef, scrollViewRef);\n const scrollViewTarget = useSharedValue<number | null>(null);\n const scrollPosition = useSharedValue(0);\n const {\n offset: position,\n layout: scrollViewLayout,\n size: scrollViewContentSize,\n } = useScrollState(scrollViewAnimatedRef);\n const currentKeyboardFrameHeight = useSharedValue(0);\n const keyboardHeight = useSharedValue(0);\n const keyboardWillAppear = useSharedValue(false);\n const tag = useSharedValue(-1);\n const initialKeyboardSize = useSharedValue(0);\n const scrollBeforeKeyboardMovement = useSharedValue(0);\n const { input, update } = useReanimatedFocusedInput();\n const layout = useSharedValue<FocusedInputLayoutChangedEvent | null>(null);\n const lastSelection =\n useSharedValue<FocusedInputSelectionChangedEvent | null>(null);\n const ghostViewSpace = useSharedValue(-1);\n const pendingSelectionForFocus = useSharedValue(false);\n const selectionUpdatedSinceHide = useSharedValue(false);\n const scrollViewPageY = useSharedValue(0);\n\n const { height } = useWindowDimensions();\n\n const onScrollViewLayout = useCallback(\n async (e: LayoutChangeEvent) => {\n const handle = findNodeHandle(scrollViewAnimatedRef.current);\n\n scrollViewTarget.value = handle;\n\n onLayout?.(e);\n\n if (handle !== null) {\n try {\n const { y } = await KeyboardControllerNative.viewPositionInWindow(\n handle,\n );\n\n scrollViewPageY.value = y;\n } catch {\n // ignore\n }\n }\n },\n [onLayout],\n );\n\n /**\n * Function that will scroll a ScrollView as keyboard gets moving.\n */\n const maybeScroll = useCallback(\n (e: number, animated: boolean = false) => {\n \"worklet\";\n\n if (!enabled) {\n return 0;\n }\n\n // input belongs to ScrollView\n if (layout.value?.parentScrollViewTarget !== scrollViewTarget.value) {\n return 0;\n }\n\n const visibleRect = height - keyboardHeight.value;\n const absoluteY = layout.value?.layout.absoluteY || 0;\n const inputHeight = layout.value?.layout.height || 0;\n const point = absoluteY + inputHeight;\n\n if (visibleRect - point <= bottomOffset) {\n const relativeScrollTo =\n keyboardHeight.value - (height - point) + bottomOffset;\n const interpolatedScrollTo = interpolate(\n e,\n [initialKeyboardSize.value, keyboardHeight.value],\n [\n 0,\n scrollDistanceWithRespectToSnapPoints(\n relativeScrollTo + scrollPosition.value,\n snapToOffsets,\n ) - scrollPosition.value,\n ],\n );\n const targetScrollY =\n Math.max(interpolatedScrollTo, 0) + scrollPosition.value;\n\n scrollTo(scrollViewAnimatedRef, 0, targetScrollY, animated);\n\n return interpolatedScrollTo;\n }\n\n if (point < scrollViewPageY.value) {\n const positionOnScreen = visibleRect - bottomOffset;\n const topOfScreen = scrollPosition.value + point;\n\n scrollTo(\n scrollViewAnimatedRef,\n 0,\n topOfScreen - positionOnScreen,\n animated,\n );\n }\n\n return 0;\n },\n [bottomOffset, enabled, height, snapToOffsets],\n );\n const removeGhostPadding = useCallback(\n (e: number) => {\n \"worklet\";\n\n // layout mode: the spacer view participates in layout, so the ScrollView\n // reflows naturally when it shrinks — no manual scroll correction needed.\n if (mode === \"layout\") {\n return false;\n }\n\n // insets mode: `ScrollViewWithBottomPadding` extends scrollable area without\n // changing layout, so when the keyboard hides and we're at the end of the\n // ScrollView we must manually scroll back.\n if (!keyboardWillAppear.value && ghostViewSpace.value > 0) {\n scrollTo(\n scrollViewAnimatedRef,\n 0,\n scrollPosition.value -\n interpolate(\n e,\n [initialKeyboardSize.value, keyboardHeight.value],\n [ghostViewSpace.value, 0],\n ),\n false,\n );\n\n return true;\n }\n\n return false;\n },\n [mode],\n );\n const performScrollWithPositionRestoration = useCallback(\n (newPosition: number) => {\n \"worklet\";\n\n const prevScroll = scrollPosition.value;\n\n // eslint-disable-next-line react-compiler/react-compiler\n scrollPosition.value = newPosition;\n maybeScroll(keyboardHeight.value, true);\n scrollPosition.value = prevScroll;\n },\n [scrollPosition, keyboardHeight, maybeScroll],\n );\n const syncKeyboardFrame = useCallback(\n (e: NativeEvent) => {\n \"worklet\";\n\n const keyboardFrame = interpolate(\n e.height,\n [0, keyboardHeight.value],\n [0, keyboardHeight.value + extraKeyboardSpace],\n );\n\n currentKeyboardFrameHeight.value = keyboardFrame;\n },\n [extraKeyboardSpace],\n );\n\n const updateLayoutFromSelection = useCallback(() => {\n \"worklet\";\n\n const customHeight = lastSelection.value?.selection.end.y;\n\n if (!input.value?.layout || !customHeight) {\n return false;\n }\n\n layout.value = {\n ...input.value,\n layout: {\n ...input.value.layout,\n // when we have multiline input with limited amount of lines, then custom height can be very big\n // so we clamp it to max input height\n height: clamp(customHeight, 0, input.value.layout.height),\n },\n };\n\n return true;\n }, [input, lastSelection, layout]);\n const scrollFromCurrentPosition = useCallback(() => {\n \"worklet\";\n\n const prevLayout = layout.value;\n\n if (!updateLayoutFromSelection()) {\n return;\n }\n\n performScrollWithPositionRestoration(position.value);\n\n layout.value = prevLayout;\n }, [performScrollWithPositionRestoration]);\n const onChangeText = useCallback(() => {\n \"worklet\";\n scrollFromCurrentPosition();\n }, [scrollFromCurrentPosition]);\n const onChangeTextHandler = useMemo(\n () => debounce(onChangeText, 200),\n [onChangeText],\n );\n const onSelectionChange = useCallback(\n (e: FocusedInputSelectionChangedEvent) => {\n \"worklet\";\n\n const lastTarget = lastSelection.value?.target;\n const latestSelection = lastSelection.value?.selection;\n\n lastSelection.value = e;\n selectionUpdatedSinceHide.value = true;\n\n if (e.target !== lastTarget || pendingSelectionForFocus.value) {\n if (pendingSelectionForFocus.value) {\n // selection arrived after onStart - complete the deferred setup\n pendingSelectionForFocus.value = false;\n updateLayoutFromSelection();\n\n // if keyboard was already visible (focus change, no onMove expected),\n // perform the deferred scroll now\n if (!keyboardWillAppear.value && keyboardHeight.value > 0) {\n position.value += maybeScroll(keyboardHeight.value, true);\n }\n }\n\n return;\n }\n // caret in the end + end coordinates has been changed -> we moved to a new line\n // so input may grow\n if (\n e.selection.end.position === e.selection.start.position &&\n latestSelection?.end.y !== e.selection.end.y\n ) {\n return scrollFromCurrentPosition();\n }\n // selection has been changed\n if (e.selection.start.position !== e.selection.end.position) {\n return scrollFromCurrentPosition();\n }\n\n onChangeTextHandler();\n },\n [\n scrollFromCurrentPosition,\n onChangeTextHandler,\n updateLayoutFromSelection,\n maybeScroll,\n ],\n );\n\n useFocusedInputHandler(\n {\n onSelectionChange: onSelectionChange,\n },\n [onSelectionChange],\n );\n\n useSmoothKeyboardHandler(\n {\n onStart: (e) => {\n \"worklet\";\n\n const keyboardWillChangeSize =\n keyboardHeight.value !== e.height && e.height > 0;\n\n keyboardWillAppear.value = e.height > 0 && keyboardHeight.value === 0;\n\n const keyboardWillHide = e.height === 0;\n const focusWasChanged =\n (tag.value !== e.target && e.target !== -1) ||\n keyboardWillChangeSize;\n\n if (keyboardWillChangeSize) {\n initialKeyboardSize.value = keyboardHeight.value;\n }\n\n if (keyboardWillHide) {\n // on back transition need to interpolate as [0, keyboardHeight]\n initialKeyboardSize.value = 0;\n scrollPosition.value = scrollBeforeKeyboardMovement.value;\n pendingSelectionForFocus.value = false;\n }\n\n if (\n keyboardWillAppear.value ||\n keyboardWillChangeSize ||\n focusWasChanged\n ) {\n // persist scroll value\n scrollPosition.value = position.value;\n // just persist height - later will be used in interpolation\n keyboardHeight.value = e.height;\n\n // insets mode: set the full contentInset upfront so that maybeScroll\n // calculations are correct from the very first onMove frame.\n // layout mode: do NOT set it here — the spacer must grow frame-by-frame\n // in onMove to avoid a premature full-height jump before the keyboard moves.\n if (mode === \"insets\") {\n syncKeyboardFrame(e);\n }\n }\n\n // focus was changed\n if (focusWasChanged) {\n tag.value = e.target;\n\n if (\n lastSelection.value?.target === e.target &&\n selectionUpdatedSinceHide.value\n ) {\n // fresh selection arrived before onStart - use it to update layout\n updateLayoutFromSelection();\n pendingSelectionForFocus.value = false;\n } else {\n // selection hasn't arrived yet for the new target (iOS 15),\n // or it's stale from previous session (Android refocus same input).\n // Use stale selection as best-effort fallback if available for same target,\n // otherwise fall back to full input layout.\n // Will be corrected if a fresh onSelectionChange arrives.\n if (lastSelection.value?.target === e.target) {\n updateLayoutFromSelection();\n } else if (input.value) {\n layout.value = input.value;\n }\n pendingSelectionForFocus.value = true;\n }\n\n // save current scroll position - when keyboard will hide we'll reuse\n // this value to achieve smooth hide effect\n scrollBeforeKeyboardMovement.value = position.value;\n }\n\n if (focusWasChanged && !keyboardWillAppear.value) {\n if (!pendingSelectionForFocus.value) {\n // update position on scroll value, so `onEnd` handler\n // will pick up correct values\n position.value += maybeScroll(e.height, true);\n }\n }\n\n if (mode === \"insets\") {\n ghostViewSpace.value =\n position.value +\n scrollViewLayout.value.height -\n scrollViewContentSize.value.height;\n\n if (ghostViewSpace.value > 0) {\n scrollPosition.value = position.value;\n }\n }\n },\n onMove: (e) => {\n \"worklet\";\n\n if (removeGhostPadding(e.height)) {\n return;\n }\n\n // layout mode: drive the spacer view animation frame-by-frame\n if (mode === \"layout\") {\n syncKeyboardFrame(e);\n }\n\n // if the user has set disableScrollOnKeyboardHide, only auto-scroll when the keyboard opens\n if (!disableScrollOnKeyboardHide || keyboardWillAppear.value) {\n maybeScroll(e.height);\n }\n },\n onEnd: (e) => {\n \"worklet\";\n\n if (e.height === 0) {\n removeGhostPadding(e.height);\n }\n\n keyboardHeight.value = e.height;\n scrollPosition.value = position.value;\n\n if (e.height === 0) {\n selectionUpdatedSinceHide.value = false;\n } else if (keyboardWillAppear.value) {\n // keyboard fully shown after appearing from hidden state — clear\n // pending flag to prevent leaking into next focus-change session.\n // Only when the keyboard was actually appearing (not a focus switch\n // with same keyboard height), otherwise we'd clear the flag before\n // onSelectionChange has a chance to process it.\n pendingSelectionForFocus.value = false;\n }\n\n syncKeyboardFrame(e);\n },\n },\n [\n mode,\n maybeScroll,\n removeGhostPadding,\n disableScrollOnKeyboardHide,\n syncKeyboardFrame,\n ],\n );\n\n const synchronize = useCallback(async () => {\n await update();\n\n requestAnimationFrame(() => {\n runOnUI(() => {\n \"worklet\";\n\n scrollFromCurrentPosition();\n })();\n });\n }, [update, scrollFromCurrentPosition]);\n\n useImperativeHandle(\n ref,\n () => {\n const scrollView = scrollViewRef.current;\n\n if (scrollView) {\n const scrollViewWithMethods =\n scrollView as KeyboardAwareScrollViewRef;\n\n scrollViewWithMethods.assureFocusedInputVisible = () => {\n synchronize();\n };\n\n return scrollViewWithMethods;\n }\n\n return {\n assureFocusedInputVisible: () => {\n synchronize();\n },\n } as KeyboardAwareScrollViewRef;\n },\n [synchronize],\n );\n\n useEffect(() => {\n synchronize();\n }, [bottomOffset]);\n\n useAnimatedReaction(\n () => input.value,\n (current, previous) => {\n if (\n current?.target === previous?.target &&\n current?.layout.height !== previous?.layout.height\n ) {\n // input has changed layout - let's check if we need to scroll\n // may happen when you paste text, then onSelectionChange will be\n // fired earlier than text actually changes its layout\n scrollFromCurrentPosition();\n }\n },\n [],\n );\n\n const padding = useDerivedValue(\n () => (enabled ? currentKeyboardFrameHeight.value : 0),\n [enabled],\n );\n // layout mode only: a spacer view whose paddingBottom grows with the keyboard.\n // The `+ 1` ensures the scroll view never reaches its absolute end during animation,\n // avoiding the layout recalculation that triggers on every frame at the boundary.\n // see: https://github.com/kirillzyusko/react-native-keyboard-controller/pull/342\n const layoutSpacerStyle = useAnimatedStyle(\n () =>\n enabled && mode === \"layout\"\n ? { paddingBottom: currentKeyboardFrameHeight.value + 1 }\n : {},\n [enabled, mode],\n );\n\n if (mode === \"layout\") {\n return (\n <ScrollViewComponent\n ref={onRef}\n {...rest}\n scrollEventThrottle={16}\n onLayout={onScrollViewLayout}\n >\n {children}\n {enabled && <Reanimated.View style={layoutSpacerStyle} />}\n </ScrollViewComponent>\n );\n }\n\n return (\n <ScrollViewWithBottomPadding\n ref={onRef}\n {...rest}\n bottomPadding={padding}\n scrollEventThrottle={16}\n ScrollViewComponent={ScrollViewComponent}\n onLayout={onScrollViewLayout}\n >\n {children}\n </ScrollViewWithBottomPadding>\n );\n },\n);\n\nexport default KeyboardAwareScrollView;\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"names":["React","forwardRef","useCallback","useEffect","useImperativeHandle","useMemo","Reanimated","clamp","interpolate","runOnUI","scrollTo","useAnimatedReaction","useAnimatedRef","useAnimatedStyle","useDerivedValue","useSharedValue","KeyboardControllerNative","useFocusedInputHandler","useReanimatedFocusedInput","useWindowDimensions","findNodeHandle","useCombinedRef","useScrollState","ScrollViewWithBottomPadding","useSmoothKeyboardHandler","debounce","scrollDistanceWithRespectToSnapPoints","KeyboardAwareScrollView","children","onLayout","bottomOffset","disableScrollOnKeyboardHide","enabled","extraKeyboardSpace","mode","ScrollViewComponent","ScrollView","snapToOffsets","rest","ref","scrollViewAnimatedRef","scrollViewRef","useRef","onRef","scrollViewTarget","scrollPosition","offset","position","layout","scrollViewLayout","size","scrollViewContentSize","currentKeyboardFrameHeight","keyboardHeight","keyboardWillAppear","tag","initialKeyboardSize","scrollBeforeKeyboardMovement","input","update","lastSelection","ghostViewSpace","pendingSelectionForFocus","selectionUpdatedSinceHide","scrollViewPageY","height","onScrollViewLayout","e","handle","current","value","y","viewPositionInWindow","maybeScroll","animated","_layout$value","_layout$value2","_layout$value3","parentScrollViewTarget","visibleRect","absoluteY","inputHeight","point","relativeScrollTo","interpolatedScrollTo","targetScrollY","Math","max","positionOnScreen","topOfScreen","removeGhostPadding","performScrollWithPositionRestoration","newPosition","prevScroll","syncKeyboardFrame","keyboardFrame","updateLayoutFromSelection","_lastSelection$value","_input$value","customHeight","selection","end","undefined","scrollFromCurrentPosition","prevLayout","onChangeText","onChangeTextHandler","onSelectionChange","_lastSelection$value2","_lastSelection$value3","lastTarget","target","latestSelection","start","onStart","keyboardWillChangeSize","keyboardWillHide","focusWasChanged","_lastSelection$value4","_lastSelection$value5","onMove","_lastSelection$value6","onEnd","synchronize","requestAnimationFrame","scrollView","scrollViewWithMethods","assureFocusedInputVisible","previous","padding","layoutSpacerStyle","paddingBottom","createElement","_extends","scrollEventThrottle","View","style","bottomPadding"],"sources":["index.tsx"],"sourcesContent":["import React, {\n forwardRef,\n useCallback,\n useEffect,\n useImperativeHandle,\n useMemo,\n} from \"react\";\nimport Reanimated, {\n clamp,\n interpolate,\n runOnUI,\n scrollTo,\n useAnimatedReaction,\n useAnimatedRef,\n useAnimatedStyle,\n useDerivedValue,\n useSharedValue,\n} from \"react-native-reanimated\";\n\nimport { KeyboardControllerNative } from \"../../bindings\";\nimport {\n useFocusedInputHandler,\n useReanimatedFocusedInput,\n useWindowDimensions,\n} from \"../../hooks\";\nimport { findNodeHandle } from \"../../utils/findNodeHandle\";\nimport useCombinedRef from \"../hooks/useCombinedRef\";\nimport useScrollState from \"../hooks/useScrollState\";\nimport ScrollViewWithBottomPadding from \"../ScrollViewWithBottomPadding\";\n\nimport { useSmoothKeyboardHandler } from \"./useSmoothKeyboardHandler\";\nimport { debounce, scrollDistanceWithRespectToSnapPoints } from \"./utils\";\n\nimport type { LayoutChangeEvent, ScrollView } from \"react-native\";\nimport type {\n FocusedInputLayoutChangedEvent,\n FocusedInputSelectionChangedEvent,\n KeyboardAwareScrollViewProps,\n KeyboardAwareScrollViewRef,\n NativeEvent,\n} from \"react-native-keyboard-controller\";\n\n// Everything begins from `onStart` handler. This handler is called every time,\n// when keyboard changes its size or when focused `TextInput` was changed. In\n// this handler we are calculating/memoizing values which later will be used\n// during layout movement. For that we calculate:\n// - layout of focused field (`layout`) - to understand whether there will be overlap\n// - initial keyboard size (`initialKeyboardSize`) - used in scroll interpolation\n// - future keyboard height (`keyboardHeight`) - used in scroll interpolation\n// - current scroll position (`scrollPosition`) - used to scroll from this point\n//\n// Once we've calculated all necessary variables - we can actually start to use them.\n// It happens in `onMove` handler - this function simply calls `maybeScroll` with\n// current keyboard frame height. This functions makes the smooth transition.\n//\n// When the transition has finished we go to `onEnd` handler. In this handler\n// we verify, that the current field is not overlapped within a keyboard frame.\n// For full `onStart`/`onMove`/`onEnd` flow it may look like a redundant thing,\n// however there could be some cases, when `onMove` is not called:\n// - on iOS when TextInput was changed - keyboard transition is instant\n// - on Android when TextInput was changed and keyboard size wasn't changed\n// So `onEnd` handler handle the case, when `onMove` wasn't triggered.\n//\n// ====================================================================================================================+\n// -----------------------------------------------------Flow chart-----------------------------------------------------+\n// ====================================================================================================================+\n//\n// +============================+ +============================+ +==================================+\n// + User Press on TextInput + => + Keyboard starts showing + => + As keyboard moves frame by frame + =>\n// + + + (run `onStart`) + + `onMove` is getting called +\n// +============================+ +============================+ +==================================+\n//\n// +============================+ +============================+ +=====================================+\n// + Keyboard is shown and we + => + User moved focus to + => + Only `onStart`/`onEnd` maybe called +\n// + call `onEnd` handler + + another `TextInput` + + (without involving `onMove`) +\n// +============================+ +============================+ +=====================================+\n//\n\n/**\n * A ScrollView component that automatically handles keyboard appearance and disappearance\n * by adjusting its content position to ensure the focused input remains visible.\n *\n * The component uses a sophisticated animation system to smoothly handle keyboard transitions\n * and maintain proper scroll position during keyboard interactions.\n *\n * @returns A ScrollView component that handles keyboard interactions.\n * @see {@link https://kirillzyusko.github.io/react-native-keyboard-controller/docs/api/components/keyboard-aware-scroll-view|Documentation} page for more details.\n * @example\n * ```tsx\n * <KeyboardAwareScrollView bottomOffset={20}>\n * <TextInput placeholder=\"Enter text\" />\n * <TextInput placeholder=\"Another input\" />\n * </KeyboardAwareScrollView>\n * ```\n */\nconst KeyboardAwareScrollView = forwardRef<\n KeyboardAwareScrollViewRef,\n React.PropsWithChildren<KeyboardAwareScrollViewProps>\n>(\n (\n {\n children,\n onLayout,\n bottomOffset = 0,\n disableScrollOnKeyboardHide = false,\n enabled = true,\n extraKeyboardSpace = 0,\n mode = \"insets\",\n ScrollViewComponent = Reanimated.ScrollView,\n snapToOffsets,\n ...rest\n },\n ref,\n ) => {\n const scrollViewAnimatedRef = useAnimatedRef<Reanimated.ScrollView>();\n const scrollViewRef = React.useRef<ScrollView>(null);\n const onRef = useCombinedRef(scrollViewAnimatedRef, scrollViewRef);\n const scrollViewTarget = useSharedValue<number | null>(null);\n const scrollPosition = useSharedValue(0);\n const {\n offset: position,\n layout: scrollViewLayout,\n size: scrollViewContentSize,\n } = useScrollState(scrollViewAnimatedRef);\n const currentKeyboardFrameHeight = useSharedValue(0);\n const keyboardHeight = useSharedValue(0);\n const keyboardWillAppear = useSharedValue(false);\n const tag = useSharedValue(-1);\n const initialKeyboardSize = useSharedValue(0);\n const scrollBeforeKeyboardMovement = useSharedValue(0);\n const { input, update } = useReanimatedFocusedInput();\n const layout = useSharedValue<FocusedInputLayoutChangedEvent | null>(null);\n const lastSelection =\n useSharedValue<FocusedInputSelectionChangedEvent | null>(null);\n const ghostViewSpace = useSharedValue(-1);\n const pendingSelectionForFocus = useSharedValue(false);\n const selectionUpdatedSinceHide = useSharedValue(false);\n const scrollViewPageY = useSharedValue(0);\n\n const { height } = useWindowDimensions();\n\n const onScrollViewLayout = useCallback(\n async (e: LayoutChangeEvent) => {\n const handle = findNodeHandle(scrollViewAnimatedRef.current);\n\n scrollViewTarget.value = handle;\n\n onLayout?.(e);\n\n if (handle !== null) {\n try {\n const { y } = await KeyboardControllerNative.viewPositionInWindow(\n handle,\n );\n\n scrollViewPageY.value = y;\n } catch {\n // ignore\n }\n }\n },\n [onLayout],\n );\n\n /**\n * Function that will scroll a ScrollView as keyboard gets moving.\n */\n const maybeScroll = useCallback(\n (e: number, animated: boolean = false) => {\n \"worklet\";\n\n if (!enabled) {\n return 0;\n }\n\n // input belongs to ScrollView\n if (layout.value?.parentScrollViewTarget !== scrollViewTarget.value) {\n return 0;\n }\n\n const visibleRect = height - keyboardHeight.value;\n const absoluteY = layout.value?.layout.absoluteY || 0;\n const inputHeight = layout.value?.layout.height || 0;\n const point = absoluteY + inputHeight;\n\n if (visibleRect - point <= bottomOffset) {\n const relativeScrollTo =\n keyboardHeight.value - (height - point) + bottomOffset;\n const interpolatedScrollTo = interpolate(\n e,\n [initialKeyboardSize.value, keyboardHeight.value],\n [\n 0,\n scrollDistanceWithRespectToSnapPoints(\n relativeScrollTo + scrollPosition.value,\n snapToOffsets,\n ) - scrollPosition.value,\n ],\n );\n const targetScrollY =\n Math.max(interpolatedScrollTo, 0) + scrollPosition.value;\n\n scrollTo(scrollViewAnimatedRef, 0, targetScrollY, animated);\n\n return interpolatedScrollTo;\n }\n\n if (point < scrollViewPageY.value) {\n const positionOnScreen = visibleRect - bottomOffset;\n const topOfScreen = scrollPosition.value + point;\n\n scrollTo(\n scrollViewAnimatedRef,\n 0,\n topOfScreen - positionOnScreen,\n animated,\n );\n }\n\n return 0;\n },\n [bottomOffset, enabled, height, snapToOffsets],\n );\n const removeGhostPadding = useCallback(\n (e: number) => {\n \"worklet\";\n\n // layout mode: the spacer view participates in layout, so the ScrollView\n // reflows naturally when it shrinks — no manual scroll correction needed.\n if (mode === \"layout\") {\n return false;\n }\n\n // insets mode: `ScrollViewWithBottomPadding` extends scrollable area without\n // changing layout, so when the keyboard hides and we're at the end of the\n // ScrollView we must manually scroll back.\n if (!keyboardWillAppear.value && ghostViewSpace.value > 0) {\n scrollTo(\n scrollViewAnimatedRef,\n 0,\n scrollPosition.value -\n interpolate(\n e,\n [initialKeyboardSize.value, keyboardHeight.value],\n [ghostViewSpace.value, 0],\n ),\n false,\n );\n\n return true;\n }\n\n return false;\n },\n [mode],\n );\n const performScrollWithPositionRestoration = useCallback(\n (newPosition: number) => {\n \"worklet\";\n\n const prevScroll = scrollPosition.value;\n\n // eslint-disable-next-line react-compiler/react-compiler\n scrollPosition.value = newPosition;\n maybeScroll(keyboardHeight.value, true);\n scrollPosition.value = prevScroll;\n },\n [scrollPosition, keyboardHeight, maybeScroll],\n );\n const syncKeyboardFrame = useCallback(\n (e: NativeEvent) => {\n \"worklet\";\n\n const keyboardFrame = interpolate(\n e.height,\n [0, keyboardHeight.value],\n [0, keyboardHeight.value + extraKeyboardSpace],\n );\n\n currentKeyboardFrameHeight.value = keyboardFrame;\n },\n [extraKeyboardSpace],\n );\n\n const updateLayoutFromSelection = useCallback(() => {\n \"worklet\";\n\n const customHeight = lastSelection.value?.selection.end.y;\n\n if (!input.value?.layout || customHeight === undefined) {\n return false;\n }\n\n layout.value = {\n ...input.value,\n layout: {\n ...input.value.layout,\n // when we have multiline input with limited amount of lines, then custom height can be very big\n // so we clamp it to max input height\n height: clamp(customHeight, 0, input.value.layout.height),\n },\n };\n\n return true;\n }, [input, lastSelection, layout]);\n const scrollFromCurrentPosition = useCallback(() => {\n \"worklet\";\n\n const prevLayout = layout.value;\n\n if (!updateLayoutFromSelection()) {\n return;\n }\n\n performScrollWithPositionRestoration(position.value);\n\n layout.value = prevLayout;\n }, [performScrollWithPositionRestoration]);\n const onChangeText = useCallback(() => {\n \"worklet\";\n scrollFromCurrentPosition();\n }, [scrollFromCurrentPosition]);\n const onChangeTextHandler = useMemo(\n () => debounce(onChangeText, 200),\n [onChangeText],\n );\n const onSelectionChange = useCallback(\n (e: FocusedInputSelectionChangedEvent) => {\n \"worklet\";\n\n const lastTarget = lastSelection.value?.target;\n const latestSelection = lastSelection.value?.selection;\n\n lastSelection.value = e;\n selectionUpdatedSinceHide.value = true;\n\n if (e.target !== lastTarget || pendingSelectionForFocus.value) {\n if (pendingSelectionForFocus.value) {\n // selection arrived after onStart - complete the deferred setup\n pendingSelectionForFocus.value = false;\n updateLayoutFromSelection();\n\n // if keyboard was already visible (focus change, no onMove expected),\n // perform the deferred scroll now\n if (!keyboardWillAppear.value && keyboardHeight.value > 0) {\n position.value += maybeScroll(keyboardHeight.value, true);\n }\n }\n\n return;\n }\n // caret in the end + end coordinates has been changed -> we moved to a new line\n // so input may grow\n if (\n e.selection.end.position === e.selection.start.position &&\n latestSelection?.end.y !== e.selection.end.y\n ) {\n return scrollFromCurrentPosition();\n }\n // selection has been changed\n if (e.selection.start.position !== e.selection.end.position) {\n return scrollFromCurrentPosition();\n }\n\n onChangeTextHandler();\n },\n [\n scrollFromCurrentPosition,\n onChangeTextHandler,\n updateLayoutFromSelection,\n maybeScroll,\n ],\n );\n\n useFocusedInputHandler(\n {\n onSelectionChange: onSelectionChange,\n },\n [onSelectionChange],\n );\n\n useSmoothKeyboardHandler(\n {\n onStart: (e) => {\n \"worklet\";\n\n const keyboardWillChangeSize =\n keyboardHeight.value !== e.height && e.height > 0;\n\n keyboardWillAppear.value = e.height > 0 && keyboardHeight.value === 0;\n\n const keyboardWillHide = e.height === 0;\n const focusWasChanged =\n (tag.value !== e.target && e.target !== -1) ||\n keyboardWillChangeSize;\n\n if (keyboardWillChangeSize) {\n initialKeyboardSize.value = keyboardHeight.value;\n }\n\n if (keyboardWillHide) {\n // on back transition need to interpolate as [0, keyboardHeight]\n initialKeyboardSize.value = 0;\n scrollPosition.value = scrollBeforeKeyboardMovement.value;\n pendingSelectionForFocus.value = false;\n }\n\n if (\n keyboardWillAppear.value ||\n keyboardWillChangeSize ||\n focusWasChanged\n ) {\n // persist scroll value\n scrollPosition.value = position.value;\n // just persist height - later will be used in interpolation\n keyboardHeight.value = e.height;\n\n // insets mode: set the full contentInset upfront so that maybeScroll\n // calculations are correct from the very first onMove frame.\n // layout mode: do NOT set it here — the spacer must grow frame-by-frame\n // in onMove to avoid a premature full-height jump before the keyboard moves.\n if (mode === \"insets\") {\n syncKeyboardFrame(e);\n }\n }\n\n // focus was changed\n if (focusWasChanged) {\n tag.value = e.target;\n\n if (\n lastSelection.value?.target === e.target &&\n selectionUpdatedSinceHide.value\n ) {\n // fresh selection arrived before onStart - use it to update layout\n updateLayoutFromSelection();\n pendingSelectionForFocus.value = false;\n } else {\n // selection hasn't arrived yet for the new target (iOS 15),\n // or it's stale from previous session (Android refocus same input).\n // Use stale selection as best-effort fallback if available for same target,\n // otherwise fall back to full input layout.\n // Will be corrected if a fresh onSelectionChange arrives.\n if (lastSelection.value?.target === e.target) {\n updateLayoutFromSelection();\n } else if (input.value) {\n layout.value = input.value;\n }\n pendingSelectionForFocus.value = true;\n }\n\n // save current scroll position - when keyboard will hide we'll reuse\n // this value to achieve smooth hide effect\n scrollBeforeKeyboardMovement.value = position.value;\n }\n\n if (focusWasChanged && !keyboardWillAppear.value) {\n if (!pendingSelectionForFocus.value) {\n // update position on scroll value, so `onEnd` handler\n // will pick up correct values\n position.value += maybeScroll(e.height, true);\n }\n }\n\n if (mode === \"insets\") {\n ghostViewSpace.value =\n position.value +\n scrollViewLayout.value.height -\n scrollViewContentSize.value.height;\n\n if (ghostViewSpace.value > 0) {\n scrollPosition.value = position.value;\n }\n }\n },\n onMove: (e) => {\n \"worklet\";\n\n if (\n pendingSelectionForFocus.value &&\n lastSelection.value?.target !== tag.value\n ) {\n return;\n }\n\n if (removeGhostPadding(e.height)) {\n return;\n }\n\n // layout mode: drive the spacer view animation frame-by-frame\n if (mode === \"layout\") {\n syncKeyboardFrame(e);\n }\n\n // if the user has set disableScrollOnKeyboardHide, only auto-scroll when the keyboard opens\n if (!disableScrollOnKeyboardHide || keyboardWillAppear.value) {\n maybeScroll(e.height);\n }\n },\n onEnd: (e) => {\n \"worklet\";\n\n if (e.height === 0) {\n removeGhostPadding(e.height);\n }\n\n keyboardHeight.value = e.height;\n scrollPosition.value = position.value;\n\n if (e.height === 0) {\n selectionUpdatedSinceHide.value = false;\n } else if (keyboardWillAppear.value) {\n // keyboard fully shown after appearing from hidden state — clear\n // pending flag to prevent leaking into next focus-change session.\n // Only when the keyboard was actually appearing (not a focus switch\n // with same keyboard height), otherwise we'd clear the flag before\n // onSelectionChange has a chance to process it.\n pendingSelectionForFocus.value = false;\n }\n\n syncKeyboardFrame(e);\n },\n },\n [\n mode,\n maybeScroll,\n removeGhostPadding,\n disableScrollOnKeyboardHide,\n syncKeyboardFrame,\n ],\n );\n\n const synchronize = useCallback(async () => {\n await update();\n\n requestAnimationFrame(() => {\n runOnUI(() => {\n \"worklet\";\n\n scrollFromCurrentPosition();\n })();\n });\n }, [update, scrollFromCurrentPosition]);\n\n useImperativeHandle(\n ref,\n () => {\n const scrollView = scrollViewRef.current;\n\n if (scrollView) {\n const scrollViewWithMethods =\n scrollView as KeyboardAwareScrollViewRef;\n\n scrollViewWithMethods.assureFocusedInputVisible = () => {\n synchronize();\n };\n\n return scrollViewWithMethods;\n }\n\n return {\n assureFocusedInputVisible: () => {\n synchronize();\n },\n } as KeyboardAwareScrollViewRef;\n },\n [synchronize],\n );\n\n useEffect(() => {\n synchronize();\n }, [bottomOffset]);\n\n useAnimatedReaction(\n () => input.value,\n (current, previous) => {\n if (\n current?.target === previous?.target &&\n current?.layout.height !== previous?.layout.height\n ) {\n // input has changed layout - let's check if we need to scroll\n // may happen when you paste text, then onSelectionChange will be\n // fired earlier than text actually changes its layout\n scrollFromCurrentPosition();\n }\n },\n [],\n );\n\n const padding = useDerivedValue(\n () => (enabled ? currentKeyboardFrameHeight.value : 0),\n [enabled],\n );\n // layout mode only: a spacer view whose paddingBottom grows with the keyboard.\n // The `+ 1` ensures the scroll view never reaches its absolute end during animation,\n // avoiding the layout recalculation that triggers on every frame at the boundary.\n // see: https://github.com/kirillzyusko/react-native-keyboard-controller/pull/342\n const layoutSpacerStyle = useAnimatedStyle(\n () =>\n enabled && mode === \"layout\"\n ? { paddingBottom: currentKeyboardFrameHeight.value + 1 }\n : {},\n [enabled, mode],\n );\n\n if (mode === \"layout\") {\n return (\n <ScrollViewComponent\n ref={onRef}\n {...rest}\n scrollEventThrottle={16}\n onLayout={onScrollViewLayout}\n >\n {children}\n {enabled && <Reanimated.View style={layoutSpacerStyle} />}\n </ScrollViewComponent>\n );\n }\n\n return (\n <ScrollViewWithBottomPadding\n ref={onRef}\n {...rest}\n bottomPadding={padding}\n scrollEventThrottle={16}\n ScrollViewComponent={ScrollViewComponent}\n onLayout={onScrollViewLayout}\n >\n {children}\n </ScrollViewWithBottomPadding>\n );\n },\n);\n\nexport default KeyboardAwareScrollView;\n"],"mappings":"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","ignoreList":[]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "react-native-keyboard-controller",
|
|
3
|
-
"version": "1.22.
|
|
3
|
+
"version": "1.22.1",
|
|
4
4
|
"description": "Keyboard manager which works in identical way on both iOS and Android",
|
|
5
5
|
"main": "lib/commonjs/index",
|
|
6
6
|
"module": "lib/module/index",
|
|
@@ -66,6 +66,7 @@
|
|
|
66
66
|
"keyboard done button",
|
|
67
67
|
"keyboard next button",
|
|
68
68
|
"keyboard previous button",
|
|
69
|
+
"keyboard effects",
|
|
69
70
|
"extend keyboard",
|
|
70
71
|
"chat",
|
|
71
72
|
"chat scroll view",
|
|
@@ -287,7 +287,7 @@ const KeyboardAwareScrollView = forwardRef<
|
|
|
287
287
|
|
|
288
288
|
const customHeight = lastSelection.value?.selection.end.y;
|
|
289
289
|
|
|
290
|
-
if (!input.value?.layout ||
|
|
290
|
+
if (!input.value?.layout || customHeight === undefined) {
|
|
291
291
|
return false;
|
|
292
292
|
}
|
|
293
293
|
|
|
@@ -476,6 +476,13 @@ const KeyboardAwareScrollView = forwardRef<
|
|
|
476
476
|
onMove: (e) => {
|
|
477
477
|
"worklet";
|
|
478
478
|
|
|
479
|
+
if (
|
|
480
|
+
pendingSelectionForFocus.value &&
|
|
481
|
+
lastSelection.value?.target !== tag.value
|
|
482
|
+
) {
|
|
483
|
+
return;
|
|
484
|
+
}
|
|
485
|
+
|
|
479
486
|
if (removeGhostPadding(e.height)) {
|
|
480
487
|
return;
|
|
481
488
|
}
|