react-native-keyboard-controller 1.11.4 → 1.11.6

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.
@@ -1 +1,2 @@
1
+ #import <React/RCTUIManager.h>
1
2
  #import <React/RCTViewManager.h>
@@ -16,6 +16,7 @@
16
16
  084AEEC82ACF4AB2001A3069 /* FocusedInputObserver.swift in Sources */ = {isa = PBXBuildFile; fileRef = 084AEEC72ACF4AB2001A3069 /* FocusedInputObserver.swift */; };
17
17
  089BA5DC2B3E0C9D000A9A90 /* ViewHierarchyNavigator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 089BA5DB2B3E0C9D000A9A90 /* ViewHierarchyNavigator.swift */; };
18
18
  08C47AFC2BA9AF7100DB93BB /* KeyboardView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 08C47AFB2BA9AF7100DB93BB /* KeyboardView.swift */; };
19
+ 08DF17B32BB1838D00279890 /* RCTUIManager+LayoutAnimationManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 08DF17B22BB1838D00279890 /* RCTUIManager+LayoutAnimationManager.m */; };
19
20
  F333F8D428996B8D0015B05F /* KeyboardControllerView.mm in Sources */ = {isa = PBXBuildFile; fileRef = F333F8D228996B8D0015B05F /* KeyboardControllerView.mm */; };
20
21
  F359D34F28133C26000B6AFE /* KeyboardControllerModule.mm in Sources */ = {isa = PBXBuildFile; fileRef = F359D34E28133C26000B6AFE /* KeyboardControllerModule.mm */; };
21
22
  F3626A0728B3FE760021B2D9 /* KeyboardMovementObserver.swift in Sources */ = {isa = PBXBuildFile; fileRef = F3626A0628B3FE760021B2D9 /* KeyboardMovementObserver.swift */; };
