@multiplayer-app/session-recorder-react-native 0.0.1-beta.2 → 0.0.1-beta.21

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (245) hide show
  1. package/README.md +170 -12
  2. package/SessionRecorderNative.podspec +26 -0
  3. package/android/build.gradle +34 -0
  4. package/copy-react-native-dist.sh +34 -16
  5. package/dist/components/GestureCaptureWrapper/GestureCaptureWrapper.d.ts +1 -0
  6. package/dist/components/GestureCaptureWrapper/GestureCaptureWrapper.js +1 -1
  7. package/dist/components/GestureCaptureWrapper/GestureCaptureWrapper.js.map +1 -1
  8. package/dist/components/MaskableComponent.d.ts +22 -0
  9. package/dist/components/MaskableComponent.js +1 -0
  10. package/dist/components/MaskableComponent.js.map +1 -0
  11. package/dist/components/MaskableTextInput.d.ts +14 -0
  12. package/dist/components/MaskableTextInput.js +1 -0
  13. package/dist/components/MaskableTextInput.js.map +1 -0
  14. package/dist/components/ScreenRecorderView/ScreenRecorderView.js +1 -1
  15. package/dist/components/ScreenRecorderView/ScreenRecorderView.js.map +1 -1
  16. package/dist/components/SessionRecorderWidget/FinalPopover.d.ts +11 -0
  17. package/dist/components/SessionRecorderWidget/FinalPopover.js +1 -0
  18. package/dist/components/SessionRecorderWidget/FinalPopover.js.map +1 -0
  19. package/dist/components/SessionRecorderWidget/FloatingButton.d.ts +8 -0
  20. package/dist/components/SessionRecorderWidget/FloatingButton.js +1 -0
  21. package/dist/components/SessionRecorderWidget/FloatingButton.js.map +1 -0
  22. package/dist/components/SessionRecorderWidget/InitialPopover.d.ts +15 -0
  23. package/dist/components/SessionRecorderWidget/InitialPopover.js +1 -0
  24. package/dist/components/SessionRecorderWidget/InitialPopover.js.map +1 -0
  25. package/dist/components/SessionRecorderWidget/ModalContainer.d.ts +8 -0
  26. package/dist/components/SessionRecorderWidget/ModalContainer.js +1 -0
  27. package/dist/components/SessionRecorderWidget/ModalContainer.js.map +1 -0
  28. package/dist/components/SessionRecorderWidget/ModalHeader.d.ts +6 -0
  29. package/dist/components/SessionRecorderWidget/ModalHeader.js +1 -0
  30. package/dist/components/SessionRecorderWidget/ModalHeader.js.map +1 -0
  31. package/dist/components/SessionRecorderWidget/SessionRecorderWidget.d.ts +5 -0
  32. package/dist/components/SessionRecorderWidget/SessionRecorderWidget.js +1 -0
  33. package/dist/components/SessionRecorderWidget/SessionRecorderWidget.js.map +1 -0
  34. package/dist/components/SessionRecorderWidget/icons.d.ts +11 -0
  35. package/dist/components/SessionRecorderWidget/icons.js +1 -0
  36. package/dist/components/SessionRecorderWidget/icons.js.map +1 -0
  37. package/dist/components/SessionRecorderWidget/index.d.ts +2 -0
  38. package/dist/components/SessionRecorderWidget/index.js +1 -0
  39. package/dist/components/SessionRecorderWidget/index.js.map +1 -0
  40. package/dist/components/SessionRecorderWidget/styles.d.ts +165 -0
  41. package/dist/components/SessionRecorderWidget/styles.js +1 -0
  42. package/dist/components/SessionRecorderWidget/styles.js.map +1 -0
  43. package/dist/components/index.d.ts +2 -1
  44. package/dist/components/index.js +1 -1
  45. package/dist/components/index.js.map +1 -1
  46. package/dist/config/defaults.d.ts +4 -4
  47. package/dist/config/defaults.js +1 -1
  48. package/dist/config/defaults.js.map +1 -1
  49. package/dist/config/masking.d.ts +2 -2
  50. package/dist/config/masking.js +1 -1
  51. package/dist/config/masking.js.map +1 -1
  52. package/dist/config/session-recorder.js +1 -1
  53. package/dist/config/session-recorder.js.map +1 -1
  54. package/dist/config/validators.d.ts +1 -1
  55. package/dist/config/validators.js +1 -1
  56. package/dist/config/validators.js.map +1 -1
  57. package/dist/config/widget.d.ts +9 -0
  58. package/dist/config/widget.js +1 -0
  59. package/dist/config/widget.js.map +1 -0
  60. package/dist/context/SessionRecorderContext.d.ts +12 -3
  61. package/dist/context/SessionRecorderContext.js +1 -1
  62. package/dist/context/SessionRecorderContext.js.map +1 -1
  63. package/dist/context/SessionRecorderStore.d.ts +10 -0
  64. package/dist/context/SessionRecorderStore.js +1 -0
  65. package/dist/context/SessionRecorderStore.js.map +1 -0
  66. package/dist/context/useSessionRecorderStore.d.ts +8 -0
  67. package/dist/context/useSessionRecorderStore.js +1 -0
  68. package/dist/context/useSessionRecorderStore.js.map +1 -0
  69. package/dist/context/useStoreSelector.d.ts +4 -0
  70. package/dist/context/useStoreSelector.js +1 -0
  71. package/dist/context/useStoreSelector.js.map +1 -0
  72. package/dist/index.d.ts +1 -1
  73. package/dist/index.js +1 -1
  74. package/dist/index.js.map +1 -1
  75. package/dist/native/GestureRecorderNative.d.ts +57 -0
  76. package/dist/native/GestureRecorderNative.js +1 -0
  77. package/dist/native/GestureRecorderNative.js.map +1 -0
  78. package/dist/native/ScreenMasking.d.ts +21 -0
  79. package/dist/native/ScreenMasking.js +1 -0
  80. package/dist/native/ScreenMasking.js.map +1 -0
  81. package/dist/native/SessionRecorderNative.d.ts +33 -0
  82. package/dist/native/SessionRecorderNative.js +1 -0
  83. package/dist/native/SessionRecorderNative.js.map +1 -0
  84. package/dist/native/index.d.ts +2 -0
  85. package/dist/native/index.js +1 -0
  86. package/dist/native/index.js.map +1 -0
  87. package/dist/otel/index.js +1 -1
  88. package/dist/otel/index.js.map +1 -1
  89. package/dist/patch/xhr.js +1 -1
  90. package/dist/patch/xhr.js.map +1 -1
  91. package/dist/recorder/eventExporter.d.ts +4 -1
  92. package/dist/recorder/eventExporter.js +1 -1
  93. package/dist/recorder/eventExporter.js.map +1 -1
  94. package/dist/recorder/gestureRecorder.d.ts +28 -62
  95. package/dist/recorder/gestureRecorder.js +1 -1
  96. package/dist/recorder/gestureRecorder.js.map +1 -1
  97. package/dist/recorder/index.d.ts +2 -0
  98. package/dist/recorder/index.js +1 -1
  99. package/dist/recorder/index.js.map +1 -1
  100. package/dist/recorder/navigationTracker.d.ts +4 -19
  101. package/dist/recorder/navigationTracker.js +1 -1
  102. package/dist/recorder/navigationTracker.js.map +1 -1
  103. package/dist/recorder/screenRecorder.d.ts +11 -5
  104. package/dist/recorder/screenRecorder.js +1 -1
  105. package/dist/recorder/screenRecorder.js.map +1 -1
  106. package/dist/recorder/screenshotManager.d.ts +10 -0
  107. package/dist/recorder/screenshotManager.js +1 -0
  108. package/dist/recorder/screenshotManager.js.map +1 -0
  109. package/dist/services/api.service.d.ts +12 -3
  110. package/dist/services/api.service.js +1 -1
  111. package/dist/services/api.service.js.map +1 -1
  112. package/dist/services/screenMaskingService.d.ts +47 -0
  113. package/dist/services/screenMaskingService.js +1 -0
  114. package/dist/services/screenMaskingService.js.map +1 -0
  115. package/dist/services/storage.service.d.ts +18 -2
  116. package/dist/services/storage.service.js +1 -1
  117. package/dist/services/storage.service.js.map +1 -1
  118. package/dist/session-recorder.d.ts +10 -34
  119. package/dist/session-recorder.js +1 -1
  120. package/dist/session-recorder.js.map +1 -1
  121. package/dist/types/configs.d.ts +85 -0
  122. package/dist/types/configs.js +1 -0
  123. package/dist/types/configs.js.map +1 -0
  124. package/dist/types/index.d.ts +1 -0
  125. package/dist/types/index.js +1 -1
  126. package/dist/types/index.js.map +1 -1
  127. package/dist/types/session-recorder.d.ts +96 -132
  128. package/dist/types/session-recorder.js +1 -1
  129. package/dist/types/session-recorder.js.map +1 -1
  130. package/dist/utils/componentRegistry.d.ts +64 -0
  131. package/dist/utils/componentRegistry.js +1 -0
  132. package/dist/utils/componentRegistry.js.map +1 -0
  133. package/dist/utils/constants.optional.d.ts +21 -0
  134. package/dist/utils/constants.optional.expo.d.ts +3 -0
  135. package/dist/utils/constants.optional.expo.js +1 -0
  136. package/dist/utils/constants.optional.expo.js.map +1 -0
  137. package/dist/utils/constants.optional.js +1 -0
  138. package/dist/utils/constants.optional.js.map +1 -0
  139. package/dist/utils/createStore.d.ts +8 -0
  140. package/dist/utils/createStore.js +1 -0
  141. package/dist/utils/createStore.js.map +1 -0
  142. package/dist/utils/logger.d.ts +1 -1
  143. package/dist/utils/logger.js +1 -1
  144. package/dist/utils/logger.js.map +1 -1
  145. package/dist/utils/nativeModuleTest.d.ts +8 -0
  146. package/dist/utils/nativeModuleTest.js +1 -0
  147. package/dist/utils/nativeModuleTest.js.map +1 -0
  148. package/dist/utils/platform.d.ts +11 -0
  149. package/dist/utils/platform.js +1 -1
  150. package/dist/utils/platform.js.map +1 -1
  151. package/dist/utils/reactNativeHierarchyExtractor.d.ts +38 -0
  152. package/dist/utils/reactNativeHierarchyExtractor.js +1 -0
  153. package/dist/utils/reactNativeHierarchyExtractor.js.map +1 -0
  154. package/dist/utils/rrweb-events.d.ts +4 -3
  155. package/dist/utils/rrweb-events.js +1 -1
  156. package/dist/utils/rrweb-events.js.map +1 -1
  157. package/dist/utils/screenshotMasker.d.ts +96 -0
  158. package/dist/utils/screenshotMasker.js +1 -0
  159. package/dist/utils/screenshotMasker.js.map +1 -0
  160. package/dist/utils/session.d.ts +2 -1
  161. package/dist/utils/session.js +1 -1
  162. package/dist/utils/session.js.map +1 -1
  163. package/dist/utils/shallowEqual.d.ts +1 -0
  164. package/dist/utils/shallowEqual.js +1 -0
  165. package/dist/utils/shallowEqual.js.map +1 -0
  166. package/dist/utils/viewHierarchyTracker.d.ts +89 -0
  167. package/dist/utils/viewHierarchyTracker.js +1 -0
  168. package/dist/utils/viewHierarchyTracker.js.map +1 -0
  169. package/dist/version.d.ts +1 -1
  170. package/dist/version.js +1 -1
  171. package/dist/version.js.map +1 -1
  172. package/ios/GestureRecorderNative.m +21 -0
  173. package/ios/GestureRecorderNative.swift +316 -0
  174. package/ios/SessionRecorderNative.m +17 -0
  175. package/ios/SessionRecorderNative.podspec +26 -0
  176. package/ios/SessionRecorderNative.swift +599 -0
  177. package/package.json +14 -12
  178. package/react-native.config.js +12 -0
  179. package/RRWEB_INTEGRATION.md +0 -336
  180. package/VIEWSHOT_INTEGRATION_TEST.md +0 -123
  181. package/babel.config.js +0 -13
  182. package/dist/components/GestureCaptureWrapper.d.ts +0 -6
  183. package/dist/components/GestureCaptureWrapper.js +0 -1
  184. package/dist/components/GestureCaptureWrapper.js.map +0 -1
  185. package/dist/expo.d.ts +0 -7
  186. package/dist/expo.js +0 -1
  187. package/dist/expo.js.map +0 -1
  188. package/dist/otel/instrumentations/gestureInstrumentation.d.ts +0 -15
  189. package/dist/otel/instrumentations/gestureInstrumentation.js +0 -1
  190. package/dist/otel/instrumentations/gestureInstrumentation.js.map +0 -1
  191. package/dist/otel/instrumentations/reactNativeInstrumentation.d.ts +0 -8
  192. package/dist/otel/instrumentations/reactNativeInstrumentation.js +0 -1
  193. package/dist/otel/instrumentations/reactNativeInstrumentation.js.map +0 -1
  194. package/dist/otel/instrumentations/reactNavigationInstrumentation.d.ts +0 -13
  195. package/dist/otel/instrumentations/reactNavigationInstrumentation.js +0 -1
  196. package/dist/otel/instrumentations/reactNavigationInstrumentation.js.map +0 -1
  197. package/dist/recorder/gestureHandlerRecorder.d.ts +0 -19
  198. package/dist/recorder/gestureHandlerRecorder.js +0 -1
  199. package/dist/recorder/gestureHandlerRecorder.js.map +0 -1
  200. package/dist/types/rrweb.d.ts +0 -118
  201. package/dist/types/rrweb.js +0 -1
  202. package/dist/types/rrweb.js.map +0 -1
  203. package/scripts/generate-app-metadata.js +0 -173
  204. package/src/components/GestureCaptureWrapper/GestureCaptureWrapper.tsx +0 -86
  205. package/src/components/GestureCaptureWrapper/index.ts +0 -1
  206. package/src/components/ScreenRecorderView/ScreenRecorderView.tsx +0 -72
  207. package/src/components/ScreenRecorderView/index.ts +0 -1
  208. package/src/components/index.ts +0 -1
  209. package/src/config/constants.ts +0 -60
  210. package/src/config/defaults.ts +0 -82
  211. package/src/config/index.ts +0 -6
  212. package/src/config/masking.ts +0 -27
  213. package/src/config/session-recorder.ts +0 -55
  214. package/src/config/validators.ts +0 -31
  215. package/src/context/SessionRecorderContext.tsx +0 -75
  216. package/src/expo.ts +0 -11
  217. package/src/index.ts +0 -17
  218. package/src/otel/helpers.ts +0 -275
  219. package/src/otel/index.ts +0 -138
  220. package/src/otel/instrumentations/index.ts +0 -115
  221. package/src/patch/index.ts +0 -1
  222. package/src/patch/xhr.ts +0 -142
  223. package/src/recorder/eventExporter.ts +0 -141
  224. package/src/recorder/gestureRecorder.ts +0 -498
  225. package/src/recorder/index.ts +0 -179
  226. package/src/recorder/navigationTracker.ts +0 -449
  227. package/src/recorder/screenRecorder.ts +0 -498
  228. package/src/services/api.service.ts +0 -203
  229. package/src/services/storage.service.ts +0 -158
  230. package/src/session-recorder.ts +0 -600
  231. package/src/types/expo.d.ts +0 -23
  232. package/src/types/index.ts +0 -28
  233. package/src/types/session-recorder.ts +0 -423
  234. package/src/types/session.ts +0 -65
  235. package/src/utils/app-metadata.ts +0 -31
  236. package/src/utils/index.ts +0 -8
  237. package/src/utils/logger.ts +0 -225
  238. package/src/utils/platform.ts +0 -384
  239. package/src/utils/request-utils.ts +0 -61
  240. package/src/utils/rrweb-events.ts +0 -309
  241. package/src/utils/session.ts +0 -18
  242. package/src/utils/time.ts +0 -17
  243. package/src/utils/type-utils.ts +0 -75
  244. package/src/version.ts +0 -1
  245. package/tsconfig.json +0 -24
