@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.
Files changed (48) hide show
  1. package/INTEGRATION_GUIDE.md +1384 -1312
  2. package/android/src/main/java/com/repliqo/screencapture/MultiWindowCapture.java +242 -230
  3. package/android/src/main/java/com/repliqo/screencapture/ScreenCaptureModule.java +94 -170
  4. package/dist/components/RepliqoFlatList.d.ts +5 -0
  5. package/dist/components/RepliqoFlatList.js +39 -0
  6. package/dist/components/RepliqoScrollView.d.ts +3 -0
  7. package/dist/components/RepliqoScrollView.js +16 -265
  8. package/dist/components/useRepliqoScrollTracking.d.ts +33 -0
  9. package/dist/components/useRepliqoScrollTracking.js +304 -0
  10. package/dist/core/client.d.ts +52 -5
  11. package/dist/core/client.js +310 -48
  12. package/dist/core/config.d.ts +1 -1
  13. package/dist/core/config.js +5 -1
  14. package/dist/core/storage.d.ts +29 -0
  15. package/dist/core/storage.js +33 -0
  16. package/dist/index.d.ts +3 -2
  17. package/dist/index.js +3 -2
  18. package/dist/snapshot/NativeScreenCapture.d.ts +6 -44
  19. package/dist/snapshot/NativeScreenCapture.js +6 -64
  20. package/dist/snapshot/capture.d.ts +7 -0
  21. package/dist/snapshot/capture.js +17 -5
  22. package/dist/trackers/error.tracker.d.ts +25 -0
  23. package/dist/trackers/error.tracker.js +114 -37
  24. package/dist/trackers/navigation.tracker.js +11 -0
  25. package/dist/transport/api.client.d.ts +34 -1
  26. package/dist/transport/api.client.js +102 -19
  27. package/dist/transport/batch-queue.d.ts +53 -1
  28. package/dist/transport/batch-queue.js +126 -19
  29. package/dist/types/events.d.ts +12 -0
  30. package/package.json +68 -64
  31. package/src/components/RepliqoFlatList.tsx +64 -0
  32. package/src/components/RepliqoScrollView.tsx +53 -302
  33. package/src/components/useRepliqoScrollTracking.ts +366 -0
  34. package/src/core/client.ts +953 -672
  35. package/src/core/config.ts +38 -30
  36. package/src/core/storage.ts +51 -0
  37. package/src/index.ts +54 -52
  38. package/src/snapshot/NativeScreenCapture.ts +62 -157
  39. package/src/snapshot/capture.ts +154 -142
  40. package/src/trackers/error.tracker.ts +211 -136
  41. package/src/trackers/navigation.tracker.ts +107 -98
  42. package/src/transport/api.client.ts +430 -327
  43. package/src/transport/batch-queue.ts +212 -95
  44. package/src/types/events.ts +72 -60
  45. package/android/src/main/java/com/repliqo/screencapture/FullContentCapture.java +0 -273
  46. package/android/src/main/java/com/repliqo/screencapture/PixelCopyScan.java +0 -279
  47. package/android/src/main/java/com/repliqo/screencapture/ScrollScanCapture.java +0 -248
  48. 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
- routeNameRef.current = currentRouteName;
77
- }, []);
78
-
79
- return {
80
- navigationRef,
81
- onStateChange,
82
- onReady,
83
- };
84
- }
85
-
86
- export function trackScreenChange(
87
- fromScreen: string,
88
- toScreen: string,
89
- ): void {
90
- try {
91
- const analytics = AppAnalytics.getInstance();
92
- analytics.trackNavigation(fromScreen, toScreen);
93
- analytics.onScreenExit(fromScreen);
94
- analytics.onScreenEnter(toScreen);
95
- } catch {
96
- // AppAnalytics not initialized, silently ignore
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
+ }