@multiplayer-app/session-recorder-react-native 1.0.1-beta.1 → 1.0.1-beta.2

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,316 +0,0 @@
1
- import UIKit
2
- import React
3
-
4
- // Temporary solution: Embed GestureTargetFinder functionality directly
5
- // TODO: Fix module linking to properly separate these files
6
- struct GestureTargetInfo {
7
- let identifier: String
8
- let label: String?
9
- let role: String?
10
- let testId: String?
11
- let text: String?
12
- }
13
-
14
- enum GestureTargetFinder {
15
- static func findTargetView(at point: CGPoint, in view: UIView) -> GestureTargetInfo {
16
- let targetView = view.hitTest(point, with: nil)
17
-
18
- guard let target = targetView else {
19
- return GestureTargetInfo(identifier: "unknown", label: nil, role: nil, testId: nil, text: nil)
20
- }
21
-
22
- let identifier = target.accessibilityIdentifier ?? target.accessibilityLabel ?? "view-\(target.hash)"
23
- let label = target.accessibilityLabel
24
- let role = roleFromAccessibilityTraits(target.accessibilityTraits)
25
- let testId = target.accessibilityIdentifier
26
-
27
- var text: String?
28
- if let labelView = target as? UILabel {
29
- text = labelView.text
30
- } else if let button = target as? UIButton {
31
- text = button.titleLabel?.text
32
- } else if let textField = target as? UITextField {
33
- text = textField.text ?? textField.placeholder
34
- } else if let textView = target as? UITextView {
35
- text = textView.text
36
- }
37
-
38
- return GestureTargetInfo(identifier: identifier, label: label, role: role, testId: testId, text: text)
39
- }
40
-
41
- static func roleFromAccessibilityTraits(_ traits: UIAccessibilityTraits) -> String? {
42
- if traits.contains(.button) { return "button" }
43
- if traits.contains(.link) { return "link" }
44
- if traits.contains(.image) { return "image" }
45
- if traits.contains(.staticText) { return "text" }
46
- if traits.contains(.header) { return "header" }
47
- if traits.contains(.searchField) { return "search" }
48
- if traits.contains(.keyboardKey) { return "key" }
49
- if traits.contains(.adjustable) { return "adjustable" }
50
- if traits.contains(.tabBar) { return "tabbar" }
51
- return nil
52
- }
53
- }
54
-
55
- @objc(GestureRecorderNative)
56
- class GestureRecorderNative: RCTEventEmitter {
57
-
58
- private var isRecording = false
59
- private var gestureCallback: RCTResponseSenderBlock?
60
- private var rootViewController: UIViewController?
61
-
62
- // Gesture recognizers
63
- private var tapGestureRecognizer: UITapGestureRecognizer?
64
- private var panGestureRecognizer: UIPanGestureRecognizer?
65
- private var longPressGestureRecognizer: UILongPressGestureRecognizer?
66
- private var pinchGestureRecognizer: UIPinchGestureRecognizer?
67
-
68
- override func supportedEvents() -> [String]! {
69
- return ["onGestureDetected"]
70
- }
71
-
72
- override static func requiresMainQueueSetup() -> Bool {
73
- return true
74
- }
75
-
76
- @objc func startGestureRecording(_ resolve: @escaping RCTPromiseResolveBlock, reject: @escaping RCTPromiseRejectBlock) {
77
- DispatchQueue.main.async {
78
- guard !self.isRecording else {
79
- resolve(nil)
80
- return
81
- }
82
-
83
- self.setupGestureRecognizers()
84
- self.isRecording = true
85
- resolve(nil)
86
- }
87
- }
88
-
89
- @objc func stopGestureRecording(_ resolve: @escaping RCTPromiseResolveBlock, reject: @escaping RCTPromiseRejectBlock) {
90
- DispatchQueue.main.async {
91
- guard self.isRecording else {
92
- resolve(nil)
93
- return
94
- }
95
-
96
- self.removeGestureRecognizers()
97
- self.isRecording = false
98
- resolve(nil)
99
- }
100
- }
101
-
102
- @objc func isGestureRecordingActive(_ resolve: @escaping RCTPromiseResolveBlock, reject: @escaping RCTPromiseRejectBlock) {
103
- resolve(self.isRecording)
104
- }
105
-
106
- @objc func recordGesture(_ gestureType: String, x: NSNumber, y: NSNumber, target: String?, metadata: NSDictionary?) {
107
- let gestureEvent: [String: Any] = [
108
- "type": gestureType,
109
- "timestamp": Date().timeIntervalSince1970 * 1000, // Convert to milliseconds
110
- "x": x.doubleValue,
111
- "y": y.doubleValue,
112
- "target": target ?? "",
113
- "metadata": metadata ?? [:]
114
- ]
115
-
116
- sendEvent(withName: "onGestureDetected", body: gestureEvent)
117
- }
118
-
119
- private func setupGestureRecognizers() {
120
- guard let window = UIApplication.shared.windows.first(where: { $0.isKeyWindow }),
121
- let rootViewController = window.rootViewController else {
122
- return
123
- }
124
-
125
- self.rootViewController = rootViewController
126
-
127
- // Tap gesture recognizer
128
- tapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(handleTap(_:)))
129
- tapGestureRecognizer?.numberOfTapsRequired = 1
130
- tapGestureRecognizer?.numberOfTouchesRequired = 1
131
- rootViewController.view.addGestureRecognizer(tapGestureRecognizer!)
132
-
133
- // Pan gesture recognizer
134
- panGestureRecognizer = UIPanGestureRecognizer(target: self, action: #selector(handlePan(_:)))
135
- rootViewController.view.addGestureRecognizer(panGestureRecognizer!)
136
-
137
- // Long press gesture recognizer
138
- longPressGestureRecognizer = UILongPressGestureRecognizer(target: self, action: #selector(handleLongPress(_:)))
139
- longPressGestureRecognizer?.minimumPressDuration = 0.5
140
- rootViewController.view.addGestureRecognizer(longPressGestureRecognizer!)
141
-
142
- // Pinch gesture recognizer
143
- pinchGestureRecognizer = UIPinchGestureRecognizer(target: self, action: #selector(handlePinch(_:)))
144
- rootViewController.view.addGestureRecognizer(pinchGestureRecognizer!)
145
-
146
- // Allow simultaneous recognition
147
- tapGestureRecognizer?.delegate = self
148
- panGestureRecognizer?.delegate = self
149
- longPressGestureRecognizer?.delegate = self
150
- pinchGestureRecognizer?.delegate = self
151
- }
152
-
153
- private func removeGestureRecognizers() {
154
- guard let rootViewController = rootViewController else { return }
155
-
156
- if let tapGesture = tapGestureRecognizer {
157
- rootViewController.view.removeGestureRecognizer(tapGesture)
158
- }
159
- if let panGesture = panGestureRecognizer {
160
- rootViewController.view.removeGestureRecognizer(panGesture)
161
- }
162
- if let longPressGesture = longPressGestureRecognizer {
163
- rootViewController.view.removeGestureRecognizer(longPressGesture)
164
- }
165
- if let pinchGesture = pinchGestureRecognizer {
166
- rootViewController.view.removeGestureRecognizer(pinchGesture)
167
- }
168
-
169
- tapGestureRecognizer = nil
170
- panGestureRecognizer = nil
171
- longPressGestureRecognizer = nil
172
- pinchGestureRecognizer = nil
173
- self.rootViewController = nil
174
- }
175
-
176
- @objc private func handleTap(_ gesture: UITapGestureRecognizer) {
177
- guard let view = gesture.view else { return }
178
- let location = gesture.location(in: view)
179
- let target = GestureTargetFinder.findTargetView(at: location, in: view)
180
-
181
- let gestureEvent: [String: Any] = [
182
- "type": "tap",
183
- "timestamp": Date().timeIntervalSince1970 * 1000,
184
- "x": location.x,
185
- "y": location.y,
186
- "target": target.identifier,
187
- "targetInfo": [
188
- "identifier": target.identifier,
189
- "label": target.label,
190
- "role": target.role,
191
- "testId": target.testId,
192
- "text": target.text
193
- ],
194
- "metadata": [
195
- "pressure": 1.0
196
- ]
197
- ]
198
-
199
- sendEvent(withName: "onGestureDetected", body: gestureEvent)
200
- }
201
-
202
- @objc private func handlePan(_ gesture: UIPanGestureRecognizer) {
203
- guard let view = gesture.view else { return }
204
- let location = gesture.location(in: view)
205
- let velocity = gesture.velocity(in: view)
206
- let translation = gesture.translation(in: view)
207
-
208
- let target = GestureTargetFinder.findTargetView(at: location, in: view)
209
-
210
- var gestureType: String
211
- switch gesture.state {
212
- case .began:
213
- gestureType = "pan_start"
214
- case .changed:
215
- gestureType = "pan_move"
216
- case .ended, .cancelled:
217
- gestureType = "pan_end"
218
- default:
219
- return
220
- }
221
-
222
- let gestureEvent: [String: Any] = [
223
- "type": gestureType,
224
- "timestamp": Date().timeIntervalSince1970 * 1000,
225
- "x": location.x,
226
- "y": location.y,
227
- "target": target.identifier,
228
- "targetInfo": [
229
- "identifier": target.identifier,
230
- "label": target.label,
231
- "role": target.role,
232
- "testId": target.testId,
233
- "text": target.text
234
- ],
235
- "metadata": [
236
- "velocity": sqrt(velocity.x * velocity.x + velocity.y * velocity.y),
237
- "deltaX": translation.x,
238
- "deltaY": translation.y
239
- ]
240
- ]
241
-
242
- sendEvent(withName: "onGestureDetected", body: gestureEvent)
243
- }
244
-
245
- @objc private func handleLongPress(_ gesture: UILongPressGestureRecognizer) {
246
- guard gesture.state == .began else { return }
247
-
248
- guard let view = gesture.view else { return }
249
- let location = gesture.location(in: view)
250
- let target = GestureTargetFinder.findTargetView(at: location, in: view)
251
-
252
- let gestureEvent: [String: Any] = [
253
- "type": "long_press",
254
- "timestamp": Date().timeIntervalSince1970 * 1000,
255
- "x": location.x,
256
- "y": location.y,
257
- "target": target.identifier,
258
- "targetInfo": [
259
- "identifier": target.identifier,
260
- "label": target.label,
261
- "role": target.role,
262
- "testId": target.testId,
263
- "text": target.text
264
- ],
265
- "metadata": [
266
- "duration": 0.5,
267
- "pressure": 1.0
268
- ]
269
- ]
270
-
271
- sendEvent(withName: "onGestureDetected", body: gestureEvent)
272
- }
273
-
274
- @objc private func handlePinch(_ gesture: UIPinchGestureRecognizer) {
275
- guard let view = gesture.view else { return }
276
- let location = gesture.location(in: view)
277
- let scale = gesture.scale
278
- let velocity = gesture.velocity
279
-
280
- let target = GestureTargetFinder.findTargetView(at: location, in: view)
281
-
282
- let gestureEvent: [String: Any] = [
283
- "type": "pinch",
284
- "timestamp": Date().timeIntervalSince1970 * 1000,
285
- "x": location.x,
286
- "y": location.y,
287
- "target": target.identifier,
288
- "targetInfo": [
289
- "identifier": target.identifier,
290
- "label": target.label,
291
- "role": target.role,
292
- "testId": target.testId,
293
- "text": target.text
294
- ],
295
- "metadata": [
296
- "scale": scale,
297
- "velocity": velocity
298
- ]
299
- ]
300
-
301
- sendEvent(withName: "onGestureDetected", body: gestureEvent)
302
- }
303
-
304
- // Target finding extracted to GestureTargetFinder
305
- }
306
-
307
- // MARK: - UIGestureRecognizerDelegate
308
- extension GestureRecorderNative: UIGestureRecognizerDelegate {
309
- func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldRecognizeSimultaneouslyWith otherGestureRecognizer: UIGestureRecognizer) -> Bool {
310
- return true
311
- }
312
-
313
- func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldReceive touch: UITouch) -> Bool {
314
- return true
315
- }
316
- }
package/turbo.json DELETED
@@ -1,41 +0,0 @@
1
- {
2
- "$schema": "https://turbo.build/schema.json",
3
- "globalDependencies": [
4
- ".nvmrc",
5
- ".yarnrc.yml"
6
- ],
7
- "globalEnv": [
8
- "NODE_ENV"
9
- ],
10
- "tasks": {
11
- "build:android": {
12
- "env": [
13
- "ANDROID_HOME",
14
- "ORG_GRADLE_PROJECT_newArchEnabled"
15
- ],
16
- "inputs": [
17
- "package.json",
18
- "android",
19
- "!android/build",
20
- "src/*.ts",
21
- "src/*.tsx"
22
- ],
23
- "outputs": []
24
- },
25
- "build:ios": {
26
- "env": [
27
- "RCT_NEW_ARCH_ENABLED",
28
- "RCT_USE_RN_DEP",
29
- "RCT_USE_PREBUILT_RNCORE"
30
- ],
31
- "inputs": [
32
- "package.json",
33
- "*.podspec",
34
- "ios",
35
- "src/*.ts",
36
- "src/*.tsx"
37
- ],
38
- "outputs": []
39
- }
40
- }
41
- }