react-native-keyboard-controller 1.11.7 → 1.12.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/android/src/main/java/com/reactnativekeyboardcontroller/events/FocusedInputSelectionChangedEvent.kt +51 -0
- package/android/src/main/java/com/reactnativekeyboardcontroller/extensions/EditText.kt +80 -1
- package/android/src/main/java/com/reactnativekeyboardcontroller/extensions/ThemedReactContext.kt +1 -2
- package/android/src/main/java/com/reactnativekeyboardcontroller/extensions/View.kt +1 -1
- package/android/src/main/java/com/reactnativekeyboardcontroller/interactive/interpolators/IosInterpolator.kt +1 -1
- package/android/src/main/java/com/reactnativekeyboardcontroller/listeners/FocusedInputObserver.kt +32 -0
- package/android/src/main/java/com/reactnativekeyboardcontroller/listeners/KeyboardAnimationCallback.kt +1 -1
- package/android/src/main/java/com/reactnativekeyboardcontroller/managers/KeyboardControllerViewManagerImpl.kt +2 -0
- package/android/src/main/java/com/reactnativekeyboardcontroller/ui/FrameScheduler.kt +40 -0
- package/android/src/main/java/com/reactnativekeyboardcontroller/views/EdgeToEdgeReactViewGroup.kt +1 -1
- package/ios/Extensions.swift +8 -2
- package/ios/KeyboardController-Bridging-Header.h +1 -0
- package/ios/core/KeyboardAnimation.swift +77 -0
- package/ios/core/SpringAnimation.swift +60 -0
- package/ios/core/UIUtils.swift +11 -0
- package/ios/delegates/KCTextInputCompositeDelegate.swift +148 -0
- package/ios/events/FocusedInputSelectionChangedEvent.h +15 -0
- package/ios/events/FocusedInputSelectionChangedEvent.m +76 -0
- package/ios/objc/RCTUITextView+DelegateManager.h +14 -0
- package/ios/objc/RCTUITextView+DelegateManager.m +26 -0
- package/ios/observers/FocusedInputObserver.swift +83 -20
- package/ios/observers/KeyboardMovementObserver.swift +39 -2
- package/ios/views/KeyboardControllerView.mm +45 -8
- package/ios/views/KeyboardControllerViewManager.mm +1 -0
- package/ios/views/KeyboardControllerViewManager.swift +10 -2
- package/lib/commonjs/animated.js +8 -0
- package/lib/commonjs/animated.js.map +1 -1
- package/lib/commonjs/components/KeyboardAvoidingView/index.js.map +1 -1
- package/lib/commonjs/components/KeyboardAwareScrollView/index.js +1 -1
- package/lib/commonjs/components/KeyboardAwareScrollView/index.js.map +1 -1
- package/lib/commonjs/components/KeyboardStickyView/index.js.map +1 -1
- package/lib/commonjs/components/KeyboardToolbar/index.js +25 -7
- package/lib/commonjs/components/KeyboardToolbar/index.js.map +1 -1
- package/lib/commonjs/components/KeyboardToolbar/types.js.map +1 -1
- package/lib/commonjs/components/index.js.map +1 -1
- package/lib/commonjs/index.js.map +1 -1
- package/lib/commonjs/reanimated.js +2 -1
- package/lib/commonjs/reanimated.js.map +1 -1
- package/lib/commonjs/reanimated.native.js +18 -1
- package/lib/commonjs/reanimated.native.js.map +1 -1
- package/lib/commonjs/specs/KeyboardControllerViewNativeComponent.js.map +1 -1
- package/lib/commonjs/types.js.map +1 -1
- package/lib/module/animated.js +9 -1
- package/lib/module/animated.js.map +1 -1
- package/lib/module/components/KeyboardAvoidingView/index.js.map +1 -1
- package/lib/module/components/KeyboardAwareScrollView/index.js +1 -1
- package/lib/module/components/KeyboardAwareScrollView/index.js.map +1 -1
- package/lib/module/components/KeyboardStickyView/index.js.map +1 -1
- package/lib/module/components/KeyboardToolbar/index.js +26 -8
- package/lib/module/components/KeyboardToolbar/index.js.map +1 -1
- package/lib/module/components/KeyboardToolbar/types.js.map +1 -1
- package/lib/module/components/index.js.map +1 -1
- package/lib/module/index.js.map +1 -1
- package/lib/module/reanimated.js +1 -0
- package/lib/module/reanimated.js.map +1 -1
- package/lib/module/reanimated.native.js +16 -0
- package/lib/module/reanimated.native.js.map +1 -1
- package/lib/module/specs/KeyboardControllerViewNativeComponent.js.map +1 -1
- package/lib/module/types.js.map +1 -1
- package/lib/typescript/components/KeyboardAvoidingView/index.d.ts +20 -0
- package/lib/typescript/components/KeyboardAwareScrollView/index.d.ts +8 -0
- package/lib/typescript/components/KeyboardStickyView/index.d.ts +15 -0
- package/lib/typescript/components/KeyboardToolbar/index.d.ts +21 -1
- package/lib/typescript/components/KeyboardToolbar/types.d.ts +3 -1
- package/lib/typescript/components/index.d.ts +3 -0
- package/lib/typescript/index.d.ts +1 -1
- package/lib/typescript/reanimated.d.ts +2 -1
- package/lib/typescript/reanimated.native.d.ts +7 -4
- package/lib/typescript/specs/KeyboardControllerViewNativeComponent.d.ts +16 -0
- package/lib/typescript/types.d.ts +21 -0
- package/package.json +4 -3
- package/src/animated.tsx +12 -0
- package/src/components/KeyboardAvoidingView/index.tsx +5 -2
- package/src/components/KeyboardAwareScrollView/index.tsx +2 -2
- package/src/components/KeyboardStickyView/index.tsx +1 -1
- package/src/components/KeyboardToolbar/index.tsx +47 -7
- package/src/components/KeyboardToolbar/types.ts +25 -1
- package/src/components/index.ts +3 -0
- package/src/index.ts +6 -1
- package/src/reanimated.native.ts +30 -3
- package/src/reanimated.ts +6 -0
- package/src/specs/KeyboardControllerViewNativeComponent.ts +17 -0
- package/src/types.ts +31 -0
- package/ios/observers/TextChangeObserver.swift +0 -41
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
//
|
|
2
|
+
// FocusedInputSelectionChangedEvent.m
|
|
3
|
+
// KeyboardController
|
|
4
|
+
//
|
|
5
|
+
// Created by Kiryl Ziusko on 23/04/2024.
|
|
6
|
+
//
|
|
7
|
+
|
|
8
|
+
#import "FocusedInputSelectionChangedEvent.h"
|
|
9
|
+
#import <React/RCTAssert.h>
|
|
10
|
+
|
|
11
|
+
@implementation FocusedInputSelectionChangedEvent {
|
|
12
|
+
NSNumber *_target;
|
|
13
|
+
NSObject *_selection;
|
|
14
|
+
uint16_t _coalescingKey;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
- (NSString *)eventName
|
|
18
|
+
{
|
|
19
|
+
return @"onFocusedInputSelectionChanged";
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
@synthesize viewTag = _viewTag;
|
|
23
|
+
|
|
24
|
+
- (instancetype)initWithReactTag:(NSNumber *)reactTag event:(NSObject *)event
|
|
25
|
+
{
|
|
26
|
+
RCTAssertParam(reactTag);
|
|
27
|
+
|
|
28
|
+
if ((self = [super init])) {
|
|
29
|
+
_viewTag = reactTag;
|
|
30
|
+
|
|
31
|
+
_selection = [event valueForKey:@"selection"];
|
|
32
|
+
_target = [event valueForKey:@"target"];
|
|
33
|
+
_coalescingKey = 0;
|
|
34
|
+
}
|
|
35
|
+
return self;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
RCT_NOT_IMPLEMENTED(-(instancetype)init)
|
|
39
|
+
|
|
40
|
+
- (uint16_t)coalescingKey
|
|
41
|
+
{
|
|
42
|
+
return _coalescingKey;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
- (NSDictionary *)body
|
|
46
|
+
{
|
|
47
|
+
NSDictionary *body = @{
|
|
48
|
+
@"selection" : _selection,
|
|
49
|
+
@"target" : _target,
|
|
50
|
+
};
|
|
51
|
+
|
|
52
|
+
return body;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
- (BOOL)canCoalesce
|
|
56
|
+
{
|
|
57
|
+
return NO;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
- (FocusedInputSelectionChangedEvent *)coalesceWithEvent:
|
|
61
|
+
(FocusedInputSelectionChangedEvent *)newEvent
|
|
62
|
+
{
|
|
63
|
+
return newEvent;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
+ (NSString *)moduleDotMethod
|
|
67
|
+
{
|
|
68
|
+
return @"RCTEventEmitter.receiveEvent";
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
- (NSArray *)arguments
|
|
72
|
+
{
|
|
73
|
+
return @[ self.viewTag, RCTNormalizeInputEventName(self.eventName), [self body] ];
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
@end
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
//
|
|
2
|
+
// RCTTextView+DelegateManager.h
|
|
3
|
+
// react-native-keyboard-controller
|
|
4
|
+
//
|
|
5
|
+
// Created by Kiryl Ziusko on 24/04/2024.
|
|
6
|
+
//
|
|
7
|
+
|
|
8
|
+
#import <React/RCTUITextView.h>
|
|
9
|
+
|
|
10
|
+
@interface RCTUITextView (DelegateManager)
|
|
11
|
+
|
|
12
|
+
- (void)setForceDelegate:(id<UITextViewDelegate>)delegate;
|
|
13
|
+
|
|
14
|
+
@end
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
//
|
|
2
|
+
// RCTUITextView+DelegateManager.m
|
|
3
|
+
// react-native-keyboard-controller
|
|
4
|
+
//
|
|
5
|
+
// Created by Kiryl Ziusko on 24/04/2024.
|
|
6
|
+
//
|
|
7
|
+
|
|
8
|
+
#import <objc/runtime.h>
|
|
9
|
+
#import "RCTUITextView+DelegateManager.h"
|
|
10
|
+
|
|
11
|
+
@implementation RCTUITextView (DelegateManager)
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* We are aware that delegate is set by RN on mount and we can not re-define it
|
|
15
|
+
* but we are using composite delegate to forward all calls to original delegate
|
|
16
|
+
* so we use this method to force set our delegate
|
|
17
|
+
*/
|
|
18
|
+
- (void)setForceDelegate:(id<UITextViewDelegate>)delegate
|
|
19
|
+
{
|
|
20
|
+
Ivar ivar = class_getInstanceVariable([UITextView class], "_delegate");
|
|
21
|
+
if (ivar) {
|
|
22
|
+
object_setIvar(self, ivar, delegate);
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
@end
|
|
@@ -25,26 +25,46 @@ let noFocusedInputEvent: [String: Any] = [
|
|
|
25
25
|
@objc(FocusedInputObserver)
|
|
26
26
|
public class FocusedInputObserver: NSObject {
|
|
27
27
|
// class members
|
|
28
|
+
/// handlers
|
|
28
29
|
var onLayoutChangedHandler: (NSDictionary) -> Void
|
|
29
30
|
var onTextChangedHandler: (String) -> Void
|
|
31
|
+
var onSelectionChangedHandler: (NSDictionary) -> Void
|
|
30
32
|
var onFocusDidSet: (NSDictionary) -> Void
|
|
33
|
+
/// delegates
|
|
34
|
+
var delegate: KCTextInputCompositeDelegate
|
|
31
35
|
// state variables
|
|
32
36
|
private var isMounted = false
|
|
33
37
|
// input tracking
|
|
34
38
|
private var currentInput: UIView?
|
|
39
|
+
private var currentResponder: UIView?
|
|
35
40
|
private var hasObservers = false
|
|
36
41
|
private var lastEventDispatched: [AnyHashable: Any] = noFocusedInputEvent
|
|
37
|
-
// observers
|
|
38
|
-
private let textChangeObserver = TextChangeObserver()
|
|
39
42
|
|
|
40
43
|
@objc public init(
|
|
41
44
|
onLayoutChangedHandler: @escaping (NSDictionary) -> Void,
|
|
42
45
|
onTextChangedHandler: @escaping (String) -> Void,
|
|
46
|
+
onSelectionChangedHandler: @escaping (NSDictionary) -> Void,
|
|
43
47
|
onFocusDidSet: @escaping (NSDictionary) -> Void
|
|
44
48
|
) {
|
|
45
49
|
self.onLayoutChangedHandler = onLayoutChangedHandler
|
|
46
50
|
self.onTextChangedHandler = onTextChangedHandler
|
|
51
|
+
self.onSelectionChangedHandler = onSelectionChangedHandler
|
|
47
52
|
self.onFocusDidSet = onFocusDidSet
|
|
53
|
+
|
|
54
|
+
// Temporary initialization of the delegate with an empty closure
|
|
55
|
+
delegate = KCTextInputCompositeDelegate(onSelectionChange: { _ in }, onTextChange: { _ in })
|
|
56
|
+
|
|
57
|
+
super.init()
|
|
58
|
+
|
|
59
|
+
// Initialize the delegate
|
|
60
|
+
delegate = KCTextInputCompositeDelegate(
|
|
61
|
+
onSelectionChange: { [weak self] event in
|
|
62
|
+
self?.onSelectionChange(event)
|
|
63
|
+
},
|
|
64
|
+
onTextChange: { [weak self] text in
|
|
65
|
+
self?.onTextChanged(text: text)
|
|
66
|
+
}
|
|
67
|
+
)
|
|
48
68
|
}
|
|
49
69
|
|
|
50
70
|
@objc public func mount() {
|
|
@@ -75,17 +95,18 @@ public class FocusedInputObserver: NSObject {
|
|
|
75
95
|
}
|
|
76
96
|
|
|
77
97
|
@objc func keyboardWillShow(_: Notification) {
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
98
|
+
guard let responder = UIResponder.current as? UIView else { return }
|
|
99
|
+
removeObservers(newResponder: responder)
|
|
100
|
+
currentResponder = responder
|
|
101
|
+
currentInput = currentResponder?.superview as UIView?
|
|
81
102
|
|
|
82
103
|
setupObservers()
|
|
83
104
|
syncUpLayout()
|
|
84
105
|
|
|
85
|
-
FocusedInputHolder.shared.set(
|
|
106
|
+
FocusedInputHolder.shared.set(currentResponder as? TextInput)
|
|
86
107
|
|
|
87
108
|
let allInputFields = ViewHierarchyNavigator.getAllInputFields()
|
|
88
|
-
let currentIndex = allInputFields.firstIndex(where: { $0 as? UIView ==
|
|
109
|
+
let currentIndex = allInputFields.firstIndex(where: { $0 as? UIView == currentResponder }) ?? -1
|
|
89
110
|
|
|
90
111
|
onFocusDidSet([
|
|
91
112
|
"current": currentIndex,
|
|
@@ -94,26 +115,29 @@ public class FocusedInputObserver: NSObject {
|
|
|
94
115
|
}
|
|
95
116
|
|
|
96
117
|
@objc func keyboardWillHide(_: Notification) {
|
|
97
|
-
removeObservers()
|
|
118
|
+
removeObservers(newResponder: nil)
|
|
98
119
|
currentInput = nil
|
|
120
|
+
currentResponder = nil
|
|
99
121
|
dispatchEventToJS(data: noFocusedInputEvent)
|
|
100
122
|
}
|
|
101
123
|
|
|
102
124
|
@objc func syncUpLayout() {
|
|
103
|
-
let responder = UIResponder
|
|
104
|
-
let focusedInput =
|
|
125
|
+
let responder = currentResponder as UIResponder?
|
|
126
|
+
let focusedInput = currentInput
|
|
105
127
|
let globalFrame = focusedInput?.globalFrame
|
|
106
128
|
|
|
129
|
+
guard let frame = globalFrame, let input = focusedInput else { return }
|
|
130
|
+
|
|
107
131
|
let data: [String: Any] = [
|
|
108
132
|
"target": responder.reactViewTag,
|
|
109
133
|
"parentScrollViewTarget": responder.parentScrollViewTarget,
|
|
110
134
|
"layout": [
|
|
111
|
-
"absoluteX":
|
|
112
|
-
"absoluteY":
|
|
113
|
-
"width":
|
|
114
|
-
"height":
|
|
115
|
-
"x":
|
|
116
|
-
"y":
|
|
135
|
+
"absoluteX": frame.origin.x,
|
|
136
|
+
"absoluteY": frame.origin.y,
|
|
137
|
+
"width": input.frame.width,
|
|
138
|
+
"height": input.frame.height,
|
|
139
|
+
"x": input.frame.origin.x,
|
|
140
|
+
"y": input.frame.origin.y,
|
|
117
141
|
],
|
|
118
142
|
]
|
|
119
143
|
|
|
@@ -145,18 +169,42 @@ public class FocusedInputObserver: NSObject {
|
|
|
145
169
|
if currentInput != nil {
|
|
146
170
|
hasObservers = true
|
|
147
171
|
currentInput?.addObserver(self, forKeyPath: "center", options: .new, context: nil)
|
|
148
|
-
|
|
172
|
+
|
|
173
|
+
substituteDelegate(currentResponder)
|
|
149
174
|
}
|
|
150
175
|
}
|
|
151
176
|
|
|
152
|
-
private func removeObservers() {
|
|
153
|
-
if !hasObservers {
|
|
177
|
+
private func removeObservers(newResponder: UIResponder?) {
|
|
178
|
+
if newResponder == currentResponder || !hasObservers {
|
|
154
179
|
return
|
|
155
180
|
}
|
|
156
181
|
|
|
157
182
|
hasObservers = false
|
|
158
183
|
currentInput?.removeObserver(self, forKeyPath: "center", context: nil)
|
|
159
|
-
|
|
184
|
+
|
|
185
|
+
substituteDelegateBack(currentResponder)
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
private func substituteDelegate(_ input: UIResponder?) {
|
|
189
|
+
if let textField = input as? UITextField {
|
|
190
|
+
if !(textField.delegate is KCTextInputCompositeDelegate) {
|
|
191
|
+
delegate.setTextFieldDelegate(delegate: textField.delegate)
|
|
192
|
+
textField.delegate = delegate
|
|
193
|
+
}
|
|
194
|
+
} else if let textView = input as? UITextView {
|
|
195
|
+
if !(textView.delegate is KCTextInputCompositeDelegate) {
|
|
196
|
+
delegate.setTextViewDelegate(delegate: textView.delegate)
|
|
197
|
+
(textView as? RCTUITextView)?.setForceDelegate(delegate)
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
private func substituteDelegateBack(_ input: UIResponder?) {
|
|
203
|
+
if let textField = input as? UITextField {
|
|
204
|
+
textField.delegate = delegate.activeDelegate as? UITextFieldDelegate
|
|
205
|
+
} else if let textView = input as? UITextView {
|
|
206
|
+
(textView as? RCTUITextView)?.setForceDelegate(delegate.activeDelegate as? UITextViewDelegate)
|
|
207
|
+
}
|
|
160
208
|
}
|
|
161
209
|
|
|
162
210
|
// swiftlint:disable:next block_based_kvo
|
|
@@ -174,4 +222,19 @@ public class FocusedInputObserver: NSObject {
|
|
|
174
222
|
}
|
|
175
223
|
}
|
|
176
224
|
}
|
|
225
|
+
|
|
226
|
+
private func onSelectionChange(_ event: NSDictionary) {
|
|
227
|
+
// Safely retrieve the event dictionary as a Swift dictionary
|
|
228
|
+
guard let eventDict = event as? [String: Any] else {
|
|
229
|
+
return
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
let target: [String: Any] = [
|
|
233
|
+
"target": (currentResponder as UIResponder?).reactViewTag,
|
|
234
|
+
]
|
|
235
|
+
|
|
236
|
+
let data = target.merging(eventDict) { _, new in new }
|
|
237
|
+
|
|
238
|
+
onSelectionChangedHandler(data as NSDictionary)
|
|
239
|
+
}
|
|
177
240
|
}
|
|
@@ -39,6 +39,7 @@ public class KeyboardMovementObserver: NSObject {
|
|
|
39
39
|
private var keyboardHeight: CGFloat = 0.0
|
|
40
40
|
private var duration = 0
|
|
41
41
|
private var tag: NSNumber = -1
|
|
42
|
+
private var animation: KeyboardAnimation?
|
|
42
43
|
|
|
43
44
|
@objc public init(
|
|
44
45
|
handler: @escaping (NSString, NSNumber, NSNumber, NSNumber, NSNumber) -> Void,
|
|
@@ -179,6 +180,7 @@ public class KeyboardMovementObserver: NSObject {
|
|
|
179
180
|
onNotify("KeyboardController::keyboardWillShow", data)
|
|
180
181
|
|
|
181
182
|
setupKeyboardWatcher()
|
|
183
|
+
initializeAnimation(fromValue: prevKeyboardPosition, toValue: keyboardHeight)
|
|
182
184
|
}
|
|
183
185
|
}
|
|
184
186
|
|
|
@@ -201,6 +203,7 @@ public class KeyboardMovementObserver: NSObject {
|
|
|
201
203
|
|
|
202
204
|
setupKeyboardWatcher()
|
|
203
205
|
removeKVObserver()
|
|
206
|
+
initializeAnimation(fromValue: prevKeyboardPosition, toValue: 0)
|
|
204
207
|
}
|
|
205
208
|
|
|
206
209
|
@objc func keyboardDidAppear(_ notification: Notification) {
|
|
@@ -224,6 +227,7 @@ public class KeyboardMovementObserver: NSObject {
|
|
|
224
227
|
|
|
225
228
|
removeKeyboardWatcher()
|
|
226
229
|
setupKVObserver()
|
|
230
|
+
animation = nil
|
|
227
231
|
}
|
|
228
232
|
}
|
|
229
233
|
|
|
@@ -243,6 +247,7 @@ public class KeyboardMovementObserver: NSObject {
|
|
|
243
247
|
onNotify("KeyboardController::keyboardDidHide", data)
|
|
244
248
|
|
|
245
249
|
removeKeyboardWatcher()
|
|
250
|
+
animation = nil
|
|
246
251
|
}
|
|
247
252
|
|
|
248
253
|
@objc func setupKeyboardWatcher() {
|
|
@@ -263,20 +268,52 @@ public class KeyboardMovementObserver: NSObject {
|
|
|
263
268
|
displayLink = nil
|
|
264
269
|
}
|
|
265
270
|
|
|
266
|
-
|
|
271
|
+
func initializeAnimation(fromValue: Double, toValue: Double) {
|
|
272
|
+
let positionAnimation = keyboardView?.layer.presentation()?.animation(forKey: "position") as? CASpringAnimation
|
|
273
|
+
guard let keyboardAnimation = positionAnimation else {
|
|
274
|
+
return
|
|
275
|
+
}
|
|
276
|
+
animation = SpringAnimation(animation: keyboardAnimation, fromValue: fromValue, toValue: toValue)
|
|
277
|
+
}
|
|
278
|
+
|
|
279
|
+
@objc func updateKeyboardFrame(link: CADisplayLink) {
|
|
267
280
|
if keyboardView == nil {
|
|
268
281
|
return
|
|
269
282
|
}
|
|
270
283
|
|
|
271
284
|
let keyboardFrameY = keyboardView?.layer.presentation()?.frame.origin.y ?? 0
|
|
272
285
|
let keyboardWindowH = keyboardView?.window?.bounds.size.height ?? 0
|
|
273
|
-
|
|
286
|
+
var keyboardPosition = keyboardWindowH - keyboardFrameY
|
|
274
287
|
|
|
275
288
|
if keyboardPosition == prevKeyboardPosition || keyboardFrameY == 0 {
|
|
276
289
|
return
|
|
277
290
|
}
|
|
278
291
|
|
|
279
292
|
prevKeyboardPosition = keyboardPosition
|
|
293
|
+
|
|
294
|
+
if let animation = animation {
|
|
295
|
+
let baseDuration = animation.timingAt(value: keyboardPosition)
|
|
296
|
+
|
|
297
|
+
#if targetEnvironment(simulator)
|
|
298
|
+
// on iOS simulator we can not use static interval
|
|
299
|
+
// (from my observation from frame to frame we may have different delays)
|
|
300
|
+
// so for now we use approximation - we add a difference as
|
|
301
|
+
// beginTime - keyboardEventTime (but only in 0..0.016 range)
|
|
302
|
+
// and it gives satisfactory results (better than static delays)
|
|
303
|
+
let duration = baseDuration + animation.diff
|
|
304
|
+
#else
|
|
305
|
+
// 2 frames because we read previous frame, but need to calculate the next frame
|
|
306
|
+
let duration = baseDuration + link.duration * 2
|
|
307
|
+
#endif
|
|
308
|
+
|
|
309
|
+
let position = CGFloat(animation.valueAt(time: duration))
|
|
310
|
+
|
|
311
|
+
// handles a case when final frame has final destination (i. e. 0 or 291)
|
|
312
|
+
// but CASpringAnimation can never get to this final destination
|
|
313
|
+
let race: (CGFloat, CGFloat) -> CGFloat = animation.isIncreasing ? max : min
|
|
314
|
+
keyboardPosition = race(position, keyboardPosition)
|
|
315
|
+
}
|
|
316
|
+
|
|
280
317
|
onEvent(
|
|
281
318
|
"onKeyboardMove",
|
|
282
319
|
keyboardPosition as NSNumber,
|
|
@@ -10,6 +10,7 @@
|
|
|
10
10
|
#ifdef RCT_NEW_ARCH_ENABLED
|
|
11
11
|
#import "KeyboardControllerView.h"
|
|
12
12
|
#import "FocusedInputLayoutChangedEvent.h"
|
|
13
|
+
#import "FocusedInputSelectionChangedEvent.h"
|
|
13
14
|
#import "FocusedInputTextChangedEvent.h"
|
|
14
15
|
#import "KeyboardMoveEvent.h"
|
|
15
16
|
|
|
@@ -57,7 +58,7 @@ using namespace facebook::react;
|
|
|
57
58
|
int target = [event[@"target"] integerValue];
|
|
58
59
|
int parentScrollViewTarget = [event[@"parentScrollViewTarget"] integerValue];
|
|
59
60
|
double absoluteY = [event[@"layout"][@"absoluteY"] doubleValue];
|
|
60
|
-
double
|
|
61
|
+
double absoluteX = [event[@"layout"][@"absoluteX"] doubleValue];
|
|
61
62
|
double y = [event[@"layout"][@"y"] doubleValue];
|
|
62
63
|
double x = [event[@"layout"][@"x"] doubleValue];
|
|
63
64
|
double width = [event[@"layout"][@"width"] doubleValue];
|
|
@@ -73,15 +74,15 @@ using namespace facebook::react;
|
|
|
73
74
|
.layout = facebook::react::KeyboardControllerViewEventEmitter::
|
|
74
75
|
OnFocusedInputLayoutChangedLayout{
|
|
75
76
|
.absoluteY = absoluteY,
|
|
76
|
-
.absoluteX =
|
|
77
|
+
.absoluteX = absoluteX,
|
|
77
78
|
.height = height,
|
|
78
79
|
.width = width,
|
|
79
80
|
.x = x,
|
|
80
81
|
.y = y}});
|
|
81
82
|
// TODO: use built-in _eventEmitter once NativeAnimated module will use
|
|
82
|
-
//
|
|
83
|
+
// ModernEventEmitter
|
|
83
84
|
RCTBridge *bridge = [RCTBridge currentBridge];
|
|
84
|
-
if (bridge
|
|
85
|
+
if (bridge) {
|
|
85
86
|
FocusedInputLayoutChangedEvent *inputChangedEvent =
|
|
86
87
|
[[FocusedInputLayoutChangedEvent alloc] initWithReactTag:@(self.tag) event:event];
|
|
87
88
|
[bridge.eventDispatcher sendEvent:inputChangedEvent];
|
|
@@ -97,15 +98,51 @@ using namespace facebook::react;
|
|
|
97
98
|
.text = std::string([text UTF8String])});
|
|
98
99
|
|
|
99
100
|
// TODO: use built-in _eventEmitter once NativeAnimated module will use
|
|
100
|
-
//
|
|
101
|
+
// ModernEventEmitter
|
|
101
102
|
RCTBridge *bridge = [RCTBridge currentBridge];
|
|
102
|
-
if (bridge
|
|
103
|
+
if (bridge) {
|
|
103
104
|
FocusedInputTextChangedEvent *textChangedEvent =
|
|
104
105
|
[[FocusedInputTextChangedEvent alloc] initWithReactTag:@(self.tag) text:text];
|
|
105
106
|
[bridge.eventDispatcher sendEvent:textChangedEvent];
|
|
106
107
|
}
|
|
107
108
|
}
|
|
108
109
|
}
|
|
110
|
+
onSelectionChangedHandler:^(NSDictionary *event) {
|
|
111
|
+
if (self->_eventEmitter) {
|
|
112
|
+
int target = [event[@"target"] integerValue];
|
|
113
|
+
double startX = [event[@"selection"][@"start"][@"x"] doubleValue];
|
|
114
|
+
double startY = [event[@"selection"][@"start"][@"y"] doubleValue];
|
|
115
|
+
double endX = [event[@"selection"][@"end"][@"x"] doubleValue];
|
|
116
|
+
double endY = [event[@"selection"][@"end"][@"y"] doubleValue];
|
|
117
|
+
int start = [event[@"selection"][@"start"][@"position"] integerValue];
|
|
118
|
+
int end = [event[@"selection"][@"end"][@"position"] integerValue];
|
|
119
|
+
|
|
120
|
+
std::dynamic_pointer_cast<const facebook::react::KeyboardControllerViewEventEmitter>(
|
|
121
|
+
self->_eventEmitter)
|
|
122
|
+
->onFocusedInputSelectionChanged(
|
|
123
|
+
facebook::react::KeyboardControllerViewEventEmitter::
|
|
124
|
+
OnFocusedInputSelectionChanged{
|
|
125
|
+
.target = target,
|
|
126
|
+
.selection = facebook::react::KeyboardControllerViewEventEmitter::
|
|
127
|
+
OnFocusedInputSelectionChangedSelection{
|
|
128
|
+
.start =
|
|
129
|
+
facebook::react::KeyboardControllerViewEventEmitter::
|
|
130
|
+
OnFocusedInputSelectionChangedSelectionStart{
|
|
131
|
+
.x = startX, .y = startY, .position = start},
|
|
132
|
+
.end = facebook::react::KeyboardControllerViewEventEmitter::
|
|
133
|
+
OnFocusedInputSelectionChangedSelectionEnd{
|
|
134
|
+
.x = endX, .y = endY, .position = end}}});
|
|
135
|
+
// TODO: use built-in _eventEmitter once NativeAnimated module will use
|
|
136
|
+
// ModernEventEmitter
|
|
137
|
+
RCTBridge *bridge = [RCTBridge currentBridge];
|
|
138
|
+
if (bridge) {
|
|
139
|
+
FocusedInputSelectionChangedEvent *selectionChangedEvent =
|
|
140
|
+
[[FocusedInputSelectionChangedEvent alloc] initWithReactTag:@(self.tag)
|
|
141
|
+
event:event];
|
|
142
|
+
[bridge.eventDispatcher sendEvent:selectionChangedEvent];
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
}
|
|
109
146
|
onFocusDidSet:^(NSDictionary *data) {
|
|
110
147
|
[KeyboardController.shared sendEvent:@"KeyboardController::focusDidSet" body:data];
|
|
111
148
|
}];
|
|
@@ -160,9 +197,9 @@ using namespace facebook::react;
|
|
|
160
197
|
.target = [target intValue]});
|
|
161
198
|
}
|
|
162
199
|
|
|
163
|
-
// TODO: use built-in _eventEmitter once NativeAnimated module will use
|
|
200
|
+
// TODO: use built-in _eventEmitter once NativeAnimated module will use ModernEventEmitter
|
|
164
201
|
RCTBridge *bridge = [RCTBridge currentBridge];
|
|
165
|
-
if (bridge
|
|
202
|
+
if (bridge) {
|
|
166
203
|
KeyboardMoveEvent *keyboardMoveEvent =
|
|
167
204
|
[[KeyboardMoveEvent alloc] initWithReactTag:@(self.tag)
|
|
168
205
|
event:event
|
|
@@ -14,5 +14,6 @@ RCT_EXPORT_VIEW_PROPERTY(onKeyboardMoveInteractive, RCTDirectEventBlock);
|
|
|
14
14
|
/// input callbacks
|
|
15
15
|
RCT_EXPORT_VIEW_PROPERTY(onFocusedInputLayoutChanged, RCTDirectEventBlock);
|
|
16
16
|
RCT_EXPORT_VIEW_PROPERTY(onFocusedInputTextChanged, RCTDirectEventBlock);
|
|
17
|
+
RCT_EXPORT_VIEW_PROPERTY(onFocusedInputSelectionChanged, RCTDirectEventBlock);
|
|
17
18
|
|
|
18
19
|
@end
|
|
@@ -24,6 +24,7 @@ class KeyboardControllerView: UIView {
|
|
|
24
24
|
/// focused input
|
|
25
25
|
@objc var onFocusedInputLayoutChanged: RCTDirectEventBlock?
|
|
26
26
|
@objc var onFocusedInputTextChanged: RCTDirectEventBlock?
|
|
27
|
+
@objc var onFocusedInputSelectionChanged: RCTDirectEventBlock?
|
|
27
28
|
// react props
|
|
28
29
|
@objc var enabled: ObjCBool = true {
|
|
29
30
|
didSet {
|
|
@@ -42,6 +43,7 @@ class KeyboardControllerView: UIView {
|
|
|
42
43
|
inputObserver = FocusedInputObserver(
|
|
43
44
|
onLayoutChangedHandler: { [weak self] event in self?.onLayoutChanged(event: event) },
|
|
44
45
|
onTextChangedHandler: { [weak self] text in self?.onTextChanged(text: text) },
|
|
46
|
+
onSelectionChangedHandler: { [weak self] event in self?.onSelectionChanged(event: event) },
|
|
45
47
|
onFocusDidSet: { [weak self] event in
|
|
46
48
|
self?.onNotify(event: "KeyboardController::focusDidSet", data: event)
|
|
47
49
|
}
|
|
@@ -93,6 +95,12 @@ class KeyboardControllerView: UIView {
|
|
|
93
95
|
eventDispatcher.send(FocusedInputTextChangedEvent(reactTag: reactTag, text: text))
|
|
94
96
|
}
|
|
95
97
|
|
|
98
|
+
func onSelectionChanged(event: NSObject) {
|
|
99
|
+
guard isJSThreadReady() else { return }
|
|
100
|
+
|
|
101
|
+
eventDispatcher.send(FocusedInputSelectionChangedEvent(reactTag: reactTag, event: event))
|
|
102
|
+
}
|
|
103
|
+
|
|
96
104
|
func onEvent(event: NSString, height: NSNumber, progress: NSNumber, duration: NSNumber, target: NSNumber) {
|
|
97
105
|
guard isJSThreadReady() else { return }
|
|
98
106
|
|
|
@@ -109,11 +117,11 @@ class KeyboardControllerView: UIView {
|
|
|
109
117
|
}
|
|
110
118
|
|
|
111
119
|
func onRequestAnimation() {
|
|
112
|
-
bridge.uiManager.scheduleKeyboardAnimation()
|
|
120
|
+
// bridge.uiManager.scheduleKeyboardAnimation()
|
|
113
121
|
}
|
|
114
122
|
|
|
115
123
|
func onCancelAnimation() {
|
|
116
|
-
bridge.uiManager.unscheduleKeyboardAnimation()
|
|
124
|
+
// bridge.uiManager.unscheduleKeyboardAnimation()
|
|
117
125
|
}
|
|
118
126
|
|
|
119
127
|
func onNotify(event: String, data: Any) {
|
package/lib/commonjs/animated.js
CHANGED
|
@@ -127,6 +127,13 @@ const KeyboardProvider = ({
|
|
|
127
127
|
broadcastInputEvents("onChangeText", e);
|
|
128
128
|
}
|
|
129
129
|
}, []);
|
|
130
|
+
const inputSelectionHandler = (0, _reanimated.useFocusedInputSelectionHandler)({
|
|
131
|
+
onFocusedInputSelectionChanged: e => {
|
|
132
|
+
"worklet";
|
|
133
|
+
|
|
134
|
+
broadcastInputEvents("onSelectionChange", e);
|
|
135
|
+
}
|
|
136
|
+
}, []);
|
|
130
137
|
// effects
|
|
131
138
|
(0, _react.useEffect)(() => {
|
|
132
139
|
if (enabled) {
|
|
@@ -145,6 +152,7 @@ const KeyboardProvider = ({
|
|
|
145
152
|
onKeyboardMoveInteractive: onKeyboardMove,
|
|
146
153
|
onFocusedInputLayoutChangedReanimated: inputLayoutHandler,
|
|
147
154
|
onFocusedInputTextChangedReanimated: inputTextHandler,
|
|
155
|
+
onFocusedInputSelectionChangedReanimated: inputSelectionHandler,
|
|
148
156
|
navigationBarTranslucent: navigationBarTranslucent,
|
|
149
157
|
statusBarTranslucent: statusBarTranslucent,
|
|
150
158
|
style: styles.container
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["_react","_interopRequireWildcard","require","_reactNative","_reactNativeReanimated","_bindings","_context","_internal","_monkeyPatch","_reanimated","_getRequireWildcardCache","e","WeakMap","r","t","__esModule","default","has","get","n","__proto__","a","Object","defineProperty","getOwnPropertyDescriptor","u","prototype","hasOwnProperty","call","i","set","KeyboardControllerViewAnimated","Reanimated","createAnimatedComponent","Animated","KeyboardControllerView","styles","StyleSheet","create","container","flex","hidden","display","position","OS","Platform","KeyboardProvider","children","statusBarTranslucent","navigationBarTranslucent","enabled","initiallyEnabled","setEnabled","useState","progress","useAnimatedValue","height","progressSV","useSharedValue","heightSV","layout","setKeyboardHandlers","broadcastKeyboardEvents","useSharedHandlers","setInputHandlers","broadcastInputEvents","context","useMemo","animated","multiply","reanimated","style","transform","translateX","translateY","onKeyboardMove","event","nativeEvent","useNativeDriver","updateSharedValues","platforms","includes","value","keyboardHandler","useAnimatedKeyboardHandler","onKeyboardMoveStart","onKeyboardMoveEnd","onKeyboardMoveInteractive","inputLayoutHandler","useFocusedInputLayoutHandler","onFocusedInputLayoutChanged","target","inputTextHandler","useFocusedInputTextHandler","onFocusedInputTextChanged","useEffect","applyMonkeyPatch","revertMonkeyPatch","createElement","KeyboardContext","Provider","onKeyboardMoveReanimated","undefined","onFocusedInputLayoutChangedReanimated","onFocusedInputTextChangedReanimated","View","exports"],"sources":["animated.tsx"],"sourcesContent":["import React, { useEffect, useMemo, useState } from \"react\";\nimport { Animated, Platform, StyleSheet } from \"react-native\";\nimport Reanimated, { useSharedValue } from \"react-native-reanimated\";\n\nimport { KeyboardControllerView } from \"./bindings\";\nimport { KeyboardContext } from \"./context\";\nimport { useAnimatedValue, useSharedHandlers } from \"./internal\";\nimport { applyMonkeyPatch, revertMonkeyPatch } from \"./monkey-patch\";\nimport {\n useAnimatedKeyboardHandler,\n useFocusedInputLayoutHandler,\n useFocusedInputTextHandler,\n} from \"./reanimated\";\n\nimport type { KeyboardAnimationContext } from \"./context\";\nimport type {\n FocusedInputHandler,\n FocusedInputLayoutChangedEvent,\n KeyboardControllerProps,\n KeyboardHandler,\n NativeEvent,\n} from \"./types\";\nimport type { ViewStyle } from \"react-native\";\n\nconst KeyboardControllerViewAnimated = Reanimated.createAnimatedComponent(\n Animated.createAnimatedComponent(\n KeyboardControllerView,\n ) as React.FC<KeyboardControllerProps>,\n);\n\ntype Styles = {\n container: ViewStyle;\n hidden: ViewStyle;\n};\n\nconst styles = StyleSheet.create<Styles>({\n container: {\n flex: 1,\n },\n hidden: {\n display: \"none\",\n position: \"absolute\",\n },\n});\n\ntype KeyboardProviderProps = {\n children: React.ReactNode;\n /**\n * Set the value to `true`, if you use translucent status bar on Android.\n * If you already control status bar translucency via `react-native-screens`\n * or `StatusBar` component from `react-native`, you can ignore it.\n * Defaults to `false`.\n *\n * @see https://github.com/kirillzyusko/react-native-keyboard-controller/issues/14\n * @platform android\n */\n statusBarTranslucent?: boolean;\n /**\n * Set the value to `true`, if you use translucent navigation bar on Android.\n * Defaults to `false`.\n *\n * @see https://github.com/kirillzyusko/react-native-keyboard-controller/issues/119\n * @platform android\n */\n navigationBarTranslucent?: boolean;\n /**\n * A boolean prop indicating whether the module is enabled. It indicate only initial state,\n * i. e. if you try to change this prop after component mount it will not have any effect.\n * To change the property in runtime use `useKeyboardController` hook and `setEnabled` method.\n * Defaults to `true`.\n */\n enabled?: boolean;\n};\n\n// capture `Platform.OS` in separate variable to avoid deep workletization of entire RN package\n// see https://github.com/kirillzyusko/react-native-keyboard-controller/issues/393 and https://github.com/kirillzyusko/react-native-keyboard-controller/issues/294 for more details\nconst OS = Platform.OS;\n\nexport const KeyboardProvider = ({\n children,\n statusBarTranslucent,\n navigationBarTranslucent,\n enabled: initiallyEnabled = true,\n}: KeyboardProviderProps) => {\n // state\n const [enabled, setEnabled] = useState(initiallyEnabled);\n // animated values\n const progress = useAnimatedValue(0);\n const height = useAnimatedValue(0);\n // shared values\n const progressSV = useSharedValue(0);\n const heightSV = useSharedValue(0);\n const layout = useSharedValue<FocusedInputLayoutChangedEvent | null>(null);\n const [setKeyboardHandlers, broadcastKeyboardEvents] =\n useSharedHandlers<KeyboardHandler>();\n const [setInputHandlers, broadcastInputEvents] =\n useSharedHandlers<FocusedInputHandler>();\n // memo\n const context = useMemo<KeyboardAnimationContext>(\n () => ({\n enabled,\n animated: { progress: progress, height: Animated.multiply(height, -1) },\n reanimated: { progress: progressSV, height: heightSV },\n layout,\n setKeyboardHandlers,\n setInputHandlers,\n setEnabled,\n }),\n [enabled],\n );\n const style = useMemo(\n () => [\n styles.hidden,\n { transform: [{ translateX: height }, { translateY: progress }] },\n ],\n [],\n );\n const onKeyboardMove = useMemo(\n () =>\n Animated.event(\n [\n {\n nativeEvent: {\n progress,\n height,\n },\n },\n ],\n { useNativeDriver: true },\n ),\n [],\n );\n // handlers\n const updateSharedValues = (event: NativeEvent, platforms: string[]) => {\n \"worklet\";\n\n if (platforms.includes(OS)) {\n progressSV.value = event.progress;\n heightSV.value = -event.height;\n }\n };\n const keyboardHandler = useAnimatedKeyboardHandler(\n {\n onKeyboardMoveStart: (event: NativeEvent) => {\n \"worklet\";\n\n broadcastKeyboardEvents(\"onStart\", event);\n updateSharedValues(event, [\"ios\"]);\n },\n onKeyboardMove: (event: NativeEvent) => {\n \"worklet\";\n\n broadcastKeyboardEvents(\"onMove\", event);\n updateSharedValues(event, [\"android\"]);\n },\n onKeyboardMoveEnd: (event: NativeEvent) => {\n \"worklet\";\n\n broadcastKeyboardEvents(\"onEnd\", event);\n },\n onKeyboardMoveInteractive: (event: NativeEvent) => {\n \"worklet\";\n\n updateSharedValues(event, [\"android\", \"ios\"]);\n broadcastKeyboardEvents(\"onInteractive\", event);\n },\n },\n [],\n );\n const inputLayoutHandler = useFocusedInputLayoutHandler(\n {\n onFocusedInputLayoutChanged: (e) => {\n \"worklet\";\n\n if (e.target !== -1) {\n layout.value = e;\n } else {\n layout.value = null;\n }\n },\n },\n [],\n );\n const inputTextHandler = useFocusedInputTextHandler(\n {\n onFocusedInputTextChanged: (e) => {\n \"worklet\";\n\n broadcastInputEvents(\"onChangeText\", e);\n },\n },\n [],\n );\n // effects\n useEffect(() => {\n if (enabled) {\n applyMonkeyPatch();\n } else {\n revertMonkeyPatch();\n }\n }, [enabled]);\n\n return (\n <KeyboardContext.Provider value={context}>\n <KeyboardControllerViewAnimated\n enabled={enabled}\n onKeyboardMoveReanimated={keyboardHandler}\n onKeyboardMoveStart={OS === \"ios\" ? onKeyboardMove : undefined}\n onKeyboardMove={OS === \"android\" ? onKeyboardMove : undefined}\n onKeyboardMoveInteractive={onKeyboardMove}\n onFocusedInputLayoutChangedReanimated={inputLayoutHandler}\n onFocusedInputTextChangedReanimated={inputTextHandler}\n navigationBarTranslucent={navigationBarTranslucent}\n statusBarTranslucent={statusBarTranslucent}\n style={styles.container}\n >\n {children}\n </KeyboardControllerViewAnimated>\n <Animated.View\n // we are using this small hack, because if the component (where\n // animated value has been used) is unmounted, then animation will\n // stop receiving events (seems like it's react-native optimization).\n // So we need to keep a reference to the animated value, to keep it's\n // always mounted (keep a reference to an animated value).\n //\n // To test why it's needed, try to open screen which consumes Animated.Value\n // then close it and open it again (for example 'Animated transition').\n style={style}\n />\n </KeyboardContext.Provider>\n );\n};\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"names":["_react","_interopRequireWildcard","require","_reactNative","_reactNativeReanimated","_bindings","_context","_internal","_monkeyPatch","_reanimated","_getRequireWildcardCache","e","WeakMap","r","t","__esModule","default","has","get","n","__proto__","a","Object","defineProperty","getOwnPropertyDescriptor","u","prototype","hasOwnProperty","call","i","set","KeyboardControllerViewAnimated","Reanimated","createAnimatedComponent","Animated","KeyboardControllerView","styles","StyleSheet","create","container","flex","hidden","display","position","OS","Platform","KeyboardProvider","children","statusBarTranslucent","navigationBarTranslucent","enabled","initiallyEnabled","setEnabled","useState","progress","useAnimatedValue","height","progressSV","useSharedValue","heightSV","layout","setKeyboardHandlers","broadcastKeyboardEvents","useSharedHandlers","setInputHandlers","broadcastInputEvents","context","useMemo","animated","multiply","reanimated","style","transform","translateX","translateY","onKeyboardMove","event","nativeEvent","useNativeDriver","updateSharedValues","platforms","includes","value","keyboardHandler","useAnimatedKeyboardHandler","onKeyboardMoveStart","onKeyboardMoveEnd","onKeyboardMoveInteractive","inputLayoutHandler","useFocusedInputLayoutHandler","onFocusedInputLayoutChanged","target","inputTextHandler","useFocusedInputTextHandler","onFocusedInputTextChanged","inputSelectionHandler","useFocusedInputSelectionHandler","onFocusedInputSelectionChanged","useEffect","applyMonkeyPatch","revertMonkeyPatch","createElement","KeyboardContext","Provider","onKeyboardMoveReanimated","undefined","onFocusedInputLayoutChangedReanimated","onFocusedInputTextChangedReanimated","onFocusedInputSelectionChangedReanimated","View","exports"],"sources":["animated.tsx"],"sourcesContent":["import React, { useEffect, useMemo, useState } from \"react\";\nimport { Animated, Platform, StyleSheet } from \"react-native\";\nimport Reanimated, { useSharedValue } from \"react-native-reanimated\";\n\nimport { KeyboardControllerView } from \"./bindings\";\nimport { KeyboardContext } from \"./context\";\nimport { useAnimatedValue, useSharedHandlers } from \"./internal\";\nimport { applyMonkeyPatch, revertMonkeyPatch } from \"./monkey-patch\";\nimport {\n useAnimatedKeyboardHandler,\n useFocusedInputLayoutHandler,\n useFocusedInputSelectionHandler,\n useFocusedInputTextHandler,\n} from \"./reanimated\";\n\nimport type { KeyboardAnimationContext } from \"./context\";\nimport type {\n FocusedInputHandler,\n FocusedInputLayoutChangedEvent,\n KeyboardControllerProps,\n KeyboardHandler,\n NativeEvent,\n} from \"./types\";\nimport type { ViewStyle } from \"react-native\";\n\nconst KeyboardControllerViewAnimated = Reanimated.createAnimatedComponent(\n Animated.createAnimatedComponent(\n KeyboardControllerView,\n ) as React.FC<KeyboardControllerProps>,\n);\n\ntype Styles = {\n container: ViewStyle;\n hidden: ViewStyle;\n};\n\nconst styles = StyleSheet.create<Styles>({\n container: {\n flex: 1,\n },\n hidden: {\n display: \"none\",\n position: \"absolute\",\n },\n});\n\ntype KeyboardProviderProps = {\n children: React.ReactNode;\n /**\n * Set the value to `true`, if you use translucent status bar on Android.\n * If you already control status bar translucency via `react-native-screens`\n * or `StatusBar` component from `react-native`, you can ignore it.\n * Defaults to `false`.\n *\n * @see https://github.com/kirillzyusko/react-native-keyboard-controller/issues/14\n * @platform android\n */\n statusBarTranslucent?: boolean;\n /**\n * Set the value to `true`, if you use translucent navigation bar on Android.\n * Defaults to `false`.\n *\n * @see https://github.com/kirillzyusko/react-native-keyboard-controller/issues/119\n * @platform android\n */\n navigationBarTranslucent?: boolean;\n /**\n * A boolean prop indicating whether the module is enabled. It indicate only initial state,\n * i. e. if you try to change this prop after component mount it will not have any effect.\n * To change the property in runtime use `useKeyboardController` hook and `setEnabled` method.\n * Defaults to `true`.\n */\n enabled?: boolean;\n};\n\n// capture `Platform.OS` in separate variable to avoid deep workletization of entire RN package\n// see https://github.com/kirillzyusko/react-native-keyboard-controller/issues/393 and https://github.com/kirillzyusko/react-native-keyboard-controller/issues/294 for more details\nconst OS = Platform.OS;\n\nexport const KeyboardProvider = ({\n children,\n statusBarTranslucent,\n navigationBarTranslucent,\n enabled: initiallyEnabled = true,\n}: KeyboardProviderProps) => {\n // state\n const [enabled, setEnabled] = useState(initiallyEnabled);\n // animated values\n const progress = useAnimatedValue(0);\n const height = useAnimatedValue(0);\n // shared values\n const progressSV = useSharedValue(0);\n const heightSV = useSharedValue(0);\n const layout = useSharedValue<FocusedInputLayoutChangedEvent | null>(null);\n const [setKeyboardHandlers, broadcastKeyboardEvents] =\n useSharedHandlers<KeyboardHandler>();\n const [setInputHandlers, broadcastInputEvents] =\n useSharedHandlers<FocusedInputHandler>();\n // memo\n const context = useMemo<KeyboardAnimationContext>(\n () => ({\n enabled,\n animated: { progress: progress, height: Animated.multiply(height, -1) },\n reanimated: { progress: progressSV, height: heightSV },\n layout,\n setKeyboardHandlers,\n setInputHandlers,\n setEnabled,\n }),\n [enabled],\n );\n const style = useMemo(\n () => [\n styles.hidden,\n { transform: [{ translateX: height }, { translateY: progress }] },\n ],\n [],\n );\n const onKeyboardMove = useMemo(\n () =>\n Animated.event(\n [\n {\n nativeEvent: {\n progress,\n height,\n },\n },\n ],\n { useNativeDriver: true },\n ),\n [],\n );\n // handlers\n const updateSharedValues = (event: NativeEvent, platforms: string[]) => {\n \"worklet\";\n\n if (platforms.includes(OS)) {\n progressSV.value = event.progress;\n heightSV.value = -event.height;\n }\n };\n const keyboardHandler = useAnimatedKeyboardHandler(\n {\n onKeyboardMoveStart: (event: NativeEvent) => {\n \"worklet\";\n\n broadcastKeyboardEvents(\"onStart\", event);\n updateSharedValues(event, [\"ios\"]);\n },\n onKeyboardMove: (event: NativeEvent) => {\n \"worklet\";\n\n broadcastKeyboardEvents(\"onMove\", event);\n updateSharedValues(event, [\"android\"]);\n },\n onKeyboardMoveEnd: (event: NativeEvent) => {\n \"worklet\";\n\n broadcastKeyboardEvents(\"onEnd\", event);\n },\n onKeyboardMoveInteractive: (event: NativeEvent) => {\n \"worklet\";\n\n updateSharedValues(event, [\"android\", \"ios\"]);\n broadcastKeyboardEvents(\"onInteractive\", event);\n },\n },\n [],\n );\n const inputLayoutHandler = useFocusedInputLayoutHandler(\n {\n onFocusedInputLayoutChanged: (e) => {\n \"worklet\";\n\n if (e.target !== -1) {\n layout.value = e;\n } else {\n layout.value = null;\n }\n },\n },\n [],\n );\n const inputTextHandler = useFocusedInputTextHandler(\n {\n onFocusedInputTextChanged: (e) => {\n \"worklet\";\n\n broadcastInputEvents(\"onChangeText\", e);\n },\n },\n [],\n );\n const inputSelectionHandler = useFocusedInputSelectionHandler(\n {\n onFocusedInputSelectionChanged: (e) => {\n \"worklet\";\n\n broadcastInputEvents(\"onSelectionChange\", e);\n },\n },\n [],\n );\n // effects\n useEffect(() => {\n if (enabled) {\n applyMonkeyPatch();\n } else {\n revertMonkeyPatch();\n }\n }, [enabled]);\n\n return (\n <KeyboardContext.Provider value={context}>\n <KeyboardControllerViewAnimated\n enabled={enabled}\n onKeyboardMoveReanimated={keyboardHandler}\n onKeyboardMoveStart={OS === \"ios\" ? onKeyboardMove : undefined}\n onKeyboardMove={OS === \"android\" ? onKeyboardMove : undefined}\n onKeyboardMoveInteractive={onKeyboardMove}\n onFocusedInputLayoutChangedReanimated={inputLayoutHandler}\n onFocusedInputTextChangedReanimated={inputTextHandler}\n onFocusedInputSelectionChangedReanimated={inputSelectionHandler}\n navigationBarTranslucent={navigationBarTranslucent}\n statusBarTranslucent={statusBarTranslucent}\n style={styles.container}\n >\n {children}\n </KeyboardControllerViewAnimated>\n <Animated.View\n // we are using this small hack, because if the component (where\n // animated value has been used) is unmounted, then animation will\n // stop receiving events (seems like it's react-native optimization).\n // So we need to keep a reference to the animated value, to keep it's\n // always mounted (keep a reference to an animated value).\n //\n // To test why it's needed, try to open screen which consumes Animated.Value\n // then close it and open it again (for example 'Animated transition').\n style={style}\n />\n </KeyboardContext.Provider>\n );\n};\n"],"mappings":";;;;;;AAAA,IAAAA,MAAA,GAAAC,uBAAA,CAAAC,OAAA;AACA,IAAAC,YAAA,GAAAD,OAAA;AACA,IAAAE,sBAAA,GAAAH,uBAAA,CAAAC,OAAA;AAEA,IAAAG,SAAA,GAAAH,OAAA;AACA,IAAAI,QAAA,GAAAJ,OAAA;AACA,IAAAK,SAAA,GAAAL,OAAA;AACA,IAAAM,YAAA,GAAAN,OAAA;AACA,IAAAO,WAAA,GAAAP,OAAA;AAKsB,SAAAQ,yBAAAC,CAAA,6BAAAC,OAAA,mBAAAC,CAAA,OAAAD,OAAA,IAAAE,CAAA,OAAAF,OAAA,YAAAF,wBAAA,YAAAA,CAAAC,CAAA,WAAAA,CAAA,GAAAG,CAAA,GAAAD,CAAA,KAAAF,CAAA;AAAA,SAAAV,wBAAAU,CAAA,EAAAE,CAAA,SAAAA,CAAA,IAAAF,CAAA,IAAAA,CAAA,CAAAI,UAAA,SAAAJ,CAAA,eAAAA,CAAA,uBAAAA,CAAA,yBAAAA,CAAA,WAAAK,OAAA,EAAAL,CAAA,QAAAG,CAAA,GAAAJ,wBAAA,CAAAG,CAAA,OAAAC,CAAA,IAAAA,CAAA,CAAAG,GAAA,CAAAN,CAAA,UAAAG,CAAA,CAAAI,GAAA,CAAAP,CAAA,OAAAQ,CAAA,KAAAC,SAAA,UAAAC,CAAA,GAAAC,MAAA,CAAAC,cAAA,IAAAD,MAAA,CAAAE,wBAAA,WAAAC,CAAA,IAAAd,CAAA,oBAAAc,CAAA,IAAAH,MAAA,CAAAI,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAjB,CAAA,EAAAc,CAAA,SAAAI,CAAA,GAAAR,CAAA,GAAAC,MAAA,CAAAE,wBAAA,CAAAb,CAAA,EAAAc,CAAA,UAAAI,CAAA,KAAAA,CAAA,CAAAX,GAAA,IAAAW,CAAA,CAAAC,GAAA,IAAAR,MAAA,CAAAC,cAAA,CAAAJ,CAAA,EAAAM,CAAA,EAAAI,CAAA,IAAAV,CAAA,CAAAM,CAAA,IAAAd,CAAA,CAAAc,CAAA,YAAAN,CAAA,CAAAH,OAAA,GAAAL,CAAA,EAAAG,CAAA,IAAAA,CAAA,CAAAgB,GAAA,CAAAnB,CAAA,EAAAQ,CAAA,GAAAA,CAAA;AAYtB,MAAMY,8BAA8B,GAAGC,8BAAU,CAACC,uBAAuB,CACvEC,qBAAQ,CAACD,uBAAuB,CAC9BE,gCACF,CACF,CAAC;AAOD,MAAMC,MAAM,GAAGC,uBAAU,CAACC,MAAM,CAAS;EACvCC,SAAS,EAAE;IACTC,IAAI,EAAE;EACR,CAAC;EACDC,MAAM,EAAE;IACNC,OAAO,EAAE,MAAM;IACfC,QAAQ,EAAE;EACZ;AACF,CAAC,CAAC;AA+BF;AACA;AACA,MAAMC,EAAE,GAAGC,qBAAQ,CAACD,EAAE;AAEf,MAAME,gBAAgB,GAAGA,CAAC;EAC/BC,QAAQ;EACRC,oBAAoB;EACpBC,wBAAwB;EACxBC,OAAO,EAAEC,gBAAgB,GAAG;AACP,CAAC,KAAK;EAC3B;EACA,MAAM,CAACD,OAAO,EAAEE,UAAU,CAAC,GAAG,IAAAC,eAAQ,EAACF,gBAAgB,CAAC;EACxD;EACA,MAAMG,QAAQ,GAAG,IAAAC,0BAAgB,EAAC,CAAC,CAAC;EACpC,MAAMC,MAAM,GAAG,IAAAD,0BAAgB,EAAC,CAAC,CAAC;EAClC;EACA,MAAME,UAAU,GAAG,IAAAC,qCAAc,EAAC,CAAC,CAAC;EACpC,MAAMC,QAAQ,GAAG,IAAAD,qCAAc,EAAC,CAAC,CAAC;EAClC,MAAME,MAAM,GAAG,IAAAF,qCAAc,EAAwC,IAAI,CAAC;EAC1E,MAAM,CAACG,mBAAmB,EAAEC,uBAAuB,CAAC,GAClD,IAAAC,2BAAiB,EAAkB,CAAC;EACtC,MAAM,CAACC,gBAAgB,EAAEC,oBAAoB,CAAC,GAC5C,IAAAF,2BAAiB,EAAsB,CAAC;EAC1C;EACA,MAAMG,OAAO,GAAG,IAAAC,cAAO,EACrB,OAAO;IACLjB,OAAO;IACPkB,QAAQ,EAAE;MAAEd,QAAQ,EAAEA,QAAQ;MAAEE,MAAM,EAAEtB,qBAAQ,CAACmC,QAAQ,CAACb,MAAM,EAAE,CAAC,CAAC;IAAE,CAAC;IACvEc,UAAU,EAAE;MAAEhB,QAAQ,EAAEG,UAAU;MAAED,MAAM,EAAEG;IAAS,CAAC;IACtDC,MAAM;IACNC,mBAAmB;IACnBG,gBAAgB;IAChBZ;EACF,CAAC,CAAC,EACF,CAACF,OAAO,CACV,CAAC;EACD,MAAMqB,KAAK,GAAG,IAAAJ,cAAO,EACnB,MAAM,CACJ/B,MAAM,CAACK,MAAM,EACb;IAAE+B,SAAS,EAAE,CAAC;MAAEC,UAAU,EAAEjB;IAAO,CAAC,EAAE;MAAEkB,UAAU,EAAEpB;IAAS,CAAC;EAAE,CAAC,CAClE,EACD,EACF,CAAC;EACD,MAAMqB,cAAc,GAAG,IAAAR,cAAO,EAC5B,MACEjC,qBAAQ,CAAC0C,KAAK,CACZ,CACE;IACEC,WAAW,EAAE;MACXvB,QAAQ;MACRE;IACF;EACF,CAAC,CACF,EACD;IAAEsB,eAAe,EAAE;EAAK,CAC1B,CAAC,EACH,EACF,CAAC;EACD;EACA,MAAMC,kBAAkB,GAAGA,CAACH,KAAkB,EAAEI,SAAmB,KAAK;IACtE,SAAS;;IAET,IAAIA,SAAS,CAACC,QAAQ,CAACrC,EAAE,CAAC,EAAE;MAC1Ba,UAAU,CAACyB,KAAK,GAAGN,KAAK,CAACtB,QAAQ;MACjCK,QAAQ,CAACuB,KAAK,GAAG,CAACN,KAAK,CAACpB,MAAM;IAChC;EACF,CAAC;EACD,MAAM2B,eAAe,GAAG,IAAAC,sCAA0B,EAChD;IACEC,mBAAmB,EAAGT,KAAkB,IAAK;MAC3C,SAAS;;MAETd,uBAAuB,CAAC,SAAS,EAAEc,KAAK,CAAC;MACzCG,kBAAkB,CAACH,KAAK,EAAE,CAAC,KAAK,CAAC,CAAC;IACpC,CAAC;IACDD,cAAc,EAAGC,KAAkB,IAAK;MACtC,SAAS;;MAETd,uBAAuB,CAAC,QAAQ,EAAEc,KAAK,CAAC;MACxCG,kBAAkB,CAACH,KAAK,EAAE,CAAC,SAAS,CAAC,CAAC;IACxC,CAAC;IACDU,iBAAiB,EAAGV,KAAkB,IAAK;MACzC,SAAS;;MAETd,uBAAuB,CAAC,OAAO,EAAEc,KAAK,CAAC;IACzC,CAAC;IACDW,yBAAyB,EAAGX,KAAkB,IAAK;MACjD,SAAS;;MAETG,kBAAkB,CAACH,KAAK,EAAE,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;MAC7Cd,uBAAuB,CAAC,eAAe,EAAEc,KAAK,CAAC;IACjD;EACF,CAAC,EACD,EACF,CAAC;EACD,MAAMY,kBAAkB,GAAG,IAAAC,wCAA4B,EACrD;IACEC,2BAA2B,EAAG/E,CAAC,IAAK;MAClC,SAAS;;MAET,IAAIA,CAAC,CAACgF,MAAM,KAAK,CAAC,CAAC,EAAE;QACnB/B,MAAM,CAACsB,KAAK,GAAGvE,CAAC;MAClB,CAAC,MAAM;QACLiD,MAAM,CAACsB,KAAK,GAAG,IAAI;MACrB;IACF;EACF,CAAC,EACD,EACF,CAAC;EACD,MAAMU,gBAAgB,GAAG,IAAAC,sCAA0B,EACjD;IACEC,yBAAyB,EAAGnF,CAAC,IAAK;MAChC,SAAS;;MAETsD,oBAAoB,CAAC,cAAc,EAAEtD,CAAC,CAAC;IACzC;EACF,CAAC,EACD,EACF,CAAC;EACD,MAAMoF,qBAAqB,GAAG,IAAAC,2CAA+B,EAC3D;IACEC,8BAA8B,EAAGtF,CAAC,IAAK;MACrC,SAAS;;MAETsD,oBAAoB,CAAC,mBAAmB,EAAEtD,CAAC,CAAC;IAC9C;EACF,CAAC,EACD,EACF,CAAC;EACD;EACA,IAAAuF,gBAAS,EAAC,MAAM;IACd,IAAIhD,OAAO,EAAE;MACX,IAAAiD,6BAAgB,EAAC,CAAC;IACpB,CAAC,MAAM;MACL,IAAAC,8BAAiB,EAAC,CAAC;IACrB;EACF,CAAC,EAAE,CAAClD,OAAO,CAAC,CAAC;EAEb,oBACElD,MAAA,CAAAgB,OAAA,CAAAqF,aAAA,CAAC/F,QAAA,CAAAgG,eAAe,CAACC,QAAQ;IAACrB,KAAK,EAAEhB;EAAQ,gBACvClE,MAAA,CAAAgB,OAAA,CAAAqF,aAAA,CAACtE,8BAA8B;IAC7BmB,OAAO,EAAEA,OAAQ;IACjBsD,wBAAwB,EAAErB,eAAgB;IAC1CE,mBAAmB,EAAEzC,EAAE,KAAK,KAAK,GAAG+B,cAAc,GAAG8B,SAAU;IAC/D9B,cAAc,EAAE/B,EAAE,KAAK,SAAS,GAAG+B,cAAc,GAAG8B,SAAU;IAC9DlB,yBAAyB,EAAEZ,cAAe;IAC1C+B,qCAAqC,EAAElB,kBAAmB;IAC1DmB,mCAAmC,EAAEf,gBAAiB;IACtDgB,wCAAwC,EAAEb,qBAAsB;IAChE9C,wBAAwB,EAAEA,wBAAyB;IACnDD,oBAAoB,EAAEA,oBAAqB;IAC3CuB,KAAK,EAAEnC,MAAM,CAACG;EAAU,GAEvBQ,QAC6B,CAAC,eACjC/C,MAAA,CAAAgB,OAAA,CAAAqF,aAAA,CAAClG,YAAA,CAAA+B,QAAQ,CAAC2E,IAAI;IACZ;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACAtC,KAAK,EAAEA;EAAM,CACd,CACuB,CAAC;AAE/B,CAAC;AAACuC,OAAA,CAAAhE,gBAAA,GAAAA,gBAAA","ignoreList":[]}
|