@multiplayer-app/session-recorder-react-native 1.0.1-beta.3 → 1.0.1-beta.5
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/LICENSE +1 -2
- package/README.md +216 -155
- package/SessionRecorderNative.podspec +9 -14
- package/android/build.gradle +21 -44
- package/android/gradle.properties +4 -4
- package/android/src/main/AndroidManifest.xml +2 -0
- package/android/src/main/java/com/multiplayer/sessionrecordernative/SessionRecorderNativeConfig.kt +52 -0
- package/android/src/main/java/com/multiplayer/sessionrecordernative/SessionRecorderNativeModule.kt +860 -0
- package/android/src/main/java/com/multiplayer/sessionrecordernative/SessionRecorderNativePackage.kt +33 -0
- package/android/src/main/java/com/multiplayer/sessionrecordernative/model/TargetInfo.kt +9 -0
- package/android/src/main/java/com/multiplayer/sessionrecordernative/util/ViewUtils.kt +72 -0
- package/ios/SessionRecorderNative.podspec +4 -2
- package/ios/SessionRecorderNative.swift +1 -1
- package/ios/SessionRecorderNativeSpec.swift +3 -3
- package/lib/module/components/ScreenRecorderView/ScreenRecorderView.js +23 -0
- package/lib/module/components/ScreenRecorderView/ScreenRecorderView.js.map +1 -0
- package/lib/module/components/ScreenRecorderView/index.js +4 -0
- package/lib/module/components/ScreenRecorderView/index.js.map +1 -0
- package/lib/module/components/SessionRecorderWidget/ErrorBanner.js +64 -0
- package/lib/module/components/SessionRecorderWidget/ErrorBanner.js.map +1 -0
- package/lib/module/components/SessionRecorderWidget/FinalPopover.js +74 -0
- package/lib/module/components/SessionRecorderWidget/FinalPopover.js.map +1 -0
- package/lib/module/components/SessionRecorderWidget/FloatingButton.js +191 -0
- package/lib/module/components/SessionRecorderWidget/FloatingButton.js.map +1 -0
- package/lib/module/components/SessionRecorderWidget/InitialPopover.js +138 -0
- package/lib/module/components/SessionRecorderWidget/InitialPopover.js.map +1 -0
- package/lib/module/components/SessionRecorderWidget/ModalContainer.js +177 -0
- package/lib/module/components/SessionRecorderWidget/ModalContainer.js.map +1 -0
- package/lib/module/components/SessionRecorderWidget/ModalHeader.js +27 -0
- package/lib/module/components/SessionRecorderWidget/ModalHeader.js.map +1 -0
- package/lib/module/components/SessionRecorderWidget/SessionRecorderWidget.js +133 -0
- package/lib/module/components/SessionRecorderWidget/SessionRecorderWidget.js.map +1 -0
- package/lib/module/components/SessionRecorderWidget/icons.js +93 -0
- package/lib/module/components/SessionRecorderWidget/icons.js.map +1 -0
- package/lib/module/components/SessionRecorderWidget/index.js +5 -0
- package/lib/module/components/SessionRecorderWidget/index.js.map +1 -0
- package/lib/module/components/SessionRecorderWidget/styles.js +173 -0
- package/lib/module/components/SessionRecorderWidget/styles.js.map +1 -0
- package/lib/module/components/index.js +5 -0
- package/lib/module/components/index.js.map +1 -0
- package/lib/module/config/constants.js +42 -0
- package/lib/module/config/constants.js.map +1 -0
- package/lib/module/config/defaults.js +81 -0
- package/lib/module/config/defaults.js.map +1 -0
- package/lib/module/config/index.js +9 -0
- package/lib/module/config/index.js.map +1 -0
- package/lib/module/config/masking.js +35 -0
- package/lib/module/config/masking.js.map +1 -0
- package/lib/module/config/session-recorder.js +44 -0
- package/lib/module/config/session-recorder.js.map +1 -0
- package/lib/module/config/validators.js +28 -0
- package/lib/module/config/validators.js.map +1 -0
- package/lib/module/config/widget.js +35 -0
- package/lib/module/config/widget.js.map +1 -0
- package/lib/module/context/SessionRecorderContext.js +93 -0
- package/lib/module/context/SessionRecorderContext.js.map +1 -0
- package/lib/module/context/SessionRecorderStore.js +12 -0
- package/lib/module/context/SessionRecorderStore.js.map +1 -0
- package/lib/module/context/useSessionRecorderStore.js +20 -0
- package/lib/module/context/useSessionRecorderStore.js.map +1 -0
- package/lib/module/context/useStoreSelector.js +27 -0
- package/lib/module/context/useStoreSelector.js.map +1 -0
- package/lib/module/index.js +13 -0
- package/lib/module/index.js.map +1 -0
- package/lib/module/native/SessionRecorderNative.js +74 -0
- package/lib/module/native/SessionRecorderNative.js.map +1 -0
- package/lib/module/native/index.js +4 -0
- package/lib/module/native/index.js.map +1 -0
- package/lib/module/otel/helpers.js +218 -0
- package/lib/module/otel/helpers.js.map +1 -0
- package/lib/module/otel/index.js +95 -0
- package/lib/module/otel/index.js.map +1 -0
- package/lib/module/otel/instrumentations/index.js +102 -0
- package/lib/module/otel/instrumentations/index.js.map +1 -0
- package/lib/module/package.json +1 -0
- package/lib/module/patch/index.js +4 -0
- package/lib/module/patch/index.js.map +1 -0
- package/lib/module/patch/xhr.js +116 -0
- package/lib/module/patch/xhr.js.map +1 -0
- package/lib/module/recorder/eventExporter.js +130 -0
- package/lib/module/recorder/eventExporter.js.map +1 -0
- package/lib/module/recorder/gestureRecorder.js +641 -0
- package/lib/module/recorder/gestureRecorder.js.map +1 -0
- package/lib/module/recorder/index.js +168 -0
- package/lib/module/recorder/index.js.map +1 -0
- package/lib/module/recorder/navigationTracker.js +228 -0
- package/lib/module/recorder/navigationTracker.js.map +1 -0
- package/lib/module/recorder/screenRecorder.js +495 -0
- package/lib/module/recorder/screenRecorder.js.map +1 -0
- package/lib/module/services/api.service.js +149 -0
- package/lib/module/services/api.service.js.map +1 -0
- package/lib/module/services/network.service.js +178 -0
- package/lib/module/services/network.service.js.map +1 -0
- package/lib/module/services/screenMaskingService.js +107 -0
- package/lib/module/services/screenMaskingService.js.map +1 -0
- package/lib/module/services/storage.service.js +179 -0
- package/lib/module/services/storage.service.js.map +1 -0
- package/lib/module/session-recorder.js +541 -0
- package/lib/module/session-recorder.js.map +1 -0
- package/lib/module/types/configs.js +4 -0
- package/lib/module/types/configs.js.map +1 -0
- package/lib/module/types/expo-constants.d.js +2 -0
- package/lib/module/types/expo-constants.d.js.map +1 -0
- package/lib/module/types/index.js +11 -0
- package/lib/module/types/index.js.map +1 -0
- package/lib/module/types/session-recorder.js +68 -0
- package/lib/module/types/session-recorder.js.map +1 -0
- package/lib/module/types/session.js +9 -0
- package/lib/module/types/session.js.map +1 -0
- package/lib/module/utils/app-metadata.js +28 -0
- package/lib/module/utils/app-metadata.js.map +1 -0
- package/lib/module/utils/constants.optional.expo.js +6 -0
- package/lib/module/utils/constants.optional.expo.js.map +1 -0
- package/lib/module/utils/constants.optional.js +8 -0
- package/lib/module/utils/constants.optional.js.map +1 -0
- package/lib/module/utils/createStore.js +27 -0
- package/lib/module/utils/createStore.js.map +1 -0
- package/lib/module/utils/index.js +11 -0
- package/lib/module/utils/index.js.map +1 -0
- package/lib/module/utils/logger.js +185 -0
- package/lib/module/utils/logger.js.map +1 -0
- package/lib/module/utils/platform.js +340 -0
- package/lib/module/utils/platform.js.map +1 -0
- package/lib/module/utils/request-utils.js +58 -0
- package/lib/module/utils/request-utils.js.map +1 -0
- package/lib/module/utils/rrweb-events.js +276 -0
- package/lib/module/utils/rrweb-events.js.map +1 -0
- package/lib/module/utils/session.js +21 -0
- package/lib/module/utils/session.js.map +1 -0
- package/lib/module/utils/shallowEqual.js +17 -0
- package/lib/module/utils/shallowEqual.js.map +1 -0
- package/lib/module/utils/time.js +17 -0
- package/lib/module/utils/time.js.map +1 -0
- package/lib/module/utils/type-utils.js +69 -0
- package/lib/module/utils/type-utils.js.map +1 -0
- package/lib/module/version.js +4 -0
- package/lib/module/version.js.map +1 -0
- package/lib/typescript/package.json +1 -0
- package/lib/typescript/src/components/ScreenRecorderView/ScreenRecorderView.d.ts +6 -0
- package/lib/typescript/src/components/ScreenRecorderView/ScreenRecorderView.d.ts.map +1 -0
- package/lib/typescript/src/components/ScreenRecorderView/index.d.ts +2 -0
- package/lib/typescript/src/components/ScreenRecorderView/index.d.ts.map +1 -0
- package/{dist → lib/typescript/src}/components/SessionRecorderWidget/ErrorBanner.d.ts +1 -0
- package/lib/typescript/src/components/SessionRecorderWidget/ErrorBanner.d.ts.map +1 -0
- package/{dist → lib/typescript/src}/components/SessionRecorderWidget/FinalPopover.d.ts +2 -1
- package/lib/typescript/src/components/SessionRecorderWidget/FinalPopover.d.ts.map +1 -0
- package/{dist → lib/typescript/src}/components/SessionRecorderWidget/FloatingButton.d.ts +1 -0
- package/lib/typescript/src/components/SessionRecorderWidget/FloatingButton.d.ts.map +1 -0
- package/{dist → lib/typescript/src}/components/SessionRecorderWidget/InitialPopover.d.ts +2 -1
- package/lib/typescript/src/components/SessionRecorderWidget/InitialPopover.d.ts.map +1 -0
- package/{dist → lib/typescript/src}/components/SessionRecorderWidget/ModalContainer.d.ts +1 -0
- package/lib/typescript/src/components/SessionRecorderWidget/ModalContainer.d.ts.map +1 -0
- package/{dist → lib/typescript/src}/components/SessionRecorderWidget/ModalHeader.d.ts +1 -0
- package/lib/typescript/src/components/SessionRecorderWidget/ModalHeader.d.ts.map +1 -0
- package/{dist → lib/typescript/src}/components/SessionRecorderWidget/SessionRecorderWidget.d.ts +1 -0
- package/lib/typescript/src/components/SessionRecorderWidget/SessionRecorderWidget.d.ts.map +1 -0
- package/{dist → lib/typescript/src}/components/SessionRecorderWidget/icons.d.ts +1 -0
- package/lib/typescript/src/components/SessionRecorderWidget/icons.d.ts.map +1 -0
- package/lib/typescript/src/components/SessionRecorderWidget/index.d.ts +3 -0
- package/lib/typescript/src/components/SessionRecorderWidget/index.d.ts.map +1 -0
- package/{dist → lib/typescript/src}/components/SessionRecorderWidget/styles.d.ts +4 -3
- package/lib/typescript/src/components/SessionRecorderWidget/styles.d.ts.map +1 -0
- package/lib/typescript/src/components/index.d.ts +3 -0
- package/lib/typescript/src/components/index.d.ts.map +1 -0
- package/{dist → lib/typescript/src}/config/constants.d.ts +1 -0
- package/lib/typescript/src/config/constants.d.ts.map +1 -0
- package/{dist → lib/typescript/src}/config/defaults.d.ts +2 -1
- package/lib/typescript/src/config/defaults.d.ts.map +1 -0
- package/{dist → lib/typescript/src}/config/index.d.ts +1 -0
- package/lib/typescript/src/config/index.d.ts.map +1 -0
- package/lib/typescript/src/config/masking.d.ts +3 -0
- package/lib/typescript/src/config/masking.d.ts.map +1 -0
- package/lib/typescript/src/config/session-recorder.d.ts +3 -0
- package/lib/typescript/src/config/session-recorder.d.ts.map +1 -0
- package/{dist → lib/typescript/src}/config/validators.d.ts +1 -0
- package/lib/typescript/src/config/validators.d.ts.map +1 -0
- package/{dist → lib/typescript/src}/config/widget.d.ts +2 -1
- package/lib/typescript/src/config/widget.d.ts.map +1 -0
- package/{dist → lib/typescript/src}/context/SessionRecorderContext.d.ts +3 -2
- package/lib/typescript/src/context/SessionRecorderContext.d.ts.map +1 -0
- package/{dist → lib/typescript/src}/context/SessionRecorderStore.d.ts +2 -1
- package/lib/typescript/src/context/SessionRecorderStore.d.ts.map +1 -0
- package/{dist → lib/typescript/src}/context/useSessionRecorderStore.d.ts +4 -3
- package/lib/typescript/src/context/useSessionRecorderStore.d.ts.map +1 -0
- package/{dist → lib/typescript/src}/context/useStoreSelector.d.ts +2 -1
- package/lib/typescript/src/context/useStoreSelector.d.ts.map +1 -0
- package/{dist → lib/typescript/src}/index.d.ts +1 -0
- package/lib/typescript/src/index.d.ts.map +1 -0
- package/{dist → lib/typescript/src}/native/SessionRecorderNative.d.ts +21 -3
- package/lib/typescript/src/native/SessionRecorderNative.d.ts.map +1 -0
- package/lib/typescript/src/native/index.d.ts +2 -0
- package/lib/typescript/src/native/index.d.ts.map +1 -0
- package/{dist → lib/typescript/src}/otel/helpers.d.ts +3 -2
- package/lib/typescript/src/otel/helpers.d.ts.map +1 -0
- package/{dist → lib/typescript/src}/otel/index.d.ts +2 -2
- package/lib/typescript/src/otel/index.d.ts.map +1 -0
- package/{dist → lib/typescript/src}/otel/instrumentations/index.d.ts +2 -1
- package/lib/typescript/src/otel/instrumentations/index.d.ts.map +1 -0
- package/lib/typescript/src/patch/index.d.ts +2 -0
- package/lib/typescript/src/patch/index.d.ts.map +1 -0
- package/{dist → lib/typescript/src}/patch/xhr.d.ts +1 -0
- package/lib/typescript/src/patch/xhr.d.ts.map +1 -0
- package/{dist → lib/typescript/src}/recorder/eventExporter.d.ts +2 -1
- package/lib/typescript/src/recorder/eventExporter.d.ts.map +1 -0
- package/{dist → lib/typescript/src}/recorder/gestureRecorder.d.ts +3 -2
- package/lib/typescript/src/recorder/gestureRecorder.d.ts.map +1 -0
- package/{dist → lib/typescript/src}/recorder/index.d.ts +3 -2
- package/lib/typescript/src/recorder/index.d.ts.map +1 -0
- package/{dist → lib/typescript/src}/recorder/navigationTracker.d.ts +2 -1
- package/lib/typescript/src/recorder/navigationTracker.d.ts.map +1 -0
- package/{dist → lib/typescript/src}/recorder/screenRecorder.d.ts +4 -4
- package/lib/typescript/src/recorder/screenRecorder.d.ts.map +1 -0
- package/{dist → lib/typescript/src}/services/api.service.d.ts +2 -1
- package/lib/typescript/src/services/api.service.d.ts.map +1 -0
- package/{dist → lib/typescript/src}/services/network.service.d.ts +1 -0
- package/lib/typescript/src/services/network.service.d.ts.map +1 -0
- package/{dist → lib/typescript/src}/services/screenMaskingService.d.ts +2 -1
- package/lib/typescript/src/services/screenMaskingService.d.ts.map +1 -0
- package/{dist → lib/typescript/src}/services/storage.service.d.ts +2 -1
- package/lib/typescript/src/services/storage.service.d.ts.map +1 -0
- package/{dist → lib/typescript/src}/session-recorder.d.ts +3 -2
- package/lib/typescript/src/session-recorder.d.ts.map +1 -0
- package/{dist → lib/typescript/src}/types/configs.d.ts +3 -2
- package/lib/typescript/src/types/configs.d.ts.map +1 -0
- package/{dist → lib/typescript/src}/types/index.d.ts +1 -0
- package/lib/typescript/src/types/index.d.ts.map +1 -0
- package/{dist → lib/typescript/src}/types/session-recorder.d.ts +7 -6
- package/lib/typescript/src/types/session-recorder.d.ts.map +1 -0
- package/{dist → lib/typescript/src}/types/session.d.ts +1 -0
- package/lib/typescript/src/types/session.d.ts.map +1 -0
- package/{dist → lib/typescript/src}/utils/app-metadata.d.ts +1 -0
- package/lib/typescript/src/utils/app-metadata.d.ts.map +1 -0
- package/{dist → lib/typescript/src}/utils/constants.optional.d.ts +1 -0
- package/lib/typescript/src/utils/constants.optional.d.ts.map +1 -0
- package/{dist → lib/typescript/src}/utils/constants.optional.expo.d.ts +1 -0
- package/lib/typescript/src/utils/constants.optional.expo.d.ts.map +1 -0
- package/{dist → lib/typescript/src}/utils/createStore.d.ts +1 -0
- package/lib/typescript/src/utils/createStore.d.ts.map +1 -0
- package/lib/typescript/src/utils/index.d.ts +8 -0
- package/lib/typescript/src/utils/index.d.ts.map +1 -0
- package/{dist → lib/typescript/src}/utils/logger.d.ts +2 -1
- package/lib/typescript/src/utils/logger.d.ts.map +1 -0
- package/{dist → lib/typescript/src}/utils/platform.d.ts +2 -1
- package/lib/typescript/src/utils/platform.d.ts.map +1 -0
- package/{dist → lib/typescript/src}/utils/request-utils.d.ts +1 -0
- package/lib/typescript/src/utils/request-utils.d.ts.map +1 -0
- package/{dist → lib/typescript/src}/utils/rrweb-events.d.ts +2 -1
- package/lib/typescript/src/utils/rrweb-events.d.ts.map +1 -0
- package/{dist → lib/typescript/src}/utils/session.d.ts +1 -0
- package/lib/typescript/src/utils/session.d.ts.map +1 -0
- package/{dist → lib/typescript/src}/utils/shallowEqual.d.ts +1 -0
- package/lib/typescript/src/utils/shallowEqual.d.ts.map +1 -0
- package/{dist → lib/typescript/src}/utils/time.d.ts +1 -0
- package/lib/typescript/src/utils/time.d.ts.map +1 -0
- package/{dist → lib/typescript/src}/utils/type-utils.d.ts +1 -0
- package/lib/typescript/src/utils/type-utils.d.ts.map +1 -0
- package/{dist → lib/typescript/src}/version.d.ts +1 -0
- package/lib/typescript/src/version.d.ts.map +1 -0
- package/package.json +133 -44
- package/src/components/ScreenRecorderView/ScreenRecorderView.tsx +20 -0
- package/src/components/ScreenRecorderView/index.ts +1 -0
- package/src/components/SessionRecorderWidget/ErrorBanner.tsx +58 -0
- package/src/components/SessionRecorderWidget/FinalPopover.tsx +96 -0
- package/src/components/SessionRecorderWidget/FloatingButton.tsx +176 -0
- package/src/components/SessionRecorderWidget/InitialPopover.tsx +167 -0
- package/src/components/SessionRecorderWidget/ModalContainer.tsx +189 -0
- package/src/components/SessionRecorderWidget/ModalHeader.tsx +26 -0
- package/src/components/SessionRecorderWidget/SessionRecorderWidget.tsx +150 -0
- package/src/components/SessionRecorderWidget/icons.tsx +80 -0
- package/src/components/SessionRecorderWidget/index.ts +3 -0
- package/src/components/SessionRecorderWidget/styles.ts +168 -0
- package/src/config/constants.ts +67 -0
- package/src/config/defaults.ts +105 -0
- package/src/config/index.ts +6 -0
- package/src/config/masking.ts +60 -0
- package/src/config/session-recorder.ts +87 -0
- package/src/config/validators.ts +54 -0
- package/src/config/widget.ts +47 -0
- package/src/context/SessionRecorderContext.tsx +138 -0
- package/src/context/SessionRecorderStore.ts +22 -0
- package/src/context/useSessionRecorderStore.ts +34 -0
- package/src/context/useStoreSelector.ts +36 -0
- package/src/index.ts +10 -0
- package/src/native/SessionRecorderNative.ts +180 -0
- package/src/native/index.ts +5 -0
- package/src/otel/helpers.ts +290 -0
- package/src/otel/index.ts +132 -0
- package/src/otel/instrumentations/index.ts +118 -0
- package/src/patch/xhr.ts +148 -0
- package/src/recorder/eventExporter.ts +150 -0
- package/src/recorder/gestureRecorder.ts +828 -0
- package/src/recorder/index.ts +203 -0
- package/src/recorder/navigationTracker.ts +268 -0
- package/src/recorder/screenRecorder.ts +600 -0
- package/src/services/api.service.ts +216 -0
- package/src/services/network.service.ts +191 -0
- package/src/services/screenMaskingService.ts +153 -0
- package/src/services/storage.service.ts +248 -0
- package/src/session-recorder.ts +647 -0
- package/src/types/configs.ts +118 -0
- package/src/types/expo-constants.d.ts +7 -0
- package/src/types/index.ts +27 -0
- package/src/types/session-recorder.ts +381 -0
- package/src/types/session.ts +65 -0
- package/src/utils/app-metadata.ts +31 -0
- package/src/utils/constants.optional.expo.ts +5 -0
- package/src/utils/constants.optional.ts +18 -0
- package/src/utils/createStore.ts +32 -0
- package/{dist/utils/index.d.ts → src/utils/index.ts} +1 -0
- package/src/utils/logger.ts +245 -0
- package/src/utils/platform.ts +401 -0
- package/src/utils/request-utils.ts +61 -0
- package/src/utils/rrweb-events.ts +329 -0
- package/src/utils/session.ts +22 -0
- package/src/utils/shallowEqual.ts +20 -0
- package/src/utils/time.ts +20 -0
- package/src/utils/type-utils.ts +75 -0
- package/src/version.ts +1 -0
- package/REACT_NATIVE_SETUP.md +0 -91
- package/android/gradle/wrapper/gradle-wrapper.jar +0 -0
- package/android/gradle/wrapper/gradle-wrapper.properties +0 -7
- package/android/gradlew +0 -249
- package/android/gradlew.bat +0 -92
- package/copy-react-native-dist.sh +0 -56
- package/dist/components/ScreenRecorderView/ScreenRecorderView.d.ts +0 -5
- package/dist/components/ScreenRecorderView/ScreenRecorderView.js +0 -1
- package/dist/components/ScreenRecorderView/ScreenRecorderView.js.map +0 -1
- package/dist/components/ScreenRecorderView/index.d.ts +0 -1
- package/dist/components/ScreenRecorderView/index.js +0 -1
- package/dist/components/ScreenRecorderView/index.js.map +0 -1
- package/dist/components/SessionRecorderWidget/ErrorBanner.js +0 -1
- package/dist/components/SessionRecorderWidget/ErrorBanner.js.map +0 -1
- package/dist/components/SessionRecorderWidget/FinalPopover.js +0 -1
- package/dist/components/SessionRecorderWidget/FinalPopover.js.map +0 -1
- package/dist/components/SessionRecorderWidget/FloatingButton.js +0 -1
- package/dist/components/SessionRecorderWidget/FloatingButton.js.map +0 -1
- package/dist/components/SessionRecorderWidget/InitialPopover.js +0 -1
- package/dist/components/SessionRecorderWidget/InitialPopover.js.map +0 -1
- package/dist/components/SessionRecorderWidget/ModalContainer.js +0 -1
- package/dist/components/SessionRecorderWidget/ModalContainer.js.map +0 -1
- package/dist/components/SessionRecorderWidget/ModalHeader.js +0 -1
- package/dist/components/SessionRecorderWidget/ModalHeader.js.map +0 -1
- package/dist/components/SessionRecorderWidget/SessionRecorderWidget.js +0 -1
- package/dist/components/SessionRecorderWidget/SessionRecorderWidget.js.map +0 -1
- package/dist/components/SessionRecorderWidget/icons.js +0 -1
- package/dist/components/SessionRecorderWidget/icons.js.map +0 -1
- package/dist/components/SessionRecorderWidget/index.d.ts +0 -2
- package/dist/components/SessionRecorderWidget/index.js +0 -1
- package/dist/components/SessionRecorderWidget/index.js.map +0 -1
- package/dist/components/SessionRecorderWidget/styles.js +0 -1
- package/dist/components/SessionRecorderWidget/styles.js.map +0 -1
- package/dist/components/index.js +0 -1
- package/dist/components/index.js.map +0 -1
- package/dist/config/constants.js +0 -1
- package/dist/config/constants.js.map +0 -1
- package/dist/config/defaults.js +0 -1
- package/dist/config/defaults.js.map +0 -1
- package/dist/config/index.js +0 -1
- package/dist/config/index.js.map +0 -1
- package/dist/config/masking.d.ts +0 -2
- package/dist/config/masking.js +0 -1
- package/dist/config/masking.js.map +0 -1
- package/dist/config/session-recorder.d.ts +0 -2
- package/dist/config/session-recorder.js +0 -1
- package/dist/config/session-recorder.js.map +0 -1
- package/dist/config/validators.js +0 -1
- package/dist/config/validators.js.map +0 -1
- package/dist/config/widget.js +0 -1
- package/dist/config/widget.js.map +0 -1
- package/dist/context/SessionRecorderContext.js +0 -1
- package/dist/context/SessionRecorderContext.js.map +0 -1
- package/dist/context/SessionRecorderStore.js +0 -1
- package/dist/context/SessionRecorderStore.js.map +0 -1
- package/dist/context/useSessionRecorderStore.js +0 -1
- package/dist/context/useSessionRecorderStore.js.map +0 -1
- package/dist/context/useStoreSelector.js +0 -1
- package/dist/context/useStoreSelector.js.map +0 -1
- package/dist/index.js +0 -1
- package/dist/index.js.map +0 -1
- package/dist/native/GestureRecorderNative.d.ts +0 -57
- package/dist/native/GestureRecorderNative.js +0 -1
- package/dist/native/GestureRecorderNative.js.map +0 -1
- package/dist/native/GestureRecorderNativeTurboSpec.d.ts +0 -31
- package/dist/native/GestureRecorderNativeTurboSpec.js +0 -1
- package/dist/native/GestureRecorderNativeTurboSpec.js.map +0 -1
- package/dist/native/SessionRecorderNative.js +0 -1
- package/dist/native/SessionRecorderNative.js.map +0 -1
- package/dist/native/SessionRecorderNativeTurboSpec.d.ts +0 -17
- package/dist/native/SessionRecorderNativeTurboSpec.js +0 -1
- package/dist/native/SessionRecorderNativeTurboSpec.js.map +0 -1
- package/dist/native/index.d.ts +0 -1
- package/dist/native/index.js +0 -1
- package/dist/native/index.js.map +0 -1
- package/dist/otel/helpers.js +0 -1
- package/dist/otel/helpers.js.map +0 -1
- package/dist/otel/index.js +0 -1
- package/dist/otel/index.js.map +0 -1
- package/dist/otel/instrumentations/index.js +0 -1
- package/dist/otel/instrumentations/index.js.map +0 -1
- package/dist/patch/index.js +0 -1
- package/dist/patch/index.js.map +0 -1
- package/dist/patch/xhr.js +0 -1
- package/dist/patch/xhr.js.map +0 -1
- package/dist/recorder/eventExporter.js +0 -1
- package/dist/recorder/eventExporter.js.map +0 -1
- package/dist/recorder/gestureRecorder.js +0 -1
- package/dist/recorder/gestureRecorder.js.map +0 -1
- package/dist/recorder/index.js +0 -1
- package/dist/recorder/index.js.map +0 -1
- package/dist/recorder/navigationTracker.js +0 -1
- package/dist/recorder/navigationTracker.js.map +0 -1
- package/dist/recorder/screenRecorder.js +0 -1
- package/dist/recorder/screenRecorder.js.map +0 -1
- package/dist/services/api.service.js +0 -1
- package/dist/services/api.service.js.map +0 -1
- package/dist/services/network.service.js +0 -1
- package/dist/services/network.service.js.map +0 -1
- package/dist/services/screenMaskingService.js +0 -1
- package/dist/services/screenMaskingService.js.map +0 -1
- package/dist/services/storage.service.js +0 -1
- package/dist/services/storage.service.js.map +0 -1
- package/dist/session-recorder.js +0 -1
- package/dist/session-recorder.js.map +0 -1
- package/dist/types/configs.js +0 -1
- package/dist/types/configs.js.map +0 -1
- package/dist/types/index.js +0 -1
- package/dist/types/index.js.map +0 -1
- package/dist/types/session-recorder.js +0 -1
- package/dist/types/session-recorder.js.map +0 -1
- package/dist/types/session.js +0 -1
- package/dist/types/session.js.map +0 -1
- package/dist/utils/app-metadata.js +0 -1
- package/dist/utils/app-metadata.js.map +0 -1
- package/dist/utils/constants.optional.expo.js +0 -1
- package/dist/utils/constants.optional.expo.js.map +0 -1
- package/dist/utils/constants.optional.js +0 -1
- package/dist/utils/constants.optional.js.map +0 -1
- package/dist/utils/createStore.js +0 -1
- package/dist/utils/createStore.js.map +0 -1
- package/dist/utils/index.js +0 -1
- package/dist/utils/index.js.map +0 -1
- package/dist/utils/logger.js +0 -1
- package/dist/utils/logger.js.map +0 -1
- package/dist/utils/platform.js +0 -1
- package/dist/utils/platform.js.map +0 -1
- package/dist/utils/request-utils.js +0 -1
- package/dist/utils/request-utils.js.map +0 -1
- package/dist/utils/rrweb-events.js +0 -1
- package/dist/utils/rrweb-events.js.map +0 -1
- package/dist/utils/session.js +0 -1
- package/dist/utils/session.js.map +0 -1
- package/dist/utils/shallowEqual.js +0 -1
- package/dist/utils/shallowEqual.js.map +0 -1
- package/dist/utils/time.js +0 -1
- package/dist/utils/time.js.map +0 -1
- package/dist/utils/type-utils.js +0 -1
- package/dist/utils/type-utils.js.map +0 -1
- package/dist/version.js +0 -1
- package/dist/version.js.map +0 -1
- package/docs/AUTO_METADATA_DETECTION.md +0 -108
- package/react-native.config.js +0 -13
- /package/{dist/components/index.d.ts → src/components/index.ts} +0 -0
- /package/{dist/patch/index.d.ts → src/patch/index.ts} +0 -0
package/README.md
CHANGED
|
@@ -92,43 +92,51 @@ If you encounter:
|
|
|
92
92
|
#### For Basic React Native Apps (App.tsx)
|
|
93
93
|
|
|
94
94
|
```javascript
|
|
95
|
-
import React from 'react'
|
|
96
|
-
import {
|
|
95
|
+
import React from 'react';
|
|
96
|
+
import {
|
|
97
|
+
SessionRecorderProvider,
|
|
98
|
+
SessionRecorder,
|
|
99
|
+
} from '@multiplayer-app/session-recorder-react-native';
|
|
97
100
|
|
|
98
101
|
// Initialize with minimal required options
|
|
99
102
|
SessionRecorder.init({
|
|
100
103
|
application: 'my-react-native-app',
|
|
101
104
|
version: '1.0.0',
|
|
102
105
|
environment: 'production',
|
|
103
|
-
apiKey: 'YOUR_MULTIPLAYER_API_KEY'
|
|
104
|
-
})
|
|
106
|
+
apiKey: 'YOUR_MULTIPLAYER_API_KEY',
|
|
107
|
+
});
|
|
105
108
|
|
|
106
109
|
export default function App() {
|
|
107
|
-
return
|
|
110
|
+
return (
|
|
111
|
+
<SessionRecorderProvider>{/* Your app content */}</SessionRecorderProvider>
|
|
112
|
+
);
|
|
108
113
|
}
|
|
109
114
|
```
|
|
110
115
|
|
|
111
116
|
#### For Expo Apps (\_layout.tsx)
|
|
112
117
|
|
|
113
118
|
```javascript
|
|
114
|
-
import React from 'react'
|
|
115
|
-
import { Stack } from 'expo-router'
|
|
116
|
-
import {
|
|
119
|
+
import React from 'react';
|
|
120
|
+
import { Stack } from 'expo-router';
|
|
121
|
+
import {
|
|
122
|
+
SessionRecorderProvider,
|
|
123
|
+
SessionRecorder,
|
|
124
|
+
} from '@multiplayer-app/session-recorder-react-native';
|
|
117
125
|
|
|
118
126
|
// Initialize with minimal required options
|
|
119
127
|
SessionRecorder.init({
|
|
120
128
|
application: 'my-expo-app',
|
|
121
129
|
version: '1.0.0',
|
|
122
130
|
environment: 'production',
|
|
123
|
-
apiKey: 'YOUR_MULTIPLAYER_API_KEY'
|
|
124
|
-
})
|
|
131
|
+
apiKey: 'YOUR_MULTIPLAYER_API_KEY',
|
|
132
|
+
});
|
|
125
133
|
|
|
126
134
|
export default function RootLayout() {
|
|
127
135
|
return (
|
|
128
136
|
<SessionRecorderProvider>
|
|
129
137
|
<Stack />
|
|
130
138
|
</SessionRecorderProvider>
|
|
131
|
-
)
|
|
139
|
+
);
|
|
132
140
|
}
|
|
133
141
|
```
|
|
134
142
|
|
|
@@ -144,8 +152,11 @@ This minimal setup will:
|
|
|
144
152
|
#### For Basic React Native Apps (App.tsx)
|
|
145
153
|
|
|
146
154
|
```javascript
|
|
147
|
-
import React from 'react'
|
|
148
|
-
import {
|
|
155
|
+
import React from 'react';
|
|
156
|
+
import {
|
|
157
|
+
SessionRecorderProvider,
|
|
158
|
+
SessionRecorder,
|
|
159
|
+
} from '@multiplayer-app/session-recorder-react-native';
|
|
149
160
|
|
|
150
161
|
SessionRecorder.init({
|
|
151
162
|
application: 'my-react-native-app',
|
|
@@ -154,20 +165,25 @@ SessionRecorder.init({
|
|
|
154
165
|
apiKey: 'YOUR_MULTIPLAYER_API_KEY',
|
|
155
166
|
recordGestures: true, // default is true
|
|
156
167
|
recordNavigation: true, // default is true
|
|
157
|
-
recordScreen: true // default is true
|
|
158
|
-
})
|
|
168
|
+
recordScreen: true, // default is true
|
|
169
|
+
});
|
|
159
170
|
|
|
160
171
|
export default function App() {
|
|
161
|
-
return
|
|
172
|
+
return (
|
|
173
|
+
<SessionRecorderProvider>{/* Your app content */}</SessionRecorderProvider>
|
|
174
|
+
);
|
|
162
175
|
}
|
|
163
176
|
```
|
|
164
177
|
|
|
165
178
|
#### For Expo Apps (\_layout.tsx)
|
|
166
179
|
|
|
167
180
|
```javascript
|
|
168
|
-
import React from 'react'
|
|
169
|
-
import { Stack } from 'expo-router'
|
|
170
|
-
import {
|
|
181
|
+
import React from 'react';
|
|
182
|
+
import { Stack } from 'expo-router';
|
|
183
|
+
import {
|
|
184
|
+
SessionRecorderProvider,
|
|
185
|
+
SessionRecorder,
|
|
186
|
+
} from '@multiplayer-app/session-recorder-react-native';
|
|
171
187
|
|
|
172
188
|
SessionRecorder.init({
|
|
173
189
|
application: 'my-expo-app',
|
|
@@ -176,15 +192,15 @@ SessionRecorder.init({
|
|
|
176
192
|
apiKey: 'YOUR_MULTIPLAYER_API_KEY',
|
|
177
193
|
recordGestures: true, // default is true
|
|
178
194
|
recordNavigation: true, // default is true
|
|
179
|
-
recordScreen: true // default is true
|
|
180
|
-
})
|
|
195
|
+
recordScreen: true, // default is true
|
|
196
|
+
});
|
|
181
197
|
|
|
182
198
|
export default function RootLayout() {
|
|
183
199
|
return (
|
|
184
200
|
<SessionRecorderProvider>
|
|
185
201
|
<Stack />
|
|
186
202
|
</SessionRecorderProvider>
|
|
187
|
-
)
|
|
203
|
+
);
|
|
188
204
|
}
|
|
189
205
|
```
|
|
190
206
|
|
|
@@ -193,11 +209,14 @@ export default function RootLayout() {
|
|
|
193
209
|
Here's a complete example showing how to integrate the session recorder in your React Native app:
|
|
194
210
|
|
|
195
211
|
```javascript
|
|
196
|
-
import React, { useEffect, useRef } from 'react'
|
|
197
|
-
import { NavigationContainer } from '@react-navigation/native'
|
|
198
|
-
import { SafeAreaProvider } from 'react-native-safe-area-context'
|
|
199
|
-
import {
|
|
200
|
-
|
|
212
|
+
import React, { useEffect, useRef } from 'react';
|
|
213
|
+
import { NavigationContainer } from '@react-navigation/native';
|
|
214
|
+
import { SafeAreaProvider } from 'react-native-safe-area-context';
|
|
215
|
+
import {
|
|
216
|
+
SessionRecorderProvider,
|
|
217
|
+
SessionRecorder,
|
|
218
|
+
} from '@multiplayer-app/session-recorder-react-native';
|
|
219
|
+
import { AppNavigator } from './navigation/AppNavigator';
|
|
201
220
|
|
|
202
221
|
// Initialize session recorder
|
|
203
222
|
SessionRecorder.init({
|
|
@@ -207,20 +226,20 @@ SessionRecorder.init({
|
|
|
207
226
|
apiKey: 'YOUR_MULTIPLAYER_API_KEY',
|
|
208
227
|
recordGestures: true,
|
|
209
228
|
recordNavigation: true,
|
|
210
|
-
recordScreen: false // Enable after adding permissions
|
|
211
|
-
})
|
|
229
|
+
recordScreen: false, // Enable after adding permissions
|
|
230
|
+
});
|
|
212
231
|
|
|
213
232
|
export default function App() {
|
|
214
|
-
const navigationRef = useRef(null)
|
|
233
|
+
const navigationRef = useRef(null);
|
|
215
234
|
|
|
216
235
|
useEffect(() => {
|
|
217
236
|
// Set session attributes for better debugging context
|
|
218
237
|
SessionRecorder.setSessionAttributes({
|
|
219
238
|
userId: 'user123',
|
|
220
239
|
userType: 'premium',
|
|
221
|
-
appVersion: '1.0.0'
|
|
222
|
-
})
|
|
223
|
-
}, [])
|
|
240
|
+
appVersion: '1.0.0',
|
|
241
|
+
});
|
|
242
|
+
}, []);
|
|
224
243
|
|
|
225
244
|
return (
|
|
226
245
|
<SessionRecorderProvider>
|
|
@@ -228,14 +247,14 @@ export default function App() {
|
|
|
228
247
|
<NavigationContainer
|
|
229
248
|
ref={navigationRef}
|
|
230
249
|
onReady={() => {
|
|
231
|
-
SessionRecorder.setNavigationRef(navigationRef.current)
|
|
250
|
+
SessionRecorder.setNavigationRef(navigationRef.current);
|
|
232
251
|
}}
|
|
233
252
|
>
|
|
234
253
|
<AppNavigator />
|
|
235
254
|
</NavigationContainer>
|
|
236
255
|
</SafeAreaProvider>
|
|
237
256
|
</SessionRecorderProvider>
|
|
238
|
-
)
|
|
257
|
+
);
|
|
239
258
|
}
|
|
240
259
|
```
|
|
241
260
|
|
|
@@ -244,7 +263,7 @@ export default function App() {
|
|
|
244
263
|
For Expo applications, the package automatically detects the Expo environment:
|
|
245
264
|
|
|
246
265
|
```javascript
|
|
247
|
-
import SessionRecorder from '@multiplayer-app/session-recorder-react-native'
|
|
266
|
+
import SessionRecorder from '@multiplayer-app/session-recorder-react-native';
|
|
248
267
|
|
|
249
268
|
SessionRecorder.init({
|
|
250
269
|
application: 'my-expo-app',
|
|
@@ -253,8 +272,8 @@ SessionRecorder.init({
|
|
|
253
272
|
apiKey: 'YOUR_MULTIPLAYER_API_KEY',
|
|
254
273
|
recordGestures: true,
|
|
255
274
|
recordNavigation: true,
|
|
256
|
-
recordScreen: true
|
|
257
|
-
})
|
|
275
|
+
recordScreen: true,
|
|
276
|
+
});
|
|
258
277
|
```
|
|
259
278
|
|
|
260
279
|
The package will automatically:
|
|
@@ -270,26 +289,29 @@ The package will automatically:
|
|
|
270
289
|
Expo Router already manages the NavigationContainer. Don't add your own.
|
|
271
290
|
|
|
272
291
|
```tsx
|
|
273
|
-
import { useEffect } from 'react'
|
|
274
|
-
import { Stack, useNavigationContainerRef } from 'expo-router'
|
|
275
|
-
import {
|
|
292
|
+
import { useEffect } from 'react';
|
|
293
|
+
import { Stack, useNavigationContainerRef } from 'expo-router';
|
|
294
|
+
import {
|
|
295
|
+
SessionRecorderProvider,
|
|
296
|
+
SessionRecorder,
|
|
297
|
+
} from '@multiplayer-app/session-recorder-react-native';
|
|
276
298
|
|
|
277
299
|
export default function RootLayout() {
|
|
278
|
-
const navigationRef = useNavigationContainerRef()
|
|
300
|
+
const navigationRef = useNavigationContainerRef();
|
|
279
301
|
|
|
280
302
|
useEffect(() => {
|
|
281
303
|
const unsub = navigationRef.addListener?.('state', () => {
|
|
282
|
-
SessionRecorder.setNavigationRef(navigationRef)
|
|
283
|
-
unsub?.()
|
|
284
|
-
})
|
|
285
|
-
return unsub
|
|
286
|
-
}, [navigationRef])
|
|
304
|
+
SessionRecorder.setNavigationRef(navigationRef);
|
|
305
|
+
unsub?.();
|
|
306
|
+
});
|
|
307
|
+
return unsub;
|
|
308
|
+
}, [navigationRef]);
|
|
287
309
|
|
|
288
310
|
return (
|
|
289
311
|
<SessionRecorderProvider>
|
|
290
312
|
<Stack />
|
|
291
313
|
</SessionRecorderProvider>
|
|
292
|
-
)
|
|
314
|
+
);
|
|
293
315
|
}
|
|
294
316
|
```
|
|
295
317
|
|
|
@@ -298,25 +320,28 @@ export default function RootLayout() {
|
|
|
298
320
|
If you own the `NavigationContainer`, set the ref in `onReady`:
|
|
299
321
|
|
|
300
322
|
```tsx
|
|
301
|
-
import { NavigationContainer } from '@react-navigation/native'
|
|
302
|
-
import { useRef } from 'react'
|
|
303
|
-
import {
|
|
323
|
+
import { NavigationContainer } from '@react-navigation/native';
|
|
324
|
+
import { useRef } from 'react';
|
|
325
|
+
import {
|
|
326
|
+
SessionRecorderProvider,
|
|
327
|
+
SessionRecorder,
|
|
328
|
+
} from '@multiplayer-app/session-recorder-react-native';
|
|
304
329
|
|
|
305
330
|
export default function App() {
|
|
306
|
-
const navigationRef = useRef<any>(null)
|
|
331
|
+
const navigationRef = useRef<any>(null);
|
|
307
332
|
|
|
308
333
|
return (
|
|
309
334
|
<SessionRecorderProvider>
|
|
310
335
|
<NavigationContainer
|
|
311
336
|
ref={navigationRef}
|
|
312
337
|
onReady={() => {
|
|
313
|
-
SessionRecorder.setNavigationRef(navigationRef.current)
|
|
338
|
+
SessionRecorder.setNavigationRef(navigationRef.current);
|
|
314
339
|
}}
|
|
315
340
|
>
|
|
316
341
|
{/* Your navigation stack */}
|
|
317
342
|
</NavigationContainer>
|
|
318
343
|
</SessionRecorderProvider>
|
|
319
|
-
)
|
|
344
|
+
);
|
|
320
345
|
}
|
|
321
346
|
```
|
|
322
347
|
|
|
@@ -324,26 +349,26 @@ export default function App() {
|
|
|
324
349
|
|
|
325
350
|
```javascript
|
|
326
351
|
// Start a new recording session
|
|
327
|
-
SessionRecorder.start()
|
|
352
|
+
SessionRecorder.start();
|
|
328
353
|
|
|
329
354
|
// Pause current recording
|
|
330
|
-
SessionRecorder.pause()
|
|
355
|
+
SessionRecorder.pause();
|
|
331
356
|
|
|
332
357
|
// Resume paused recording
|
|
333
|
-
SessionRecorder.resume()
|
|
358
|
+
SessionRecorder.resume();
|
|
334
359
|
|
|
335
360
|
// Stop recording with optional reason
|
|
336
|
-
SessionRecorder.stop('Session completed')
|
|
361
|
+
SessionRecorder.stop('Session completed');
|
|
337
362
|
|
|
338
363
|
// Save continuous recording (for continuous mode)
|
|
339
|
-
SessionRecorder.save()
|
|
364
|
+
SessionRecorder.save();
|
|
340
365
|
|
|
341
366
|
// Set session attributes for better context
|
|
342
367
|
SessionRecorder.setSessionAttributes({
|
|
343
368
|
userId: 'user123',
|
|
344
369
|
feature: 'checkout',
|
|
345
|
-
version: '2.1.0'
|
|
346
|
-
})
|
|
370
|
+
version: '2.1.0',
|
|
371
|
+
});
|
|
347
372
|
```
|
|
348
373
|
|
|
349
374
|
## Session Provider & Hooks
|
|
@@ -363,10 +388,10 @@ SessionRecorder.init({
|
|
|
363
388
|
widget: {
|
|
364
389
|
enabled: true,
|
|
365
390
|
button: {
|
|
366
|
-
visible: false // Hide the floating button
|
|
367
|
-
}
|
|
368
|
-
}
|
|
369
|
-
})
|
|
391
|
+
visible: false, // Hide the floating button
|
|
392
|
+
},
|
|
393
|
+
},
|
|
394
|
+
});
|
|
370
395
|
```
|
|
371
396
|
|
|
372
397
|
### Programmatic Widget Control
|
|
@@ -374,56 +399,67 @@ SessionRecorder.init({
|
|
|
374
399
|
Use the `useSessionRecorder` hook to control the widget modal programmatically:
|
|
375
400
|
|
|
376
401
|
```javascript
|
|
377
|
-
import React from 'react'
|
|
378
|
-
import { View, Button } from 'react-native'
|
|
379
|
-
import { useSessionRecorder } from '@multiplayer-app/session-recorder-react-native'
|
|
402
|
+
import React from 'react';
|
|
403
|
+
import { View, Button } from 'react-native';
|
|
404
|
+
import { useSessionRecorder } from '@multiplayer-app/session-recorder-react-native';
|
|
380
405
|
|
|
381
406
|
function MyComponent() {
|
|
382
|
-
const { openWidgetModal, closeWidgetModal } = useSessionRecorder()
|
|
407
|
+
const { openWidgetModal, closeWidgetModal } = useSessionRecorder();
|
|
383
408
|
|
|
384
409
|
return (
|
|
385
410
|
<View>
|
|
386
|
-
<Button title=
|
|
387
|
-
<Button title=
|
|
411
|
+
<Button title="Open Session Recorder" onPress={openWidgetModal} />
|
|
412
|
+
<Button title="Close Session Recorder" onPress={closeWidgetModal} />
|
|
388
413
|
</View>
|
|
389
|
-
)
|
|
414
|
+
);
|
|
390
415
|
}
|
|
391
416
|
```
|
|
392
417
|
|
|
393
418
|
### Session Control with Hooks
|
|
394
419
|
|
|
395
420
|
```javascript
|
|
396
|
-
import React from 'react'
|
|
397
|
-
import { View, Button } from 'react-native'
|
|
398
|
-
import { useSessionRecorder } from '@multiplayer-app/session-recorder-react-native'
|
|
421
|
+
import React from 'react';
|
|
422
|
+
import { View, Button } from 'react-native';
|
|
423
|
+
import { useSessionRecorder } from '@multiplayer-app/session-recorder-react-native';
|
|
399
424
|
|
|
400
425
|
function SessionControls() {
|
|
401
|
-
const {
|
|
426
|
+
const {
|
|
427
|
+
startSession,
|
|
428
|
+
stopSession,
|
|
429
|
+
pauseSession,
|
|
430
|
+
resumeSession,
|
|
431
|
+
saveSession,
|
|
432
|
+
} = useSessionRecorder();
|
|
402
433
|
|
|
403
434
|
return (
|
|
404
435
|
<View>
|
|
405
|
-
<Button title=
|
|
406
|
-
<Button title=
|
|
407
|
-
<Button title=
|
|
408
|
-
<Button
|
|
409
|
-
|
|
436
|
+
<Button title="Start Session" onPress={() => startSession()} />
|
|
437
|
+
<Button title="Pause Session" onPress={() => pauseSession()} />
|
|
438
|
+
<Button title="Resume Session" onPress={() => resumeSession()} />
|
|
439
|
+
<Button
|
|
440
|
+
title="Stop Session"
|
|
441
|
+
onPress={() => stopSession('User completed')}
|
|
442
|
+
/>
|
|
443
|
+
<Button title="Save Session" onPress={() => saveSession()} />
|
|
410
444
|
</View>
|
|
411
|
-
)
|
|
445
|
+
);
|
|
412
446
|
}
|
|
413
447
|
```
|
|
414
448
|
|
|
415
449
|
### Session State with Hooks
|
|
416
450
|
|
|
417
451
|
```javascript
|
|
418
|
-
import React from 'react'
|
|
419
|
-
import { View, Text } from 'react-native'
|
|
420
|
-
import { useSessionRecorderStore } from '@multiplayer-app/session-recorder-react-native'
|
|
452
|
+
import React from 'react';
|
|
453
|
+
import { View, Text } from 'react-native';
|
|
454
|
+
import { useSessionRecorderStore } from '@multiplayer-app/session-recorder-react-native';
|
|
421
455
|
|
|
422
456
|
function SessionStatus() {
|
|
423
|
-
const sessionType = useSessionRecorderStore((s) => s.sessionType)
|
|
424
|
-
const isWidgetModalVisible = useSessionRecorderStore(
|
|
425
|
-
|
|
426
|
-
|
|
457
|
+
const sessionType = useSessionRecorderStore((s) => s.sessionType);
|
|
458
|
+
const isWidgetModalVisible = useSessionRecorderStore(
|
|
459
|
+
(s) => s.isWidgetModalVisible
|
|
460
|
+
);
|
|
461
|
+
const sessionState = useSessionRecorderStore((s) => s.sessionState);
|
|
462
|
+
const isOnline = useSessionRecorderStore((s) => s.isOnline);
|
|
427
463
|
|
|
428
464
|
return (
|
|
429
465
|
<View>
|
|
@@ -432,56 +468,58 @@ function SessionStatus() {
|
|
|
432
468
|
<Text>Widget Visible: {isWidgetModalVisible ? 'Yes' : 'No'}</Text>
|
|
433
469
|
<Text>Online: {isOnline ? 'Yes' : 'No'}</Text>
|
|
434
470
|
</View>
|
|
435
|
-
)
|
|
471
|
+
);
|
|
436
472
|
}
|
|
437
473
|
```
|
|
438
474
|
|
|
439
475
|
### Complete Example with Custom UI
|
|
440
476
|
|
|
441
477
|
```javascript
|
|
442
|
-
import React, { useEffect } from 'react'
|
|
443
|
-
import { View, Button, Text, Alert } from 'react-native'
|
|
478
|
+
import React, { useEffect } from 'react';
|
|
479
|
+
import { View, Button, Text, Alert } from 'react-native';
|
|
444
480
|
import {
|
|
445
481
|
SessionRecorderProvider,
|
|
446
482
|
useSessionRecorder,
|
|
447
|
-
useSessionRecorderStore
|
|
448
|
-
} from '@multiplayer-app/session-recorder-react-native'
|
|
483
|
+
useSessionRecorderStore,
|
|
484
|
+
} from '@multiplayer-app/session-recorder-react-native';
|
|
449
485
|
|
|
450
486
|
function SessionRecorderUI() {
|
|
451
|
-
const { startSession, stopSession, openWidgetModal } = useSessionRecorder()
|
|
452
|
-
const { sessionState, isWidgetModalVisible } = useSessionRecorderStore(
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
|
|
487
|
+
const { startSession, stopSession, openWidgetModal } = useSessionRecorder();
|
|
488
|
+
const { sessionState, isWidgetModalVisible } = useSessionRecorderStore(
|
|
489
|
+
(state) => ({
|
|
490
|
+
sessionState: state.sessionState,
|
|
491
|
+
isWidgetModalVisible: state.isWidgetModalVisible,
|
|
492
|
+
})
|
|
493
|
+
);
|
|
456
494
|
|
|
457
495
|
const handleStartRecording = async () => {
|
|
458
496
|
try {
|
|
459
|
-
await startSession()
|
|
460
|
-
Alert.alert('Success', 'Session recording started')
|
|
497
|
+
await startSession();
|
|
498
|
+
Alert.alert('Success', 'Session recording started');
|
|
461
499
|
} catch (error) {
|
|
462
|
-
Alert.alert('Error', 'Failed to start recording')
|
|
500
|
+
Alert.alert('Error', 'Failed to start recording');
|
|
463
501
|
}
|
|
464
|
-
}
|
|
502
|
+
};
|
|
465
503
|
|
|
466
504
|
const handleStopRecording = async () => {
|
|
467
505
|
try {
|
|
468
|
-
await stopSession('User manually stopped')
|
|
469
|
-
Alert.alert('Success', 'Session recording stopped')
|
|
506
|
+
await stopSession('User manually stopped');
|
|
507
|
+
Alert.alert('Success', 'Session recording stopped');
|
|
470
508
|
} catch (error) {
|
|
471
|
-
Alert.alert('Error', 'Failed to stop recording')
|
|
509
|
+
Alert.alert('Error', 'Failed to stop recording');
|
|
472
510
|
}
|
|
473
|
-
}
|
|
511
|
+
};
|
|
474
512
|
|
|
475
513
|
return (
|
|
476
514
|
<View style={{ padding: 20 }}>
|
|
477
515
|
<Text>Session State: {sessionState}</Text>
|
|
478
516
|
<Text>Widget Modal: {isWidgetModalVisible ? 'Open' : 'Closed'}</Text>
|
|
479
517
|
|
|
480
|
-
<Button title=
|
|
481
|
-
<Button title=
|
|
482
|
-
<Button title=
|
|
518
|
+
<Button title="Start Recording" onPress={handleStartRecording} />
|
|
519
|
+
<Button title="Stop Recording" onPress={handleStopRecording} />
|
|
520
|
+
<Button title="Open Widget" onPress={openWidgetModal} />
|
|
483
521
|
</View>
|
|
484
|
-
)
|
|
522
|
+
);
|
|
485
523
|
}
|
|
486
524
|
|
|
487
525
|
export default function App() {
|
|
@@ -489,7 +527,7 @@ export default function App() {
|
|
|
489
527
|
<SessionRecorderProvider>
|
|
490
528
|
<SessionRecorderUI />
|
|
491
529
|
</SessionRecorderProvider>
|
|
492
|
-
)
|
|
530
|
+
);
|
|
493
531
|
}
|
|
494
532
|
```
|
|
495
533
|
|
|
@@ -537,7 +575,11 @@ To get the most useful target information in your traces, follow these practices
|
|
|
537
575
|
#### 1. Use Accessibility Labels
|
|
538
576
|
|
|
539
577
|
```jsx
|
|
540
|
-
<TouchableOpacity
|
|
578
|
+
<TouchableOpacity
|
|
579
|
+
accessibilityLabel="Submit user registration form"
|
|
580
|
+
accessibilityRole="button"
|
|
581
|
+
onPress={handleSubmit}
|
|
582
|
+
>
|
|
541
583
|
<Text>Submit</Text>
|
|
542
584
|
</TouchableOpacity>
|
|
543
585
|
```
|
|
@@ -545,7 +587,11 @@ To get the most useful target information in your traces, follow these practices
|
|
|
545
587
|
#### 2. Add Test IDs for Testing Context
|
|
546
588
|
|
|
547
589
|
```jsx
|
|
548
|
-
<TouchableOpacity
|
|
590
|
+
<TouchableOpacity
|
|
591
|
+
testID="registration-submit-btn"
|
|
592
|
+
accessibilityLabel="Submit registration"
|
|
593
|
+
onPress={handleSubmit}
|
|
594
|
+
>
|
|
549
595
|
<Text>Submit</Text>
|
|
550
596
|
</TouchableOpacity>
|
|
551
597
|
```
|
|
@@ -663,9 +709,12 @@ SessionRecorder.init({
|
|
|
663
709
|
// NOTE: if frontend domain doesn't match to backend one, set backend domain to `propagateTraceHeaderCorsUrls` parameter
|
|
664
710
|
propagateTraceHeaderCorsUrls: [
|
|
665
711
|
new RegExp('https://your.backend.api.domain', 'i'), // can be regex or string
|
|
666
|
-
new RegExp('https://another.backend.api.domain', 'i')
|
|
712
|
+
new RegExp('https://another.backend.api.domain', 'i'),
|
|
713
|
+
],
|
|
714
|
+
ignoreUrls: [
|
|
715
|
+
/https:\/\/analytics\.example\.com/,
|
|
716
|
+
/https:\/\/crashlytics\.com/,
|
|
667
717
|
],
|
|
668
|
-
ignoreUrls: [/https:\/\/analytics\.example\.com/, /https:\/\/crashlytics\.com/],
|
|
669
718
|
captureBody: true,
|
|
670
719
|
captureHeaders: true,
|
|
671
720
|
maxCapturingHttpPayloadSize: 100000,
|
|
@@ -677,7 +726,7 @@ SessionRecorder.init({
|
|
|
677
726
|
maskBodyFieldsList: ['password', 'token', 'secret', 'creditCard'],
|
|
678
727
|
maskTextInputs: true,
|
|
679
728
|
maskImages: false,
|
|
680
|
-
maskButtons: false
|
|
729
|
+
maskButtons: false,
|
|
681
730
|
},
|
|
682
731
|
|
|
683
732
|
// Session widget configuration
|
|
@@ -685,19 +734,22 @@ SessionRecorder.init({
|
|
|
685
734
|
enabled: true,
|
|
686
735
|
button: {
|
|
687
736
|
visible: true,
|
|
688
|
-
placement: 'bottomRight' // or 'bottomLeft'
|
|
689
|
-
}
|
|
737
|
+
placement: 'bottomRight', // or 'bottomLeft'
|
|
738
|
+
},
|
|
690
739
|
},
|
|
691
740
|
|
|
692
741
|
// Continuous recording
|
|
693
|
-
showContinuousRecording: true
|
|
694
|
-
})
|
|
742
|
+
showContinuousRecording: true,
|
|
743
|
+
});
|
|
695
744
|
```
|
|
696
745
|
|
|
697
746
|
### Environment-Specific Configuration
|
|
698
747
|
|
|
699
748
|
```javascript
|
|
700
|
-
import {
|
|
749
|
+
import {
|
|
750
|
+
SessionRecorder,
|
|
751
|
+
LogLevel,
|
|
752
|
+
} from '@multiplayer-app/session-recorder-react-native';
|
|
701
753
|
|
|
702
754
|
const config = {
|
|
703
755
|
application: 'my-app',
|
|
@@ -708,12 +760,12 @@ const config = {
|
|
|
708
760
|
...(__DEV__ && {
|
|
709
761
|
logger: {
|
|
710
762
|
enabled: true,
|
|
711
|
-
level: LogLevel.DEBUG
|
|
712
|
-
}
|
|
713
|
-
})
|
|
714
|
-
}
|
|
763
|
+
level: LogLevel.DEBUG,
|
|
764
|
+
},
|
|
765
|
+
}),
|
|
766
|
+
};
|
|
715
767
|
|
|
716
|
-
SessionRecorder.init(config)
|
|
768
|
+
SessionRecorder.init(config);
|
|
717
769
|
```
|
|
718
770
|
|
|
719
771
|
## Troubleshooting
|
|
@@ -768,15 +820,18 @@ SessionRecorder.init(config)
|
|
|
768
820
|
Enable debug logging to troubleshoot issues:
|
|
769
821
|
|
|
770
822
|
```javascript
|
|
771
|
-
import {
|
|
823
|
+
import {
|
|
824
|
+
SessionRecorder,
|
|
825
|
+
LogLevel,
|
|
826
|
+
} from '@multiplayer-app/session-recorder-react-native';
|
|
772
827
|
|
|
773
828
|
SessionRecorder.init({
|
|
774
829
|
// ... other config
|
|
775
830
|
logger: {
|
|
776
831
|
enabled: true,
|
|
777
|
-
level: LogLevel.DEBUG
|
|
778
|
-
}
|
|
779
|
-
})
|
|
832
|
+
level: LogLevel.DEBUG,
|
|
833
|
+
},
|
|
834
|
+
});
|
|
780
835
|
```
|
|
781
836
|
|
|
782
837
|
## Examples
|
|
@@ -814,38 +869,44 @@ Both examples include:
|
|
|
814
869
|
```typescript
|
|
815
870
|
interface SessionRecorderOptions {
|
|
816
871
|
// Required
|
|
817
|
-
apiKey: string
|
|
818
|
-
application: string
|
|
819
|
-
version: string
|
|
820
|
-
environment: string
|
|
872
|
+
apiKey: string;
|
|
873
|
+
application: string;
|
|
874
|
+
version: string;
|
|
875
|
+
environment: string;
|
|
821
876
|
|
|
822
877
|
// Optional
|
|
823
|
-
exporterEndpoint?: string
|
|
824
|
-
apiBaseUrl?: string
|
|
825
|
-
recordGestures?: boolean
|
|
826
|
-
recordNavigation?: boolean
|
|
827
|
-
recordScreen?: boolean
|
|
828
|
-
sampleTraceRatio?: number
|
|
829
|
-
captureBody?: boolean
|
|
830
|
-
captureHeaders?: boolean
|
|
831
|
-
maxCapturingHttpPayloadSize?: number
|
|
832
|
-
masking?: MaskingOptions
|
|
833
|
-
ignoreUrls?: Array<string | RegExp
|
|
834
|
-
propagateTraceHeaderCorsUrls?: PropagateTraceHeaderCorsUrls
|
|
835
|
-
showContinuousRecording?: boolean
|
|
836
|
-
schemifyDocSpanPayload?: boolean
|
|
837
|
-
widget?: WidgetConfig
|
|
878
|
+
exporterEndpoint?: string;
|
|
879
|
+
apiBaseUrl?: string;
|
|
880
|
+
recordGestures?: boolean;
|
|
881
|
+
recordNavigation?: boolean;
|
|
882
|
+
recordScreen?: boolean;
|
|
883
|
+
sampleTraceRatio?: number;
|
|
884
|
+
captureBody?: boolean;
|
|
885
|
+
captureHeaders?: boolean;
|
|
886
|
+
maxCapturingHttpPayloadSize?: number;
|
|
887
|
+
masking?: MaskingOptions;
|
|
888
|
+
ignoreUrls?: Array<string | RegExp>;
|
|
889
|
+
propagateTraceHeaderCorsUrls?: PropagateTraceHeaderCorsUrls;
|
|
890
|
+
showContinuousRecording?: boolean;
|
|
891
|
+
schemifyDocSpanPayload?: boolean;
|
|
892
|
+
widget?: WidgetConfig;
|
|
838
893
|
logger?: {
|
|
839
|
-
level?: number
|
|
840
|
-
enabled?: boolean
|
|
841
|
-
}
|
|
894
|
+
level?: number;
|
|
895
|
+
enabled?: boolean;
|
|
896
|
+
};
|
|
842
897
|
}
|
|
843
898
|
```
|
|
844
899
|
|
|
845
900
|
## Contributing
|
|
846
901
|
|
|
847
|
-
|
|
902
|
+
- [Development workflow](CONTRIBUTING.md#development-workflow)
|
|
903
|
+
- [Sending a pull request](CONTRIBUTING.md#sending-a-pull-request)
|
|
904
|
+
- [Code of conduct](CODE_OF_CONDUCT.md)
|
|
848
905
|
|
|
849
906
|
## License
|
|
850
907
|
|
|
851
|
-
MIT
|
|
908
|
+
MIT
|
|
909
|
+
|
|
910
|
+
---
|
|
911
|
+
|
|
912
|
+
Made with [create-react-native-library](https://github.com/callstack/react-native-builder-bob)
|