@cxpinsight/react-native 0.2.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/LICENSE +21 -0
- package/README.md +131 -0
- package/babel.js +101 -0
- package/instrumented/Pressable.d.ts +2 -0
- package/instrumented/Pressable.js +2 -0
- package/instrumented/ScrollView.d.ts +2 -0
- package/instrumented/ScrollView.js +2 -0
- package/instrumented/TextInput.d.ts +2 -0
- package/instrumented/TextInput.js +2 -0
- package/instrumented/TouchableOpacity.d.ts +2 -0
- package/instrumented/TouchableOpacity.js +2 -0
- package/lib/CXPinsight.d.ts +113 -0
- package/lib/CXPinsight.d.ts.map +1 -0
- package/lib/CXPinsight.js +831 -0
- package/lib/CXPinsight.js.map +1 -0
- package/lib/CXPinsightProvider.d.ts +19 -0
- package/lib/CXPinsightProvider.d.ts.map +1 -0
- package/lib/CXPinsightProvider.js +382 -0
- package/lib/CXPinsightProvider.js.map +1 -0
- package/lib/core/autoScreenTracker.d.ts +20 -0
- package/lib/core/autoScreenTracker.d.ts.map +1 -0
- package/lib/core/autoScreenTracker.js +66 -0
- package/lib/core/autoScreenTracker.js.map +1 -0
- package/lib/core/deepLinkTracker.d.ts +17 -0
- package/lib/core/deepLinkTracker.d.ts.map +1 -0
- package/lib/core/deepLinkTracker.js +81 -0
- package/lib/core/deepLinkTracker.js.map +1 -0
- package/lib/core/deviceInfo.d.ts +14 -0
- package/lib/core/deviceInfo.d.ts.map +1 -0
- package/lib/core/deviceInfo.js +166 -0
- package/lib/core/deviceInfo.js.map +1 -0
- package/lib/core/eventQueue.d.ts +23 -0
- package/lib/core/eventQueue.d.ts.map +1 -0
- package/lib/core/eventQueue.js +240 -0
- package/lib/core/eventQueue.js.map +1 -0
- package/lib/core/lifecycle.d.ts +18 -0
- package/lib/core/lifecycle.d.ts.map +1 -0
- package/lib/core/lifecycle.js +127 -0
- package/lib/core/lifecycle.js.map +1 -0
- package/lib/core/mobileRecorder.d.ts +15 -0
- package/lib/core/mobileRecorder.d.ts.map +1 -0
- package/lib/core/mobileRecorder.js +231 -0
- package/lib/core/mobileRecorder.js.map +1 -0
- package/lib/core/network.d.ts +10 -0
- package/lib/core/network.d.ts.map +1 -0
- package/lib/core/network.js +74 -0
- package/lib/core/network.js.map +1 -0
- package/lib/core/networkCapture.d.ts +22 -0
- package/lib/core/networkCapture.d.ts.map +1 -0
- package/lib/core/networkCapture.js +100 -0
- package/lib/core/networkCapture.js.map +1 -0
- package/lib/core/scrollCapture.d.ts +48 -0
- package/lib/core/scrollCapture.d.ts.map +1 -0
- package/lib/core/scrollCapture.js +221 -0
- package/lib/core/scrollCapture.js.map +1 -0
- package/lib/core/session.d.ts +15 -0
- package/lib/core/session.d.ts.map +1 -0
- package/lib/core/session.js +157 -0
- package/lib/core/session.js.map +1 -0
- package/lib/core/storage.d.ts +11 -0
- package/lib/core/storage.d.ts.map +1 -0
- package/lib/core/storage.js +59 -0
- package/lib/core/storage.js.map +1 -0
- package/lib/core/triggerEngine.d.ts +56 -0
- package/lib/core/triggerEngine.d.ts.map +1 -0
- package/lib/core/triggerEngine.js +432 -0
- package/lib/core/triggerEngine.js.map +1 -0
- package/lib/index.d.ts +7 -0
- package/lib/index.d.ts.map +1 -0
- package/lib/index.js +11 -0
- package/lib/index.js.map +1 -0
- package/lib/instrumented/Pressable.d.ts +9 -0
- package/lib/instrumented/Pressable.d.ts.map +1 -0
- package/lib/instrumented/Pressable.js +96 -0
- package/lib/instrumented/Pressable.js.map +1 -0
- package/lib/instrumented/ScrollView.d.ts +6 -0
- package/lib/instrumented/ScrollView.d.ts.map +1 -0
- package/lib/instrumented/ScrollView.js +101 -0
- package/lib/instrumented/ScrollView.js.map +1 -0
- package/lib/instrumented/TextInput.d.ts +9 -0
- package/lib/instrumented/TextInput.d.ts.map +1 -0
- package/lib/instrumented/TextInput.js +75 -0
- package/lib/instrumented/TextInput.js.map +1 -0
- package/lib/instrumented/TouchableOpacity.d.ts +11 -0
- package/lib/instrumented/TouchableOpacity.d.ts.map +1 -0
- package/lib/instrumented/TouchableOpacity.js +96 -0
- package/lib/instrumented/TouchableOpacity.js.map +1 -0
- package/lib/instrumented/index.d.ts +19 -0
- package/lib/instrumented/index.d.ts.map +1 -0
- package/lib/instrumented/index.js +28 -0
- package/lib/instrumented/index.js.map +1 -0
- package/lib/instrumented/interactionObserver.d.ts +29 -0
- package/lib/instrumented/interactionObserver.d.ts.map +1 -0
- package/lib/instrumented/interactionObserver.js +38 -0
- package/lib/instrumented/interactionObserver.js.map +1 -0
- package/lib/setup/AccessibilityScanner.d.ts +32 -0
- package/lib/setup/AccessibilityScanner.d.ts.map +1 -0
- package/lib/setup/AccessibilityScanner.js +127 -0
- package/lib/setup/AccessibilityScanner.js.map +1 -0
- package/lib/setup/ElementIdentifier.d.ts +65 -0
- package/lib/setup/ElementIdentifier.d.ts.map +1 -0
- package/lib/setup/ElementIdentifier.js +114 -0
- package/lib/setup/ElementIdentifier.js.map +1 -0
- package/lib/setup/ElementRegistry.d.ts +22 -0
- package/lib/setup/ElementRegistry.d.ts.map +1 -0
- package/lib/setup/ElementRegistry.js +47 -0
- package/lib/setup/ElementRegistry.js.map +1 -0
- package/lib/setup/SetupCodeEntry.d.ts +15 -0
- package/lib/setup/SetupCodeEntry.d.ts.map +1 -0
- package/lib/setup/SetupCodeEntry.js +198 -0
- package/lib/setup/SetupCodeEntry.js.map +1 -0
- package/lib/setup/SetupController.d.ts +29 -0
- package/lib/setup/SetupController.d.ts.map +1 -0
- package/lib/setup/SetupController.js +189 -0
- package/lib/setup/SetupController.js.map +1 -0
- package/lib/setup/SetupOverlay.d.ts +10 -0
- package/lib/setup/SetupOverlay.d.ts.map +1 -0
- package/lib/setup/SetupOverlay.js +408 -0
- package/lib/setup/SetupOverlay.js.map +1 -0
- package/lib/setup/TapInterceptor.d.ts +19 -0
- package/lib/setup/TapInterceptor.d.ts.map +1 -0
- package/lib/setup/TapInterceptor.js +98 -0
- package/lib/setup/TapInterceptor.js.map +1 -0
- package/lib/setup/TouchObserver.d.ts +25 -0
- package/lib/setup/TouchObserver.d.ts.map +1 -0
- package/lib/setup/TouchObserver.js +88 -0
- package/lib/setup/TouchObserver.js.map +1 -0
- package/lib/setup/TouchPatcher.d.ts +27 -0
- package/lib/setup/TouchPatcher.d.ts.map +1 -0
- package/lib/setup/TouchPatcher.js +182 -0
- package/lib/setup/TouchPatcher.js.map +1 -0
- package/lib/setup/index.d.ts +13 -0
- package/lib/setup/index.d.ts.map +1 -0
- package/lib/setup/index.js +45 -0
- package/lib/setup/index.js.map +1 -0
- package/lib/setup/useCXPElement.d.ts +25 -0
- package/lib/setup/useCXPElement.d.ts.map +1 -0
- package/lib/setup/useCXPElement.js +33 -0
- package/lib/setup/useCXPElement.js.map +1 -0
- package/lib/survey/SurveyModal.d.ts +10 -0
- package/lib/survey/SurveyModal.d.ts.map +1 -0
- package/lib/survey/SurveyModal.js +1650 -0
- package/lib/survey/SurveyModal.js.map +1 -0
- package/lib/survey/expressionEval.d.ts +10 -0
- package/lib/survey/expressionEval.d.ts.map +1 -0
- package/lib/survey/expressionEval.js +287 -0
- package/lib/survey/expressionEval.js.map +1 -0
- package/lib/survey/frequencyCap.d.ts +15 -0
- package/lib/survey/frequencyCap.d.ts.map +1 -0
- package/lib/survey/frequencyCap.js +116 -0
- package/lib/survey/frequencyCap.js.map +1 -0
- package/lib/survey/handsFreeVoice.d.ts +30 -0
- package/lib/survey/handsFreeVoice.d.ts.map +1 -0
- package/lib/survey/handsFreeVoice.js +312 -0
- package/lib/survey/handsFreeVoice.js.map +1 -0
- package/lib/survey/interpolate.d.ts +6 -0
- package/lib/survey/interpolate.d.ts.map +1 -0
- package/lib/survey/interpolate.js +61 -0
- package/lib/survey/interpolate.js.map +1 -0
- package/lib/survey/pagesFromV1.d.ts +6 -0
- package/lib/survey/pagesFromV1.d.ts.map +1 -0
- package/lib/survey/pagesFromV1.js +83 -0
- package/lib/survey/pagesFromV1.js.map +1 -0
- package/lib/survey/questions/CSATQuestion.d.ts +16 -0
- package/lib/survey/questions/CSATQuestion.d.ts.map +1 -0
- package/lib/survey/questions/CSATQuestion.js +37 -0
- package/lib/survey/questions/CSATQuestion.js.map +1 -0
- package/lib/survey/questions/DateQuestion.d.ts +20 -0
- package/lib/survey/questions/DateQuestion.d.ts.map +1 -0
- package/lib/survey/questions/DateQuestion.js +103 -0
- package/lib/survey/questions/DateQuestion.js.map +1 -0
- package/lib/survey/questions/ImagePickerQuestion.d.ts +33 -0
- package/lib/survey/questions/ImagePickerQuestion.d.ts.map +1 -0
- package/lib/survey/questions/ImagePickerQuestion.js +68 -0
- package/lib/survey/questions/ImagePickerQuestion.js.map +1 -0
- package/lib/survey/questions/ImageQuestion.d.ts +26 -0
- package/lib/survey/questions/ImageQuestion.d.ts.map +1 -0
- package/lib/survey/questions/ImageQuestion.js +24 -0
- package/lib/survey/questions/ImageQuestion.js.map +1 -0
- package/lib/survey/questions/MatrixCell.d.ts +45 -0
- package/lib/survey/questions/MatrixCell.d.ts.map +1 -0
- package/lib/survey/questions/MatrixCell.js +54 -0
- package/lib/survey/questions/MatrixCell.js.map +1 -0
- package/lib/survey/questions/MatrixDropdownQuestion.d.ts +29 -0
- package/lib/survey/questions/MatrixDropdownQuestion.d.ts.map +1 -0
- package/lib/survey/questions/MatrixDropdownQuestion.js +42 -0
- package/lib/survey/questions/MatrixDropdownQuestion.js.map +1 -0
- package/lib/survey/questions/MatrixDynamicQuestion.d.ts +26 -0
- package/lib/survey/questions/MatrixDynamicQuestion.d.ts.map +1 -0
- package/lib/survey/questions/MatrixDynamicQuestion.js +52 -0
- package/lib/survey/questions/MatrixDynamicQuestion.js.map +1 -0
- package/lib/survey/questions/MatrixQuestion.d.ts +38 -0
- package/lib/survey/questions/MatrixQuestion.d.ts.map +1 -0
- package/lib/survey/questions/MatrixQuestion.js +64 -0
- package/lib/survey/questions/MatrixQuestion.js.map +1 -0
- package/lib/survey/questions/MultiTextQuestion.d.ts +19 -0
- package/lib/survey/questions/MultiTextQuestion.d.ts.map +1 -0
- package/lib/survey/questions/MultiTextQuestion.js +64 -0
- package/lib/survey/questions/MultiTextQuestion.js.map +1 -0
- package/lib/survey/questions/MultipleChoiceQuestion.d.ts +25 -0
- package/lib/survey/questions/MultipleChoiceQuestion.d.ts.map +1 -0
- package/lib/survey/questions/MultipleChoiceQuestion.js +111 -0
- package/lib/survey/questions/MultipleChoiceQuestion.js.map +1 -0
- package/lib/survey/questions/NPSQuestion.d.ts +18 -0
- package/lib/survey/questions/NPSQuestion.d.ts.map +1 -0
- package/lib/survey/questions/NPSQuestion.js +62 -0
- package/lib/survey/questions/NPSQuestion.js.map +1 -0
- package/lib/survey/questions/PanelDynamicQuestion.d.ts +50 -0
- package/lib/survey/questions/PanelDynamicQuestion.d.ts.map +1 -0
- package/lib/survey/questions/PanelDynamicQuestion.js +62 -0
- package/lib/survey/questions/PanelDynamicQuestion.js.map +1 -0
- package/lib/survey/questions/RankingQuestion.d.ts +34 -0
- package/lib/survey/questions/RankingQuestion.d.ts.map +1 -0
- package/lib/survey/questions/RankingQuestion.js +85 -0
- package/lib/survey/questions/RankingQuestion.js.map +1 -0
- package/lib/survey/questions/RatingQuestion.d.ts +20 -0
- package/lib/survey/questions/RatingQuestion.d.ts.map +1 -0
- package/lib/survey/questions/RatingQuestion.js +53 -0
- package/lib/survey/questions/RatingQuestion.js.map +1 -0
- package/lib/survey/questions/TextQuestion.d.ts +17 -0
- package/lib/survey/questions/TextQuestion.d.ts.map +1 -0
- package/lib/survey/questions/TextQuestion.js +46 -0
- package/lib/survey/questions/TextQuestion.js.map +1 -0
- package/lib/survey/styleContract.d.ts +230 -0
- package/lib/survey/styleContract.d.ts.map +1 -0
- package/lib/survey/styleContract.js +365 -0
- package/lib/survey/styleContract.js.map +1 -0
- package/lib/survey/themePalette.d.ts +56 -0
- package/lib/survey/themePalette.d.ts.map +1 -0
- package/lib/survey/themePalette.js +63 -0
- package/lib/survey/themePalette.js.map +1 -0
- package/lib/survey/translationLookup.d.ts +4 -0
- package/lib/survey/translationLookup.d.ts.map +1 -0
- package/lib/survey/translationLookup.js +62 -0
- package/lib/survey/translationLookup.js.map +1 -0
- package/lib/survey/validate.d.ts +3 -0
- package/lib/survey/validate.d.ts.map +1 -0
- package/lib/survey/validate.js +159 -0
- package/lib/survey/validate.js.map +1 -0
- package/lib/survey/variablesResolver.d.ts +10 -0
- package/lib/survey/variablesResolver.d.ts.map +1 -0
- package/lib/survey/variablesResolver.js +107 -0
- package/lib/survey/variablesResolver.js.map +1 -0
- package/lib/survey/voiceParsers.d.ts +47 -0
- package/lib/survey/voiceParsers.d.ts.map +1 -0
- package/lib/survey/voiceParsers.js +310 -0
- package/lib/survey/voiceParsers.js.map +1 -0
- package/lib/types.d.ts +349 -0
- package/lib/types.d.ts.map +1 -0
- package/lib/types.js +20 -0
- package/lib/types.js.map +1 -0
- package/metro.js +55 -0
- package/package.json +78 -0
|
@@ -0,0 +1,432 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.loadTriggerConfigs = loadTriggerConfigs;
|
|
37
|
+
exports.registerSurveyTrigger = registerSurveyTrigger;
|
|
38
|
+
exports.unregisterSurveyTrigger = unregisterSurveyTrigger;
|
|
39
|
+
exports.onScreenView = onScreenView;
|
|
40
|
+
exports.onEventTracked = onEventTracked;
|
|
41
|
+
exports.clearTriggerState = clearTriggerState;
|
|
42
|
+
const network_1 = require("./network");
|
|
43
|
+
const storage = __importStar(require("./storage"));
|
|
44
|
+
const STORAGE_KEY = '@cxpinsight:triggerConfigs';
|
|
45
|
+
const FIRED_KEY = '@cxpinsight:triggersFired';
|
|
46
|
+
let configs = [];
|
|
47
|
+
let configsLoaded = false;
|
|
48
|
+
// Last screen the SDK saw. Used to gate event_match triggers that carry
|
|
49
|
+
// a screenName — a scroll def authored on "Profile" MUST NOT fire on
|
|
50
|
+
// "Dashboard" just because both screens emit scroll events. Updated by
|
|
51
|
+
// onScreenView(); '' means "no screen seen yet" and any-screen triggers
|
|
52
|
+
// (screenName empty on the trigger) still fire.
|
|
53
|
+
let currentScreen = '';
|
|
54
|
+
let surveyTrigger = null;
|
|
55
|
+
let debugMode = false;
|
|
56
|
+
let appOpenCount = 0;
|
|
57
|
+
let sessionStartTime = 0;
|
|
58
|
+
// Queue of events that arrived before configs were loaded
|
|
59
|
+
let pendingScreenViews = [];
|
|
60
|
+
let pendingEvents = [];
|
|
61
|
+
function log(...args) {
|
|
62
|
+
if (debugMode) {
|
|
63
|
+
console.log('[CXPinsight:Triggers]', ...args);
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
/** Fetch trigger configs from server and cache locally. */
|
|
67
|
+
async function loadTriggerConfigs(applicationId, debug) {
|
|
68
|
+
debugMode = debug ?? false;
|
|
69
|
+
sessionStartTime = Date.now();
|
|
70
|
+
// Track app opens
|
|
71
|
+
const savedCount = await storage.get('@cxpinsight:appOpenCount');
|
|
72
|
+
appOpenCount = (savedCount ?? 0) + 1;
|
|
73
|
+
await storage.set('@cxpinsight:appOpenCount', appOpenCount);
|
|
74
|
+
try {
|
|
75
|
+
const scopeQs = `applicationId=${encodeURIComponent(applicationId)}`;
|
|
76
|
+
const result = await (0, network_1.sdkFetch)('GET', `/api/engagement/setup/mobile-configs/sdk?${scopeQs}`);
|
|
77
|
+
if (result.success && result.data) {
|
|
78
|
+
const data = result.data.data ?? result.data;
|
|
79
|
+
configs = Array.isArray(data) ? data : [];
|
|
80
|
+
// Replace cache with fresh server data (removes stale/deactivated configs)
|
|
81
|
+
await storage.set(STORAGE_KEY, configs);
|
|
82
|
+
// Also clear fired state for configs that no longer exist
|
|
83
|
+
const activeIds = new Set(configs.map(c => c.configId));
|
|
84
|
+
const allFired = (await storage.get(FIRED_KEY)) ?? {};
|
|
85
|
+
const cleaned = {};
|
|
86
|
+
for (const [id, state] of Object.entries(allFired)) {
|
|
87
|
+
if (activeIds.has(id))
|
|
88
|
+
cleaned[id] = state;
|
|
89
|
+
}
|
|
90
|
+
await storage.set(FIRED_KEY, cleaned);
|
|
91
|
+
log(`Loaded ${configs.length} trigger configs from server`);
|
|
92
|
+
if (configs.length === 0) {
|
|
93
|
+
console.log('[CXPinsight:Triggers] Server returned 0 trigger configs for scope:', applicationId);
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
else {
|
|
97
|
+
// Fall back to cached configs
|
|
98
|
+
console.warn('[CXPinsight:Triggers] Failed to load configs from server:', result.error || 'no data');
|
|
99
|
+
const cached = await storage.get(STORAGE_KEY);
|
|
100
|
+
configs = cached ?? [];
|
|
101
|
+
log(`Using ${configs.length} cached trigger configs`);
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
catch (err) {
|
|
105
|
+
console.warn('[CXPinsight:Triggers] Network error loading configs:', err);
|
|
106
|
+
const cached = await storage.get(STORAGE_KEY);
|
|
107
|
+
configs = cached ?? [];
|
|
108
|
+
log('Network error, using cached configs');
|
|
109
|
+
}
|
|
110
|
+
configsLoaded = true;
|
|
111
|
+
// Replay any events that arrived before configs were loaded
|
|
112
|
+
const pendingScreens = [...pendingScreenViews];
|
|
113
|
+
const pendingEvts = [...pendingEvents];
|
|
114
|
+
pendingScreenViews = [];
|
|
115
|
+
pendingEvents = [];
|
|
116
|
+
for (const screen of pendingScreens) {
|
|
117
|
+
log(`Replaying pending screen view: ${screen}`);
|
|
118
|
+
await onScreenView(screen);
|
|
119
|
+
}
|
|
120
|
+
for (const evt of pendingEvts) {
|
|
121
|
+
log(`Replaying pending event: ${evt.eventName}`);
|
|
122
|
+
await onEventTracked(evt.eventName, evt.eventData);
|
|
123
|
+
}
|
|
124
|
+
// Check for app_lifecycle triggers (app_open / first_open)
|
|
125
|
+
await checkLifecycleTriggers();
|
|
126
|
+
}
|
|
127
|
+
/** Register the function used to present surveys */
|
|
128
|
+
function registerSurveyTrigger(fn) {
|
|
129
|
+
surveyTrigger = fn;
|
|
130
|
+
}
|
|
131
|
+
/** Unregister */
|
|
132
|
+
function unregisterSurveyTrigger() {
|
|
133
|
+
surveyTrigger = null;
|
|
134
|
+
}
|
|
135
|
+
/** Called when a screen is viewed — checks for matching screen_view triggers */
|
|
136
|
+
async function onScreenView(screenName) {
|
|
137
|
+
currentScreen = screenName || '';
|
|
138
|
+
if (!configsLoaded) {
|
|
139
|
+
log(`Configs not loaded yet, queuing screen view: ${screenName}`);
|
|
140
|
+
pendingScreenViews.push(screenName);
|
|
141
|
+
return;
|
|
142
|
+
}
|
|
143
|
+
const matching = configs.filter(c => c.triggerType === 'screen_view' && c.screenName === screenName);
|
|
144
|
+
for (const config of matching) {
|
|
145
|
+
await evaluateAndFire(config);
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
/** Evaluate a definition's attribute conditions against a tracked event's data.
|
|
149
|
+
* `logic` selects OR ('any' — at least one condition must hold) vs AND ('all'
|
|
150
|
+
* — every condition must hold; default). Mirrors the server's evalCondition
|
|
151
|
+
* (lib/eventSignature.js). Compares as strings for eq/neq; numeric for gt/lt. */
|
|
152
|
+
function matchAttributeConditions(data, conds, logic = 'all') {
|
|
153
|
+
const str = (v) => (v == null ? '' : String(v));
|
|
154
|
+
const mode = logic === 'any' ? 'any' : 'all';
|
|
155
|
+
for (const c of conds) {
|
|
156
|
+
const actual = data ? data[c.attr] : undefined;
|
|
157
|
+
const op = c.op || 'eq';
|
|
158
|
+
let ok = false;
|
|
159
|
+
switch (op) {
|
|
160
|
+
case 'eq':
|
|
161
|
+
ok = str(actual) === str(c.value);
|
|
162
|
+
break;
|
|
163
|
+
case 'neq':
|
|
164
|
+
ok = str(actual) !== str(c.value);
|
|
165
|
+
break;
|
|
166
|
+
case 'contains':
|
|
167
|
+
ok = str(actual).toLowerCase().includes(str(c.value).toLowerCase());
|
|
168
|
+
break;
|
|
169
|
+
case 'gt':
|
|
170
|
+
ok = Number(actual) > Number(c.value);
|
|
171
|
+
break;
|
|
172
|
+
case 'lt':
|
|
173
|
+
ok = Number(actual) < Number(c.value);
|
|
174
|
+
break;
|
|
175
|
+
case 'gte':
|
|
176
|
+
ok = Number(actual) >= Number(c.value);
|
|
177
|
+
break;
|
|
178
|
+
case 'lte':
|
|
179
|
+
ok = Number(actual) <= Number(c.value);
|
|
180
|
+
break;
|
|
181
|
+
case 'exists':
|
|
182
|
+
ok = actual != null && actual !== '';
|
|
183
|
+
break;
|
|
184
|
+
default: ok = str(actual) === str(c.value);
|
|
185
|
+
}
|
|
186
|
+
if (ok && mode === 'any')
|
|
187
|
+
return true; // OR: one match short-circuits true
|
|
188
|
+
if (!ok && mode === 'all')
|
|
189
|
+
return false; // AND: any failure short-circuits false
|
|
190
|
+
}
|
|
191
|
+
return mode === 'all'; // AND: all passed. OR: none passed → false.
|
|
192
|
+
}
|
|
193
|
+
/** Called when a custom event is tracked — checks for matching event_match triggers.
|
|
194
|
+
* `context` is the ATTRIBUTE CONTEXT (bare event keys plus the namespaced bag
|
|
195
|
+
* event/device/user/session) built by track(). A trigger's `matchConditions` fire
|
|
196
|
+
* the survey ONLY if the context satisfies them — now over any attribute, e.g.
|
|
197
|
+
* "scroll to 100 on Profile" AND "user.plan == pro". The geo and location
|
|
198
|
+
* namespaces are server-tier (P3) and skipped here so a geo rule isn't silently
|
|
199
|
+
* hidden before the server enforces it. */
|
|
200
|
+
async function onEventTracked(eventName, context) {
|
|
201
|
+
if (!configsLoaded) {
|
|
202
|
+
log(`Configs not loaded yet, queuing event: ${eventName}`);
|
|
203
|
+
pendingEvents.push({ eventName, eventData: context });
|
|
204
|
+
return;
|
|
205
|
+
}
|
|
206
|
+
const matching = configs.filter((c) => {
|
|
207
|
+
if (c.triggerType !== 'event_match' || c.eventName !== eventName)
|
|
208
|
+
return false;
|
|
209
|
+
// Screen constraint: if the def was authored on a specific screen, the
|
|
210
|
+
// trigger only fires when the user is on that screen. Empty screenName
|
|
211
|
+
// on the trigger = "any screen" (author didn't scope it).
|
|
212
|
+
if (c.screenName && c.screenName !== currentScreen)
|
|
213
|
+
return false;
|
|
214
|
+
return true;
|
|
215
|
+
});
|
|
216
|
+
for (const config of matching) {
|
|
217
|
+
if (config.matchConditions && config.matchConditions.length) {
|
|
218
|
+
// Evaluate only what the device can know now; defer geo.*/location.* to P3.
|
|
219
|
+
const onDevice = config.matchConditions.filter((c) => {
|
|
220
|
+
const ns = String(c.attr || '').split('.')[0];
|
|
221
|
+
return ns !== 'geo' && ns !== 'location';
|
|
222
|
+
});
|
|
223
|
+
if (onDevice.length && !matchAttributeConditions(context || {}, onDevice, config.matchLogic || 'all')) {
|
|
224
|
+
log(`Conditions not met for ${eventName} → skipping survey ${config.linkedSurveyId}`);
|
|
225
|
+
continue;
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
await evaluateAndFire(config);
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
/** Check app_lifecycle triggers (called on init) */
|
|
232
|
+
async function checkLifecycleTriggers() {
|
|
233
|
+
const lifecycleConfigs = configs.filter(c => c.triggerType === 'app_lifecycle');
|
|
234
|
+
for (const config of lifecycleConfigs) {
|
|
235
|
+
if (config.lifecycleEvent === 'first_open' && appOpenCount !== 1)
|
|
236
|
+
continue;
|
|
237
|
+
if (config.lifecycleEvent === 'app_open' || config.lifecycleEvent === 'app_foreground') {
|
|
238
|
+
await evaluateAndFire(config);
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
async function advanceSequenceState(seq) {
|
|
243
|
+
const storageKey = `cxp:seq:${seq.definitionId}`;
|
|
244
|
+
const now = Date.now();
|
|
245
|
+
const winMs = Math.max(1, Number(seq.windowSeconds) || 1800) * 1000;
|
|
246
|
+
let s = null;
|
|
247
|
+
try {
|
|
248
|
+
s = (await storage.get(storageKey)) ?? null;
|
|
249
|
+
}
|
|
250
|
+
catch {
|
|
251
|
+
s = null;
|
|
252
|
+
}
|
|
253
|
+
// Expire stale state — first hit older than the window means the user
|
|
254
|
+
// dropped out mid-flow; discard and treat this as a fresh attempt.
|
|
255
|
+
if (s && s.startedAt && (now - s.startedAt) > winMs)
|
|
256
|
+
s = null;
|
|
257
|
+
if (!s)
|
|
258
|
+
s = { hits: [], startedAt: now };
|
|
259
|
+
const idx = Number(seq.sequenceIndex);
|
|
260
|
+
const total = Number(seq.sequenceTotal);
|
|
261
|
+
if (seq.mode === 'and-ordered') {
|
|
262
|
+
// Ordered: next expected index equals s.hits.length. Out-of-order
|
|
263
|
+
// hits abandon the current attempt (or restart if this hit is index 0);
|
|
264
|
+
// idempotent repeats of the last index are ignored.
|
|
265
|
+
const expected = s.hits.length;
|
|
266
|
+
if (idx === expected) {
|
|
267
|
+
s.hits.push({ index: idx, at: now });
|
|
268
|
+
}
|
|
269
|
+
else if (s.hits.length > 0 && idx === s.hits[s.hits.length - 1].index) {
|
|
270
|
+
// no-op — same signature fired twice, sequence unchanged
|
|
271
|
+
}
|
|
272
|
+
else {
|
|
273
|
+
s = idx === 0 ? { hits: [{ index: 0, at: now }], startedAt: now } : { hits: [], startedAt: now };
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
else {
|
|
277
|
+
// and-any-order: dedupe hits by index so a user re-firing signature 0
|
|
278
|
+
// three times doesn't count as three separate contributions.
|
|
279
|
+
const seen = s.hits.some((h) => h.index === idx);
|
|
280
|
+
if (!seen)
|
|
281
|
+
s.hits.push({ index: idx, at: now });
|
|
282
|
+
}
|
|
283
|
+
const complete = s.hits.length >= total;
|
|
284
|
+
if (complete) {
|
|
285
|
+
try {
|
|
286
|
+
await storage.remove(storageKey);
|
|
287
|
+
}
|
|
288
|
+
catch { /* ignore */ }
|
|
289
|
+
return true;
|
|
290
|
+
}
|
|
291
|
+
try {
|
|
292
|
+
await storage.set(storageKey, s);
|
|
293
|
+
}
|
|
294
|
+
catch { /* ignore */ }
|
|
295
|
+
return false;
|
|
296
|
+
}
|
|
297
|
+
/** Evaluate conditions and fire the trigger if all pass */
|
|
298
|
+
async function evaluateAndFire(config) {
|
|
299
|
+
// Skip configs without a linked survey
|
|
300
|
+
if (!config.linkedSurveyId) {
|
|
301
|
+
log(`Skipping ${config.configId}: no linkedSurveyId`);
|
|
302
|
+
return;
|
|
303
|
+
}
|
|
304
|
+
// Multi-event sequence gate. When the def combines two or more events
|
|
305
|
+
// with an AND mode, THIS trigger is one signature of a group. The
|
|
306
|
+
// sequence advancer records this hit and only returns true once every
|
|
307
|
+
// sequenceTotal signatures have fired within windowSeconds (ordered
|
|
308
|
+
// mode also requires strict sequenceIndex order). See advanceSequenceState
|
|
309
|
+
// for the state shape + reset rules — kept in lockstep with the web
|
|
310
|
+
// SDK's implementation in services/unified-sdk/src/engagement.js.
|
|
311
|
+
if (config.sequence && config.sequence.mode !== 'or' && config.sequence.sequenceTotal > 1) {
|
|
312
|
+
const complete = await advanceSequenceState(config.sequence);
|
|
313
|
+
if (!complete) {
|
|
314
|
+
log(`Sequence partial for def ${config.sequence.definitionId} (${config.sequence.mode}) — waiting`);
|
|
315
|
+
return;
|
|
316
|
+
}
|
|
317
|
+
log(`Sequence COMPLETE for def ${config.sequence.definitionId} — proceeding to fire`);
|
|
318
|
+
}
|
|
319
|
+
const { conditions, displayPreferences } = config;
|
|
320
|
+
// Check platform condition
|
|
321
|
+
if (conditions?.platforms?.length) {
|
|
322
|
+
const { Platform } = require('react-native');
|
|
323
|
+
const currentPlatform = Platform.OS; // 'ios' or 'android'
|
|
324
|
+
if (!conditions.platforms.includes(currentPlatform)) {
|
|
325
|
+
log(`Skipping ${config.configId}: platform ${currentPlatform} not in ${conditions.platforms}`);
|
|
326
|
+
return;
|
|
327
|
+
}
|
|
328
|
+
}
|
|
329
|
+
// Check minAppOpens
|
|
330
|
+
if (conditions?.minAppOpens && appOpenCount < conditions.minAppOpens) {
|
|
331
|
+
log(`Skipping ${config.configId}: appOpens ${appOpenCount} < ${conditions.minAppOpens}`);
|
|
332
|
+
return;
|
|
333
|
+
}
|
|
334
|
+
// Check minSessionDuration
|
|
335
|
+
if (conditions?.minSessionDuration) {
|
|
336
|
+
const elapsed = (Date.now() - sessionStartTime) / 1000;
|
|
337
|
+
if (elapsed < conditions.minSessionDuration) {
|
|
338
|
+
log(`Skipping ${config.configId}: session ${elapsed}s < ${conditions.minSessionDuration}s`);
|
|
339
|
+
return;
|
|
340
|
+
}
|
|
341
|
+
}
|
|
342
|
+
// Check user sampling
|
|
343
|
+
if (displayPreferences?.userSamplingPercent != null && displayPreferences.userSamplingPercent < 100) {
|
|
344
|
+
const roll = Math.random() * 100;
|
|
345
|
+
if (roll > displayPreferences.userSamplingPercent) {
|
|
346
|
+
log(`Skipping ${config.configId}: sampling roll ${roll.toFixed(1)} > ${displayPreferences.userSamplingPercent}%`);
|
|
347
|
+
return;
|
|
348
|
+
}
|
|
349
|
+
}
|
|
350
|
+
// Check frequency cap (has this config already fired too many times?)
|
|
351
|
+
const firedState = await getFiredState(config.configId);
|
|
352
|
+
if (displayPreferences) {
|
|
353
|
+
const { frequency, maxImpressions, cooldownDays } = displayPreferences;
|
|
354
|
+
if (maxImpressions && maxImpressions > 0 && firedState.count >= maxImpressions) {
|
|
355
|
+
log(`Skipping ${config.configId}: max impressions reached (${firedState.count}/${maxImpressions})`);
|
|
356
|
+
return;
|
|
357
|
+
}
|
|
358
|
+
if (firedState.lastFiredAt) {
|
|
359
|
+
const daysSince = (Date.now() - firedState.lastFiredAt) / (24 * 60 * 60 * 1000);
|
|
360
|
+
if (cooldownDays && daysSince < cooldownDays) {
|
|
361
|
+
log(`Skipping ${config.configId}: cooldown (${daysSince.toFixed(1)} < ${cooldownDays} days)`);
|
|
362
|
+
return;
|
|
363
|
+
}
|
|
364
|
+
switch (frequency) {
|
|
365
|
+
case 'once':
|
|
366
|
+
if (firedState.count > 0)
|
|
367
|
+
return;
|
|
368
|
+
break;
|
|
369
|
+
case 'daily':
|
|
370
|
+
if (daysSince < 1)
|
|
371
|
+
return;
|
|
372
|
+
break;
|
|
373
|
+
case 'weekly':
|
|
374
|
+
if (daysSince < 7)
|
|
375
|
+
return;
|
|
376
|
+
break;
|
|
377
|
+
case 'monthly':
|
|
378
|
+
if (daysSince < 30)
|
|
379
|
+
return;
|
|
380
|
+
break;
|
|
381
|
+
case 'always':
|
|
382
|
+
break;
|
|
383
|
+
}
|
|
384
|
+
}
|
|
385
|
+
}
|
|
386
|
+
// All conditions passed — fire with optional delay
|
|
387
|
+
const delay = (conditions?.delaySeconds ?? 0) * 1000;
|
|
388
|
+
const fire = async () => {
|
|
389
|
+
if (!surveyTrigger || !config.linkedSurveyId) {
|
|
390
|
+
log(`Cannot fire ${config.configId}: no survey trigger registered or no linkedSurveyId`);
|
|
391
|
+
console.warn('[CXPinsight:Triggers] Cannot fire:', {
|
|
392
|
+
hasSurveyTrigger: !!surveyTrigger,
|
|
393
|
+
linkedSurveyId: config.linkedSurveyId,
|
|
394
|
+
});
|
|
395
|
+
return;
|
|
396
|
+
}
|
|
397
|
+
log(`Firing trigger ${config.configId} → survey ${config.linkedSurveyId}`);
|
|
398
|
+
try {
|
|
399
|
+
// surveyTrigger is actually async (presentSurvey) — await it
|
|
400
|
+
await surveyTrigger(config.linkedSurveyId, { skipFrequencyCap: true });
|
|
401
|
+
}
|
|
402
|
+
catch (err) {
|
|
403
|
+
console.error('[CXPinsight:Triggers] Survey trigger error:', err);
|
|
404
|
+
}
|
|
405
|
+
await recordFired(config.configId);
|
|
406
|
+
};
|
|
407
|
+
if (delay > 0) {
|
|
408
|
+
setTimeout(fire, delay);
|
|
409
|
+
}
|
|
410
|
+
else {
|
|
411
|
+
await fire();
|
|
412
|
+
}
|
|
413
|
+
}
|
|
414
|
+
async function getFiredState(configId) {
|
|
415
|
+
const all = await storage.get(FIRED_KEY);
|
|
416
|
+
return all?.[configId] ?? { count: 0, lastFiredAt: null };
|
|
417
|
+
}
|
|
418
|
+
async function recordFired(configId) {
|
|
419
|
+
const all = (await storage.get(FIRED_KEY)) ?? {};
|
|
420
|
+
const prev = all[configId] ?? { count: 0, lastFiredAt: null };
|
|
421
|
+
all[configId] = { count: prev.count + 1, lastFiredAt: Date.now() };
|
|
422
|
+
await storage.set(FIRED_KEY, all);
|
|
423
|
+
}
|
|
424
|
+
/** Clear all trigger state (called on SDK reset) */
|
|
425
|
+
async function clearTriggerState() {
|
|
426
|
+
configs = [];
|
|
427
|
+
configsLoaded = false;
|
|
428
|
+
pendingScreenViews = [];
|
|
429
|
+
pendingEvents = [];
|
|
430
|
+
await storage.multiRemove([STORAGE_KEY, FIRED_KEY, '@cxpinsight:appOpenCount']);
|
|
431
|
+
}
|
|
432
|
+
//# sourceMappingURL=triggerEngine.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"triggerEngine.js","sourceRoot":"","sources":["../../src/core/triggerEngine.ts"],"names":[],"mappings":"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"}
|
package/lib/index.d.ts
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export { CXPinsight } from './CXPinsight';
|
|
2
|
+
export { CXPinsightProvider } from './CXPinsightProvider';
|
|
3
|
+
export type { CXPinsightConfig, UserIdentity, CXPinsightCallbacks, FunnelStepOptions, ExperimentOptions, ConversionOptions, } from './types';
|
|
4
|
+
export { useCXPElement } from './setup/useCXPElement';
|
|
5
|
+
export type { ElementInfo, StoredElementIdentifier } from './setup/ElementIdentifier';
|
|
6
|
+
export type { SetupSessionState } from './setup/SetupController';
|
|
7
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC1D,YAAY,EACV,gBAAgB,EAChB,YAAY,EACZ,mBAAmB,EACnB,iBAAiB,EACjB,iBAAiB,EACjB,iBAAiB,GAClB,MAAM,SAAS,CAAC;AAGjB,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AACtD,YAAY,EAAE,WAAW,EAAE,uBAAuB,EAAE,MAAM,2BAA2B,CAAC;AACtF,YAAY,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC"}
|
package/lib/index.js
ADDED
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.useCXPElement = exports.CXPinsightProvider = exports.CXPinsight = void 0;
|
|
4
|
+
var CXPinsight_1 = require("./CXPinsight");
|
|
5
|
+
Object.defineProperty(exports, "CXPinsight", { enumerable: true, get: function () { return CXPinsight_1.CXPinsight; } });
|
|
6
|
+
var CXPinsightProvider_1 = require("./CXPinsightProvider");
|
|
7
|
+
Object.defineProperty(exports, "CXPinsightProvider", { enumerable: true, get: function () { return CXPinsightProvider_1.CXPinsightProvider; } });
|
|
8
|
+
// Setup mode exports
|
|
9
|
+
var useCXPElement_1 = require("./setup/useCXPElement");
|
|
10
|
+
Object.defineProperty(exports, "useCXPElement", { enumerable: true, get: function () { return useCXPElement_1.useCXPElement; } });
|
|
11
|
+
//# sourceMappingURL=index.js.map
|
package/lib/index.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AAAA,2CAA0C;AAAjC,wGAAA,UAAU,OAAA;AACnB,2DAA0D;AAAjD,wHAAA,kBAAkB,OAAA;AAU3B,qBAAqB;AACrB,uDAAsD;AAA7C,8GAAA,aAAa,OAAA"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { View, type PressableProps } from 'react-native';
|
|
3
|
+
/**
|
|
4
|
+
* Instrumented Pressable — drop-in replacement.
|
|
5
|
+
*/
|
|
6
|
+
declare const Pressable: React.ForwardRefExoticComponent<PressableProps & React.RefAttributes<View>>;
|
|
7
|
+
export default Pressable;
|
|
8
|
+
export { Pressable };
|
|
9
|
+
//# sourceMappingURL=Pressable.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Pressable.d.ts","sourceRoot":"","sources":["../../src/instrumented/Pressable.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAqB,MAAM,OAAO,CAAC;AAC1C,OAAO,EAEL,IAAI,EACJ,KAAK,cAAc,EACpB,MAAM,cAAc,CAAC;AAGtB;;GAEG;AACH,QAAA,MAAM,SAAS,6EAiDd,CAAC;eAIa,SAAS;AACxB,OAAO,EAAE,SAAS,EAAE,CAAC"}
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.Pressable = void 0;
|
|
37
|
+
const jsx_runtime_1 = require("react/jsx-runtime");
|
|
38
|
+
const react_1 = __importStar(require("react"));
|
|
39
|
+
const react_native_1 = require("react-native");
|
|
40
|
+
const interactionObserver_1 = require("./interactionObserver");
|
|
41
|
+
/**
|
|
42
|
+
* Instrumented Pressable — drop-in replacement.
|
|
43
|
+
*/
|
|
44
|
+
const Pressable = (0, react_1.forwardRef)((props, ref) => {
|
|
45
|
+
const { onPress, onLongPress, children, ...rest } = props;
|
|
46
|
+
const handlePress = react_1.default.useCallback((e) => {
|
|
47
|
+
(0, interactionObserver_1.notifyInteraction)({
|
|
48
|
+
testID: rest.testID,
|
|
49
|
+
accessibilityLabel: rest.accessibilityLabel,
|
|
50
|
+
nativeID: rest.nativeID,
|
|
51
|
+
accessibilityRole: rest.accessibilityRole,
|
|
52
|
+
elementType: 'button',
|
|
53
|
+
text: typeof children === 'function' ? undefined : extractText(children),
|
|
54
|
+
interactive: true,
|
|
55
|
+
interactionType: 'tap',
|
|
56
|
+
});
|
|
57
|
+
onPress?.(e);
|
|
58
|
+
}, [onPress, rest.testID, rest.accessibilityLabel, rest.nativeID, rest.accessibilityRole, children]);
|
|
59
|
+
const handleLongPress = react_1.default.useCallback((e) => {
|
|
60
|
+
(0, interactionObserver_1.notifyInteraction)({
|
|
61
|
+
testID: rest.testID,
|
|
62
|
+
accessibilityLabel: rest.accessibilityLabel,
|
|
63
|
+
nativeID: rest.nativeID,
|
|
64
|
+
accessibilityRole: rest.accessibilityRole,
|
|
65
|
+
elementType: 'button',
|
|
66
|
+
text: typeof children === 'function' ? undefined : extractText(children),
|
|
67
|
+
interactive: true,
|
|
68
|
+
interactionType: 'long_press',
|
|
69
|
+
});
|
|
70
|
+
onLongPress?.(e);
|
|
71
|
+
}, [onLongPress, rest.testID, rest.accessibilityLabel, rest.nativeID, rest.accessibilityRole, children]);
|
|
72
|
+
return ((0, jsx_runtime_1.jsx)(react_native_1.Pressable, { ref: ref, ...rest, onPress: onPress ? handlePress : undefined, onLongPress: onLongPress ? handleLongPress : undefined, children: children }));
|
|
73
|
+
});
|
|
74
|
+
exports.Pressable = Pressable;
|
|
75
|
+
Pressable.displayName = 'Pressable';
|
|
76
|
+
exports.default = Pressable;
|
|
77
|
+
function extractText(children) {
|
|
78
|
+
if (typeof children === 'string')
|
|
79
|
+
return children.slice(0, 80);
|
|
80
|
+
if (typeof children === 'number')
|
|
81
|
+
return String(children);
|
|
82
|
+
if (typeof children === 'function')
|
|
83
|
+
return ''; // Pressable render function
|
|
84
|
+
if (Array.isArray(children)) {
|
|
85
|
+
for (const child of children) {
|
|
86
|
+
const t = extractText(child);
|
|
87
|
+
if (t)
|
|
88
|
+
return t;
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
if (children && typeof children === 'object' && 'props' in children) {
|
|
92
|
+
return extractText(children.props?.children);
|
|
93
|
+
}
|
|
94
|
+
return '';
|
|
95
|
+
}
|
|
96
|
+
//# sourceMappingURL=Pressable.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Pressable.js","sourceRoot":"","sources":["../../src/instrumented/Pressable.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { ScrollView as RNScrollView, type ScrollViewProps } from 'react-native';
|
|
3
|
+
declare const ScrollView: React.ForwardRefExoticComponent<ScrollViewProps & React.RefAttributes<RNScrollView>>;
|
|
4
|
+
export default ScrollView;
|
|
5
|
+
export { ScrollView };
|
|
6
|
+
//# sourceMappingURL=ScrollView.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ScrollView.d.ts","sourceRoot":"","sources":["../../src/instrumented/ScrollView.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAqB,MAAM,OAAO,CAAC;AAC1C,OAAO,EACL,UAAU,IAAI,YAAY,EAC1B,KAAK,eAAe,EAGrB,MAAM,cAAc,CAAC;AAwBtB,QAAA,MAAM,UAAU,sFAiDd,CAAC;eAIY,UAAU;AACzB,OAAO,EAAE,UAAU,EAAE,CAAC"}
|