package/README.md CHANGED
@@ -15,22 +15,53 @@ yarn add @multiplayer-app/session-recorder-react-native
15
15
  This package requires the following dependencies to be installed in your React Native application:
16
16
 
17
17
  ```bash
18
- npm install @react-native-async-storage/async-storage @react-native-community/netinfo react-native-mmkv
18
+ npm install @react-native-async-storage/async-storage @react-native-community/netinfo react-native-mmkv react-native-svg
19
19
  # or
20
- yarn add @react-native-async-storage/async-storage @react-native-community/netinfo react-native-mmkv
20
+ yarn add @react-native-async-storage/async-storage @react-native-community/netinfo react-native-mmkv react-native-svg
21
21
  ```
22
22
 
23
- **Note**: If these dependencies are not installed, the session recorder will throw clear error messages indicating which dependencies are missing.
23
+ **Important**: Native modules like `@react-native-async-storage/async-storage` and `react-native-svg` must be installed directly in your app's `package.json`. React Native autolinking only links native modules that are declared by the app itself, not modules pulled in transitively by libraries. If you don't add them directly, you may see errors like "NativeModule: AsyncStorage is null" or SVGs not rendering.
24
24
 
25
- ### Expo Installation
25
+ #### Bare React Native projects
26
26
 
27
- For Expo applications, the package automatically detects the Expo environment and provides Expo-specific optimizations:
27
+ ```bash
28
+ # install native deps in the app
29
+ npm install @react-native-async-storage/async-storage @react-native-community/netinfo react-native-mmkv react-native-svg
30
+
31
+ # iOS: install pods from your app's ios directory
32
+ cd ios && pod install && cd -
33
+ ```
34
+
35
+ #### Expo projects
36
+
37
+ Use Expo's version-aware installer so versions match the SDK:
28
38
 
29
39
  ```bash
30
- npx expo install @multiplayer-app/session-recorder-react-native
40
+ npx expo install @react-native-async-storage/async-storage @react-native-community/netinfo react-native-mmkv react-native-svg
41
+ ```
42
+
43
+ If you use Expo Router or a managed workflow, no extra autolinking steps are required beyond installing the packages.
44
+
45
+ #### Why direct install is required
46
+
47
+ - Autolinking scans only the app's `package.json`
48
+ - iOS CocoaPods/Android Gradle include native modules only when the app declares them
49
+ - Libraries should list native requirements as `peerDependencies` and document installation
50
+
51
+ <!-- Removed separate Expo Installation block to avoid duplication. Expo users should install native deps with `expo install` as shown above. -->
52
+
53
+ ### Troubleshooting AsyncStorage
54
+
55
+ If you encounter:
56
+
57
+ ```
58
+ [@RNC/AsyncStorage]: NativeModule: AsyncStorage is null
31
59
  ```
32
60
 
33
- The package will automatically detect if you're running in an Expo environment and provide the appropriate configuration.
61
+ 1. Ensure `@react-native-async-storage/async-storage` is installed in your app (not only in this library)
62
+ 2. iOS: run `cd ios && pod install`, then rebuild the app
63
+ 3. Clear Metro cache: `npm start -- --reset-cache` (or `expo start -c`)
64
+ 4. Clean builds: uninstall the app from device/simulator and rebuild
34
65
 
35
66
  ## Setup
36
67
 
@@ -75,14 +106,43 @@ The package will automatically:
75
106
  - Add Expo-specific attributes to traces
76
107
  - Optimize performance for Expo runtime
77
108
 
78
- ### React Navigation Integration
109
+ ### Navigation integration
79
110
 
80
- ```javascript
111
+ #### Expo Router (recommended)
112
+
113
+ Expo Router already manages the NavigationContainer. Don’t add your own.
114
+
115
+ ```tsx
116
+ import { useEffect } from 'react'
117
+ import { Stack, useNavigationContainerRef } from 'expo-router'
118
+ import SessionRecorder from '@multiplayer-app/session-recorder-react-native'
119
+
120
+ export default function RootLayout() {
121
+ const navigationRef = useNavigationContainerRef()
122
+
123
+ useEffect(() => {
124
+ const unsub = navigationRef.addListener?.('state', () => {
125
+ SessionRecorder.setNavigationRef(navigationRef)
126
+ unsub?.()
127
+ })
128
+ return unsub
129
+ }, [navigationRef])
130
+
131
+ return <Stack />
132
+ }
133
+ ```
134
+
135
+ #### Classic React Navigation (no Expo Router)
136
+
137
+ If you own the `NavigationContainer`, set the ref in `onReady`:
138
+
139
+ ```tsx
81
140
  import { NavigationContainer } from '@react-navigation/native'
141
+ import { useRef } from 'react'
82
142
  import SessionRecorder from '@multiplayer-app/session-recorder-react-native'
83
143
 