@@ -47,6 +48,8 @@
47
48
  084AEEC72ACF4AB2001A3069 /* FocusedInputObserver.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FocusedInputObserver.swift; sourceTree = "<group>"; };
48
49
  089BA5DB2B3E0C9D000A9A90 /* ViewHierarchyNavigator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ViewHierarchyNavigator.swift; sourceTree = "<group>"; };
49
50
  08C47AFB2BA9AF7100DB93BB /* KeyboardView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KeyboardView.swift; sourceTree = "<group>"; };
51
+ 08DF17B22BB1838D00279890 /* RCTUIManager+LayoutAnimationManager.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = "RCTUIManager+LayoutAnimationManager.m"; sourceTree = "<group>"; };
52
+ 08DF17B52BB1845500279890 /* RCTUIManager+LayoutAnimationManager.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "RCTUIManager+LayoutAnimationManager.h"; sourceTree = "<group>"; };
50
53
  134814201AA4EA6300B7C361 /* libKeyboardController.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libKeyboardController.a; sourceTree = BUILT_PRODUCTS_DIR; };
51
54
  B3E7B5891CC2AC0600A0062D /* KeyboardControllerViewManager.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = KeyboardControllerViewManager.mm; sourceTree = "<group>"; };
52
55
  F333F8D128996B1C0015B05F /* KeyboardControllerView.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = KeyboardControllerView.h; sourceTree = "<group>"; };
@@ -116,6 +119,15 @@
116
119
  path = traversal;
117
120
  sourceTree = "<group>";
118
121
  };
122
+ 08DF17B12BB1834400279890 /* objc */ = {
123
+ isa = PBXGroup;
124
+ children = (
125
+ 08DF17B22BB1838D00279890 /* RCTUIManager+LayoutAnimationManager.m */,
126
+ 08DF17B52BB1845500279890 /* RCTUIManager+LayoutAnimationManager.h */,
127
+ );
128
+ path = objc;
129
+ sourceTree = "<group>";
130
+ };
119
131
  134814211AA4EA7D00B7C361 /* Products */ = {
120
132
  isa = PBXGroup;
121
133
  children = (
@@ -127,6 +139,7 @@
127
139
  58B511D21A9E6C8500147676 = {
128
140
  isa = PBXGroup;
129
141
  children = (
142
+ 08DF17B12BB1834400279890 /* objc */,
130
143
  089BA5DD2B3EC978000A9A90 /* traversal */,
131
144
  084AEEC12ACF405C001A3069 /* views */,
132
145
  084AEEC02ACDFC2A001A3069 /* observers */,
@@ -205,6 +218,7 @@
205
218
  F4FF95D7245B92E800C19C63 /* KeyboardControllerViewManager.swift in Sources */,
206
219
  F333F8D428996B8D0015B05F /* KeyboardControllerView.mm in Sources */,
207
220
  0800511E2B65558800928E51 /* TextInput.swift in Sources */,
221
+ 08DF17B32BB1838D00279890 /* RCTUIManager+LayoutAnimationManager.m in Sources */,
208
222
  08C47AFC2BA9AF7100DB93BB /* KeyboardView.swift in Sources */,
209
223
  F3F50669289E653B003091D6 /* KeyboardMoveEvent.m in Sources */,
210
224
  083FB9852B15171600C0EFF0 /* TextChangeObserver.swift in Sources */,
@@ -0,0 +1,15 @@
1
+ //
2
+ // RCTUIManager+LayoutAnimationManager.h
3
+ // react-native-keyboard-controller
4
+ //
5
+ // Created by Kiryl Ziusko on 22/03/2024.
6
+ //
7
+
8
+ #import <React/RCTUIManager.h>
9
+
10
+ @interface RCTUIManager (LayoutAnimationManager)
11
+
12
+ - (void)scheduleKeyboardAnimation;
13
+ - (void)unscheduleKeyboardAnimation;
14
+
15
+ @end
@@ -0,0 +1,32 @@
1
+ //
2
+ // RCTUIManager+LayoutAnimationManager.m
3
+ // react-native-keyboard-controller
4
+ //
5
+ // Created by Kiryl Ziusko on 22/03/2024.
6
+ //
7
+
8
+ #import <React/RCTLayoutAnimationGroup.h>
9
+ #import "RCTUIManager+LayoutAnimationManager.h"
10
+
11
+ @implementation RCTUIManager (LayoutAnimationManager)
12
+
13
+ - (void)scheduleKeyboardAnimation
14
+ {
15
+ NSDictionary *animationConfig =
16
+ @{@"duration" : @250, @"update" : @{@"duration" : @250, @"type" : @"keyboard"}};
17
+
18
+ RCTLayoutAnimationGroup *layoutAnimationGroup =
19
+ [[RCTLayoutAnimationGroup alloc] initWithConfig:animationConfig callback:nil];
20
+
21
+ [self setValue:layoutAnimationGroup forKey:@"_layoutAnimationGroup"];
22
+ }
23
+
24
+ - (void)unscheduleKeyboardAnimation
25
+ {
26
+ RCTLayoutAnimationGroup *layoutAnimationGroup =
27
+ [[RCTLayoutAnimationGroup alloc] initWithConfig:nil callback:nil];
28
+
29
+ [self setValue:layoutAnimationGroup forKey:@"_layoutAnimationGroup"];
30
+ }
31
+
32
+ @end
@@ -14,6 +14,9 @@ public class KeyboardMovementObserver: NSObject {
14
14
  // class members
15
15
  var onEvent: (NSString, NSNumber, NSNumber, NSNumber, NSNumber) -> Void
16
16
  var onNotify: (String, Any) -> Void
17
+ // animation
18
+ var onRequestAnimation: () -> Void
19
+ var onCancelAnimation: () -> Void
17
20
  // progress tracker
18
21
  private var _keyboardView: UIView?
19
22
  private var keyboardView: UIView? {
@@ -39,10 +42,14 @@ public class KeyboardMovementObserver: NSObject {
39
42
 
40
43
  @objc public init(
41
44
  handler: @escaping (NSString, NSNumber, NSNumber, NSNumber, NSNumber) -> Void,
42
- onNotify: @escaping (String, Any) -> Void
45
+ onNotify: @escaping (String, Any) -> Void,
46
+ onRequestAnimation: @escaping () -> Void,
47
+ onCancelAnimation: @escaping () -> Void
43
48
  ) {
44
49
  onEvent = handler
45
50
  self.onNotify = onNotify
51
+ self.onRequestAnimation = onRequestAnimation
52
+ self.onCancelAnimation = onCancelAnimation
46
53
  }
47
54
 
48
55
  @objc public func mount() {
@@ -167,6 +174,7 @@ public class KeyboardMovementObserver: NSObject {
167
174
  data["timestamp"] = Date.currentTimeStamp
168
175
  data["target"] = tag
169
176
 
177
+ onRequestAnimation()
170
178
  onEvent("onKeyboardMoveStart", Float(keyboardHeight) as NSNumber, 1, duration as NSNumber, tag)
171
179
  onNotify("KeyboardController::keyboardWillShow", data)
172
180
 
@@ -187,6 +195,7 @@ public class KeyboardMovementObserver: NSObject {
187
195
  data["timestamp"] = Date.currentTimeStamp
188
196
  data["target"] = tag
189
197
 
198
+ onRequestAnimation()
190
199
  onEvent("onKeyboardMoveStart", 0, 0, duration as NSNumber, tag)
191
200
  onNotify("KeyboardController::keyboardWillHide", data)
192
201
 
@@ -209,6 +218,7 @@ public class KeyboardMovementObserver: NSObject {
209
218
  data["timestamp"] = Date.currentTimeStamp
210
219
  data["target"] = tag
211
220
 
221
+ onCancelAnimation()
212
222
  onEvent("onKeyboardMoveEnd", keyboardHeight as NSNumber, 1, duration as NSNumber, tag)
213
223
  onNotify("KeyboardController::keyboardDidShow", data)
214
224
 
@@ -228,6 +238,7 @@ public class KeyboardMovementObserver: NSObject {
228
238
  data["timestamp"] = Date.currentTimeStamp
229
239
  data["target"] = tag
230
240
 
241
+ onCancelAnimation()
231
242
  onEvent("onKeyboardMoveEnd", 0 as NSNumber, 0, duration as NSNumber, tag)
232
243
  onNotify("KeyboardController::keyboardDidHide", data)
233
244
 
@@ -175,6 +175,12 @@ using namespace facebook::react;
175
175
  }
176
176
  onNotify:^(NSString *event, NSDictionary *data) {
177
177
  [KeyboardController.shared sendEvent:event body:data];
178
+ }
179
+ onRequestAnimation:^() {
180
+ // no-op for fabric
181
+ }
182
+ onCancelAnimation:^(){
183
+ // no-op for fabric
178
184
  }];
179
185
  }
180
186
 
@@ -52,6 +52,12 @@ class KeyboardControllerView: UIView {
52
52
  },
53
53
  onNotify: { [weak self] event, data in
54
54
  self?.onNotify(event: event, data: data)
55
+ },
56
+ onRequestAnimation: { [weak self] in
57
+ self?.onRequestAnimation()
58
+ },
59
+ onCancelAnimation: { [weak self] in
60
+ self?.onCancelAnimation()
55
61
  }
56
62
  )
57
63
  }
@@ -102,6 +108,14 @@ class KeyboardControllerView: UIView {
102
108
  )
103
109
  }
104
110
 
111
+ func onRequestAnimation() {
112
+ bridge.uiManager.scheduleKeyboardAnimation()
113
+ }
114
+
115
+ func onCancelAnimation() {
116
+ bridge.uiManager.unscheduleKeyboardAnimation()
117
+ }
118
+
105
119
  func onNotify(event: String, data: Any) {
106
120
  KeyboardController.shared()?.sendEvent(event, body: data)
107
121
  }
@@ -7,10 +7,13 @@ exports.useKeyboardAnimation = void 0;
7
7
  var _reactNativeReanimated = require("react-native-reanimated");
8
8
  var _reactNativeKeyboardController = require("react-native-keyboard-controller");
9
9
  const useKeyboardAnimation = () => {
10
- const heightWhenOpened = (0, _reactNativeReanimated.useSharedValue)(0);
11
- const height = (0, _reactNativeReanimated.useSharedValue)(0);
12
- const progress = (0, _reactNativeReanimated.useSharedValue)(0);
13
- const isClosed = (0, _reactNativeReanimated.useSharedValue)(true);
10
+ const {
11
+ reanimated
12
+ } = (0, _reactNativeKeyboardController.useKeyboardContext)();
13
+ const heightWhenOpened = (0, _reactNativeReanimated.useSharedValue)(-reanimated.height.value);
14
+ const height = (0, _reactNativeReanimated.useSharedValue)(-reanimated.height.value);
15
+ const progress = (0, _reactNativeReanimated.useSharedValue)(reanimated.progress.value);
16
+ const isClosed = (0, _reactNativeReanimated.useSharedValue)(reanimated.progress.value === 0);
14
17
  (0, _reactNativeKeyboardController.useKeyboardHandler)({
15
18
  onStart: e => {
16
19
  "worklet";
@@ -1 +1 @@
1
- {"version":3,"names":["_reactNativeReanimated","require","_reactNativeKeyboardController","useKeyboardAnimation","heightWhenOpened","useSharedValue","height","progress","isClosed","useKeyboardHandler","onStart","e","value","onMove","onEnd","duration","exports"],"sources":["hooks.ts"],"sourcesContent":["import { useSharedValue } from \"react-native-reanimated\";\n\nimport { useKeyboardHandler } from \"react-native-keyboard-controller\";\n\nexport const useKeyboardAnimation = () => {\n const heightWhenOpened = useSharedValue(0);\n const height = useSharedValue(0);\n const progress = useSharedValue(0);\n const isClosed = useSharedValue(true);\n\n useKeyboardHandler(\n {\n onStart: (e) => {\n \"worklet\";\n\n if (e.height > 0) {\n isClosed.value = false;\n heightWhenOpened.value = e.height;\n }\n },\n onMove: (e) => {\n \"worklet\";\n\n progress.value = e.progress;\n height.value = e.height;\n },\n onEnd: (e) => {\n \"worklet\";\n\n isClosed.value = e.height === 0;\n\n // `height` update happens in `onMove` handler\n // in `onEnd` we need to update only if `onMove`\n // wasn't called (i. e. duration === 0)\n //\n // we can not call this code without condition below\n // because in some corner cases (iOS with `secureTextEntry`)\n // `onEnd` can be emitted before `onMove` and in this case\n // it may lead to choppy/glitchy/jumpy UI\n // see https://github.com/kirillzyusko/react-native-keyboard-controller/issues/327\n if (e.duration === 0) {\n progress.value = e.progress;\n height.value = e.height;\n }\n },\n },\n [],\n );\n\n return { height, progress, heightWhenOpened, isClosed };\n};\n"],"mappings":";;;;;;AAAA,IAAAA,sBAAA,GAAAC,OAAA;AAEA,IAAAC,8BAAA,GAAAD,OAAA;AAEO,MAAME,oBAAoB,GAAGA,CAAA,KAAM;EACxC,MAAMC,gBAAgB,GAAG,IAAAC,qCAAc,EAAC,CAAC,CAAC;EAC1C,MAAMC,MAAM,GAAG,IAAAD,qCAAc,EAAC,CAAC,CAAC;EAChC,MAAME,QAAQ,GAAG,IAAAF,qCAAc,EAAC,CAAC,CAAC;EAClC,MAAMG,QAAQ,GAAG,IAAAH,qCAAc,EAAC,IAAI,CAAC;EAErC,IAAAI,iDAAkB,EAChB;IACEC,OAAO,EAAGC,CAAC,IAAK;MACd,SAAS;;MAET,IAAIA,CAAC,CAACL,MAAM,GAAG,CAAC,EAAE;QAChBE,QAAQ,CAACI,KAAK,GAAG,KAAK;QACtBR,gBAAgB,CAACQ,KAAK,GAAGD,CAAC,CAACL,MAAM;MACnC;IACF,CAAC;IACDO,MAAM,EAAGF,CAAC,IAAK;MACb,SAAS;;MAETJ,QAAQ,CAACK,KAAK,GAAGD,CAAC,CAACJ,QAAQ;MAC3BD,MAAM,CAACM,KAAK,GAAGD,CAAC,CAACL,MAAM;IACzB,CAAC;IACDQ,KAAK,EAAGH,CAAC,IAAK;MACZ,SAAS;;MAETH,QAAQ,CAACI,KAAK,GAAGD,CAAC,CAACL,MAAM,KAAK,CAAC;;MAE/B;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA,IAAIK,CAAC,CAACI,QAAQ,KAAK,CAAC,EAAE;QACpBR,QAAQ,CAACK,KAAK,GAAGD,CAAC,CAACJ,QAAQ;QAC3BD,MAAM,CAACM,KAAK,GAAGD,CAAC,CAACL,MAAM;MACzB;IACF;EACF,CAAC,EACD,EACF,CAAC;EAED,OAAO;IAAEA,MAAM;IAAEC,QAAQ;IAAEH,gBAAgB;IAAEI;EAAS,CAAC;AACzD,CAAC;AAACQ,OAAA,CAAAb,oBAAA,GAAAA,oBAAA","ignoreList":[]}
1
+ {"version":3,"names":["_reactNativeReanimated","require","_reactNativeKeyboardController","useKeyboardAnimation","reanimated","useKeyboardContext","heightWhenOpened","useSharedValue","height","value","progress","isClosed","useKeyboardHandler","onStart","e","onMove","onEnd","duration","exports"],"sources":["hooks.ts"],"sourcesContent":["import { useSharedValue } from \"react-native-reanimated\";\n\nimport {\n useKeyboardContext,\n useKeyboardHandler,\n} from \"react-native-keyboard-controller\";\n\nexport const useKeyboardAnimation = () => {\n const { reanimated } = useKeyboardContext();\n const heightWhenOpened = useSharedValue(-reanimated.height.value);\n const height = useSharedValue(-reanimated.height.value);\n const progress = useSharedValue(reanimated.progress.value);\n const isClosed = useSharedValue(reanimated.progress.value === 0);\n\n useKeyboardHandler(\n {\n onStart: (e) => {\n \"worklet\";\n\n if (e.height > 0) {\n isClosed.value = false;\n heightWhenOpened.value = e.height;\n }\n },\n onMove: (e) => {\n \"worklet\";\n\n progress.value = e.progress;\n height.value = e.height;\n },\n onEnd: (e) => {\n \"worklet\";\n\n isClosed.value = e.height === 0;\n\n // `height` update happens in `onMove` handler\n // in `onEnd` we need to update only if `onMove`\n // wasn't called (i. e. duration === 0)\n //\n // we can not call this code without condition below\n // because in some corner cases (iOS with `secureTextEntry`)\n // `onEnd` can be emitted before `onMove` and in this case\n // it may lead to choppy/glitchy/jumpy UI\n // see https://github.com/kirillzyusko/react-native-keyboard-controller/issues/327\n if (e.duration === 0) {\n progress.value = e.progress;\n height.value = e.height;\n }\n },\n },\n [],\n );\n\n return { height, progress, heightWhenOpened, isClosed };\n};\n"],"mappings":";;;;;;AAAA,IAAAA,sBAAA,GAAAC,OAAA;AAEA,IAAAC,8BAAA,GAAAD,OAAA;AAKO,MAAME,oBAAoB,GAAGA,CAAA,KAAM;EACxC,MAAM;IAAEC;EAAW,CAAC,GAAG,IAAAC,iDAAkB,EAAC,CAAC;EAC3C,MAAMC,gBAAgB,GAAG,IAAAC,qCAAc,EAAC,CAACH,UAAU,CAACI,MAAM,CAACC,KAAK,CAAC;EACjE,MAAMD,MAAM,GAAG,IAAAD,qCAAc,EAAC,CAACH,UAAU,CAACI,MAAM,CAACC,KAAK,CAAC;EACvD,MAAMC,QAAQ,GAAG,IAAAH,qCAAc,EAACH,UAAU,CAACM,QAAQ,CAACD,KAAK,CAAC;EAC1D,MAAME,QAAQ,GAAG,IAAAJ,qCAAc,EAACH,UAAU,CAACM,QAAQ,CAACD,KAAK,KAAK,CAAC,CAAC;EAEhE,IAAAG,iDAAkB,EAChB;IACEC,OAAO,EAAGC,CAAC,IAAK;MACd,SAAS;;MAET,IAAIA,CAAC,CAACN,MAAM,GAAG,CAAC,EAAE;QAChBG,QAAQ,CAACF,KAAK,GAAG,KAAK;QACtBH,gBAAgB,CAACG,KAAK,GAAGK,CAAC,CAACN,MAAM;MACnC;IACF,CAAC;IACDO,MAAM,EAAGD,CAAC,IAAK;MACb,SAAS;;MAETJ,QAAQ,CAACD,KAAK,GAAGK,CAAC,CAACJ,QAAQ;MAC3BF,MAAM,CAACC,KAAK,GAAGK,CAAC,CAACN,MAAM;IACzB,CAAC;IACDQ,KAAK,EAAGF,CAAC,IAAK;MACZ,SAAS;;MAETH,QAAQ,CAACF,KAAK,GAAGK,CAAC,CAACN,MAAM,KAAK,CAAC;;MAE/B;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA,IAAIM,CAAC,CAACG,QAAQ,KAAK,CAAC,EAAE;QACpBP,QAAQ,CAACD,KAAK,GAAGK,CAAC,CAACJ,QAAQ;QAC3BF,MAAM,CAACC,KAAK,GAAGK,CAAC,CAACN,MAAM;MACzB;IACF;EACF,CAAC,EACD,EACF,CAAC;EAED,OAAO;IAAEA,MAAM;IAAEE,QAAQ;IAAEJ,gBAAgB;IAAEK;EAAS,CAAC;AACzD,CAAC;AAACO,OAAA,CAAAf,oBAAA,GAAAA,oBAAA","ignoreList":[]}
@@ -57,6 +57,7 @@ const KeyboardAwareScrollView = /*#__PURE__*/(0, _react.forwardRef)(({
57
57
  bottomOffset = 0,
58
58
  disableScrollOnKeyboardHide = false,
59
59
  enabled = true,
60
+ onScroll: onScrollProps,
60
61
  ...rest
61
62
  }, ref) => {
62
63
  const scrollViewAnimatedRef = (0, _reactNativeReanimated.useAnimatedRef)();
@@ -76,11 +77,10 @@ const KeyboardAwareScrollView = /*#__PURE__*/(0, _react.forwardRef)(({
76
77
  const {
77
78
  height
78
79
  } = (0, _reactNative.useWindowDimensions)();
79
- const onScroll = (0, _reactNativeReanimated.useAnimatedScrollHandler)({
80
- onScroll: e => {
81
- position.value = e.contentOffset.y;
82
- }
83
- }, []);
80
+ const onScroll = (0, _react.useCallback)(event => {
81
+ position.value = event.nativeEvent.contentOffset.y;
82
+ onScrollProps === null || onScrollProps === void 0 || onScrollProps(event);
83
+ }, [onScrollProps]);
84
84
  const onRef = (0, _react.useCallback)(assignedRef => {
85
85
  if (typeof ref === "function") {
86
86
  ref(assignedRef);
@@ -223,10 +223,8 @@ const KeyboardAwareScrollView = /*#__PURE__*/(0, _react.forwardRef)(({
223
223
  return /*#__PURE__*/_react.default.createElement(_reactNativeReanimated.default.ScrollView, _extends({
224
224
  ref: onRef
225
225
  }, rest, {
226
- onLayout: onScrollViewLayout
227
- // @ts-expect-error `onScrollReanimated` is a fake prop needed for reanimated to intercept scroll events
228
- ,
229
- onScrollReanimated: onScroll,
226
+ onLayout: onScrollViewLayout,
227
+ onScroll: onScroll,
230
228
  scrollEventThrottle: 16
231
229
  }), children, /*#__PURE__*/_react.default.createElement(_reactNativeReanimated.default.View, {
232
230
  style: view
@@ -1 +1 @@
1
- {"version":3,"names":["_react","_interopRequireWildcard","require","_reactNative","_reactNativeReanimated","_reactNativeKeyboardController","_useSmoothKeyboardHandler","_utils","_getRequireWildcardCache","e","WeakMap","r","t","__esModule","default","has","get","n","__proto__","a","Object","defineProperty","getOwnPropertyDescriptor","u","prototype","hasOwnProperty","call","i","set","_extends","assign","bind","target","arguments","length","source","key","apply","KeyboardAwareScrollView","forwardRef","children","onLayout","bottomOffset","disableScrollOnKeyboardHide","enabled","rest","ref","scrollViewAnimatedRef","useAnimatedRef","scrollViewTarget","useSharedValue","scrollPosition","position","currentKeyboardFrameHeight","keyboardHeight","keyboardWillAppear","tag","initialKeyboardSize","scrollBeforeKeyboardMovement","input","useReanimatedFocusedInput","layout","height","useWindowDimensions","onScroll","useAnimatedScrollHandler","value","contentOffset","y","onRef","useCallback","assignedRef","current","onScrollViewLayout","findNodeHandle","maybeScroll","animated","_layout$value","_layout$value2","_layout$value3","parentScrollViewTarget","visibleRect","absoluteY","inputHeight","point","interpolatedScrollTo","interpolate","targetScrollY","Math","max","scrollTo","positionOnScreen","topOfScreen","onChangeText","_layout$value4","_input$value","prevScrollPosition","prevLayout","onChangeTextHandler","useMemo","debounce","useFocusedInputHandler","useSmoothKeyboardHandler","onStart","keyboardWillChangeSize","keyboardWillHide","focusWasChanged","onMove","onEnd","useAnimatedReaction","previous","view","useAnimatedStyle","paddingBottom","createElement","ScrollView","onScrollReanimated","scrollEventThrottle","View","style","_default","exports"],"sources":["index.tsx"],"sourcesContent":["import React, { forwardRef, useCallback, useMemo } from \"react\";\nimport { findNodeHandle, useWindowDimensions } from \"react-native\";\nimport Reanimated, {\n interpolate,\n scrollTo,\n useAnimatedReaction,\n useAnimatedRef,\n useAnimatedScrollHandler,\n useAnimatedStyle,\n useSharedValue,\n} from \"react-native-reanimated\";\n\nimport {\n useFocusedInputHandler,\n useReanimatedFocusedInput,\n} from \"react-native-keyboard-controller\";\n\nimport { useSmoothKeyboardHandler } from \"./useSmoothKeyboardHandler\";\nimport { debounce } from \"./utils\";\n\nimport type {\n LayoutChangeEvent,\n ScrollView,\n ScrollViewProps,\n} from \"react-native\";\nimport type { FocusedInputLayoutChangedEvent } from \"react-native-keyboard-controller\";\n\ntype KeyboardAwareScrollViewProps = {\n /** The distance between keyboard and focused `TextInput` when keyboard is shown. Default is `0`. */\n bottomOffset?: number;\n /** Prevents automatic scrolling of the `ScrollView` when the keyboard gets hidden, maintaining the current screen position. Default is `false`. */\n disableScrollOnKeyboardHide?: boolean;\n /** Controls whether this `KeyboardAwareScrollView` instance should take effect. Default is `true` */\n enabled?: boolean;\n} & ScrollViewProps;\n\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 * +============================+ +============================+ +=====================================+\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 */\nconst KeyboardAwareScrollView = forwardRef<\n ScrollView,\n React.PropsWithChildren<KeyboardAwareScrollViewProps>\n>(\n (\n {\n children,\n onLayout,\n bottomOffset = 0,\n disableScrollOnKeyboardHide = false,\n enabled = true,\n ...rest\n },\n ref,\n ) => {\n const scrollViewAnimatedRef = useAnimatedRef<Reanimated.ScrollView>();\n const scrollViewTarget = useSharedValue<number | null>(null);\n const scrollPosition = useSharedValue(0);\n const position = useSharedValue(0);\n const currentKeyboardFrameHeight = useSharedValue(0);\n const keyboardHeight = useSharedValue(0);\n const keyboardWillAppear = useSharedValue(false);\n const tag = useSharedValue(-1);\n const initialKeyboardSize = useSharedValue(0);\n const scrollBeforeKeyboardMovement = useSharedValue(0);\n const { input } = useReanimatedFocusedInput();\n const layout = useSharedValue<FocusedInputLayoutChangedEvent | null>(null);\n\n const { height } = useWindowDimensions();\n\n const onScroll = useAnimatedScrollHandler(\n {\n onScroll: (e) => {\n position.value = e.contentOffset.y;\n },\n },\n [],\n );\n\n const onRef = useCallback((assignedRef: Reanimated.ScrollView) => {\n if (typeof ref === \"function\") {\n ref(assignedRef);\n } else if (ref) {\n ref.current = assignedRef;\n }\n\n scrollViewAnimatedRef(assignedRef);\n }, []);\n const onScrollViewLayout = useCallback(\n (e: LayoutChangeEvent) => {\n scrollViewTarget.value = findNodeHandle(scrollViewAnimatedRef.current);\n\n onLayout?.(e);\n },\n [onLayout],\n );\n\n /**\n * Function that will scroll a ScrollView as keyboard gets moving\n */\n const maybeScroll = useCallback(\n (e: number, animated: boolean = false) => {\n \"worklet\";\n\n if (!enabled) {\n return 0;\n }\n\n // input belongs to ScrollView\n if (layout.value?.parentScrollViewTarget !== scrollViewTarget.value) {\n return 0;\n }\n\n const visibleRect = height - keyboardHeight.value;\n const absoluteY = layout.value?.layout.absoluteY || 0;\n const inputHeight = layout.value?.layout.height || 0;\n const point = absoluteY + inputHeight;\n\n if (visibleRect - point <= bottomOffset) {\n const interpolatedScrollTo = interpolate(\n e,\n [initialKeyboardSize.value, keyboardHeight.value],\n [0, keyboardHeight.value - (height - point) + bottomOffset],\n );\n const targetScrollY =\n Math.max(interpolatedScrollTo, 0) + scrollPosition.value;\n scrollTo(scrollViewAnimatedRef, 0, targetScrollY, animated);\n\n return interpolatedScrollTo;\n }\n\n if (absoluteY < 0) {\n const positionOnScreen = visibleRect - inputHeight - bottomOffset;\n const topOfScreen = scrollPosition.value + absoluteY;\n\n scrollTo(\n scrollViewAnimatedRef,\n 0,\n topOfScreen - positionOnScreen,\n animated,\n );\n }\n\n return 0;\n },\n [bottomOffset, enabled],\n );\n\n const onChangeText = useCallback(() => {\n \"worklet\";\n\n // if typing a text caused layout shift, then we need to ignore this handler\n // because this event will be handled in `useAnimatedReaction` below\n if (layout.value?.layout.height !== input.value?.layout.height) {\n return;\n }\n\n const prevScrollPosition = scrollPosition.value;\n const prevLayout = layout.value;\n\n scrollPosition.value = position.value;\n layout.value = input.value;\n maybeScroll(keyboardHeight.value, true);\n scrollPosition.value = prevScrollPosition;\n layout.value = prevLayout;\n }, [maybeScroll]);\n\n const onChangeTextHandler = useMemo(\n () => debounce(onChangeText, 200),\n [onChangeText],\n );\n\n useFocusedInputHandler(\n {\n onChangeText: onChangeTextHandler,\n },\n [onChangeTextHandler],\n );\n\n useSmoothKeyboardHandler(\n enabled\n ? {\n onStart: (e) => {\n \"worklet\";\n\n const keyboardWillChangeSize =\n keyboardHeight.value !== e.height && e.height > 0;\n keyboardWillAppear.value =\n e.height > 0 && keyboardHeight.value === 0;\n const keyboardWillHide = e.height === 0;\n const focusWasChanged =\n (tag.value !== e.target && e.target !== -1) ||\n keyboardWillChangeSize;\n\n if (keyboardWillChangeSize) {\n initialKeyboardSize.value = keyboardHeight.value;\n }\n\n if (keyboardWillHide) {\n // on back transition need to interpolate as [0, keyboardHeight]\n initialKeyboardSize.value = 0;\n scrollPosition.value = scrollBeforeKeyboardMovement.value;\n }\n\n if (\n keyboardWillAppear.value ||\n keyboardWillChangeSize ||\n focusWasChanged\n ) {\n // persist scroll value\n scrollPosition.value = position.value;\n // just persist height - later will be used in interpolation\n keyboardHeight.value = e.height;\n }\n\n // focus was changed\n if (focusWasChanged) {\n tag.value = e.target;\n\n // save position of focused text input when keyboard starts to move\n layout.value = input.value;\n // save current scroll position - when keyboard will hide we'll reuse\n // this value to achieve smooth hide effect\n scrollBeforeKeyboardMovement.value = position.value;\n }\n\n if (focusWasChanged && !keyboardWillAppear.value) {\n // update position on scroll value, so `onEnd` handler\n // will pick up correct values\n position.value += maybeScroll(e.height, true);\n }\n },\n onMove: (e) => {\n \"worklet\";\n\n currentKeyboardFrameHeight.value = e.height;\n\n // if the user has set disableScrollOnKeyboardHide, only auto-scroll when the keyboard opens\n if (!disableScrollOnKeyboardHide || keyboardWillAppear.value) {\n maybeScroll(e.height);\n }\n },\n onEnd: (e) => {\n \"worklet\";\n\n keyboardHeight.value = e.height;\n scrollPosition.value = position.value;\n },\n }\n : {},\n [height, maybeScroll, disableScrollOnKeyboardHide, enabled],\n );\n\n useAnimatedReaction(\n () => input.value,\n (current, previous) => {\n if (\n current?.target === previous?.target &&\n current?.layout.height !== previous?.layout.height\n ) {\n const prevLayout = layout.value;\n\n layout.value = input.value;\n scrollPosition.value += maybeScroll(keyboardHeight.value, true);\n layout.value = prevLayout;\n }\n },\n [],\n );\n\n const view = useAnimatedStyle(\n () => ({\n // animations become laggy when scrolling to the end of the `ScrollView` (when the last input is focused)\n // this happens because the layout recalculates on every frame. To avoid this we slightly increase padding\n // by `+1`. In this way we assure, that `scrollTo` will never scroll to the end, because it uses interpolation\n // from 0 to `keyboardHeight`, and here our padding is `keyboardHeight + 1`. It allows us not to re-run layout\n // re-calculation on every animation frame and it helps to achieve smooth animation.\n // see: https://github.com/kirillzyusko/react-native-keyboard-controller/pull/342\n paddingBottom: currentKeyboardFrameHeight.value + 1,\n }),\n [],\n );\n\n return (\n <Reanimated.ScrollView\n ref={onRef}\n {...rest}\n onLayout={onScrollViewLayout}\n // @ts-expect-error `onScrollReanimated` is a fake prop needed for reanimated to intercept scroll events\n onScrollReanimated={onScroll}\n scrollEventThrottle={16}\n >\n {children}\n <Reanimated.View style={view} />\n </Reanimated.ScrollView>\n );\n },\n);\n\nexport default KeyboardAwareScrollView;\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["_react","_interopRequireWildcard","require","_reactNative","_reactNativeReanimated","_reactNativeKeyboardController","_useSmoothKeyboardHandler","_utils","_getRequireWildcardCache","e","WeakMap","r","t","__esModule","default","has","get","n","__proto__","a","Object","defineProperty","getOwnPropertyDescriptor","u","prototype","hasOwnProperty","call","i","set","_extends","assign","bind","target","arguments","length","source","key","apply","KeyboardAwareScrollView","forwardRef","children","onLayout","bottomOffset","disableScrollOnKeyboardHide","enabled","onScroll","onScrollProps","rest","ref","scrollViewAnimatedRef","useAnimatedRef","scrollViewTarget","useSharedValue","scrollPosition","position","currentKeyboardFrameHeight","keyboardHeight","keyboardWillAppear","tag","initialKeyboardSize","scrollBeforeKeyboardMovement","input","useReanimatedFocusedInput","layout","height","useWindowDimensions","useCallback","event","value","nativeEvent","contentOffset","y","onRef","assignedRef","current","onScrollViewLayout","findNodeHandle","maybeScroll","animated","_layout$value","_layout$value2","_layout$value3","parentScrollViewTarget","visibleRect","absoluteY","inputHeight","point","interpolatedScrollTo","interpolate","targetScrollY","Math","max","scrollTo","positionOnScreen","topOfScreen","onChangeText","_layout$value4","_input$value","prevScrollPosition","prevLayout","onChangeTextHandler","useMemo","debounce","useFocusedInputHandler","useSmoothKeyboardHandler","onStart","keyboardWillChangeSize","keyboardWillHide","focusWasChanged","onMove","onEnd","useAnimatedReaction","previous","view","useAnimatedStyle","paddingBottom","createElement","ScrollView","scrollEventThrottle","View","style","_default","exports"],"sources":["index.tsx"],"sourcesContent":["import React, { forwardRef, useCallback, useMemo } from \"react\";\nimport { findNodeHandle, useWindowDimensions } from \"react-native\";\nimport Reanimated, {\n interpolate,\n scrollTo,\n useAnimatedReaction,\n useAnimatedRef,\n useAnimatedStyle,\n useSharedValue,\n} from \"react-native-reanimated\";\n\nimport {\n useFocusedInputHandler,\n useReanimatedFocusedInput,\n} from \"react-native-keyboard-controller\";\n\nimport { useSmoothKeyboardHandler } from \"./useSmoothKeyboardHandler\";\nimport { debounce } from \"./utils\";\n\nimport type {\n LayoutChangeEvent,\n ScrollView,\n ScrollViewProps,\n} from \"react-native\";\nimport type { FocusedInputLayoutChangedEvent } from \"react-native-keyboard-controller\";\n\ntype KeyboardAwareScrollViewProps = {\n /** The distance between keyboard and focused `TextInput` when keyboard is shown. Default is `0`. */\n bottomOffset?: number;\n /** Prevents automatic scrolling of the `ScrollView` when the keyboard gets hidden, maintaining the current screen position. Default is `false`. */\n disableScrollOnKeyboardHide?: boolean;\n /** Controls whether this `KeyboardAwareScrollView` instance should take effect. Default is `true` */\n enabled?: boolean;\n} & ScrollViewProps;\n\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 * +============================+ +============================+ +=====================================+\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 */\nconst KeyboardAwareScrollView = forwardRef<\n ScrollView,\n React.PropsWithChildren<KeyboardAwareScrollViewProps>\n>(\n (\n {\n children,\n onLayout,\n bottomOffset = 0,\n disableScrollOnKeyboardHide = false,\n enabled = true,\n onScroll: onScrollProps,\n ...rest\n },\n ref,\n ) => {\n const scrollViewAnimatedRef = useAnimatedRef<Reanimated.ScrollView>();\n const scrollViewTarget = useSharedValue<number | null>(null);\n const scrollPosition = useSharedValue(0);\n const position = useSharedValue(0);\n const currentKeyboardFrameHeight = useSharedValue(0);\n const keyboardHeight = useSharedValue(0);\n const keyboardWillAppear = useSharedValue(false);\n const tag = useSharedValue(-1);\n const initialKeyboardSize = useSharedValue(0);\n const scrollBeforeKeyboardMovement = useSharedValue(0);\n const { input } = useReanimatedFocusedInput();\n const layout = useSharedValue<FocusedInputLayoutChangedEvent | null>(null);\n\n const { height } = useWindowDimensions();\n\n const onScroll = useCallback<NonNullable<ScrollViewProps[\"onScroll\"]>>(\n (event) => {\n position.value = event.nativeEvent.contentOffset.y;\n\n onScrollProps?.(event);\n },\n [onScrollProps],\n );\n\n const onRef = useCallback((assignedRef: Reanimated.ScrollView) => {\n if (typeof ref === \"function\") {\n ref(assignedRef);\n } else if (ref) {\n ref.current = assignedRef;\n }\n\n scrollViewAnimatedRef(assignedRef);\n }, []);\n const onScrollViewLayout = useCallback(\n (e: LayoutChangeEvent) => {\n scrollViewTarget.value = findNodeHandle(scrollViewAnimatedRef.current);\n\n onLayout?.(e);\n },\n [onLayout],\n );\n\n /**\n * Function that will scroll a ScrollView as keyboard gets moving\n */\n const maybeScroll = useCallback(\n (e: number, animated: boolean = false) => {\n \"worklet\";\n\n if (!enabled) {\n return 0;\n }\n\n // input belongs to ScrollView\n if (layout.value?.parentScrollViewTarget !== scrollViewTarget.value) {\n return 0;\n }\n\n const visibleRect = height - keyboardHeight.value;\n const absoluteY = layout.value?.layout.absoluteY || 0;\n const inputHeight = layout.value?.layout.height || 0;\n const point = absoluteY + inputHeight;\n\n if (visibleRect - point <= bottomOffset) {\n const interpolatedScrollTo = interpolate(\n e,\n [initialKeyboardSize.value, keyboardHeight.value],\n [0, keyboardHeight.value - (height - point) + bottomOffset],\n );\n const targetScrollY =\n Math.max(interpolatedScrollTo, 0) + scrollPosition.value;\n scrollTo(scrollViewAnimatedRef, 0, targetScrollY, animated);\n\n return interpolatedScrollTo;\n }\n\n if (absoluteY < 0) {\n const positionOnScreen = visibleRect - inputHeight - bottomOffset;\n const topOfScreen = scrollPosition.value + absoluteY;\n\n scrollTo(\n scrollViewAnimatedRef,\n 0,\n topOfScreen - positionOnScreen,\n animated,\n );\n }\n\n return 0;\n },\n [bottomOffset, enabled],\n );\n\n const onChangeText = useCallback(() => {\n \"worklet\";\n\n // if typing a text caused layout shift, then we need to ignore this handler\n // because this event will be handled in `useAnimatedReaction` below\n if (layout.value?.layout.height !== input.value?.layout.height) {\n return;\n }\n\n const prevScrollPosition = scrollPosition.value;\n const prevLayout = layout.value;\n\n scrollPosition.value = position.value;\n layout.value = input.value;\n maybeScroll(keyboardHeight.value, true);\n scrollPosition.value = prevScrollPosition;\n layout.value = prevLayout;\n }, [maybeScroll]);\n\n const onChangeTextHandler = useMemo(\n () => debounce(onChangeText, 200),\n [onChangeText],\n );\n\n useFocusedInputHandler(\n {\n onChangeText: onChangeTextHandler,\n },\n [onChangeTextHandler],\n );\n\n useSmoothKeyboardHandler(\n enabled\n ? {\n onStart: (e) => {\n \"worklet\";\n\n const keyboardWillChangeSize =\n keyboardHeight.value !== e.height && e.height > 0;\n keyboardWillAppear.value =\n e.height > 0 && keyboardHeight.value === 0;\n const keyboardWillHide = e.height === 0;\n const focusWasChanged =\n (tag.value !== e.target && e.target !== -1) ||\n keyboardWillChangeSize;\n\n if (keyboardWillChangeSize) {\n initialKeyboardSize.value = keyboardHeight.value;\n }\n\n if (keyboardWillHide) {\n // on back transition need to interpolate as [0, keyboardHeight]\n initialKeyboardSize.value = 0;\n scrollPosition.value = scrollBeforeKeyboardMovement.value;\n }\n\n if (\n keyboardWillAppear.value ||\n keyboardWillChangeSize ||\n focusWasChanged\n ) {\n // persist scroll value\n scrollPosition.value = position.value;\n // just persist height - later will be used in interpolation\n keyboardHeight.value = e.height;\n }\n\n // focus was changed\n if (focusWasChanged) {\n tag.value = e.target;\n\n // save position of focused text input when keyboard starts to move\n layout.value = input.value;\n // save current scroll position - when keyboard will hide we'll reuse\n // this value to achieve smooth hide effect\n scrollBeforeKeyboardMovement.value = position.value;\n }\n\n if (focusWasChanged && !keyboardWillAppear.value) {\n // update position on scroll value, so `onEnd` handler\n // will pick up correct values\n position.value += maybeScroll(e.height, true);\n }\n },\n onMove: (e) => {\n \"worklet\";\n\n currentKeyboardFrameHeight.value = e.height;\n\n // if the user has set disableScrollOnKeyboardHide, only auto-scroll when the keyboard opens\n if (!disableScrollOnKeyboardHide || keyboardWillAppear.value) {\n maybeScroll(e.height);\n }\n },\n onEnd: (e) => {\n \"worklet\";\n\n keyboardHeight.value = e.height;\n scrollPosition.value = position.value;\n },\n }\n : {},\n [height, maybeScroll, disableScrollOnKeyboardHide, enabled],\n );\n\n useAnimatedReaction(\n () => input.value,\n (current, previous) => {\n if (\n current?.target === previous?.target &&\n current?.layout.height !== previous?.layout.height\n ) {\n const prevLayout = layout.value;\n\n layout.value = input.value;\n scrollPosition.value += maybeScroll(keyboardHeight.value, true);\n layout.value = prevLayout;\n }\n },\n [],\n );\n\n const view = useAnimatedStyle(\n () => ({\n // animations become laggy when scrolling to the end of the `ScrollView` (when the last input is focused)\n // this happens because the layout recalculates on every frame. To avoid this we slightly increase padding\n // by `+1`. In this way we assure, that `scrollTo` will never scroll to the end, because it uses interpolation\n // from 0 to `keyboardHeight`, and here our padding is `keyboardHeight + 1`. It allows us not to re-run layout\n // re-calculation on every animation frame and it helps to achieve smooth animation.\n // see: https://github.com/kirillzyusko/react-native-keyboard-controller/pull/342\n paddingBottom: currentKeyboardFrameHeight.value + 1,\n }),\n [],\n );\n\n return (\n <Reanimated.ScrollView\n ref={onRef}\n {...rest}\n onLayout={onScrollViewLayout}\n onScroll={onScroll}\n scrollEventThrottle={16}\n >\n {children}\n <Reanimated.View style={view} />\n </Reanimated.ScrollView>\n );\n },\n);\n\nexport default KeyboardAwareScrollView;\n"],"mappings":"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","ignoreList":[]}
@@ -1,10 +1,13 @@
1
1
  import { useSharedValue } from "react-native-reanimated";
2
- import { useKeyboardHandler } from "react-native-keyboard-controller";
2
+ import { useKeyboardContext, useKeyboardHandler } from "react-native-keyboard-controller";
3
3
  export const useKeyboardAnimation = () => {
4
- const heightWhenOpened = useSharedValue(0);
5
- const height = useSharedValue(0);
6
- const progress = useSharedValue(0);
7
- const isClosed = useSharedValue(true);
4
+ const {
5
+ reanimated
6
+ } = useKeyboardContext();
7
+ const heightWhenOpened = useSharedValue(-reanimated.height.value);
8
+ const height = useSharedValue(-reanimated.height.value);
9
+ const progress = useSharedValue(reanimated.progress.value);
10
+ const isClosed = useSharedValue(reanimated.progress.value === 0);
8
11
  useKeyboardHandler({
9
12
  onStart: e => {
10
13
  "worklet";
@@ -1 +1 @@
1
- {"version":3,"names":["useSharedValue","useKeyboardHandler","useKeyboardAnimation","heightWhenOpened","height","progress","isClosed","onStart","e","value","onMove","onEnd","duration"],"sources":["hooks.ts"],"sourcesContent":["import { useSharedValue } from \"react-native-reanimated\";\n\nimport { useKeyboardHandler } from \"react-native-keyboard-controller\";\n\nexport const useKeyboardAnimation = () => {\n const heightWhenOpened = useSharedValue(0);\n const height = useSharedValue(0);\n const progress = useSharedValue(0);\n const isClosed = useSharedValue(true);\n\n useKeyboardHandler(\n {\n onStart: (e) => {\n \"worklet\";\n\n if (e.height > 0) {\n isClosed.value = false;\n heightWhenOpened.value = e.height;\n }\n },\n onMove: (e) => {\n \"worklet\";\n\n progress.value = e.progress;\n height.value = e.height;\n },\n onEnd: (e) => {\n \"worklet\";\n\n isClosed.value = e.height === 0;\n\n // `height` update happens in `onMove` handler\n // in `onEnd` we need to update only if `onMove`\n // wasn't called (i. e. duration === 0)\n //\n // we can not call this code without condition below\n // because in some corner cases (iOS with `secureTextEntry`)\n // `onEnd` can be emitted before `onMove` and in this case\n // it may lead to choppy/glitchy/jumpy UI\n // see https://github.com/kirillzyusko/react-native-keyboard-controller/issues/327\n if (e.duration === 0) {\n progress.value = e.progress;\n height.value = e.height;\n }\n },\n },\n [],\n );\n\n return { height, progress, heightWhenOpened, isClosed };\n};\n"],"mappings":"AAAA,SAASA,cAAc,QAAQ,yBAAyB;AAExD,SAASC,kBAAkB,QAAQ,kCAAkC;AAErE,OAAO,MAAMC,oBAAoB,GAAGA,CAAA,KAAM;EACxC,MAAMC,gBAAgB,GAAGH,cAAc,CAAC,CAAC,CAAC;EAC1C,MAAMI,MAAM,GAAGJ,cAAc,CAAC,CAAC,CAAC;EAChC,MAAMK,QAAQ,GAAGL,cAAc,CAAC,CAAC,CAAC;EAClC,MAAMM,QAAQ,GAAGN,cAAc,CAAC,IAAI,CAAC;EAErCC,kBAAkB,CAChB;IACEM,OAAO,EAAGC,CAAC,IAAK;MACd,SAAS;;MAET,IAAIA,CAAC,CAACJ,MAAM,GAAG,CAAC,EAAE;QAChBE,QAAQ,CAACG,KAAK,GAAG,KAAK;QACtBN,gBAAgB,CAACM,KAAK,GAAGD,CAAC,CAACJ,MAAM;MACnC;IACF,CAAC;IACDM,MAAM,EAAGF,CAAC,IAAK;MACb,SAAS;;MAETH,QAAQ,CAACI,KAAK,GAAGD,CAAC,CAACH,QAAQ;MAC3BD,MAAM,CAACK,KAAK,GAAGD,CAAC,CAACJ,MAAM;IACzB,CAAC;IACDO,KAAK,EAAGH,CAAC,IAAK;MACZ,SAAS;;MAETF,QAAQ,CAACG,KAAK,GAAGD,CAAC,CAACJ,MAAM,KAAK,CAAC;;MAE/B;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA,IAAII,CAAC,CAACI,QAAQ,KAAK,CAAC,EAAE;QACpBP,QAAQ,CAACI,KAAK,GAAGD,CAAC,CAACH,QAAQ;QAC3BD,MAAM,CAACK,KAAK,GAAGD,CAAC,CAACJ,MAAM;MACzB;IACF;EACF,CAAC,EACD,EACF,CAAC;EAED,OAAO;IAAEA,MAAM;IAAEC,QAAQ;IAAEF,gBAAgB;IAAEG;EAAS,CAAC;AACzD,CAAC","ignoreList":[]}
1
+ {"version":3,"names":["useSharedValue","useKeyboardContext","useKeyboardHandler","useKeyboardAnimation","reanimated","heightWhenOpened","height","value","progress","isClosed","onStart","e","onMove","onEnd","duration"],"sources":["hooks.ts"],"sourcesContent":["import { useSharedValue } from \"react-native-reanimated\";\n\nimport {\n useKeyboardContext,\n useKeyboardHandler,\n} from \"react-native-keyboard-controller\";\n\nexport const useKeyboardAnimation = () => {\n const { reanimated } = useKeyboardContext();\n const heightWhenOpened = useSharedValue(-reanimated.height.value);\n const height = useSharedValue(-reanimated.height.value);\n const progress = useSharedValue(reanimated.progress.value);\n const isClosed = useSharedValue(reanimated.progress.value === 0);\n\n useKeyboardHandler(\n {\n onStart: (e) => {\n \"worklet\";\n\n if (e.height > 0) {\n isClosed.value = false;\n heightWhenOpened.value = e.height;\n }\n },\n onMove: (e) => {\n \"worklet\";\n\n progress.value = e.progress;\n height.value = e.height;\n },\n onEnd: (e) => {\n \"worklet\";\n\n isClosed.value = e.height === 0;\n\n // `height` update happens in `onMove` handler\n // in `onEnd` we need to update only if `onMove`\n // wasn't called (i. e. duration === 0)\n //\n // we can not call this code without condition below\n // because in some corner cases (iOS with `secureTextEntry`)\n // `onEnd` can be emitted before `onMove` and in this case\n // it may lead to choppy/glitchy/jumpy UI\n // see https://github.com/kirillzyusko/react-native-keyboard-controller/issues/327\n if (e.duration === 0) {\n progress.value = e.progress;\n height.value = e.height;\n }\n },\n },\n [],\n );\n\n return { height, progress, heightWhenOpened, isClosed };\n};\n"],"mappings":"AAAA,SAASA,cAAc,QAAQ,yBAAyB;AAExD,SACEC,kBAAkB,EAClBC,kBAAkB,QACb,kCAAkC;AAEzC,OAAO,MAAMC,oBAAoB,GAAGA,CAAA,KAAM;EACxC,MAAM;IAAEC;EAAW,CAAC,GAAGH,kBAAkB,CAAC,CAAC;EAC3C,MAAMI,gBAAgB,GAAGL,cAAc,CAAC,CAACI,UAAU,CAACE,MAAM,CAACC,KAAK,CAAC;EACjE,MAAMD,MAAM,GAAGN,cAAc,CAAC,CAACI,UAAU,CAACE,MAAM,CAACC,KAAK,CAAC;EACvD,MAAMC,QAAQ,GAAGR,cAAc,CAACI,UAAU,CAACI,QAAQ,CAACD,KAAK,CAAC;EAC1D,MAAME,QAAQ,GAAGT,cAAc,CAACI,UAAU,CAACI,QAAQ,CAACD,KAAK,KAAK,CAAC,CAAC;EAEhEL,kBAAkB,CAChB;IACEQ,OAAO,EAAGC,CAAC,IAAK;MACd,SAAS;;MAET,IAAIA,CAAC,CAACL,MAAM,GAAG,CAAC,EAAE;QAChBG,QAAQ,CAACF,KAAK,GAAG,KAAK;QACtBF,gBAAgB,CAACE,KAAK,GAAGI,CAAC,CAACL,MAAM;MACnC;IACF,CAAC;IACDM,MAAM,EAAGD,CAAC,IAAK;MACb,SAAS;;MAETH,QAAQ,CAACD,KAAK,GAAGI,CAAC,CAACH,QAAQ;MAC3BF,MAAM,CAACC,KAAK,GAAGI,CAAC,CAACL,MAAM;IACzB,CAAC;IACDO,KAAK,EAAGF,CAAC,IAAK;MACZ,SAAS;;MAETF,QAAQ,CAACF,KAAK,GAAGI,CAAC,CAACL,MAAM,KAAK,CAAC;;MAE/B;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA,IAAIK,CAAC,CAACG,QAAQ,KAAK,CAAC,EAAE;QACpBN,QAAQ,CAACD,KAAK,GAAGI,CAAC,CAACH,QAAQ;QAC3BF,MAAM,CAACC,KAAK,GAAGI,CAAC,CAACL,MAAM;MACzB;IACF;EACF,CAAC,EACD,EACF,CAAC;EAED,OAAO;IAAEA,MAAM;IAAEE,QAAQ;IAAEH,gBAAgB;IAAEI;EAAS,CAAC;AACzD,CAAC","ignoreList":[]}
@@ -1,7 +1,7 @@
1
1
  function _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }
2
2
  import React, { forwardRef, useCallback, useMemo } from "react";
3
3
  import { findNodeHandle, useWindowDimensions } from "react-native";
4
- import Reanimated, { interpolate, scrollTo, useAnimatedReaction, useAnimatedRef, useAnimatedScrollHandler, useAnimatedStyle, useSharedValue } from "react-native-reanimated";
4
+ import Reanimated, { interpolate, scrollTo, useAnimatedReaction, useAnimatedRef, useAnimatedStyle, useSharedValue } from "react-native-reanimated";
5
5
  import { useFocusedInputHandler, useReanimatedFocusedInput } from "react-native-keyboard-controller";
6
6
  import { useSmoothKeyboardHandler } from "./useSmoothKeyboardHandler";
7
7
  import { debounce } from "./utils";
@@ -49,6 +49,7 @@ const KeyboardAwareScrollView = /*#__PURE__*/forwardRef(({
49
49
  bottomOffset = 0,
50
50
  disableScrollOnKeyboardHide = false,
51
51
  enabled = true,
52
+ onScroll: onScrollProps,
52
53
  ...rest
53
54
  }, ref) => {
54
55
  const scrollViewAnimatedRef = useAnimatedRef();
@@ -68,11 +69,10 @@ const KeyboardAwareScrollView = /*#__PURE__*/forwardRef(({
68
69
  const {
69
70
  height
70
71
  } = useWindowDimensions();
71
- const onScroll = useAnimatedScrollHandler({
72
- onScroll: e => {
73
- position.value = e.contentOffset.y;
74
- }
75
- }, []);
72
+ const onScroll = useCallback(event => {
73
+ position.value = event.nativeEvent.contentOffset.y;
74
+ onScrollProps === null || onScrollProps === void 0 || onScrollProps(event);
75
+ }, [onScrollProps]);
76
76
  const onRef = useCallback(assignedRef => {
77
77
  if (typeof ref === "function") {
78
78
  ref(assignedRef);
@@ -215,10 +215,8 @@ const KeyboardAwareScrollView = /*#__PURE__*/forwardRef(({
215
215
  return /*#__PURE__*/React.createElement(Reanimated.ScrollView, _extends({
216
216
  ref: onRef
217
217
  }, rest, {
218
- onLayout: onScrollViewLayout
219
- // @ts-expect-error `onScrollReanimated` is a fake prop needed for reanimated to intercept scroll events
220
- ,
221
- onScrollReanimated: onScroll,
218
+ onLayout: onScrollViewLayout,
219
+ onScroll: onScroll,
222
220
  scrollEventThrottle: 16
223
221
  }), children, /*#__PURE__*/React.createElement(Reanimated.View, {
224
222
  style: view
@@ -1 +1 @@
1
- {"version":3,"names":["React","forwardRef","useCallback","useMemo","findNodeHandle","useWindowDimensions","Reanimated","interpolate","scrollTo","useAnimatedReaction","useAnimatedRef","useAnimatedScrollHandler","useAnimatedStyle","useSharedValue","useFocusedInputHandler","useReanimatedFocusedInput","useSmoothKeyboardHandler","debounce","KeyboardAwareScrollView","children","onLayout","bottomOffset","disableScrollOnKeyboardHide","enabled","rest","ref","scrollViewAnimatedRef","scrollViewTarget","scrollPosition","position","currentKeyboardFrameHeight","keyboardHeight","keyboardWillAppear","tag","initialKeyboardSize","scrollBeforeKeyboardMovement","input","layout","height","onScroll","e","value","contentOffset","y","onRef","assignedRef","current","onScrollViewLayout","maybeScroll","animated","_layout$value","_layout$value2","_layout$value3","parentScrollViewTarget","visibleRect","absoluteY","inputHeight","point","interpolatedScrollTo","targetScrollY","Math","max","positionOnScreen","topOfScreen","onChangeText","_layout$value4","_input$value","prevScrollPosition","prevLayout","onChangeTextHandler","onStart","keyboardWillChangeSize","keyboardWillHide","focusWasChanged","target","onMove","onEnd","previous","view","paddingBottom","createElement","ScrollView","_extends","onScrollReanimated","scrollEventThrottle","View","style"],"sources":["index.tsx"],"sourcesContent":["import React, { forwardRef, useCallback, useMemo } from \"react\";\nimport { findNodeHandle, useWindowDimensions } from \"react-native\";\nimport Reanimated, {\n interpolate,\n scrollTo,\n useAnimatedReaction,\n useAnimatedRef,\n useAnimatedScrollHandler,\n useAnimatedStyle,\n useSharedValue,\n} from \"react-native-reanimated\";\n\nimport {\n useFocusedInputHandler,\n useReanimatedFocusedInput,\n} from \"react-native-keyboard-controller\";\n\nimport { useSmoothKeyboardHandler } from \"./useSmoothKeyboardHandler\";\nimport { debounce } from \"./utils\";\n\nimport type {\n LayoutChangeEvent,\n ScrollView,\n ScrollViewProps,\n} from \"react-native\";\nimport type { FocusedInputLayoutChangedEvent } from \"react-native-keyboard-controller\";\n\ntype KeyboardAwareScrollViewProps = {\n /** The distance between keyboard and focused `TextInput` when keyboard is shown. Default is `0`. */\n bottomOffset?: number;\n /** Prevents automatic scrolling of the `ScrollView` when the keyboard gets hidden, maintaining the current screen position. Default is `false`. */\n disableScrollOnKeyboardHide?: boolean;\n /** Controls whether this `KeyboardAwareScrollView` instance should take effect. Default is `true` */\n enabled?: boolean;\n} & ScrollViewProps;\n\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 * +============================+ +============================+ +=====================================+\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 */\nconst KeyboardAwareScrollView = forwardRef<\n ScrollView,\n React.PropsWithChildren<KeyboardAwareScrollViewProps>\n>(\n (\n {\n children,\n onLayout,\n bottomOffset = 0,\n disableScrollOnKeyboardHide = false,\n enabled = true,\n ...rest\n },\n ref,\n ) => {\n const scrollViewAnimatedRef = useAnimatedRef<Reanimated.ScrollView>();\n const scrollViewTarget = useSharedValue<number | null>(null);\n const scrollPosition = useSharedValue(0);\n const position = useSharedValue(0);\n const currentKeyboardFrameHeight = useSharedValue(0);\n const keyboardHeight = useSharedValue(0);\n const keyboardWillAppear = useSharedValue(false);\n const tag = useSharedValue(-1);\n const initialKeyboardSize = useSharedValue(0);\n const scrollBeforeKeyboardMovement = useSharedValue(0);\n const { input } = useReanimatedFocusedInput();\n const layout = useSharedValue<FocusedInputLayoutChangedEvent | null>(null);\n\n const { height } = useWindowDimensions();\n\n const onScroll = useAnimatedScrollHandler(\n {\n onScroll: (e) => {\n position.value = e.contentOffset.y;\n },\n },\n [],\n );\n\n const onRef = useCallback((assignedRef: Reanimated.ScrollView) => {\n if (typeof ref === \"function\") {\n ref(assignedRef);\n } else if (ref) {\n ref.current = assignedRef;\n }\n\n scrollViewAnimatedRef(assignedRef);\n }, []);\n const onScrollViewLayout = useCallback(\n (e: LayoutChangeEvent) => {\n scrollViewTarget.value = findNodeHandle(scrollViewAnimatedRef.current);\n\n onLayout?.(e);\n },\n [onLayout],\n );\n\n /**\n * Function that will scroll a ScrollView as keyboard gets moving\n */\n const maybeScroll = useCallback(\n (e: number, animated: boolean = false) => {\n \"worklet\";\n\n if (!enabled) {\n return 0;\n }\n\n // input belongs to ScrollView\n if (layout.value?.parentScrollViewTarget !== scrollViewTarget.value) {\n return 0;\n }\n\n const visibleRect = height - keyboardHeight.value;\n const absoluteY = layout.value?.layout.absoluteY || 0;\n const inputHeight = layout.value?.layout.height || 0;\n const point = absoluteY + inputHeight;\n\n if (visibleRect - point <= bottomOffset) {\n const interpolatedScrollTo = interpolate(\n e,\n [initialKeyboardSize.value, keyboardHeight.value],\n [0, keyboardHeight.value - (height - point) + bottomOffset],\n );\n const targetScrollY =\n Math.max(interpolatedScrollTo, 0) + scrollPosition.value;\n scrollTo(scrollViewAnimatedRef, 0, targetScrollY, animated);\n\n return interpolatedScrollTo;\n }\n\n if (absoluteY < 0) {\n const positionOnScreen = visibleRect - inputHeight - bottomOffset;\n const topOfScreen = scrollPosition.value + absoluteY;\n\n scrollTo(\n scrollViewAnimatedRef,\n 0,\n topOfScreen - positionOnScreen,\n animated,\n );\n }\n\n return 0;\n },\n [bottomOffset, enabled],\n );\n\n const onChangeText = useCallback(() => {\n \"worklet\";\n\n // if typing a text caused layout shift, then we need to ignore this handler\n // because this event will be handled in `useAnimatedReaction` below\n if (layout.value?.layout.height !== input.value?.layout.height) {\n return;\n }\n\n const prevScrollPosition = scrollPosition.value;\n const prevLayout = layout.value;\n\n scrollPosition.value = position.value;\n layout.value = input.value;\n maybeScroll(keyboardHeight.value, true);\n scrollPosition.value = prevScrollPosition;\n layout.value = prevLayout;\n }, [maybeScroll]);\n\n const onChangeTextHandler = useMemo(\n () => debounce(onChangeText, 200),\n [onChangeText],\n );\n\n useFocusedInputHandler(\n {\n onChangeText: onChangeTextHandler,\n },\n [onChangeTextHandler],\n );\n\n useSmoothKeyboardHandler(\n enabled\n ? {\n onStart: (e) => {\n \"worklet\";\n\n const keyboardWillChangeSize =\n keyboardHeight.value !== e.height && e.height > 0;\n keyboardWillAppear.value =\n e.height > 0 && keyboardHeight.value === 0;\n const keyboardWillHide = e.height === 0;\n const focusWasChanged =\n (tag.value !== e.target && e.target !== -1) ||\n keyboardWillChangeSize;\n\n if (keyboardWillChangeSize) {\n initialKeyboardSize.value = keyboardHeight.value;\n }\n\n if (keyboardWillHide) {\n // on back transition need to interpolate as [0, keyboardHeight]\n initialKeyboardSize.value = 0;\n scrollPosition.value = scrollBeforeKeyboardMovement.value;\n }\n\n if (\n keyboardWillAppear.value ||\n keyboardWillChangeSize ||\n focusWasChanged\n ) {\n // persist scroll value\n scrollPosition.value = position.value;\n // just persist height - later will be used in interpolation\n keyboardHeight.value = e.height;\n }\n\n // focus was changed\n if (focusWasChanged) {\n tag.value = e.target;\n\n // save position of focused text input when keyboard starts to move\n layout.value = input.value;\n // save current scroll position - when keyboard will hide we'll reuse\n // this value to achieve smooth hide effect\n scrollBeforeKeyboardMovement.value = position.value;\n }\n\n if (focusWasChanged && !keyboardWillAppear.value) {\n // update position on scroll value, so `onEnd` handler\n // will pick up correct values\n position.value += maybeScroll(e.height, true);\n }\n },\n onMove: (e) => {\n \"worklet\";\n\n currentKeyboardFrameHeight.value = e.height;\n\n // if the user has set disableScrollOnKeyboardHide, only auto-scroll when the keyboard opens\n if (!disableScrollOnKeyboardHide || keyboardWillAppear.value) {\n maybeScroll(e.height);\n }\n },\n onEnd: (e) => {\n \"worklet\";\n\n keyboardHeight.value = e.height;\n scrollPosition.value = position.value;\n },\n }\n : {},\n [height, maybeScroll, disableScrollOnKeyboardHide, enabled],\n );\n\n useAnimatedReaction(\n () => input.value,\n (current, previous) => {\n if (\n current?.target === previous?.target &&\n current?.layout.height !== previous?.layout.height\n ) {\n const prevLayout = layout.value;\n\n layout.value = input.value;\n scrollPosition.value += maybeScroll(keyboardHeight.value, true);\n layout.value = prevLayout;\n }\n },\n [],\n );\n\n const view = useAnimatedStyle(\n () => ({\n // animations become laggy when scrolling to the end of the `ScrollView` (when the last input is focused)\n // this happens because the layout recalculates on every frame. To avoid this we slightly increase padding\n // by `+1`. In this way we assure, that `scrollTo` will never scroll to the end, because it uses interpolation\n // from 0 to `keyboardHeight`, and here our padding is `keyboardHeight + 1`. It allows us not to re-run layout\n // re-calculation on every animation frame and it helps to achieve smooth animation.\n // see: https://github.com/kirillzyusko/react-native-keyboard-controller/pull/342\n paddingBottom: currentKeyboardFrameHeight.value + 1,\n }),\n [],\n );\n\n return (\n <Reanimated.ScrollView\n ref={onRef}\n {...rest}\n onLayout={onScrollViewLayout}\n // @ts-expect-error `onScrollReanimated` is a fake prop needed for reanimated to intercept scroll events\n onScrollReanimated={onScroll}\n scrollEventThrottle={16}\n >\n {children}\n <Reanimated.View style={view} />\n </Reanimated.ScrollView>\n );\n },\n);\n\nexport default KeyboardAwareScrollView;\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["React","forwardRef","useCallback","useMemo","findNodeHandle","useWindowDimensions","Reanimated","interpolate","scrollTo","useAnimatedReaction","useAnimatedRef","useAnimatedStyle","useSharedValue","useFocusedInputHandler","useReanimatedFocusedInput","useSmoothKeyboardHandler","debounce","KeyboardAwareScrollView","children","onLayout","bottomOffset","disableScrollOnKeyboardHide","enabled","onScroll","onScrollProps","rest","ref","scrollViewAnimatedRef","scrollViewTarget","scrollPosition","position","currentKeyboardFrameHeight","keyboardHeight","keyboardWillAppear","tag","initialKeyboardSize","scrollBeforeKeyboardMovement","input","layout","height","event","value","nativeEvent","contentOffset","y","onRef","assignedRef","current","onScrollViewLayout","e","maybeScroll","animated","_layout$value","_layout$value2","_layout$value3","parentScrollViewTarget","visibleRect","absoluteY","inputHeight","point","interpolatedScrollTo","targetScrollY","Math","max","positionOnScreen","topOfScreen","onChangeText","_layout$value4","_input$value","prevScrollPosition","prevLayout","onChangeTextHandler","onStart","keyboardWillChangeSize","keyboardWillHide","focusWasChanged","target","onMove","onEnd","previous","view","paddingBottom","createElement","ScrollView","_extends","scrollEventThrottle","View","style"],"sources":["index.tsx"],"sourcesContent":["import React, { forwardRef, useCallback, useMemo } from \"react\";\nimport { findNodeHandle, useWindowDimensions } from \"react-native\";\nimport Reanimated, {\n interpolate,\n scrollTo,\n useAnimatedReaction,\n useAnimatedRef,\n useAnimatedStyle,\n useSharedValue,\n} from \"react-native-reanimated\";\n\nimport {\n useFocusedInputHandler,\n useReanimatedFocusedInput,\n} from \"react-native-keyboard-controller\";\n\nimport { useSmoothKeyboardHandler } from \"./useSmoothKeyboardHandler\";\nimport { debounce } from \"./utils\";\n\nimport type {\n LayoutChangeEvent,\n ScrollView,\n ScrollViewProps,\n} from \"react-native\";\nimport type { FocusedInputLayoutChangedEvent } from \"react-native-keyboard-controller\";\n\ntype KeyboardAwareScrollViewProps = {\n /** The distance between keyboard and focused `TextInput` when keyboard is shown. Default is `0`. */\n bottomOffset?: number;\n /** Prevents automatic scrolling of the `ScrollView` when the keyboard gets hidden, maintaining the current screen position. Default is `false`. */\n disableScrollOnKeyboardHide?: boolean;\n /** Controls whether this `KeyboardAwareScrollView` instance should take effect. Default is `true` */\n enabled?: boolean;\n} & ScrollViewProps;\n\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 * +============================+ +============================+ +=====================================+\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 */\nconst KeyboardAwareScrollView = forwardRef<\n ScrollView,\n React.PropsWithChildren<KeyboardAwareScrollViewProps>\n>(\n (\n {\n children,\n onLayout,\n bottomOffset = 0,\n disableScrollOnKeyboardHide = false,\n enabled = true,\n onScroll: onScrollProps,\n ...rest\n },\n ref,\n ) => {\n const scrollViewAnimatedRef = useAnimatedRef<Reanimated.ScrollView>();\n const scrollViewTarget = useSharedValue<number | null>(null);\n const scrollPosition = useSharedValue(0);\n const position = useSharedValue(0);\n const currentKeyboardFrameHeight = useSharedValue(0);\n const keyboardHeight = useSharedValue(0);\n const keyboardWillAppear = useSharedValue(false);\n const tag = useSharedValue(-1);\n const initialKeyboardSize = useSharedValue(0);\n const scrollBeforeKeyboardMovement = useSharedValue(0);\n const { input } = useReanimatedFocusedInput();\n const layout = useSharedValue<FocusedInputLayoutChangedEvent | null>(null);\n\n const { height } = useWindowDimensions();\n\n const onScroll = useCallback<NonNullable<ScrollViewProps[\"onScroll\"]>>(\n (event) => {\n position.value = event.nativeEvent.contentOffset.y;\n\n onScrollProps?.(event);\n },\n [onScrollProps],\n );\n\n const onRef = useCallback((assignedRef: Reanimated.ScrollView) => {\n if (typeof ref === \"function\") {\n ref(assignedRef);\n } else if (ref) {\n ref.current = assignedRef;\n }\n\n scrollViewAnimatedRef(assignedRef);\n }, []);\n const onScrollViewLayout = useCallback(\n (e: LayoutChangeEvent) => {\n scrollViewTarget.value = findNodeHandle(scrollViewAnimatedRef.current);\n\n onLayout?.(e);\n },\n [onLayout],\n );\n\n /**\n * Function that will scroll a ScrollView as keyboard gets moving\n */\n const maybeScroll = useCallback(\n (e: number, animated: boolean = false) => {\n \"worklet\";\n\n if (!enabled) {\n return 0;\n }\n\n // input belongs to ScrollView\n if (layout.value?.parentScrollViewTarget !== scrollViewTarget.value) {\n return 0;\n }\n\n const visibleRect = height - keyboardHeight.value;\n const absoluteY = layout.value?.layout.absoluteY || 0;\n const inputHeight = layout.value?.layout.height || 0;\n const point = absoluteY + inputHeight;\n\n if (visibleRect - point <= bottomOffset) {\n const interpolatedScrollTo = interpolate(\n e,\n [initialKeyboardSize.value, keyboardHeight.value],\n [0, keyboardHeight.value - (height - point) + bottomOffset],\n );\n const targetScrollY =\n Math.max(interpolatedScrollTo, 0) + scrollPosition.value;\n scrollTo(scrollViewAnimatedRef, 0, targetScrollY, animated);\n\n return interpolatedScrollTo;\n }\n\n if (absoluteY < 0) {\n const positionOnScreen = visibleRect - inputHeight - bottomOffset;\n const topOfScreen = scrollPosition.value + absoluteY;\n\n scrollTo(\n scrollViewAnimatedRef,\n 0,\n topOfScreen - positionOnScreen,\n animated,\n );\n }\n\n return 0;\n },\n [bottomOffset, enabled],\n );\n\n const onChangeText = useCallback(() => {\n \"worklet\";\n\n // if typing a text caused layout shift, then we need to ignore this handler\n // because this event will be handled in `useAnimatedReaction` below\n if (layout.value?.layout.height !== input.value?.layout.height) {\n return;\n }\n\n const prevScrollPosition = scrollPosition.value;\n const prevLayout = layout.value;\n\n scrollPosition.value = position.value;\n layout.value = input.value;\n maybeScroll(keyboardHeight.value, true);\n scrollPosition.value = prevScrollPosition;\n layout.value = prevLayout;\n }, [maybeScroll]);\n\n const onChangeTextHandler = useMemo(\n () => debounce(onChangeText, 200),\n [onChangeText],\n );\n\n useFocusedInputHandler(\n {\n onChangeText: onChangeTextHandler,\n },\n [onChangeTextHandler],\n );\n\n useSmoothKeyboardHandler(\n enabled\n ? {\n onStart: (e) => {\n \"worklet\";\n\n const keyboardWillChangeSize =\n keyboardHeight.value !== e.height && e.height > 0;\n keyboardWillAppear.value =\n e.height > 0 && keyboardHeight.value === 0;\n const keyboardWillHide = e.height === 0;\n const focusWasChanged =\n (tag.value !== e.target && e.target !== -1) ||\n keyboardWillChangeSize;\n\n if (keyboardWillChangeSize) {\n initialKeyboardSize.value = keyboardHeight.value;\n }\n\n if (keyboardWillHide) {\n // on back transition need to interpolate as [0, keyboardHeight]\n initialKeyboardSize.value = 0;\n scrollPosition.value = scrollBeforeKeyboardMovement.value;\n }\n\n if (\n keyboardWillAppear.value ||\n keyboardWillChangeSize ||\n focusWasChanged\n ) {\n // persist scroll value\n scrollPosition.value = position.value;\n // just persist height - later will be used in interpolation\n keyboardHeight.value = e.height;\n }\n\n // focus was changed\n if (focusWasChanged) {\n tag.value = e.target;\n\n // save position of focused text input when keyboard starts to move\n layout.value = input.value;\n // save current scroll position - when keyboard will hide we'll reuse\n // this value to achieve smooth hide effect\n scrollBeforeKeyboardMovement.value = position.value;\n }\n\n if (focusWasChanged && !keyboardWillAppear.value) {\n // update position on scroll value, so `onEnd` handler\n // will pick up correct values\n position.value += maybeScroll(e.height, true);\n }\n },\n onMove: (e) => {\n \"worklet\";\n\n currentKeyboardFrameHeight.value = e.height;\n\n // if the user has set disableScrollOnKeyboardHide, only auto-scroll when the keyboard opens\n if (!disableScrollOnKeyboardHide || keyboardWillAppear.value) {\n maybeScroll(e.height);\n }\n },\n onEnd: (e) => {\n \"worklet\";\n\n keyboardHeight.value = e.height;\n scrollPosition.value = position.value;\n },\n }\n : {},\n [height, maybeScroll, disableScrollOnKeyboardHide, enabled],\n );\n\n useAnimatedReaction(\n () => input.value,\n (current, previous) => {\n if (\n current?.target === previous?.target &&\n current?.layout.height !== previous?.layout.height\n ) {\n const prevLayout = layout.value;\n\n layout.value = input.value;\n scrollPosition.value += maybeScroll(keyboardHeight.value, true);\n layout.value = prevLayout;\n }\n },\n [],\n );\n\n const view = useAnimatedStyle(\n () => ({\n // animations become laggy when scrolling to the end of the `ScrollView` (when the last input is focused)\n // this happens because the layout recalculates on every frame. To avoid this we slightly increase padding\n // by `+1`. In this way we assure, that `scrollTo` will never scroll to the end, because it uses interpolation\n // from 0 to `keyboardHeight`, and here our padding is `keyboardHeight + 1`. It allows us not to re-run layout\n // re-calculation on every animation frame and it helps to achieve smooth animation.\n // see: https://github.com/kirillzyusko/react-native-keyboard-controller/pull/342\n paddingBottom: currentKeyboardFrameHeight.value + 1,\n }),\n [],\n );\n\n return (\n <Reanimated.ScrollView\n ref={onRef}\n {...rest}\n onLayout={onScrollViewLayout}\n onScroll={onScroll}\n scrollEventThrottle={16}\n >\n {children}\n <Reanimated.View style={view} />\n </Reanimated.ScrollView>\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.11.4",
3
+ "version": "1.11.6",
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",
@@ -22,6 +22,7 @@
22
22
  "!android/gradlew",
23
23
  "!android/gradlew.bat",
24
24
  "!ios/build",
25
+ "!ios/KeyboardControllerNative",
25
26
  "!**/__tests__",
26
27
  "!**/__fixtures__",
27
28
  "!**/__mocks__"
@@ -18,6 +18,7 @@ Pod::Spec.new do |s|
18
18
  s.source = { :git => "https://github.com/kirillzyusko/react-native-keyboard-controller.git", :tag => "#{s.version}" }
19
19
 
20
20
  s.source_files = "ios/**/*.{h,m,mm,swift}"
21
+ s.exclude_files = "ios/KeyboardControllerNative/**/*"
21
22
  s.public_header_files = "ios/**/*.h"
22
23
 
23
24
  # This guard prevent to install the dependencies when we run `pod install` in the old architecture.
@@ -1,12 +1,16 @@
1
1
  import { useSharedValue } from "react-native-reanimated";
2
2
 
3
- import { useKeyboardHandler } from "react-native-keyboard-controller";
3
+ import {
4
+ useKeyboardContext,
5
+ useKeyboardHandler,
6
+ } from "react-native-keyboard-controller";
4
7
 
5
8
  export const useKeyboardAnimation = () => {
6
- const heightWhenOpened = useSharedValue(0);
7
- const height = useSharedValue(0);
8
- const progress = useSharedValue(0);
9
- const isClosed = useSharedValue(true);
9
+ const { reanimated } = useKeyboardContext();
10
+ const heightWhenOpened = useSharedValue(-reanimated.height.value);
11
+ const height = useSharedValue(-reanimated.height.value);
12
+ const progress = useSharedValue(reanimated.progress.value);
13
+ const isClosed = useSharedValue(reanimated.progress.value === 0);
10
14
 
11
15
  useKeyboardHandler(
12
16
  {
@@ -5,7 +5,6 @@ import Reanimated, {
5
5
  scrollTo,
6
6
  useAnimatedReaction,
7
7
  useAnimatedRef,
8
- useAnimatedScrollHandler,
9
8
  useAnimatedStyle,
10
9
  useSharedValue,
11
10
  } from "react-native-reanimated";
@@ -83,6 +82,7 @@ const KeyboardAwareScrollView = forwardRef<
83
82
  bottomOffset = 0,
84
83
  disableScrollOnKeyboardHide = false,
85
84
  enabled = true,
85
+ onScroll: onScrollProps,
86
86
  ...rest
87
87
  },
88
88
  ref,
@@ -102,13 +102,13 @@ const KeyboardAwareScrollView = forwardRef<
102
102
 
103
103
  const { height } = useWindowDimensions();
104
104
 
105
- const onScroll = useAnimatedScrollHandler(
106
- {
107
- onScroll: (e) => {
108
- position.value = e.contentOffset.y;
109
- },
105
+ const onScroll = useCallback<NonNullable<ScrollViewProps["onScroll"]>>(
106
+ (event) => {
107
+ position.value = event.nativeEvent.contentOffset.y;
108
+
109
+ onScrollProps?.(event);
110
110
  },
111
- [],
111
+ [onScrollProps],
112
112
  );
113
113
 
114
114
  const onRef = useCallback((assignedRef: Reanimated.ScrollView) => {
@@ -320,8 +320,7 @@ const KeyboardAwareScrollView = forwardRef<
320
320
  ref={onRef}
321
321
  {...rest}
322
322
  onLayout={onScrollViewLayout}
323
- // @ts-expect-error `onScrollReanimated` is a fake prop needed for reanimated to intercept scroll events
324
- onScrollReanimated={onScroll}
323
+ onScroll={onScroll}
325
324
  scrollEventThrottle={16}
326
325
  >
327
326
  {children}