@repliqo/sdk-react-native 0.3.7 → 0.4.0
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/INTEGRATION_GUIDE.md +1384 -1312
- package/android/src/main/java/com/repliqo/screencapture/MultiWindowCapture.java +242 -230
- package/android/src/main/java/com/repliqo/screencapture/ScreenCaptureModule.java +94 -170
- package/dist/components/RepliqoFlatList.d.ts +5 -0
- package/dist/components/RepliqoFlatList.js +39 -0
- package/dist/components/RepliqoScrollView.d.ts +3 -0
- package/dist/components/RepliqoScrollView.js +16 -265
- package/dist/components/useRepliqoScrollTracking.d.ts +33 -0
- package/dist/components/useRepliqoScrollTracking.js +304 -0
- package/dist/core/client.d.ts +52 -5
- package/dist/core/client.js +310 -48
- package/dist/core/config.d.ts +1 -1
- package/dist/core/config.js +5 -1
- package/dist/core/storage.d.ts +29 -0
- package/dist/core/storage.js +33 -0
- package/dist/index.d.ts +3 -2
- package/dist/index.js +3 -2
- package/dist/snapshot/NativeScreenCapture.d.ts +6 -44
- package/dist/snapshot/NativeScreenCapture.js +6 -64
- package/dist/snapshot/capture.d.ts +7 -0
- package/dist/snapshot/capture.js +17 -5
- package/dist/trackers/error.tracker.d.ts +25 -0
- package/dist/trackers/error.tracker.js +114 -37
- package/dist/trackers/navigation.tracker.js +11 -0
- package/dist/transport/api.client.d.ts +34 -1
- package/dist/transport/api.client.js +102 -19
- package/dist/transport/batch-queue.d.ts +53 -1
- package/dist/transport/batch-queue.js +126 -19
- package/dist/types/events.d.ts +12 -0
- package/package.json +68 -64
- package/src/components/RepliqoFlatList.tsx +64 -0
- package/src/components/RepliqoScrollView.tsx +53 -302
- package/src/components/useRepliqoScrollTracking.ts +366 -0
- package/src/core/client.ts +953 -672
- package/src/core/config.ts +38 -30
- package/src/core/storage.ts +51 -0
- package/src/index.ts +54 -52
- package/src/snapshot/NativeScreenCapture.ts +62 -157
- package/src/snapshot/capture.ts +154 -142
- package/src/trackers/error.tracker.ts +211 -136
- package/src/trackers/navigation.tracker.ts +107 -98
- package/src/transport/api.client.ts +430 -327
- package/src/transport/batch-queue.ts +212 -95
- package/src/types/events.ts +72 -60
- package/android/src/main/java/com/repliqo/screencapture/FullContentCapture.java +0 -273
- package/android/src/main/java/com/repliqo/screencapture/PixelCopyScan.java +0 -279
- package/android/src/main/java/com/repliqo/screencapture/ScrollScanCapture.java +0 -248
- package/src/snapshot/ScreenCaptureManager.ts +0 -156
|
@@ -1,98 +1,107 @@
|
|
|
1
|
-
import { useRef, useCallback } from 'react';
|
|
2
|
-
import { AppAnalytics } from '../core/client';
|
|
3
|
-
|
|
4
|
-
interface NavigationState {
|
|
5
|
-
routes: Array<{ name: string; key: string; state?: NavigationState }>;
|
|
6
|
-
index: number;
|
|
7
|
-
}
|
|
8
|
-
|
|
9
|
-
function getActiveRouteName(state: NavigationState | undefined): string | null {
|
|
10
|
-
if (!state) {
|
|
11
|
-
return null;
|
|
12
|
-
}
|
|
13
|
-
|
|
14
|
-
const route = state.routes[state.index];
|
|
15
|
-
if (!route) {
|
|
16
|
-
return null;
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
// Dive into nested navigators
|
|
20
|
-
if (route.state) {
|
|
21
|
-
return getActiveRouteName(route.state as NavigationState);
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
return route.name;
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
export function useNavigationTracker() {
|
|
28
|
-
const routeNameRef = useRef<string | null>(null);
|
|
29
|
-
const navigationRef = useRef<any>(null);
|
|
30
|
-
|
|
31
|
-
const onReady = useCallback(() => {
|
|
32
|
-
if (navigationRef.current) {
|
|
33
|
-
const state = navigationRef.current.getRootState() as
|
|
34
|
-
| NavigationState
|
|
35
|
-
| undefined;
|
|
36
|
-
const currentRouteName = getActiveRouteName(state);
|
|
37
|
-
routeNameRef.current = currentRouteName;
|
|
38
|
-
|
|
39
|
-
if (currentRouteName) {
|
|
40
|
-
try {
|
|
41
|
-
const analytics = AppAnalytics.getInstance();
|
|
42
|
-
analytics.onScreenEnter(currentRouteName);
|
|
43
|
-
} catch {
|
|
44
|
-
// AppAnalytics not initialized, silently ignore
|
|
45
|
-
}
|
|
46
|
-
}
|
|
47
|
-
}
|
|
48
|
-
}, []);
|
|
49
|
-
|
|
50
|
-
const onStateChange = useCallback(() => {
|
|
51
|
-
if (!navigationRef.current) {
|
|
52
|
-
return;
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
const state = navigationRef.current.getRootState() as
|
|
56
|
-
| NavigationState
|
|
57
|
-
| undefined;
|
|
58
|
-
const currentRouteName = getActiveRouteName(state);
|
|
59
|
-
const previousRouteName = routeNameRef.current;
|
|
60
|
-
|
|
61
|
-
if (
|
|
62
|
-
currentRouteName &&
|
|
63
|
-
previousRouteName &&
|
|
64
|
-
currentRouteName !== previousRouteName
|
|
65
|
-
) {
|
|
66
|
-
try {
|
|
67
|
-
const analytics = AppAnalytics.getInstance();
|
|
68
|
-
analytics.trackNavigation(previousRouteName, currentRouteName);
|
|
69
|
-
analytics.onScreenExit(previousRouteName);
|
|
70
|
-
analytics.onScreenEnter(currentRouteName);
|
|
71
|
-
} catch {
|
|
72
|
-
// AppAnalytics not initialized, silently ignore
|
|
73
|
-
}
|
|
74
|
-
}
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
1
|
+
import { useRef, useCallback } from 'react';
|
|
2
|
+
import { AppAnalytics } from '../core/client';
|
|
3
|
+
|
|
4
|
+
interface NavigationState {
|
|
5
|
+
routes: Array<{ name: string; key: string; state?: NavigationState }>;
|
|
6
|
+
index: number;
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
function getActiveRouteName(state: NavigationState | undefined): string | null {
|
|
10
|
+
if (!state) {
|
|
11
|
+
return null;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
const route = state.routes[state.index];
|
|
15
|
+
if (!route) {
|
|
16
|
+
return null;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
// Dive into nested navigators
|
|
20
|
+
if (route.state) {
|
|
21
|
+
return getActiveRouteName(route.state as NavigationState);
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
return route.name;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
export function useNavigationTracker() {
|
|
28
|
+
const routeNameRef = useRef<string | null>(null);
|
|
29
|
+
const navigationRef = useRef<any>(null);
|
|
30
|
+
|
|
31
|
+
const onReady = useCallback(() => {
|
|
32
|
+
if (navigationRef.current) {
|
|
33
|
+
const state = navigationRef.current.getRootState() as
|
|
34
|
+
| NavigationState
|
|
35
|
+
| undefined;
|
|
36
|
+
const currentRouteName = getActiveRouteName(state);
|
|
37
|
+
routeNameRef.current = currentRouteName;
|
|
38
|
+
|
|
39
|
+
if (currentRouteName) {
|
|
40
|
+
try {
|
|
41
|
+
const analytics = AppAnalytics.getInstance();
|
|
42
|
+
analytics.onScreenEnter(currentRouteName);
|
|
43
|
+
} catch {
|
|
44
|
+
// AppAnalytics not initialized, silently ignore
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
}, []);
|
|
49
|
+
|
|
50
|
+
const onStateChange = useCallback(() => {
|
|
51
|
+
if (!navigationRef.current) {
|
|
52
|
+
return;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
const state = navigationRef.current.getRootState() as
|
|
56
|
+
| NavigationState
|
|
57
|
+
| undefined;
|
|
58
|
+
const currentRouteName = getActiveRouteName(state);
|
|
59
|
+
const previousRouteName = routeNameRef.current;
|
|
60
|
+
|
|
61
|
+
if (
|
|
62
|
+
currentRouteName &&
|
|
63
|
+
previousRouteName &&
|
|
64
|
+
currentRouteName !== previousRouteName
|
|
65
|
+
) {
|
|
66
|
+
try {
|
|
67
|
+
const analytics = AppAnalytics.getInstance();
|
|
68
|
+
analytics.trackNavigation(previousRouteName, currentRouteName);
|
|
69
|
+
analytics.onScreenExit(previousRouteName);
|
|
70
|
+
analytics.onScreenEnter(currentRouteName);
|
|
71
|
+
} catch {
|
|
72
|
+
// AppAnalytics not initialized, silently ignore
|
|
73
|
+
}
|
|
74
|
+
} else if (currentRouteName && !previousRouteName) {
|
|
75
|
+
// First route seen without onReady having fired (some apps only wire
|
|
76
|
+
// onStateChange). Without this, currentScreen stays null until the
|
|
77
|
+
// SECOND navigation and early touches/visits go unattributed.
|
|
78
|
+
try {
|
|
79
|
+
AppAnalytics.getInstance().onScreenEnter(currentRouteName);
|
|
80
|
+
} catch {
|
|
81
|
+
// AppAnalytics not initialized, silently ignore
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
routeNameRef.current = currentRouteName;
|
|
86
|
+
}, []);
|
|
87
|
+
|
|
88
|
+
return {
|
|
89
|
+
navigationRef,
|
|
90
|
+
onStateChange,
|
|
91
|
+
onReady,
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
export function trackScreenChange(
|
|
96
|
+
fromScreen: string,
|
|
97
|
+
toScreen: string,
|
|
98
|
+
): void {
|
|
99
|
+
try {
|
|
100
|
+
const analytics = AppAnalytics.getInstance();
|
|
101
|
+
analytics.trackNavigation(fromScreen, toScreen);
|
|
102
|
+
analytics.onScreenExit(fromScreen);
|
|
103
|
+
analytics.onScreenEnter(toScreen);
|
|
104
|
+
} catch {
|
|
105
|
+
// AppAnalytics not initialized, silently ignore
|
|
106
|
+
}
|
|
107
|
+
}
|