84
144
  export default function App() {
85
- const navigationRef = useRef(null)
145
+ const navigationRef = useRef<any>(null)
86
146
 
87
147
  return (
88
148
  <NavigationContainer
@@ -118,7 +178,7 @@ SessionRecorder.save()
118
178
 
119
179
  ## Features
120
180
 
121
- - **Gesture Recording**: Track taps, swipes, and other touch interactions
181
+ - **Gesture Recording**: Track taps, swipes, and other touch interactions with target element information
122
182
  - **Navigation Tracking**: Monitor screen transitions and navigation state
123
183
  - **Screen Recording**: Capture periodic screenshots (requires permissions)
124
184
  - **OpenTelemetry Integration**: Correlate with backend traces
@@ -126,6 +186,104 @@ SessionRecorder.save()
126
186
  - **Session Management**: Start, pause, resume, and stop sessions
127
187
  - **Expo Support**: Full compatibility with Expo applications including automatic environment detection
128
188
 
189
+ ## Gesture Recording & Target Element Information
190
+
191
+ The session recorder automatically captures target element information for all gesture interactions, enriching your OpenTelemetry traces with valuable context about what users are interacting with.
192
+
193
+ ### Captured Attributes
194
+
195
+ When users interact with elements, the following attributes are automatically added to gesture spans:
196
+
197
+ | Attribute | Description | Example |
198
+ | ------------------------ | ----------------------------------------- | ----------------- |
199
+ | `gesture.target` | Primary identifier for the target element | `"Submit Button"` |
200
+ | `gesture.target.label` | Accessibility label of the element | `"Submit form"` |
201
+ | `gesture.target.role` | Accessibility role of the element | `"button"` |
202
+ | `gesture.target.test_id` | Test ID of the element | `"submit-btn"` |
203
+ | `gesture.target.text` | Text content of the element | `"Submit"` |
204
+
205
+ ### How Target Information is Extracted
206
+
207
+ The recorder automatically extracts target information from React Native elements using the following priority:
208
+
209
+ 1. **`accessibilityLabel`** - Explicit accessibility label (highest priority)
210
+ 2. **Text content** - Text from child elements
211
+ 3. **`testID`** - Test identifier (lowest priority)
212
+
213
+ ### Best Practices for Better Trace Information
214
+
215
+ To get the most useful target information in your traces, follow these practices:
216
+
217
+ #### 1. Use Accessibility Labels
218
+
219
+ ```jsx
220
+ <TouchableOpacity accessibilityLabel='Submit user registration form' accessibilityRole='button' onPress={handleSubmit}>
221
+ <Text>Submit</Text>
222
+ </TouchableOpacity>
223
+ ```
224
+
225
+ #### 2. Add Test IDs for Testing Context
226
+
227
+ ```jsx
228
+ <TouchableOpacity testID='registration-submit-btn' accessibilityLabel='Submit registration' onPress={handleSubmit}>
229
+ <Text>Submit</Text>
230
+ </TouchableOpacity>
231
+ ```
232
+
233
+ #### 3. Use Semantic Text Content
234
+
235
+ ```jsx
236
+ <TouchableOpacity onPress={handleSubmit}>
237
+ <Text>Submit Registration</Text> {/* Clear, descriptive text */}
238
+ </TouchableOpacity>
239
+ ```
240
+
241
+ #### 4. Avoid Generic Labels
242
+
243
+ ```jsx
244
+ // ❌ Poor trace information
245
+ <TouchableOpacity accessibilityLabel="Button" onPress={handleSubmit}>
246
+ <Text>Click</Text>
247
+ </TouchableOpacity>
248
+
249
+ // ✅ Rich trace information
250
+ <TouchableOpacity
251
+ accessibilityLabel="Submit user registration form"
252
+ testID="registration-submit"
253
+ onPress={handleSubmit}
254
+ >
255
+ <Text>Submit Registration</Text>
256
+ </TouchableOpacity>
257
+ ```
258
+
259
+ ### Example Trace Output
260
+
261
+ With proper element labeling, your gesture traces will include rich context:
262
+
263
+ ```json
264
+ {
265
+ "spanName": "Gesture.tap",
266
+ "attributes": {
267
+ "gesture.type": "tap",
268
+ "gesture.platform": "react-native",
269
+ "gesture.coordinates.x": 150.5,
270
+ "gesture.coordinates.y": 200.3,
271
+ "gesture.target": "Submit user registration form",
272
+ "gesture.target.label": "Submit user registration form",
273
+ "gesture.target.role": "button",
274
+ "gesture.target.test_id": "registration-submit",
275
+ "gesture.target.text": "Submit Registration"
276
+ }
277
+ }
278
+ ```
279
+
280
+ This rich context helps you:
281
+
282
+ - **Debug user interactions** more effectively
283
+ - **Understand user behavior** patterns
284
+ - **Identify UI issues** faster
285
+ - **Correlate frontend actions** with backend events
286
+
129
287
  ## Permissions
130
288
 
131
289
  For screen recording, you'll need to add permissions to your app:
@@ -202,7 +360,7 @@ SessionRecorder.init({
202
360
 
203
361
  1. **Screen recording not working**: Ensure you have the necessary permissions
204
362
  2. **Navigation tracking not working**: Make sure you've set the navigation ref
205
- 3. **Gesture recording issues**: Check that react-native-gesture-handler is properly configured
363
+ 3. **Gesture recording issues**: Gesture recording uses native PanResponder and should work out of the box
206
364
  4. **Expo environment not detected**: Ensure `expo-constants` is installed and accessible
207
365
  5. **Expo build issues**: Make sure you're using the correct entry point for Expo applications
208
366
 
@@ -0,0 +1,26 @@
1
+ require "json"
2
+
3
+ package = JSON.parse(File.read(File.join(__dir__, "..", "package.json")))
4
+
5
+ Pod::Spec.new do |s|
6
+ s.name = "SessionRecorderNative"
7
+ s.version = package["version"]
8
+ s.summary = "Native session recorder module for React Native"
9
+ s.description = "A native module that provides session recording with automatic masking of sensitive UI elements"
10
+ s.homepage = "https://github.com/multiplayer-app/multiplayer-session-recorder-javascript"
11
+ s.license = "MIT"
12
+ s.authors = { "Multiplayer Software, Inc." => "https://www.multiplayer.app" }
13
+ s.platforms = { :ios => "12.0" }
14
+ s.source = { :git => "https://github.com/multiplayer-app/multiplayer-session-recorder-javascript.git", :tag => "#{s.version}" }
15
+
16
+ s.source_files = "ios/**/*.{h,m,mm,swift}"
17
+ s.requires_arc = true
18
+
19
+ s.dependency "React-Core"
20
+ s.dependency "React"
21
+
22
+ # Ensure proper linking for Expo
23
+ s.pod_target_xcconfig = {
24
+ "HEADER_SEARCH_PATHS" => "\"$(PODS_ROOT)/React-Core/React\""
25
+ }
26
+ end
@@ -0,0 +1,34 @@
1
+ apply plugin: 'com.android.library'
2
+ apply plugin: 'kotlin-android'
3
+
4
+ def safeExtGet(prop, fallback) {
5
+ rootProject.ext.has(prop) ? rootProject.ext.get(prop) : fallback
6
+ }
7
+
8
+ android {
9
+ namespace "com.multiplayer.sessionrecorder"
10
+ compileSdkVersion safeExtGet('compileSdkVersion', 33)
11
+
12
+ defaultConfig {
13
+ minSdkVersion safeExtGet('minSdkVersion', 21)
14
+ targetSdkVersion safeExtGet('targetSdkVersion', 33)
15
+ versionCode 1
16
+ versionName "1.0"
17
+ }
18
+
19
+ buildTypes {
20
+ release {
21
+ minifyEnabled false
22
+ proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
23
+ }
24
+ }
25
+
26
+ compileOptions {
27
+ sourceCompatibility JavaVersion.VERSION_1_8
28
+ targetCompatibility JavaVersion.VERSION_1_8
29
+ }
30
+ }
31
+
32
+ dependencies {
33
+ implementation 'com.facebook.react:react-native:+'
34
+ }
@@ -5,7 +5,10 @@ set -e
5
5
 
6
6
  # Configuration
7
7
  SOURCE_DIR="./dist"
8
- TARGET_DIR="../../../sample-expo-app/node_modules/@multiplayer-app/session-recorder-react-native"
8
+ SOURCE_DIR_IOS="./ios"
9
+ SOURCE_DIR_ANDROID="./android"
10
+ TARGET_DIR_EXPO="./examples/example-app-expo/node_modules/@multiplayer-app/session-recorder-react-native"
11
+ TARGET_DIR_NATIVE="./examples/example-app/node_modules/@multiplayer-app/session-recorder-react-native"
9
12
 
10
13
  echo "📱 Copying React Native dist to sample Expo app..."
11
14
 
@@ -17,22 +20,37 @@ if [ ! -d "$SOURCE_DIR" ]; then
17
20
  fi
18
21
 
19
22
  # Check if target directory exists
20
- if [ ! -d "$TARGET_DIR" ]; then
21
- echo "Target directory does not exist: $TARGET_DIR"
22
- echo "💡 Please make sure the sample-expo-app is set up and has the package installed"
23
- exit 1
23
+ if [ ! -d "$TARGET_DIR_EXPO" ]; then
24
+ echo "⚠️ Target directory does not exist: $TARGET_DIR_EXPO"
25
+ echo "💡 Skipping script execution - please make sure the sample-expo-app is set up and has the package installed"
26
+ exit 0
24
27
  fi
25
28
 
26
- # Create backup of existing dist if it exists
27
- if [ -d "$TARGET_DIR/dist" ]; then
28
- echo "📦 Creating backup of existing dist..."
29
- cp -r "$TARGET_DIR/dist" "$TARGET_DIR/dist.backup.$(date +%Y%m%d_%H%M%S)"
29
+ # Check if target directory exists
30
+ if [ ! -d "$TARGET_DIR_NATIVE" ]; then
31
+ echo "⚠️ Target directory does not exist: $TARGET_DIR_NATIVE"
32
+ echo "💡 Skipping script execution - please make sure the example-app is set up and has the package installed"
33
+ exit 0
30
34
  fi
31
35
 
32
- # Copy the dist folder
33
- echo "🔄 Copying dist folder..."
34
- cp -r "$SOURCE_DIR" "$TARGET_DIR/"
35
-
36
- echo " Successfully copied dist folder to sample Expo app!"
37
- echo "📍 Source: $SOURCE_DIR"
38
- echo "📍 Target: $TARGET_DIR/dist"
36
+ # Copy the dist and native folders
37
+ echo "🔄 Copying dist folder and native sources..."
38
+ cp -r "$SOURCE_DIR" "$TARGET_DIR_EXPO/"
39
+ cp -r "$SOURCE_DIR_IOS" "$TARGET_DIR_EXPO/"
40
+ cp -r "$SOURCE_DIR_ANDROID" "$TARGET_DIR_EXPO/"
41
+
42
+ cp -r "$SOURCE_DIR" "$TARGET_DIR_NATIVE/"
43
+ cp -r "$SOURCE_DIR_IOS" "$TARGET_DIR_NATIVE/"
44
+ cp -r "$SOURCE_DIR_ANDROID" "$TARGET_DIR_NATIVE/"
45
+
46
+ # Ensure RN autolinking config and metadata are in sync
47
+ echo "🛠️ Syncing react-native.config.js and package.json..."
48
+ cp -f "./react-native.config.js" "$TARGET_DIR_EXPO/react-native.config.js"
49
+ cp -f "./package.json" "$TARGET_DIR_EXPO/package.json"
50
+ cp -f "./react-native.config.js" "$TARGET_DIR_NATIVE/react-native.config.js"
51
+ cp -f "./package.json" "$TARGET_DIR_NATIVE/package.json"
52
+
53
+ echo "✅ Successfully synced package into sample Expo app."
54
+ echo "📍 Source: $(pwd)"
55
+ echo "📍 Target: $TARGET_DIR_EXPO"
56
+ echo "📍 Target: $TARGET_DIR_NATIVE"
@@ -2,5 +2,6 @@ import React, { ReactNode } from 'react';
2
2
  export interface GestureCaptureWrapperProps {
3
3
  children: ReactNode;
4
4
  onGestureRecord: (gestureType: string, data: any) => void;
5
+ enabled?: boolean;
5
6
  }
6
7
  export declare const GestureCaptureWrapper: React.FC<GestureCaptureWrapperProps>;
@@ -1 +1 @@
1
- "use strict";var _typeof=require("@babel/runtime/helpers/typeof");Object.defineProperty(exports,"__esModule",{value:true});exports.GestureCaptureWrapper=void 0;var _react=_interopRequireWildcard(require("react"));var _reactNativeGestureHandler=require("react-native-gesture-handler");var _jsxRuntime=require("react/jsx-runtime");var _this=void 0,_jsxFileName="/Users/gegham/www/multiplayer-debugger-javascript/packages/session-recorder-react-native/dist/components/GestureCaptureWrapper/GestureCaptureWrapper.js";function _interopRequireWildcard(e,t){if("function"==typeof WeakMap)var r=new WeakMap(),n=new WeakMap();return(_interopRequireWildcard=function _interopRequireWildcard(e,t){if(!t&&e&&e.__esModule)return e;var o,i,f={__proto__:null,"default":e};if(null===e||"object"!=_typeof(e)&&"function"!=typeof e)return f;if(o=t?n:r){if(o.has(e))return o.get(e);o.set(e,f);}for(var _t2 in e)"default"!==_t2&&{}.hasOwnProperty.call(e,_t2)&&((i=(o=Object.defineProperty)&&Object.getOwnPropertyDescriptor(e,_t2))&&(i.get||i.set)?o(f,_t2,i):f[_t2]=e[_t2]);return f;})(e,t);}var GestureCaptureWrapper=exports.GestureCaptureWrapper=function GestureCaptureWrapper(_ref){var children=_ref.children,onGestureRecord=_ref.onGestureRecord;var recordGesture=(0,_react.useCallback)(function(gestureType,data){onGestureRecord(gestureType,data);},[onGestureRecord]);var tapGesture=(0,_react.useMemo)(function(){return _reactNativeGestureHandler.Gesture.Tap().runOnJS(true).onStart(function(event){recordGesture('tap',{x:event.x,y:event.y,timestamp:Date.now()});});},[recordGesture]);var panGesture=(0,_react.useMemo)(function(){return _reactNativeGestureHandler.Gesture.Pan().runOnJS(true).onStart(function(event){recordGesture('pan_start',{x:event.x,y:event.y,timestamp:Date.now()});}).onUpdate(function(event){recordGesture('pan_update',{x:event.x,y:event.y,translationX:event.translationX,translationY:event.translationY,velocityX:event.velocityX,velocityY:event.velocityY,timestamp:Date.now()});}).onEnd(function(event){recordGesture('pan_end',{x:event.x,y:event.y,translationX:event.translationX,translationY:event.translationY,velocityX:event.velocityX,velocityY:event.velocityY,timestamp:Date.now()});});},[recordGesture]);var longPressGesture=(0,_react.useMemo)(function(){return _reactNativeGestureHandler.Gesture.LongPress().runOnJS(true).minDuration(500).onStart(function(event){recordGesture('long_press',{x:event.x,y:event.y,duration:500,timestamp:Date.now()});});},[recordGesture]);return(0,_jsxRuntime.jsx)(_reactNativeGestureHandler.GestureHandlerRootView,{style:{flex:1},children:(0,_jsxRuntime.jsx)(_reactNativeGestureHandler.GestureDetector,{gesture:_reactNativeGestureHandler.Gesture.Simultaneous(tapGesture,panGesture,longPressGesture),children:children})});};
1
+ "use strict";var _interopRequireDefault=require("@babel/runtime/helpers/interopRequireDefault");var _typeof=require("@babel/runtime/helpers/typeof");Object.defineProperty(exports,"__esModule",{value:true});exports.GestureCaptureWrapper=void 0;var _defineProperty2=_interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));var _react=_interopRequireWildcard(require("react"));var _reactNative=require("react-native");var _jsxRuntime=require("react/jsx-runtime");var _this=void 0,_jsxFileName="/Users/gegham/www/multiplayer-debugger-javascript/packages/session-recorder-react-native/dist/components/GestureCaptureWrapper/GestureCaptureWrapper.js";function _interopRequireWildcard(e,t){if("function"==typeof WeakMap)var r=new WeakMap(),n=new WeakMap();return(_interopRequireWildcard=function _interopRequireWildcard(e,t){if(!t&&e&&e.__esModule)return e;var o,i,f={__proto__:null,"default":e};if(null===e||"object"!=_typeof(e)&&"function"!=typeof e)return f;if(o=t?n:r){if(o.has(e))return o.get(e);o.set(e,f);}for(var _t2 in e)"default"!==_t2&&{}.hasOwnProperty.call(e,_t2)&&((i=(o=Object.defineProperty)&&Object.getOwnPropertyDescriptor(e,_t2))&&(i.get||i.set)?o(f,_t2,i):f[_t2]=e[_t2]);return f;})(e,t);}function ownKeys(e,r){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);r&&(o=o.filter(function(r){return Object.getOwnPropertyDescriptor(e,r).enumerable;})),t.push.apply(t,o);}return t;}function _objectSpread(e){for(var r=1;r<arguments.length;r++){var t=null!=arguments[r]?arguments[r]:{};r%2?ownKeys(Object(t),!0).forEach(function(r){(0,_defineProperty2["default"])(e,r,t[r]);}):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(t)):ownKeys(Object(t)).forEach(function(r){Object.defineProperty(e,r,Object.getOwnPropertyDescriptor(t,r));});}return e;}var GestureCaptureWrapper=exports.GestureCaptureWrapper=function GestureCaptureWrapper(_ref){var children=_ref.children,onGestureRecord=_ref.onGestureRecord,enabled=_ref.enabled;var extractTargetInfo=(0,_react.useCallback)(function(evt){var _a,_b,_c,_d;try{var inst=(evt===null||evt===void 0?void 0:evt._targetInst)||(evt===null||evt===void 0?void 0:evt._dispatchInstances)||undefined;var props=(inst===null||inst===void 0?void 0:inst.memoizedProps)||((_a=inst===null||inst===void 0?void 0:inst._currentElement)===null||_a===void 0?void 0:_a.props)||undefined;var accessibilityLabel=(props===null||props===void 0?void 0:props.accessibilityLabel)||(props===null||props===void 0?void 0:props.ariaLabel)||undefined;var accessibilityRole=(props===null||props===void 0?void 0:props.accessibilityRole)||(props===null||props===void 0?void 0:props.role)||undefined;var testID=(props===null||props===void 0?void 0:props.testID)||undefined;var text;if(typeof(props===null||props===void 0?void 0:props.children)==='string'){text=props.children;}else if(Array.isArray(props===null||props===void 0?void 0:props.children)){var flat=((_c=(_b=props.children).flat)===null||_c===void 0?void 0:_c.call(_b))||props.children;var firstText=(_d=flat.find)===null||_d===void 0?void 0:_d.call(flat,function(c){return typeof c==='string';});if(typeof firstText==='string'){text=firstText;}}var target=accessibilityLabel||text||testID||undefined;return{target:target,targetInfo:{label:accessibilityLabel,role:accessibilityRole,testId:testID,text:text}};}catch(_e){return{target:undefined,targetInfo:undefined};}},[]);var recordGesture=(0,_react.useCallback)(function(gestureType,data){if(!enabled)return;console.log('GestureCaptureWrapper: Recording gesture',{gestureType:gestureType,data:data});onGestureRecord(gestureType,data);},[enabled,onGestureRecord]);(0,_react.useEffect)(function(){if(!enabled)return;var originalHandlers={TouchableOpacity:_reactNative.TouchableOpacity.prototype._onPress,TouchableHighlight:_reactNative.TouchableHighlight.prototype._onPress,TouchableWithoutFeedback:_reactNative.TouchableWithoutFeedback.prototype._onPress,Pressable:_reactNative.Pressable.prototype._onPress};var createGestureWrapper=function createGestureWrapper(originalHandler,componentName){return function(evt){var _a,_b,_c,_d,_e;var props=this.props||{};var accessibilityLabel=props.accessibilityLabel||props.ariaLabel;var accessibilityRole=props.accessibilityRole||props.role;var testID=props.testID;var text;if(typeof props.children==='string'){text=props.children;}else if(Array.isArray(props.children)){var flat=((_b=(_a=props.children).flat)===null||_b===void 0?void 0:_b.call(_a))||props.children;var firstText=(_c=flat.find)===null||_c===void 0?void 0:_c.call(flat,function(c){return typeof c==='string';});if(typeof firstText==='string'){text=firstText;}}var target=accessibilityLabel||text||testID||"".concat(componentName,"-").concat(Math.random().toString(36).substr(2,9));recordGesture('tap',{x:((_d=evt===null||evt===void 0?void 0:evt.nativeEvent)===null||_d===void 0?void 0:_d.pageX)||0,y:((_e=evt===null||evt===void 0?void 0:evt.nativeEvent)===null||_e===void 0?void 0:_e.pageY)||0,timestamp:Date.now(),target:target,targetInfo:{label:accessibilityLabel,role:accessibilityRole,testId:testID,text:text}});if(originalHandler){return originalHandler.call(this,evt);}};};_reactNative.TouchableOpacity.prototype._onPress=createGestureWrapper(originalHandlers.TouchableOpacity,'TouchableOpacity');_reactNative.TouchableHighlight.prototype._onPress=createGestureWrapper(originalHandlers.TouchableHighlight,'TouchableHighlight');_reactNative.TouchableWithoutFeedback.prototype._onPress=createGestureWrapper(originalHandlers.TouchableWithoutFeedback,'TouchableWithoutFeedback');_reactNative.Pressable.prototype._onPress=createGestureWrapper(originalHandlers.Pressable,'Pressable');return function(){;_reactNative.TouchableOpacity.prototype._onPress=originalHandlers.TouchableOpacity;_reactNative.TouchableHighlight.prototype._onPress=originalHandlers.TouchableHighlight;_reactNative.TouchableWithoutFeedback.prototype._onPress=originalHandlers.TouchableWithoutFeedback;_reactNative.Pressable.prototype._onPress=originalHandlers.Pressable;};},[enabled,recordGesture]);var panResponder=(0,_react.useMemo)(function(){return _reactNative.PanResponder.create({onStartShouldSetPanResponder:function onStartShouldSetPanResponder(){return true;},onMoveShouldSetPanResponder:function onMoveShouldSetPanResponder(){return true;},onPanResponderGrant:function onPanResponderGrant(evt){var _extractTargetInfo=extractTargetInfo(evt),target=_extractTargetInfo.target,targetInfo=_extractTargetInfo.targetInfo;recordGesture('tap',{x:evt.nativeEvent.pageX,y:evt.nativeEvent.pageY,timestamp:Date.now(),target:target,targetInfo:targetInfo});},onPanResponderMove:function onPanResponderMove(evt){var _extractTargetInfo2=extractTargetInfo(evt),target=_extractTargetInfo2.target,targetInfo=_extractTargetInfo2.targetInfo;recordGesture('pan_update',{x:evt.nativeEvent.pageX,y:evt.nativeEvent.pageY,translationX:evt.nativeEvent.pageX-evt.nativeEvent.locationX,translationY:evt.nativeEvent.pageY-evt.nativeEvent.locationY,timestamp:Date.now(),target:target,targetInfo:targetInfo});},onPanResponderRelease:function onPanResponderRelease(evt){var _extractTargetInfo3=extractTargetInfo(evt),target=_extractTargetInfo3.target,targetInfo=_extractTargetInfo3.targetInfo;recordGesture('pan_end',{x:evt.nativeEvent.pageX,y:evt.nativeEvent.pageY,timestamp:Date.now(),target:target,targetInfo:targetInfo});}});},[extractTargetInfo,recordGesture]);return(0,_jsxRuntime.jsx)(_reactNative.View,_objectSpread(_objectSpread({collapsable:false,style:{flex:1},pointerEvents:"box-none"},panResponder.panHandlers),{},{children:children}));};
@@ -1 +1 @@
1
- {"version":3,"file":"GestureCaptureWrapper.js","sourceRoot":"","sources":["../../../src/components/GestureCaptureWrapper/GestureCaptureWrapper.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAa,WAAW,EAAE,OAAO,EAAE,MAAM,OAAO,CAAA;AAC9D,OAAO,EAAE,OAAO,EAAE,eAAe,EAAE,sBAAsB,EAAE,MAAM,8BAA8B,CAAA;AAO/F,MAAM,CAAC,MAAM,qBAAqB,GAAyC,CAAC,EAAE,QAAQ,EAAE,eAAe,EAAE,EAAE,EAAE;IAC3G,MAAM,aAAa,GAAG,WAAW,CAC/B,CAAC,WAAmB,EAAE,IAAS,EAAE,EAAE;QACjC,+BAA+B;QAC/B,eAAe,CAAC,WAAW,EAAE,IAAI,CAAC,CAAA;IACpC,CAAC,EACD,CAAC,eAAe,CAAC,CAClB,CAAA;IAED,qBAAqB;IACrB,MAAM,UAAU,GAAG,OAAO,CAAC,GAAG,EAAE;QAC9B,OAAO,OAAO,CAAC,GAAG,EAAE;aACjB,OAAO,CAAC,IAAI,CAAC;aACb,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE;YACjB,aAAa,CAAC,KAAK,EAAE;gBACnB,CAAC,EAAE,KAAK,CAAC,CAAC;gBACV,CAAC,EAAE,KAAK,CAAC,CAAC;gBACV,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;aACtB,CAAC,CAAA;QACJ,CAAC,CAAC,CAAA;IACN,CAAC,EAAE,CAAC,aAAa,CAAC,CAAC,CAAA;IAEnB,4CAA4C;IAC5C,MAAM,UAAU,GAAG,OAAO,CAAC,GAAG,EAAE;QAC9B,OAAO,OAAO,CAAC,GAAG,EAAE;aACjB,OAAO,CAAC,IAAI,CAAC;aACb,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE;YACjB,aAAa,CAAC,WAAW,EAAE;gBACzB,CAAC,EAAE,KAAK,CAAC,CAAC;gBACV,CAAC,EAAE,KAAK,CAAC,CAAC;gBACV,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;aACtB,CAAC,CAAA;QACJ,CAAC,CAAC;aACD,QAAQ,CAAC,CAAC,KAAK,EAAE,EAAE;YAClB,aAAa,CAAC,YAAY,EAAE;gBAC1B,CAAC,EAAE,KAAK,CAAC,CAAC;gBACV,CAAC,EAAE,KAAK,CAAC,CAAC;gBACV,YAAY,EAAE,KAAK,CAAC,YAAY;gBAChC,YAAY,EAAE,KAAK,CAAC,YAAY;gBAChC,SAAS,EAAE,KAAK,CAAC,SAAS;gBAC1B,SAAS,EAAE,KAAK,CAAC,SAAS;gBAC1B,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;aACtB,CAAC,CAAA;QACJ,CAAC,CAAC;aACD,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;YACf,aAAa,CAAC,SAAS,EAAE;gBACvB,CAAC,EAAE,KAAK,CAAC,CAAC;gBACV,CAAC,EAAE,KAAK,CAAC,CAAC;gBACV,YAAY,EAAE,KAAK,CAAC,YAAY;gBAChC,YAAY,EAAE,KAAK,CAAC,YAAY;gBAChC,SAAS,EAAE,KAAK,CAAC,SAAS;gBAC1B,SAAS,EAAE,KAAK,CAAC,SAAS;gBAC1B,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;aACtB,CAAC,CAAA;QACJ,CAAC,CAAC,CAAA;IACN,CAAC,EAAE,CAAC,aAAa,CAAC,CAAC,CAAA;IAEnB,4BAA4B;IAC5B,MAAM,gBAAgB,GAAG,OAAO,CAAC,GAAG,EAAE;QACpC,OAAO,OAAO,CAAC,SAAS,EAAE;aACvB,OAAO,CAAC,IAAI,CAAC;aACb,WAAW,CAAC,GAAG,CAAC;aAChB,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE;YACjB,aAAa,CAAC,YAAY,EAAE;gBAC1B,CAAC,EAAE,KAAK,CAAC,CAAC;gBACV,CAAC,EAAE,KAAK,CAAC,CAAC;gBACV,QAAQ,EAAE,GAAG;gBACb,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;aACtB,CAAC,CAAA;QACJ,CAAC,CAAC,CAAA;IACN,CAAC,EAAE,CAAC,aAAa,CAAC,CAAC,CAAA;IAEnB,OAAO,CACL,CAAC,sBAAsB,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC,CACzC;MAAA,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,YAAY,CAAC,UAAU,EAAE,UAAU,EAAE,gBAAgB,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,eAAe,CACvH;IAAA,EAAE,sBAAsB,CAAC,CAC1B,CAAA;AACH,CAAC,CAAA"}
1
+ {"version":3,"file":"GestureCaptureWrapper.js","sourceRoot":"","sources":["../../../src/components/GestureCaptureWrapper/GestureCaptureWrapper.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ import React from 'react';
2
+ import { ViewProps } from 'react-native';
3
+ interface MaskableComponentProps extends ViewProps {
4
+ /** Whether this component should be masked in screenshots */
5
+ maskInScreenshots?: boolean;
6
+ /** Custom mask type for this component */
7
+ maskType?: 'blur' | 'blackout' | 'pixelate';
8
+ /** Element identifier for hierarchy tracking */
9
+ elementId?: string;
10
+ /** Whether this is a sensitive input field */
11
+ isSensitive?: boolean;
12
+ /** Accessibility label for masking detection */
13
+ accessibilityLabel?: string;
14
+ /** Children components */
15
+ children?: React.ReactNode;
16
+ }
17
+ /**
18
+ * A wrapper component that provides masking control for its children
19
+ * Similar to PostHog's ph-no-capture functionality
20
+ */
21
+ export declare const MaskableComponent: React.FC<MaskableComponentProps>;
22
+ export default MaskableComponent;
@@ -0,0 +1 @@
1
+ "use strict";var _interopRequireDefault=require("@babel/runtime/helpers/interopRequireDefault");var _typeof=require("@babel/runtime/helpers/typeof");Object.defineProperty(exports,"__esModule",{value:true});exports["default"]=exports.MaskableComponent=void 0;var _defineProperty2=_interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));var _objectWithoutProperties2=_interopRequireDefault(require("@babel/runtime/helpers/objectWithoutProperties"));var _react=_interopRequireWildcard(require("react"));var _reactNative=require("react-native");var _jsxRuntime=require("react/jsx-runtime");var _excluded=["maskInScreenshots","maskType","elementId","isSensitive","accessibilityLabel","children"];var _this=void 0,_jsxFileName="/Users/gegham/www/multiplayer-debugger-javascript/packages/session-recorder-react-native/dist/components/MaskableComponent.js";function _interopRequireWildcard(e,t){if("function"==typeof WeakMap)var r=new WeakMap(),n=new WeakMap();return(_interopRequireWildcard=function _interopRequireWildcard(e,t){if(!t&&e&&e.__esModule)return e;var o,i,f={__proto__:null,"default":e};if(null===e||"object"!=_typeof(e)&&"function"!=typeof e)return f;if(o=t?n:r){if(o.has(e))return o.get(e);o.set(e,f);}for(var _t2 in e)"default"!==_t2&&{}.hasOwnProperty.call(e,_t2)&&((i=(o=Object.defineProperty)&&Object.getOwnPropertyDescriptor(e,_t2))&&(i.get||i.set)?o(f,_t2,i):f[_t2]=e[_t2]);return f;})(e,t);}function ownKeys(e,r){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);r&&(o=o.filter(function(r){return Object.getOwnPropertyDescriptor(e,r).enumerable;})),t.push.apply(t,o);}return t;}function _objectSpread(e){for(var r=1;r<arguments.length;r++){var t=null!=arguments[r]?arguments[r]:{};r%2?ownKeys(Object(t),!0).forEach(function(r){(0,_defineProperty2["default"])(e,r,t[r]);}):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(t)):ownKeys(Object(t)).forEach(function(r){Object.defineProperty(e,r,Object.getOwnPropertyDescriptor(t,r));});}return e;}var MaskableComponent=exports.MaskableComponent=function MaskableComponent(_ref){var _ref$maskInScreenshot=_ref.maskInScreenshots,maskInScreenshots=_ref$maskInScreenshot===void 0?false:_ref$maskInScreenshot,_ref$maskType=_ref.maskType,maskType=_ref$maskType===void 0?'blackout':_ref$maskType,elementId=_ref.elementId,_ref$isSensitive=_ref.isSensitive,isSensitive=_ref$isSensitive===void 0?false:_ref$isSensitive,accessibilityLabel=_ref.accessibilityLabel,children=_ref.children,viewProps=(0,_objectWithoutProperties2["default"])(_ref,_excluded);var viewRef=(0,_react.useRef)(null);(0,_react.useEffect)(function(){if(maskInScreenshots||isSensitive){registerMaskableComponent({elementId:elementId,maskType:maskType,isSensitive:isSensitive,bounds:getElementBounds(viewRef.current)});}return function(){if(elementId){unregisterMaskableComponent(elementId);}};},[maskInScreenshots,maskType,elementId,isSensitive]);var finalAccessibilityLabel=accessibilityLabel||(maskInScreenshots?'ph-no-capture':undefined)||(isSensitive?'mask-input':undefined);return(0,_jsxRuntime.jsx)(_reactNative.View,_objectSpread(_objectSpread({ref:viewRef,accessibilityLabel:finalAccessibilityLabel},viewProps),{},{children:children}));};function registerMaskableComponent(component){console.log('Registering maskable component:',component);}function unregisterMaskableComponent(elementId){console.log('Unregistering maskable component:',elementId);}function getElementBounds(view){if(!view)return undefined;return undefined;}var _default=exports["default"]=MaskableComponent;
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MaskableComponent.js","sourceRoot":"","sources":["../../src/components/MaskableComponent.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,OAAO,CAAA;AAChD,OAAO,EAAE,IAAI,EAAa,MAAM,cAAc,CAAA;AAiB9C;;;GAGG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAqC,CAAC,EAClE,iBAAiB,GAAG,KAAK,EACzB,QAAQ,GAAG,UAAU,EACrB,SAAS,EACT,WAAW,GAAG,KAAK,EACnB,kBAAkB,EAClB,QAAQ,EACR,GAAG,SAAS,EACb,EAAE,EAAE;IACH,MAAM,OAAO,GAAG,MAAM,CAAO,IAAI,CAAC,CAAA;IAElC,SAAS,CAAC,GAAG,EAAE;QACb,6DAA6D;QAC7D,IAAI,iBAAiB,IAAI,WAAW,EAAE,CAAC;YACrC,yEAAyE;YACzE,wCAAwC;YACxC,yBAAyB,CAAC;gBACxB,SAAS;gBACT,QAAQ;gBACR,WAAW;gBACX,MAAM,EAAE,gBAAgB,CAAC,OAAO,CAAC,OAAO,CAAC;aAC1C,CAAC,CAAA;QACJ,CAAC;QAED,OAAO,GAAG,EAAE;YACV,kCAAkC;YAClC,IAAI,SAAS,EAAE,CAAC;gBACd,2BAA2B,CAAC,SAAS,CAAC,CAAA;YACxC,CAAC;QACH,CAAC,CAAA;IACH,CAAC,EAAE,CAAC,iBAAiB,EAAE,QAAQ,EAAE,SAAS,EAAE,WAAW,CAAC,CAAC,CAAA;IAEzD,oCAAoC;IACpC,MAAM,uBAAuB,GAC3B,kBAAkB,IAAI,CAAC,iBAAiB,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,SAAS,CAAC,CAAA;IAErH,OAAO,CACL,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,kBAAkB,CAAC,CAAC,uBAAuB,CAAC,CAAC,IAAI,SAAS,CAAC,CAC7E;MAAA,CAAC,QAAQ,CACX;IAAA,EAAE,IAAI,CAAC,CACR,CAAA;AACH,CAAC,CAAA;AAED;;;GAGG;AACH,SAAS,yBAAyB,CAAC,SAKlC;IACC,wDAAwD;IACxD,gDAAgD;IAChD,OAAO,CAAC,GAAG,CAAC,iCAAiC,EAAE,SAAS,CAAC,CAAA;AAC3D,CAAC;AAED;;GAEG;AACH,SAAS,2BAA2B,CAAC,SAAiB;IACpD,wDAAwD;IACxD,gDAAgD;IAChD,OAAO,CAAC,GAAG,CAAC,mCAAmC,EAAE,SAAS,CAAC,CAAA;AAC7D,CAAC;AAED;;GAEG;AACH,SAAS,gBAAgB,CAAC,IAAiB;IACzC,IAAI,CAAC,IAAI;QAAE,OAAO,SAAS,CAAA;IAE3B,oDAAoD;IACpD,6CAA6C;IAC7C,OAAO,SAAS,CAAA;AAClB,CAAC;AAED,eAAe,iBAAiB,CAAA"}
@@ -0,0 +1,14 @@
1
+ import React from 'react';
2
+ import { TextInputProps } from 'react-native';
3
+ interface MaskableTextInputProps extends TextInputProps {
4
+ /** Unique identifier for this input */
5
+ maskId: string;
6
+ /** Whether this input should be masked (default: true) */
7
+ shouldMask?: boolean;
8
+ }
9
+ /**
10
+ * A TextInput component that automatically registers itself for masking
11
+ * This is the practical solution for React Native input masking
12
+ */
13
+ export declare const MaskableTextInput: React.FC<MaskableTextInputProps>;
14
+ export default MaskableTextInput;
@@ -0,0 +1 @@
1
+ "use strict";var _interopRequireDefault=require("@babel/runtime/helpers/interopRequireDefault");var _typeof=require("@babel/runtime/helpers/typeof");Object.defineProperty(exports,"__esModule",{value:true});exports["default"]=exports.MaskableTextInput=void 0;var _defineProperty2=_interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));var _objectWithoutProperties2=_interopRequireDefault(require("@babel/runtime/helpers/objectWithoutProperties"));var _react=_interopRequireWildcard(require("react"));var _reactNative=require("react-native");var _componentRegistry=require("../utils/componentRegistry");var _jsxRuntime=require("react/jsx-runtime");var _excluded=["maskId","shouldMask"];var _this=void 0,_jsxFileName="/Users/gegham/www/multiplayer-debugger-javascript/packages/session-recorder-react-native/dist/components/MaskableTextInput.js";function _interopRequireWildcard(e,t){if("function"==typeof WeakMap)var r=new WeakMap(),n=new WeakMap();return(_interopRequireWildcard=function _interopRequireWildcard(e,t){if(!t&&e&&e.__esModule)return e;var o,i,f={__proto__:null,"default":e};if(null===e||"object"!=_typeof(e)&&"function"!=typeof e)return f;if(o=t?n:r){if(o.has(e))return o.get(e);o.set(e,f);}for(var _t2 in e)"default"!==_t2&&{}.hasOwnProperty.call(e,_t2)&&((i=(o=Object.defineProperty)&&Object.getOwnPropertyDescriptor(e,_t2))&&(i.get||i.set)?o(f,_t2,i):f[_t2]=e[_t2]);return f;})(e,t);}function ownKeys(e,r){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);r&&(o=o.filter(function(r){return Object.getOwnPropertyDescriptor(e,r).enumerable;})),t.push.apply(t,o);}return t;}function _objectSpread(e){for(var r=1;r<arguments.length;r++){var t=null!=arguments[r]?arguments[r]:{};r%2?ownKeys(Object(t),!0).forEach(function(r){(0,_defineProperty2["default"])(e,r,t[r]);}):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(t)):ownKeys(Object(t)).forEach(function(r){Object.defineProperty(e,r,Object.getOwnPropertyDescriptor(t,r));});}return e;}var MaskableTextInput=exports.MaskableTextInput=function MaskableTextInput(_ref){var maskId=_ref.maskId,_ref$shouldMask=_ref.shouldMask,shouldMask=_ref$shouldMask===void 0?true:_ref$shouldMask,textInputProps=(0,_objectWithoutProperties2["default"])(_ref,_excluded);var textInputRef=(0,_react.useRef)(null);(0,_react.useEffect)(function(){if(shouldMask&&textInputRef.current){(0,_componentRegistry.registerTextInput)(maskId,textInputRef.current,textInputProps);}return function(){(0,_componentRegistry.unregisterComponent)(maskId);};},[maskId,shouldMask,textInputProps]);return(0,_jsxRuntime.jsx)(_reactNative.TextInput,_objectSpread({ref:textInputRef},textInputProps));};var _default=exports["default"]=MaskableTextInput;
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MaskableTextInput.js","sourceRoot":"","sources":["../../src/components/MaskableTextInput.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,OAAO,CAAA;AAChD,OAAO,EAAE,SAAS,EAAkB,MAAM,cAAc,CAAA;AACxD,OAAO,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAA;AASnF;;;GAGG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAqC,CAAC,EAAE,MAAM,EAAE,UAAU,GAAG,IAAI,EAAE,GAAG,cAAc,EAAE,EAAE,EAAE;IACtH,MAAM,YAAY,GAAG,MAAM,CAAY,IAAI,CAAC,CAAA;IAE5C,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,UAAU,IAAI,YAAY,CAAC,OAAO,EAAE,CAAC;YACvC,sCAAsC;YACtC,iBAAiB,CAAC,MAAM,EAAE,YAAY,CAAC,OAAO,EAAE,cAAc,CAAC,CAAA;QACjE,CAAC;QAED,qBAAqB;QACrB,OAAO,GAAG,EAAE;YACV,mBAAmB,CAAC,MAAM,CAAC,CAAA;QAC7B,CAAC,CAAA;IACH,CAAC,EAAE,CAAC,MAAM,EAAE,UAAU,EAAE,cAAc,CAAC,CAAC,CAAA;IAExC,OAAO,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,YAAY,CAAC,CAAC,IAAI,cAAc,CAAC,EAAG,CAAA;AAC7D,CAAC,CAAA;AAED,eAAe,iBAAiB,CAAA"}
@@ -1 +1 @@
1
- "use strict";var _interopRequireDefault=require("@babel/runtime/helpers/interopRequireDefault");var _typeof=require("@babel/runtime/helpers/typeof");Object.defineProperty(exports,"__esModule",{value:true});exports.ScreenRecorderView=void 0;var _sessionRecorderReactNative=_interopRequireDefault(require("@multiplayer-app/session-recorder-react-native"));var _react=_interopRequireWildcard(require("react"));var _reactNative=require("react-native");var _types=require("../../types");var _utils=require("../../utils");var _GestureCaptureWrapper=require("../GestureCaptureWrapper");var _jsxRuntime=require("react/jsx-runtime");var _this=void 0,_jsxFileName="/Users/gegham/www/multiplayer-debugger-javascript/packages/session-recorder-react-native/dist/components/ScreenRecorderView/ScreenRecorderView.js";function _interopRequireWildcard(e,t){if("function"==typeof WeakMap)var r=new WeakMap(),n=new WeakMap();return(_interopRequireWildcard=function _interopRequireWildcard(e,t){if(!t&&e&&e.__esModule)return e;var o,i,f={__proto__:null,"default":e};if(null===e||"object"!=_typeof(e)&&"function"!=typeof e)return f;if(o=t?n:r){if(o.has(e))return o.get(e);o.set(e,f);}for(var _t2 in e)"default"!==_t2&&{}.hasOwnProperty.call(e,_t2)&&((i=(o=Object.defineProperty)&&Object.getOwnPropertyDescriptor(e,_t2))&&(i.get||i.set)?o(f,_t2,i):f[_t2]=e[_t2]);return f;})(e,t);}var ScreenRecorderView=exports.ScreenRecorderView=function ScreenRecorderView(_ref){var children=_ref.children;var handleGestureRecord=(0,_react.useCallback)(function(gestureType,data){var _a,_b,_c,_d,_e,_f,_g;if(_sessionRecorderReactNative["default"].sessionState!==_types.SessionState.started){_utils.logger.debug('SessionRecorderContext','Gesture recording skipped',{client:!!_sessionRecorderReactNative["default"].sessionState,sessionState:_sessionRecorderReactNative["default"].sessionState});return;}_utils.logger.debug('SessionRecorderContext','Gesture recorded',{gestureType:gestureType,data:data});try{switch(gestureType){case'tap':_utils.logger.debug('SessionRecorderContext','Recording tap as touch start + end');(_a=_sessionRecorderReactNative["default"].recordTouchStart)===null||_a===void 0?void 0:_a.call(_sessionRecorderReactNative["default"],data.x,data.y,undefined,1.0);(_b=_sessionRecorderReactNative["default"].recordTouchEnd)===null||_b===void 0?void 0:_b.call(_sessionRecorderReactNative["default"],data.x,data.y,undefined,1.0);break;case'pan_start':_utils.logger.debug('SessionRecorderContext','Recording pan_start as touch start');(_c=_sessionRecorderReactNative["default"].recordTouchStart)===null||_c===void 0?void 0:_c.call(_sessionRecorderReactNative["default"],data.x,data.y,undefined,1.0);break;case'pan_update':_utils.logger.debug('SessionRecorderContext','Recording pan_update as touch move');(_d=_sessionRecorderReactNative["default"].recordTouchMove)===null||_d===void 0?void 0:_d.call(_sessionRecorderReactNative["default"],data.x,data.y,undefined,1.0);break;case'pan_end':_utils.logger.debug('SessionRecorderContext','Recording pan_end as touch end');(_e=_sessionRecorderReactNative["default"].recordTouchEnd)===null||_e===void 0?void 0:_e.call(_sessionRecorderReactNative["default"],data.x,data.y,undefined,1.0);break;case'long_press':_utils.logger.debug('SessionRecorderContext','Recording long_press as touch start + end');(_f=_sessionRecorderReactNative["default"].recordTouchStart)===null||_f===void 0?void 0:_f.call(_sessionRecorderReactNative["default"],data.x,data.y,undefined,1.0);(_g=_sessionRecorderReactNative["default"].recordTouchEnd)===null||_g===void 0?void 0:_g.call(_sessionRecorderReactNative["default"],data.x,data.y,undefined,1.0);break;default:}}catch(error){_utils.logger.error('SessionRecorderContext','Failed to record gesture event',error);}},[]);var setViewShotRef=function setViewShotRef(ref){var _a;if(ref){(_a=_sessionRecorderReactNative["default"].setViewShotRef)===null||_a===void 0?void 0:_a.call(_sessionRecorderReactNative["default"],ref);}};return(0,_jsxRuntime.jsx)(_GestureCaptureWrapper.GestureCaptureWrapper,{onGestureRecord:handleGestureRecord,children:(0,_jsxRuntime.jsx)(_reactNative.View,{ref:setViewShotRef,style:{flex:1},children:children})});};
1
+ "use strict";var _interopRequireDefault=require("@babel/runtime/helpers/interopRequireDefault");Object.defineProperty(exports,"__esModule",{value:true});exports.ScreenRecorderView=void 0;var _sessionRecorderReactNative=_interopRequireDefault(require("@multiplayer-app/session-recorder-react-native"));var _react=_interopRequireDefault(require("react"));var _reactNative=require("react-native");var _jsxRuntime=require("react/jsx-runtime");var _this=void 0,_jsxFileName="/Users/gegham/www/multiplayer-debugger-javascript/packages/session-recorder-react-native/dist/components/ScreenRecorderView/ScreenRecorderView.js";var ScreenRecorderView=exports.ScreenRecorderView=function ScreenRecorderView(_ref){var children=_ref.children;var setViewShotRef=function setViewShotRef(ref){var _a;if(ref){(_a=_sessionRecorderReactNative["default"].setViewShotRef)===null||_a===void 0?void 0:_a.call(_sessionRecorderReactNative["default"],ref);}};return(0,_jsxRuntime.jsx)(_reactNative.View,{ref:setViewShotRef,style:{flex:1},children:children});};
@@ -1 +1 @@
1
- {"version":3,"file":"ScreenRecorderView.js","sourceRoot":"","sources":["../../../src/components/ScreenRecorderView/ScreenRecorderView.tsx"],"names":[],"mappings":"AAAA,OAAO,eAAe,MAAM,gDAAgD,CAAA;AAC5E,OAAO,KAAK,EAAE,EAAqB,WAAW,EAAE,MAAM,OAAO,CAAA;AAC7D,OAAO,EAAE,IAAI,EAAE,MAAM,cAAc,CAAA;AACnC,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAC1C,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AACpC,OAAO,EAAE,qBAAqB,EAAE,MAAM,0BAA0B,CAAA;AAIhE,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,EAAE,QAAQ,EAA2B,EAAE,EAAE;IAC1E,oCAAoC;IACpC,MAAM,mBAAmB,GAAG,WAAW,CAAC,CAAC,WAAmB,EAAE,IAAS,EAAE,EAAE;;QACzE,IAAI,eAAe,CAAC,YAAY,KAAK,YAAY,CAAC,OAAO,EAAE,CAAC;YAC1D,MAAM,CAAC,KAAK,CAAC,wBAAwB,EAAE,2BAA2B,EAAE;gBAClE,MAAM,EAAE,CAAC,CAAC,eAAe,CAAC,YAAY;gBACtC,YAAY,EAAE,eAAe,CAAC,YAAY;aAC3C,CAAC,CAAA;YACF,OAAM;QACR,CAAC;QACD,MAAM,CAAC,KAAK,CAAC,wBAAwB,EAAE,kBAAkB,EAAE,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC,CAAA;QACjF,IAAI,CAAC;YACH,6CAA6C;YAC7C,QAAQ,WAAW,EAAE,CAAC;gBACpB,KAAK,KAAK;oBACR,2CAA2C;oBAC3C,MAAM,CAAC,KAAK,CAAC,wBAAwB,EAAE,oCAAoC,CAAC,CAAA;oBAC5E,MAAA,eAAe,CAAC,gBAAgB,gEAAG,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,EAAE,SAAS,EAAE,GAAG,CAAC,CAAA;oBAClE,MAAA,eAAe,CAAC,cAAc,gEAAG,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,EAAE,SAAS,EAAE,GAAG,CAAC,CAAA;oBAChE,MAAK;gBAEP,KAAK,WAAW;oBACd,MAAM,CAAC,KAAK,CAAC,wBAAwB,EAAE,oCAAoC,CAAC,CAAA;oBAC5E,MAAA,eAAe,CAAC,gBAAgB,gEAAG,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,EAAE,SAAS,EAAE,GAAG,CAAC,CAAA;oBAClE,MAAK;gBAEP,KAAK,YAAY;oBACf,MAAM,CAAC,KAAK,CAAC,wBAAwB,EAAE,oCAAoC,CAAC,CAAA;oBAC5E,MAAA,eAAe,CAAC,eAAe,gEAAG,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,EAAE,SAAS,EAAE,GAAG,CAAC,CAAA;oBACjE,MAAK;gBAEP,KAAK,SAAS;oBACZ,MAAM,CAAC,KAAK,CAAC,wBAAwB,EAAE,gCAAgC,CAAC,CAAA;oBACxE,MAAA,eAAe,CAAC,cAAc,gEAAG,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,EAAE,SAAS,EAAE,GAAG,CAAC,CAAA;oBAChE,MAAK;gBAEP,KAAK,YAAY;oBACf,MAAM,CAAC,KAAK,CAAC,wBAAwB,EAAE,2CAA2C,CAAC,CAAA;oBACnF,MAAA,eAAe,CAAC,gBAAgB,gEAAG,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,EAAE,SAAS,EAAE,GAAG,CAAC,CAAA;oBAClE,MAAA,eAAe,CAAC,cAAc,gEAAG,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,EAAE,SAAS,EAAE,GAAG,CAAC,CAAA;oBAChE,MAAK;gBACP,QAAQ;YACV,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,CAAC,KAAK,CAAC,wBAAwB,EAAE,gCAAgC,EAAE,KAAK,CAAC,CAAA;QACjF,CAAC;IACH,CAAC,EAAE,EAAE,CAAC,CAAA;IAEN,kEAAkE;IAClE,MAAM,cAAc,GAAG,CAAC,GAAgB,EAAE,EAAE;;QAC1C,IAAI,GAAG,EAAE,CAAC;YACR,MAAA,eAAe,CAAC,cAAc,gEAAG,GAAG,CAAC,CAAA;QACvC,CAAC;IACH,CAAC,CAAA;IAED,OAAO,CACL,CAAC,qBAAqB,CAAC,eAAe,CAAC,CAAC,mBAAmB,CAAC,CAC1D;MAAA,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,cAAc,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC,CAC5C;QAAA,CAAC,QAAQ,CACX;MAAA,EAAE,IAAI,CACR;IAAA,EAAE,qBAAqB,CAAC,CACzB,CAAA;AACH,CAAC,CAAA"}
1
+ {"version":3,"file":"ScreenRecorderView.js","sourceRoot":"","sources":["../../../src/components/ScreenRecorderView/ScreenRecorderView.tsx"],"names":[],"mappings":"AAAA,OAAO,eAAe,MAAM,gDAAgD,CAAA;AAC5E,OAAO,KAA4B,MAAM,OAAO,CAAA;AAChD,OAAO,EAAE,IAAI,EAAE,MAAM,cAAc,CAAA;AAInC,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,EAAE,QAAQ,EAA2B,EAAE,EAAE;IAC1E,kEAAkE;IAClE,MAAM,cAAc,GAAG,CAAC,GAAgB,EAAE,EAAE;;QAC1C,IAAI,GAAG,EAAE,CAAC;YACR,MAAA,eAAe,CAAC,cAAc,gEAAG,GAAG,CAAC,CAAA;QACvC,CAAC;IACH,CAAC,CAAA;IAED,OAAO,CACL,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,cAAc,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC,CAC5C;MAAA,CAAC,QAAQ,CACX;IAAA,EAAE,IAAI,CAAC,CACR,CAAA;AACH,CAAC,CAAA"}
@@ -0,0 +1,11 @@
1
+ import React from 'react';
2
+ import { TextOverridesOptions } from '../../types';
3
+ interface FinalPopoverProps {
4
+ textOverrides: TextOverridesOptions;
5
+ onStopRecording: (comment: string) => void;
6
+ onCancelSession: () => void;
7
+ onClose: () => void;
8
+ isSubmitting: boolean;
9
+ }
10
+ declare const FinalPopover: React.FC<FinalPopoverProps>;
11
+ export default FinalPopover;
@@ -0,0 +1 @@
1
+ "use strict";var _interopRequireDefault=require("@babel/runtime/helpers/interopRequireDefault");var _typeof=require("@babel/runtime/helpers/typeof");Object.defineProperty(exports,"__esModule",{value:true});exports["default"]=void 0;var _regenerator=_interopRequireDefault(require("@babel/runtime/regenerator"));var _asyncToGenerator2=_interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));var _slicedToArray2=_interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));var _react=_interopRequireWildcard(require("react"));var _reactNative=require("react-native");var _styles=require("./styles");var _ModalHeader=_interopRequireDefault(require("./ModalHeader"));var _jsxRuntime=require("react/jsx-runtime");var _this=void 0,_jsxFileName="/Users/gegham/www/multiplayer-debugger-javascript/packages/session-recorder-react-native/dist/components/SessionRecorderWidget/FinalPopover.js";function _interopRequireWildcard(e,t){if("function"==typeof WeakMap)var r=new WeakMap(),n=new WeakMap();return(_interopRequireWildcard=function _interopRequireWildcard(e,t){if(!t&&e&&e.__esModule)return e;var o,i,f={__proto__:null,"default":e};if(null===e||"object"!=_typeof(e)&&"function"!=typeof e)return f;if(o=t?n:r){if(o.has(e))return o.get(e);o.set(e,f);}for(var _t3 in e)"default"!==_t3&&{}.hasOwnProperty.call(e,_t3)&&((i=(o=Object.defineProperty)&&Object.getOwnPropertyDescriptor(e,_t3))&&(i.get||i.set)?o(f,_t3,i):f[_t3]=e[_t3]);return f;})(e,t);}var FinalPopover=function FinalPopover(_ref){var textOverrides=_ref.textOverrides,onStopRecording=_ref.onStopRecording,onCancelSession=_ref.onCancelSession,isSubmitting=_ref.isSubmitting;var _useState=(0,_react.useState)(''),_useState2=(0,_slicedToArray2["default"])(_useState,2),comment=_useState2[0],setComment=_useState2[1];var handleStopRecording=function(){var _ref2=(0,_asyncToGenerator2["default"])(_regenerator["default"].mark(function _callee(){var _t;return _regenerator["default"].wrap(function(_context){while(1)switch(_context.prev=_context.next){case 0:_context.prev=0;_context.next=1;return onStopRecording(comment);case 1:_context.next=3;break;case 2:_context.prev=2;_t=_context["catch"](0);_reactNative.Alert.alert('Error','Failed to save session');case 3:case"end":return _context.stop();}},_callee,null,[[0,2]]);}));return function handleStopRecording(){return _ref2.apply(this,arguments);};}();return(0,_jsxRuntime.jsxs)(_reactNative.View,{style:_styles.sharedStyles.popoverContent,children:[(0,_jsxRuntime.jsx)(_ModalHeader["default"],{children:(0,_jsxRuntime.jsx)(_reactNative.Pressable,{onPress:onCancelSession,style:_styles.sharedStyles.cancelButton,children:(0,_jsxRuntime.jsx)(_reactNative.Text,{style:_styles.sharedStyles.cancelButtonText,children:textOverrides.cancelButtonText})})}),(0,_jsxRuntime.jsxs)(_reactNative.ScrollView,{style:_styles.sharedStyles.popoverBody,keyboardShouldPersistTaps:"handled",contentInsetAdjustmentBehavior:"automatic",children:[(0,_jsxRuntime.jsx)(_reactNative.Text,{style:_styles.sharedStyles.title,children:textOverrides.finalTitle}),(0,_jsxRuntime.jsx)(_reactNative.Text,{style:_styles.sharedStyles.description,children:textOverrides.finalDescription}),(0,_jsxRuntime.jsx)(_reactNative.TextInput,{style:_styles.sharedStyles.commentInput,placeholder:textOverrides.commentPlaceholder,value:comment,onChangeText:setComment,multiline:true,numberOfLines:3,textAlignVertical:"top",returnKeyType:"done",blurOnSubmit:true,onSubmitEditing:function onSubmitEditing(){return _reactNative.Keyboard.dismiss();}}),(0,_jsxRuntime.jsx)(_reactNative.View,{style:_styles.sharedStyles.popoverFooter,children:(0,_jsxRuntime.jsx)(_reactNative.Pressable,{style:[_styles.sharedStyles.actionButton,_styles.sharedStyles.stopButton],onPress:handleStopRecording,disabled:isSubmitting,children:(0,_jsxRuntime.jsx)(_reactNative.Text,{style:_styles.sharedStyles.actionButtonText,children:isSubmitting?'Saving...':textOverrides.saveButtonText})})})]})]});};var _default=exports["default"]=FinalPopover;
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FinalPopover.js","sourceRoot":"","sources":["../../../src/components/SessionRecorderWidget/FinalPopover.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAA;AACvC,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,SAAS,EAAE,SAAS,EAAE,KAAK,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAA;AAE5F,OAAO,EAAE,YAAY,EAAE,MAAM,UAAU,CAAA;AACvC,OAAO,WAAW,MAAM,eAAe,CAAA;AAUvC,MAAM,YAAY,GAAgC,CAAC,EAAE,aAAa,EAAE,eAAe,EAAE,eAAe,EAAE,YAAY,EAAE,EAAE,EAAE;IACtH,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,QAAQ,CAAC,EAAE,CAAC,CAAA;IAE1C,MAAM,mBAAmB,GAAG,KAAK,IAAI,EAAE;QACrC,IAAI,CAAC;YACH,MAAM,eAAe,CAAC,OAAO,CAAC,CAAA;QAChC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,KAAK,CAAC,KAAK,CAAC,OAAO,EAAE,wBAAwB,CAAC,CAAA;QAChD,CAAC;IACH,CAAC,CAAA;IAED,OAAO,CACL,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,YAAY,CAAC,cAAc,CAAC,CACvC;MAAA,CAAC,WAAW,CACV;QAAA,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,eAAe,CAAC,CAAC,KAAK,CAAC,CAAC,YAAY,CAAC,YAAY,CAAC,CACpE;UAAA,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,YAAY,CAAC,gBAAgB,CAAC,CAAC,CAAC,aAAa,CAAC,gBAAgB,CAAC,EAAE,IAAI,CACpF;QAAA,EAAE,SAAS,CACb;MAAA,EAAE,WAAW,CAEb;;MAAA,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,YAAY,CAAC,WAAW,CAAC,CAAC,yBAAyB,CAAC,SAAS,CAAC,8BAA8B,CAAC,WAAW,CACzH;QAAA,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC,aAAa,CAAC,UAAU,CAAC,EAAE,IAAI,CACjE;QAAA,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,YAAY,CAAC,WAAW,CAAC,CAAC,CAAC,aAAa,CAAC,gBAAgB,CAAC,EAAE,IAAI,CAE7E;;QAAA,CAAC,SAAS,CACR,KAAK,CAAC,CAAC,YAAY,CAAC,YAAY,CAAC,CACjC,WAAW,CAAC,CAAC,aAAa,CAAC,kBAAkB,CAAC,CAC9C,KAAK,CAAC,CAAC,OAAO,CAAC,CACf,YAAY,CAAC,CAAC,UAAU,CAAC,CACzB,SAAS,CACT,aAAa,CAAC,CAAC,CAAC,CAAC,CACjB,iBAAiB,CAAC,KAAK,CACvB,aAAa,CAAC,MAAM,CACpB,YAAY,CACZ,eAAe,CAAC,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC,EAG5C;;QAAA,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,YAAY,CAAC,aAAa,CAAC,CACtC;UAAA,CAAC,SAAS,CACR,KAAK,CAAC,CAAC,CAAC,YAAY,CAAC,YAAY,EAAE,YAAY,CAAC,UAAU,CAAC,CAAC,CAC5D,OAAO,CAAC,CAAC,mBAAmB,CAAC,CAC7B,QAAQ,CAAC,CAAC,YAAY,CAAC,CAEvB;YAAA,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,YAAY,CAAC,gBAAgB,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,aAAa,CAAC,cAAc,CAAC,EAAE,IAAI,CAC/G;UAAA,EAAE,SAAS,CACb;QAAA,EAAE,IAAI,CACR;MAAA,EAAE,UAAU,CACd;IAAA,EAAE,IAAI,CAAC,CACR,CAAA;AACH,CAAC,CAAA;AAED,eAAe,YAAY,CAAA"}
@@ -0,0 +1,8 @@
1
+ import React from 'react';
2
+ import { SessionState } from '../../types';
3
+ interface FloatingButtonProps {
4
+ sessionState: SessionState | null;
5
+ onPress: () => void;
6
+ }
7
+ declare const FloatingButton: React.FC<FloatingButtonProps>;
8
+ export default FloatingButton;
@@ -0,0 +1 @@
1
+ "use strict";var _interopRequireDefault=require("@babel/runtime/helpers/interopRequireDefault");var _typeof=require("@babel/runtime/helpers/typeof");Object.defineProperty(exports,"__esModule",{value:true});exports["default"]=void 0;var _defineProperty2=_interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));var _react=_interopRequireWildcard(require("react"));var _reactNative=require("react-native");var _types=require("../../types");var _storage=require("../../services/storage.service");var _icons=require("./icons");var _jsxRuntime=require("react/jsx-runtime");var _this=void 0,_jsxFileName="/Users/gegham/www/multiplayer-debugger-javascript/packages/session-recorder-react-native/dist/components/SessionRecorderWidget/FloatingButton.js";function _interopRequireWildcard(e,t){if("function"==typeof WeakMap)var r=new WeakMap(),n=new WeakMap();return(_interopRequireWildcard=function _interopRequireWildcard(e,t){if(!t&&e&&e.__esModule)return e;var o,i,f={__proto__:null,"default":e};if(null===e||"object"!=_typeof(e)&&"function"!=typeof e)return f;if(o=t?n:r){if(o.has(e))return o.get(e);o.set(e,f);}for(var _t2 in e)"default"!==_t2&&{}.hasOwnProperty.call(e,_t2)&&((i=(o=Object.defineProperty)&&Object.getOwnPropertyDescriptor(e,_t2))&&(i.get||i.set)?o(f,_t2,i):f[_t2]=e[_t2]);return f;})(e,t);}function ownKeys(e,r){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);r&&(o=o.filter(function(r){return Object.getOwnPropertyDescriptor(e,r).enumerable;})),t.push.apply(t,o);}return t;}function _objectSpread(e){for(var r=1;r<arguments.length;r++){var t=null!=arguments[r]?arguments[r]:{};r%2?ownKeys(Object(t),!0).forEach(function(r){(0,_defineProperty2["default"])(e,r,t[r]);}):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(t)):ownKeys(Object(t)).forEach(function(r){Object.defineProperty(e,r,Object.getOwnPropertyDescriptor(t,r));});}return e;}var buttonSize=52;var rightOffset=20;var topOffset=_reactNative.Platform.OS==='ios'?60:40;var FloatingButton=function FloatingButton(_ref){var sessionState=_ref.sessionState,onPress=_ref.onPress;var position=(0,_react.useRef)(new _reactNative.Animated.ValueXY({x:0,y:0})).current;var lastPosition=(0,_react.useRef)({top:topOffset,right:rightOffset});var storageService=(0,_react.useRef)(_storage.StorageService.getInstance()).current;var screenBounds=(0,_react.useMemo)(function(){var _Dimensions$get=_reactNative.Dimensions.get('window'),width=_Dimensions$get.width,height=_Dimensions$get.height;return{minTop:topOffset,maxTop:height-buttonSize,minRight:0,maxRight:width-buttonSize};},[]);(0,_react.useEffect)(function(){var savedPosition=storageService.getFloatingButtonPosition();if(savedPosition){var _Dimensions$get2=_reactNative.Dimensions.get('window'),width=_Dimensions$get2.width;var top=savedPosition.y;var right=width-savedPosition.x-buttonSize;lastPosition.current={top:top,right:right};position.setValue({x:right,y:top});}else{position.setValue({x:lastPosition.current.right,y:lastPosition.current.top});}},[]);var panResponder=(0,_react.useRef)(_reactNative.PanResponder.create({onStartShouldSetPanResponder:function onStartShouldSetPanResponder(){return true;},onMoveShouldSetPanResponder:function onMoveShouldSetPanResponder(evt,gestureState){var distance=Math.sqrt(gestureState.dx*gestureState.dx+gestureState.dy*gestureState.dy);return distance>5;},onPanResponderGrant:function onPanResponderGrant(){position.setValue({x:lastPosition.current.right,y:lastPosition.current.top});},onPanResponderMove:function onPanResponderMove(evt,gestureState){var newTop=lastPosition.current.top+gestureState.dy;var newRight=lastPosition.current.right-gestureState.dx;position.setValue({x:newRight,y:newTop});},onPanResponderRelease:function onPanResponderRelease(e,gestureState){var distance=Math.sqrt(gestureState.dx*gestureState.dx+gestureState.dy*gestureState.dy);if(distance<=5){onPress();}else{var newTop=lastPosition.current.top+gestureState.dy;var newRight=lastPosition.current.right-gestureState.dx;var clampedTop=Math.max(screenBounds.minTop,Math.min(screenBounds.maxTop,newTop));var clampedRight=Math.max(screenBounds.minRight,Math.min(screenBounds.maxRight,newRight));lastPosition.current={top:clampedTop,right:clampedRight};position.setValue({x:clampedRight,y:clampedTop});var _Dimensions$get3=_reactNative.Dimensions.get('window'),width=_Dimensions$get3.width;var storagePosition={x:width-clampedRight-buttonSize,y:clampedTop};storageService.saveFloatingButtonPosition(storagePosition);}}})).current;var content=(0,_react.useMemo)(function(){switch(sessionState){case _types.SessionState.started:return{icon:(0,_jsxRuntime.jsx)(_icons.CapturingIcon,{size:28,color:"white"}),color:'#FF4444'};case _types.SessionState.paused:return{icon:(0,_jsxRuntime.jsx)(_icons.PausedIcon,{size:28,color:"white"}),color:'#FFA500'};default:return{icon:(0,_jsxRuntime.jsx)(_icons.RecordIcon,{size:28,color:"#718096"}),color:'#ffffff'};}},[sessionState]);return(0,_jsxRuntime.jsx)(_reactNative.Animated.View,_objectSpread(_objectSpread({style:[styles.draggableButton,{top:position.y,right:position.x}]},panResponder.panHandlers),{},{children:(0,_jsxRuntime.jsx)(_reactNative.View,{style:[styles.floatingButton,{backgroundColor:content.color}],children:content.icon})}));};var styles=_reactNative.StyleSheet.create({draggableButton:{position:'absolute'},floatingButton:{elevation:8,shadowRadius:4,width:buttonSize,shadowColor:'#000',height:buttonSize,shadowOpacity:0.25,alignItems:'center',justifyContent:'center',borderRadius:buttonSize/2,shadowOffset:{width:0,height:2}}});var _default=exports["default"]=FloatingButton;
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FloatingButton.js","sourceRoot":"","sources":["../../../src/components/SessionRecorderWidget/FloatingButton.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ import React from 'react';
2
+ import { SessionType } from '@multiplayer-app/session-recorder-common';
3
+ import { TextOverridesOptions } from '../../types';
4
+ interface InitialPopoverProps {
5
+ isContinuous: boolean;
6
+ showContinuousRecording: boolean;
7
+ textOverrides: TextOverridesOptions;
8
+ onStartRecording: (sessionType: SessionType) => void;
9
+ onStopRecording: (comment?: string) => void;
10
+ onSaveContinuousSession: () => void;
11
+ onClose: () => void;
12
+ isSubmitting: boolean;
13
+ }
14
+ declare const InitialPopover: React.FC<InitialPopoverProps>;
15
+ export default InitialPopover;