@multiplayer-app/session-recorder-react-native 0.0.1-beta.2 → 0.0.1-beta.20
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +170 -12
- package/SessionRecorderNative.podspec +29 -0
- package/android/build.gradle +34 -0
- package/copy-react-native-dist.sh +34 -16
- package/dist/components/GestureCaptureWrapper/GestureCaptureWrapper.d.ts +1 -0
- package/dist/components/GestureCaptureWrapper/GestureCaptureWrapper.js +1 -1
- package/dist/components/GestureCaptureWrapper/GestureCaptureWrapper.js.map +1 -1
- package/dist/components/MaskableComponent.d.ts +22 -0
- package/dist/components/MaskableComponent.js +1 -0
- package/dist/components/MaskableComponent.js.map +1 -0
- package/dist/components/MaskableTextInput.d.ts +14 -0
- package/dist/components/MaskableTextInput.js +1 -0
- package/dist/components/MaskableTextInput.js.map +1 -0
- package/dist/components/ScreenRecorderView/ScreenRecorderView.js +1 -1
- package/dist/components/ScreenRecorderView/ScreenRecorderView.js.map +1 -1
- package/dist/components/SessionRecorderWidget/FinalPopover.d.ts +11 -0
- package/dist/components/SessionRecorderWidget/FinalPopover.js +1 -0
- package/dist/components/SessionRecorderWidget/FinalPopover.js.map +1 -0
- package/dist/components/SessionRecorderWidget/FloatingButton.d.ts +8 -0
- package/dist/components/SessionRecorderWidget/FloatingButton.js +1 -0
- package/dist/components/SessionRecorderWidget/FloatingButton.js.map +1 -0
- package/dist/components/SessionRecorderWidget/InitialPopover.d.ts +15 -0
- package/dist/components/SessionRecorderWidget/InitialPopover.js +1 -0
- package/dist/components/SessionRecorderWidget/InitialPopover.js.map +1 -0
- package/dist/components/SessionRecorderWidget/ModalContainer.d.ts +8 -0
- package/dist/components/SessionRecorderWidget/ModalContainer.js +1 -0
- package/dist/components/SessionRecorderWidget/ModalContainer.js.map +1 -0
- package/dist/components/SessionRecorderWidget/ModalHeader.d.ts +6 -0
- package/dist/components/SessionRecorderWidget/ModalHeader.js +1 -0
- package/dist/components/SessionRecorderWidget/ModalHeader.js.map +1 -0
- package/dist/components/SessionRecorderWidget/SessionRecorderWidget.d.ts +5 -0
- package/dist/components/SessionRecorderWidget/SessionRecorderWidget.js +1 -0
- package/dist/components/SessionRecorderWidget/SessionRecorderWidget.js.map +1 -0
- package/dist/components/SessionRecorderWidget/icons.d.ts +11 -0
- package/dist/components/SessionRecorderWidget/icons.js +1 -0
- package/dist/components/SessionRecorderWidget/icons.js.map +1 -0
- package/dist/components/SessionRecorderWidget/index.d.ts +2 -0
- package/dist/components/SessionRecorderWidget/index.js +1 -0
- package/dist/components/SessionRecorderWidget/index.js.map +1 -0
- package/dist/components/SessionRecorderWidget/styles.d.ts +165 -0
- package/dist/components/SessionRecorderWidget/styles.js +1 -0
- package/dist/components/SessionRecorderWidget/styles.js.map +1 -0
- package/dist/components/index.d.ts +2 -1
- package/dist/components/index.js +1 -1
- package/dist/components/index.js.map +1 -1
- package/dist/config/defaults.d.ts +4 -4
- package/dist/config/defaults.js +1 -1
- package/dist/config/defaults.js.map +1 -1
- package/dist/config/masking.d.ts +2 -2
- package/dist/config/masking.js +1 -1
- package/dist/config/masking.js.map +1 -1
- package/dist/config/session-recorder.js +1 -1
- package/dist/config/session-recorder.js.map +1 -1
- package/dist/config/validators.d.ts +1 -1
- package/dist/config/validators.js +1 -1
- package/dist/config/validators.js.map +1 -1
- package/dist/config/widget.d.ts +9 -0
- package/dist/config/widget.js +1 -0
- package/dist/config/widget.js.map +1 -0
- package/dist/context/SessionRecorderContext.d.ts +12 -3
- package/dist/context/SessionRecorderContext.js +1 -1
- package/dist/context/SessionRecorderContext.js.map +1 -1
- package/dist/context/SessionRecorderStore.d.ts +10 -0
- package/dist/context/SessionRecorderStore.js +1 -0
- package/dist/context/SessionRecorderStore.js.map +1 -0
- package/dist/context/useSessionRecorderStore.d.ts +8 -0
- package/dist/context/useSessionRecorderStore.js +1 -0
- package/dist/context/useSessionRecorderStore.js.map +1 -0
- package/dist/context/useStoreSelector.d.ts +4 -0
- package/dist/context/useStoreSelector.js +1 -0
- package/dist/context/useStoreSelector.js.map +1 -0
- package/dist/index.d.ts +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/native/GestureRecorderNative.d.ts +57 -0
- package/dist/native/GestureRecorderNative.js +1 -0
- package/dist/native/GestureRecorderNative.js.map +1 -0
- package/dist/native/ScreenMasking.d.ts +21 -0
- package/dist/native/ScreenMasking.js +1 -0
- package/dist/native/ScreenMasking.js.map +1 -0
- package/dist/native/SessionRecorderNative.d.ts +33 -0
- package/dist/native/SessionRecorderNative.js +1 -0
- package/dist/native/SessionRecorderNative.js.map +1 -0
- package/dist/native/index.d.ts +2 -0
- package/dist/native/index.js +1 -0
- package/dist/native/index.js.map +1 -0
- package/dist/otel/index.js +1 -1
- package/dist/otel/index.js.map +1 -1
- package/dist/patch/xhr.js +1 -1
- package/dist/patch/xhr.js.map +1 -1
- package/dist/recorder/eventExporter.d.ts +4 -1
- package/dist/recorder/eventExporter.js +1 -1
- package/dist/recorder/eventExporter.js.map +1 -1
- package/dist/recorder/gestureRecorder.d.ts +28 -62
- package/dist/recorder/gestureRecorder.js +1 -1
- package/dist/recorder/gestureRecorder.js.map +1 -1
- package/dist/recorder/index.d.ts +2 -0
- package/dist/recorder/index.js +1 -1
- package/dist/recorder/index.js.map +1 -1
- package/dist/recorder/navigationTracker.d.ts +4 -19
- package/dist/recorder/navigationTracker.js +1 -1
- package/dist/recorder/navigationTracker.js.map +1 -1
- package/dist/recorder/screenRecorder.d.ts +11 -5
- package/dist/recorder/screenRecorder.js +1 -1
- package/dist/recorder/screenRecorder.js.map +1 -1
- package/dist/recorder/screenshotManager.d.ts +10 -0
- package/dist/recorder/screenshotManager.js +1 -0
- package/dist/recorder/screenshotManager.js.map +1 -0
- package/dist/services/api.service.d.ts +12 -3
- package/dist/services/api.service.js +1 -1
- package/dist/services/api.service.js.map +1 -1
- package/dist/services/screenMaskingService.d.ts +47 -0
- package/dist/services/screenMaskingService.js +1 -0
- package/dist/services/screenMaskingService.js.map +1 -0
- package/dist/services/storage.service.d.ts +18 -2
- package/dist/services/storage.service.js +1 -1
- package/dist/services/storage.service.js.map +1 -1
- package/dist/session-recorder.d.ts +10 -34
- package/dist/session-recorder.js +1 -1
- package/dist/session-recorder.js.map +1 -1
- package/dist/types/configs.d.ts +85 -0
- package/dist/types/configs.js +1 -0
- package/dist/types/configs.js.map +1 -0
- package/dist/types/index.d.ts +1 -0
- package/dist/types/index.js +1 -1
- package/dist/types/index.js.map +1 -1
- package/dist/types/session-recorder.d.ts +96 -132
- package/dist/types/session-recorder.js +1 -1
- package/dist/types/session-recorder.js.map +1 -1
- package/dist/utils/componentRegistry.d.ts +64 -0
- package/dist/utils/componentRegistry.js +1 -0
- package/dist/utils/componentRegistry.js.map +1 -0
- package/dist/utils/constants.optional.d.ts +21 -0
- package/dist/utils/constants.optional.expo.d.ts +3 -0
- package/dist/utils/constants.optional.expo.js +1 -0
- package/dist/utils/constants.optional.expo.js.map +1 -0
- package/dist/utils/constants.optional.js +1 -0
- package/dist/utils/constants.optional.js.map +1 -0
- package/dist/utils/createStore.d.ts +8 -0
- package/dist/utils/createStore.js +1 -0
- package/dist/utils/createStore.js.map +1 -0
- package/dist/utils/logger.d.ts +1 -1
- package/dist/utils/logger.js +1 -1
- package/dist/utils/logger.js.map +1 -1
- package/dist/utils/nativeModuleTest.d.ts +8 -0
- package/dist/utils/nativeModuleTest.js +1 -0
- package/dist/utils/nativeModuleTest.js.map +1 -0
- package/dist/utils/platform.d.ts +11 -0
- package/dist/utils/platform.js +1 -1
- package/dist/utils/platform.js.map +1 -1
- package/dist/utils/reactNativeHierarchyExtractor.d.ts +38 -0
- package/dist/utils/reactNativeHierarchyExtractor.js +1 -0
- package/dist/utils/reactNativeHierarchyExtractor.js.map +1 -0
- package/dist/utils/rrweb-events.d.ts +4 -3
- package/dist/utils/rrweb-events.js +1 -1
- package/dist/utils/rrweb-events.js.map +1 -1
- package/dist/utils/screenshotMasker.d.ts +96 -0
- package/dist/utils/screenshotMasker.js +1 -0
- package/dist/utils/screenshotMasker.js.map +1 -0
- package/dist/utils/session.d.ts +2 -1
- package/dist/utils/session.js +1 -1
- package/dist/utils/session.js.map +1 -1
- package/dist/utils/shallowEqual.d.ts +1 -0
- package/dist/utils/shallowEqual.js +1 -0
- package/dist/utils/shallowEqual.js.map +1 -0
- package/dist/utils/viewHierarchyTracker.d.ts +89 -0
- package/dist/utils/viewHierarchyTracker.js +1 -0
- package/dist/utils/viewHierarchyTracker.js.map +1 -0
- package/ios/GestureRecorderNative.m +21 -0
- package/ios/GestureRecorderNative.swift +316 -0
- package/ios/SessionRecorderNative.m +17 -0
- package/ios/SessionRecorderNative.podspec +26 -0
- package/ios/SessionRecorderNative.swift +599 -0
- package/package.json +13 -12
- package/react-native.config.js +12 -0
- package/RRWEB_INTEGRATION.md +0 -336
- package/VIEWSHOT_INTEGRATION_TEST.md +0 -123
- package/babel.config.js +0 -13
- package/dist/components/GestureCaptureWrapper.d.ts +0 -6
- package/dist/components/GestureCaptureWrapper.js +0 -1
- package/dist/components/GestureCaptureWrapper.js.map +0 -1
- package/dist/expo.d.ts +0 -7
- package/dist/expo.js +0 -1
- package/dist/expo.js.map +0 -1
- package/dist/otel/instrumentations/gestureInstrumentation.d.ts +0 -15
- package/dist/otel/instrumentations/gestureInstrumentation.js +0 -1
- package/dist/otel/instrumentations/gestureInstrumentation.js.map +0 -1
- package/dist/otel/instrumentations/reactNativeInstrumentation.d.ts +0 -8
- package/dist/otel/instrumentations/reactNativeInstrumentation.js +0 -1
- package/dist/otel/instrumentations/reactNativeInstrumentation.js.map +0 -1
- package/dist/otel/instrumentations/reactNavigationInstrumentation.d.ts +0 -13
- package/dist/otel/instrumentations/reactNavigationInstrumentation.js +0 -1
- package/dist/otel/instrumentations/reactNavigationInstrumentation.js.map +0 -1
- package/dist/recorder/gestureHandlerRecorder.d.ts +0 -19
- package/dist/recorder/gestureHandlerRecorder.js +0 -1
- package/dist/recorder/gestureHandlerRecorder.js.map +0 -1
- package/dist/types/rrweb.d.ts +0 -118
- package/dist/types/rrweb.js +0 -1
- package/dist/types/rrweb.js.map +0 -1
- package/scripts/generate-app-metadata.js +0 -173
- package/src/components/GestureCaptureWrapper/GestureCaptureWrapper.tsx +0 -86
- package/src/components/GestureCaptureWrapper/index.ts +0 -1
- package/src/components/ScreenRecorderView/ScreenRecorderView.tsx +0 -72
- package/src/components/ScreenRecorderView/index.ts +0 -1
- package/src/components/index.ts +0 -1
- package/src/config/constants.ts +0 -60
- package/src/config/defaults.ts +0 -82
- package/src/config/index.ts +0 -6
- package/src/config/masking.ts +0 -27
- package/src/config/session-recorder.ts +0 -55
- package/src/config/validators.ts +0 -31
- package/src/context/SessionRecorderContext.tsx +0 -75
- package/src/expo.ts +0 -11
- package/src/index.ts +0 -17
- package/src/otel/helpers.ts +0 -275
- package/src/otel/index.ts +0 -138
- package/src/otel/instrumentations/index.ts +0 -115
- package/src/patch/index.ts +0 -1
- package/src/patch/xhr.ts +0 -142
- package/src/recorder/eventExporter.ts +0 -141
- package/src/recorder/gestureRecorder.ts +0 -498
- package/src/recorder/index.ts +0 -179
- package/src/recorder/navigationTracker.ts +0 -449
- package/src/recorder/screenRecorder.ts +0 -498
- package/src/services/api.service.ts +0 -203
- package/src/services/storage.service.ts +0 -158
- package/src/session-recorder.ts +0 -600
- package/src/types/expo.d.ts +0 -23
- package/src/types/index.ts +0 -28
- package/src/types/session-recorder.ts +0 -423
- package/src/types/session.ts +0 -65
- package/src/utils/app-metadata.ts +0 -31
- package/src/utils/index.ts +0 -8
- package/src/utils/logger.ts +0 -225
- package/src/utils/platform.ts +0 -384
- package/src/utils/request-utils.ts +0 -61
- package/src/utils/rrweb-events.ts +0 -309
- package/src/utils/session.ts +0 -18
- package/src/utils/time.ts +0 -17
- package/src/utils/type-utils.ts +0 -75
- package/src/version.ts +0 -1
- 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
|
-
**
|
|
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
|
-
|
|
25
|
+
#### Bare React Native projects
|
|
26
26
|
|
|
27
|
-
|
|
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 @
|
|
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
|
-
|
|
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
|
-
###
|
|
109
|
+
### Navigation integration
|
|
79
110
|
|
|
80
|
-
|
|
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**:
|
|
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,29 @@
|
|
|
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
|
+
|
|
21
|
+
# Swift support
|
|
22
|
+
s.swift_version = "5.0"
|
|
23
|
+
|
|
24
|
+
# Ensure proper linking for React Native
|
|
25
|
+
s.pod_target_xcconfig = {
|
|
26
|
+
"DEFINES_MODULE" => "YES",
|
|
27
|
+
"SWIFT_OPTIMIZATION_LEVEL" => "-Onone"
|
|
28
|
+
}
|
|
29
|
+
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
|
-
|
|
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 "$
|
|
21
|
-
echo "
|
|
22
|
-
echo "💡
|
|
23
|
-
exit
|
|
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
|
-
#
|
|
27
|
-
if [ -d "$
|
|
28
|
-
echo "
|
|
29
|
-
|
|
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
|
|
33
|
-
echo "🔄 Copying dist folder..."
|
|
34
|
-
cp -r "$SOURCE_DIR" "$
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
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
|
|
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;
|
|
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");
|
|
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,
|
|
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":"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"}
|
|
@@ -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;
|