react-native-netmera 2.1.0-alpha03 → 2.1.0-alpha04
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
CHANGED
|
@@ -547,4 +547,89 @@ startDataTransfer() method, the SDK will attempt to resend any requests that wer
|
|
|
547
547
|
Netmera.startDataTransfer();
|
|
548
548
|
```
|
|
549
549
|
|
|
550
|
+
---
|
|
551
|
+
|
|
552
|
+
## Autotracking
|
|
553
|
+
|
|
554
|
+
Netmera Autotracking automatically captures screen transitions via **React Navigation** and tap interactions on **official React Native components** (`Pressable`, `TouchableOpacity`, `Switch`, etc.) without requiring manual instrumentation for each event.
|
|
555
|
+
|
|
556
|
+
### NetmeraAnalyticProvider
|
|
557
|
+
|
|
558
|
+
Wrap your `NavigationContainer` (or your root component) with `NetmeraAnalyticProvider`. The provider handles both screen tracking and tap tracking based on the configuration received from the Netmera dashboard.
|
|
559
|
+
|
|
560
|
+
```tsx
|
|
561
|
+
export default function App() {
|
|
562
|
+
return (
|
|
563
|
+
<NetmeraAnalyticProvider>
|
|
564
|
+
<NavigationContainer>
|
|
565
|
+
{/* your navigators */}
|
|
566
|
+
</NavigationContainer>
|
|
567
|
+
</NetmeraAnalyticProvider>
|
|
568
|
+
);
|
|
569
|
+
}
|
|
570
|
+
```
|
|
571
|
+
|
|
572
|
+
### React Navigation v6 and below
|
|
573
|
+
|
|
574
|
+
On **React Navigation v7+** the provider locates the navigation container automatically via the React fiber tree (no extra configuration needed).
|
|
575
|
+
|
|
576
|
+
On **React Navigation v6 and below** the fiber-based detection is not available. Pass an explicit `navigationRef` prop so the provider can subscribe to screen changes:
|
|
577
|
+
|
|
578
|
+
```tsx
|
|
579
|
+
import { useNavigationContainerRef, NavigationContainer } from '@react-navigation/native';
|
|
580
|
+
import { NetmeraAnalyticProvider } from 'react-native-netmera';
|
|
581
|
+
|
|
582
|
+
export default function App() {
|
|
583
|
+
const navigationRef = useNavigationContainerRef();
|
|
584
|
+
|
|
585
|
+
return (
|
|
586
|
+
<NetmeraAnalyticProvider navigationRef={navigationRef}>
|
|
587
|
+
<NavigationContainer ref={navigationRef}>
|
|
588
|
+
{/* your navigators */}
|
|
589
|
+
</NavigationContainer>
|
|
590
|
+
</NetmeraAnalyticProvider>
|
|
591
|
+
);
|
|
592
|
+
}
|
|
593
|
+
```
|
|
594
|
+
|
|
595
|
+
### Manual action tracking with `Netmera.trackAction`
|
|
596
|
+
|
|
597
|
+
For components that do not fire standard `onPress` or `onValueChange` events (e.g. third-party dropdowns, custom pickers, gesture-only views), call `Netmera.trackAction` to record the interaction manually.
|
|
598
|
+
|
|
599
|
+
The method automatically prepends the current screen name to the provided path:
|
|
600
|
+
|
|
601
|
+
```ts
|
|
602
|
+
import { Netmera } from 'react-native-netmera';
|
|
603
|
+
|
|
604
|
+
Netmera.trackAction('category-selector|Electronics');
|
|
605
|
+
// → records: "HomeScreen|category-selector|Electronics"
|
|
606
|
+
```
|
|
607
|
+
|
|
608
|
+
Use the `|` separator to build structured paths (e.g. `component|value`, `list|item-name`).
|
|
609
|
+
|
|
610
|
+
### Improving tap tracking with `accessibilityLabel` and `testID`
|
|
611
|
+
|
|
612
|
+
When a tap is detected, Netmera resolves an identifier for the tapped component using the following priority order:
|
|
613
|
+
|
|
614
|
+
1. **`accessibilityLabel`** — the preferred identifier; human-readable and stable.
|
|
615
|
+
2. **`testID`** — used when `accessibilityLabel` is absent.
|
|
616
|
+
3. **`placeholder`** — for `TextInput` components with no label or testID.
|
|
617
|
+
4. **Child text content** — the text of the first `<Text>` descendant, trimmed to 50 characters.
|
|
618
|
+
|
|
619
|
+
If none of the above resolves to a non-empty string the tap is not recorded.
|
|
620
|
+
|
|
621
|
+
Add `accessibilityLabel` to interactive components that would otherwise produce no identifier (icon buttons, image buttons, custom gesture views):
|
|
622
|
+
|
|
623
|
+
```tsx
|
|
624
|
+
// Icon button — without accessibilityLabel it would produce no identifier
|
|
625
|
+
<Pressable
|
|
626
|
+
accessibilityLabel="add-to-cart"
|
|
627
|
+
onPress={handleAddToCart}
|
|
628
|
+
>
|
|
629
|
+
<CartIcon />
|
|
630
|
+
</Pressable>
|
|
631
|
+
```
|
|
632
|
+
|
|
633
|
+
> **Recommendation:** Prefer `accessibilityLabel` over relying on child text content. Text content can change with copy updates or localisation, causing tracking paths to shift. An explicit label stays stable across UI changes.
|
|
634
|
+
|
|
550
635
|
Please explore [our example project](https://github.com/Netmera/Netmera-React-Native-Typescript-Example) for detailed information.
|
|
@@ -14,8 +14,10 @@ const TAP_THRESHOLD = 10; // px — above this distance the gesture is a scroll,
|
|
|
14
14
|
// ── Fiber predicates ──────────────────────────────────────────────────────────
|
|
15
15
|
|
|
16
16
|
// Skip onStartShouldSetResponder — it matches ScrollViews, which are not interactive targets.
|
|
17
|
+
// onChangeText covers TextInput — its touch end event is consumed natively on Android Fabric,
|
|
18
|
+
// so we need to recognise it during onTouchStart (see targetFiber fallback below).
|
|
17
19
|
function isInteractive(props) {
|
|
18
|
-
return !!(props?.onPress || props?.onClick || props?.onValueChange);
|
|
20
|
+
return !!(props?.onPress || props?.onClick || props?.onValueChange || props?.onChangeText);
|
|
19
21
|
}
|
|
20
22
|
|
|
21
23
|
// Switch has onValueChange + boolean value, but no onPress/onClick.
|
|
@@ -158,8 +160,9 @@ export function useTapTracking(enabled, shouldCollectValues) {
|
|
|
158
160
|
const onTouchStart = useCallback(e => {
|
|
159
161
|
if (!enabledRef.current) return;
|
|
160
162
|
let switchValue;
|
|
163
|
+
const startFiber = e._targetInst;
|
|
161
164
|
try {
|
|
162
|
-
let fiber =
|
|
165
|
+
let fiber = startFiber;
|
|
163
166
|
for (let d = 0; d < MAX_FIBER_DEPTH && fiber; d++, fiber = fiber.return) {
|
|
164
167
|
if (isSwitch(fiber.memoizedProps)) {
|
|
165
168
|
// Capture the committed value before any event fires — reliable first-tap baseline.
|
|
@@ -171,7 +174,10 @@ export function useTapTracking(enabled, shouldCollectValues) {
|
|
|
171
174
|
touchStartRef.current = {
|
|
172
175
|
x: e.nativeEvent.pageX,
|
|
173
176
|
y: e.nativeEvent.pageY,
|
|
174
|
-
switchValue
|
|
177
|
+
switchValue,
|
|
178
|
+
// Android Fabric (New Arch) consumes the ACTION_UP event for TextInput natively,
|
|
179
|
+
// so onTouchEnd._targetInst can be null. Fall back to the fiber captured here.
|
|
180
|
+
targetFiber: startFiber
|
|
175
181
|
};
|
|
176
182
|
}, []);
|
|
177
183
|
const onTouchEnd = useCallback(e => {
|
|
@@ -183,7 +189,7 @@ export function useTapTracking(enabled, shouldCollectValues) {
|
|
|
183
189
|
if (dx > TAP_THRESHOLD || dy > TAP_THRESHOLD) return;
|
|
184
190
|
}
|
|
185
191
|
try {
|
|
186
|
-
let node = e._targetInst;
|
|
192
|
+
let node = e._targetInst ?? touchStartRef.current?.targetFiber;
|
|
187
193
|
if (!node) return;
|
|
188
194
|
|
|
189
195
|
// Pass 1: walk up to find the first interactive ancestor.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["useCallback","useEffect","useRef","getCurrentScreen","RNNetmera","MAX_FIBER_DEPTH","MAX_TEXT_DEPTH","TAP_THRESHOLD","isInteractive","props","onPress","onClick","onValueChange","isSwitch","value","isInsideSelectionControl","fiber","node","return","d","memoizedProps","onSelect","textFromChildren","children","depth","undefined","t","trim","length","String","Array","isArray","child","resolveIdentifier","accessibilityLabel","testID","placeholder","resolveListIndex","startFiber","p","index","cellKey","onUnmount","flatIndex","stateNode","sections","up","i","upProps","endsWith","idx","si","count","data","type","sectionIndex","itemIndex","buildPath","screen","listType","identifier","indexSuffix","base","useTapTracking","enabled","shouldCollectValues","enabledRef","shouldCollectValuesRef","touchStartRef","lastScreenRef","switchLastLoggedRef","Map","current","clear","onTouchStart","e","switchValue","_targetInst","_","x","nativeEvent","pageX","y","pageY","onTouchEnd","start","dx","Math","abs","dy","interactiveNode","identifierNode","isSwitchNode","listIndex","lastLogged","get","newValue","preTapValue","set","switchPath","trackAction","tapPath"],"sourceRoot":"../../../src","sources":["autotracking/useTapTracking.ts"],"mappings":";;AAAA;AACA;AACA;;AAEA,SAASA,WAAW,EAAEC,SAAS,EAAEC,MAAM,QAAQ,OAAO;AAEtD,SAASC,gBAAgB,QAAQ,6BAA0B;AAC3D,SAASC,SAAS,QAAQ,uBAAoB;AAE9C,MAAMC,eAAe,GAAG,EAAE;AAC1B,MAAMC,cAAc,GAAG,CAAC;AACxB,MAAMC,aAAa,GAAG,EAAE,CAAC,CAAC;;AAE1B;;AAEA;AACA,SAASC,aAAaA,CAACC,KAAU,EAAW;EAC1C,OAAO,CAAC,
|
|
1
|
+
{"version":3,"names":["useCallback","useEffect","useRef","getCurrentScreen","RNNetmera","MAX_FIBER_DEPTH","MAX_TEXT_DEPTH","TAP_THRESHOLD","isInteractive","props","onPress","onClick","onValueChange","onChangeText","isSwitch","value","isInsideSelectionControl","fiber","node","return","d","memoizedProps","onSelect","textFromChildren","children","depth","undefined","t","trim","length","String","Array","isArray","child","resolveIdentifier","accessibilityLabel","testID","placeholder","resolveListIndex","startFiber","p","index","cellKey","onUnmount","flatIndex","stateNode","sections","up","i","upProps","endsWith","idx","si","count","data","type","sectionIndex","itemIndex","buildPath","screen","listType","identifier","indexSuffix","base","useTapTracking","enabled","shouldCollectValues","enabledRef","shouldCollectValuesRef","touchStartRef","lastScreenRef","switchLastLoggedRef","Map","current","clear","onTouchStart","e","switchValue","_targetInst","_","x","nativeEvent","pageX","y","pageY","targetFiber","onTouchEnd","start","dx","Math","abs","dy","interactiveNode","identifierNode","isSwitchNode","listIndex","lastLogged","get","newValue","preTapValue","set","switchPath","trackAction","tapPath"],"sourceRoot":"../../../src","sources":["autotracking/useTapTracking.ts"],"mappings":"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","ignoreList":[]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useTapTracking.d.ts","sourceRoot":"","sources":["../../../../src/autotracking/useTapTracking.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"useTapTracking.d.ts","sourceRoot":"","sources":["../../../../src/autotracking/useTapTracking.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,cAAc,CAAC;AAoK1D,wBAAgB,cAAc,CAAC,OAAO,EAAE,OAAO,EAAE,mBAAmB,EAAE,OAAO;sBA8BtC,qBAAqB;oBAwBvB,qBAAqB;EA+FzD"}
|
package/package.json
CHANGED
|
@@ -14,8 +14,15 @@ const TAP_THRESHOLD = 10; // px — above this distance the gesture is a scroll,
|
|
|
14
14
|
// ── Fiber predicates ──────────────────────────────────────────────────────────
|
|
15
15
|
|
|
16
16
|
// Skip onStartShouldSetResponder — it matches ScrollViews, which are not interactive targets.
|
|
17
|
+
// onChangeText covers TextInput — its touch end event is consumed natively on Android Fabric,
|
|
18
|
+
// so we need to recognise it during onTouchStart (see targetFiber fallback below).
|
|
17
19
|
function isInteractive(props: any): boolean {
|
|
18
|
-
return !!(
|
|
20
|
+
return !!(
|
|
21
|
+
props?.onPress ||
|
|
22
|
+
props?.onClick ||
|
|
23
|
+
props?.onValueChange ||
|
|
24
|
+
props?.onChangeText
|
|
25
|
+
);
|
|
19
26
|
}
|
|
20
27
|
|
|
21
28
|
// Switch has onValueChange + boolean value, but no onPress/onClick.
|
|
@@ -167,6 +174,7 @@ export function useTapTracking(enabled: boolean, shouldCollectValues: boolean) {
|
|
|
167
174
|
x: number;
|
|
168
175
|
y: number;
|
|
169
176
|
switchValue?: boolean;
|
|
177
|
+
targetFiber?: any;
|
|
170
178
|
} | null>(null);
|
|
171
179
|
const lastScreenRef = useRef<string | null | undefined>(undefined);
|
|
172
180
|
|
|
@@ -192,8 +200,9 @@ export function useTapTracking(enabled: boolean, shouldCollectValues: boolean) {
|
|
|
192
200
|
const onTouchStart = useCallback((e: GestureResponderEvent) => {
|
|
193
201
|
if (!enabledRef.current) return;
|
|
194
202
|
let switchValue: boolean | undefined;
|
|
203
|
+
const startFiber: any = (e as any)._targetInst;
|
|
195
204
|
try {
|
|
196
|
-
let fiber: any =
|
|
205
|
+
let fiber: any = startFiber;
|
|
197
206
|
for (let d = 0; d < MAX_FIBER_DEPTH && fiber; d++, fiber = fiber.return) {
|
|
198
207
|
if (isSwitch(fiber.memoizedProps)) {
|
|
199
208
|
// Capture the committed value before any event fires — reliable first-tap baseline.
|
|
@@ -206,6 +215,9 @@ export function useTapTracking(enabled: boolean, shouldCollectValues: boolean) {
|
|
|
206
215
|
x: e.nativeEvent.pageX,
|
|
207
216
|
y: e.nativeEvent.pageY,
|
|
208
217
|
switchValue,
|
|
218
|
+
// Android Fabric (New Arch) consumes the ACTION_UP event for TextInput natively,
|
|
219
|
+
// so onTouchEnd._targetInst can be null. Fall back to the fiber captured here.
|
|
220
|
+
targetFiber: startFiber,
|
|
209
221
|
};
|
|
210
222
|
}, []);
|
|
211
223
|
|
|
@@ -219,7 +231,8 @@ export function useTapTracking(enabled: boolean, shouldCollectValues: boolean) {
|
|
|
219
231
|
}
|
|
220
232
|
|
|
221
233
|
try {
|
|
222
|
-
let node: any =
|
|
234
|
+
let node: any =
|
|
235
|
+
(e as any)._targetInst ?? touchStartRef.current?.targetFiber;
|
|
223
236
|
if (!node) return;
|
|
224
237
|
|
|
225
238
|
// Pass 1: walk up to find the first interactive ancestor.
|
|
@@ -285,7 +298,13 @@ export function useTapTracking(enabled: boolean, shouldCollectValues: boolean) {
|
|
|
285
298
|
: !interactiveNode.memoizedProps.value;
|
|
286
299
|
}
|
|
287
300
|
switchLastLoggedRef.current.set(identifier, newValue);
|
|
288
|
-
const switchPath = buildPath(
|
|
301
|
+
const switchPath = buildPath(
|
|
302
|
+
screen,
|
|
303
|
+
listType,
|
|
304
|
+
identifier,
|
|
305
|
+
indexSuffix,
|
|
306
|
+
newValue
|
|
307
|
+
);
|
|
289
308
|
RNNetmera.trackAction(switchPath);
|
|
290
309
|
} else {
|
|
291
310
|
const tapPath = buildPath(screen, listType, identifier, indexSuffix);
|