@revrag-ai/embed-react-native 1.0.16 → 1.0.18

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 (123) hide show
  1. package/README.md +6 -108
  2. package/android/build.gradle +3 -3
  3. package/dist/commonjs/api/api.js +6 -5
  4. package/dist/commonjs/api/api.js.map +1 -1
  5. package/dist/commonjs/components/Embed/EmbedButton.js +138 -345
  6. package/dist/commonjs/components/Embed/EmbedButton.js.map +1 -1
  7. package/dist/commonjs/components/Embed/EmbedVoice.js +16 -4
  8. package/dist/commonjs/components/Embed/EmbedVoice.js.map +1 -1
  9. package/dist/commonjs/context/EmbedProvider.js +638 -0
  10. package/dist/commonjs/context/EmbedProvider.js.map +1 -0
  11. package/dist/commonjs/events/agent-event-emitter.js +114 -0
  12. package/dist/commonjs/events/agent-event-emitter.js.map +1 -0
  13. package/dist/commonjs/events/embed.event.js +93 -79
  14. package/dist/commonjs/events/embed.event.js.map +1 -1
  15. package/dist/commonjs/events/embed.types.js +32 -0
  16. package/dist/commonjs/events/embed.types.js.map +1 -0
  17. package/dist/commonjs/events/embed.validators.js +36 -0
  18. package/dist/commonjs/events/embed.validators.js.map +1 -0
  19. package/dist/commonjs/events/index.js +47 -0
  20. package/dist/commonjs/events/index.js.map +1 -0
  21. package/dist/commonjs/hooks/EmbedButton.animations.js +181 -0
  22. package/dist/commonjs/hooks/EmbedButton.animations.js.map +1 -0
  23. package/dist/commonjs/hooks/EmbedButton.helpers.js +90 -0
  24. package/dist/commonjs/hooks/EmbedButton.helpers.js.map +1 -0
  25. package/dist/commonjs/hooks/EmbedButton.hooks.js +165 -0
  26. package/dist/commonjs/hooks/EmbedButton.hooks.js.map +1 -0
  27. package/dist/commonjs/hooks/initialize.js +65 -25
  28. package/dist/commonjs/hooks/initialize.js.map +1 -1
  29. package/dist/commonjs/hooks/voiceagent.js +1 -18
  30. package/dist/commonjs/hooks/voiceagent.js.map +1 -1
  31. package/dist/commonjs/index.js +16 -1
  32. package/dist/commonjs/index.js.map +1 -1
  33. package/dist/commonjs/index.types.js +1 -2
  34. package/dist/commonjs/index.types.js.map +1 -1
  35. package/dist/commonjs/utils/constant.js +99 -0
  36. package/dist/commonjs/utils/constant.js.map +1 -0
  37. package/dist/commonjs/utils/permision.js +48 -1
  38. package/dist/commonjs/utils/permision.js.map +1 -1
  39. package/dist/commonjs/utils/reanimated.helper.js +2 -3
  40. package/dist/commonjs/utils/reanimated.helper.js.map +1 -1
  41. package/dist/module/api/api.js +6 -6
  42. package/dist/module/api/api.js.map +1 -1
  43. package/dist/module/components/Embed/EmbedButton.js +140 -347
  44. package/dist/module/components/Embed/EmbedButton.js.map +1 -1
  45. package/dist/module/components/Embed/EmbedVoice.js +16 -4
  46. package/dist/module/components/Embed/EmbedVoice.js.map +1 -1
  47. package/dist/module/context/EmbedProvider.js +626 -0
  48. package/dist/module/context/EmbedProvider.js.map +1 -0
  49. package/dist/module/events/agent-event-emitter.js +109 -0
  50. package/dist/module/events/agent-event-emitter.js.map +1 -0
  51. package/dist/module/events/embed.event.js +82 -80
  52. package/dist/module/events/embed.event.js.map +1 -1
  53. package/dist/module/events/embed.types.js +33 -0
  54. package/dist/module/events/embed.types.js.map +1 -0
  55. package/dist/module/events/embed.validators.js +32 -0
  56. package/dist/module/events/embed.validators.js.map +1 -0
  57. package/dist/module/events/index.js +12 -0
  58. package/dist/module/events/index.js.map +1 -0
  59. package/dist/module/hooks/EmbedButton.animations.js +172 -0
  60. package/dist/module/hooks/EmbedButton.animations.js.map +1 -0
  61. package/dist/module/hooks/EmbedButton.helpers.js +80 -0
  62. package/dist/module/hooks/EmbedButton.helpers.js.map +1 -0
  63. package/dist/module/hooks/EmbedButton.hooks.js +160 -0
  64. package/dist/module/hooks/EmbedButton.hooks.js.map +1 -0
  65. package/dist/module/hooks/initialize.js +66 -26
  66. package/dist/module/hooks/initialize.js.map +1 -1
  67. package/dist/module/hooks/voiceagent.js +1 -17
  68. package/dist/module/hooks/voiceagent.js.map +1 -1
  69. package/dist/module/index.js +4 -2
  70. package/dist/module/index.js.map +1 -1
  71. package/dist/module/index.types.js +1 -2
  72. package/dist/module/index.types.js.map +1 -1
  73. package/dist/module/utils/constant.js +93 -0
  74. package/dist/module/utils/constant.js.map +1 -0
  75. package/dist/module/utils/permision.js +48 -1
  76. package/dist/module/utils/permision.js.map +1 -1
  77. package/dist/module/utils/reanimated.helper.js +2 -3
  78. package/dist/module/utils/reanimated.helper.js.map +1 -1
  79. package/dist/typescript/src/api/api.d.ts +4 -3
  80. package/dist/typescript/src/api/api.d.ts.map +1 -1
  81. package/dist/typescript/src/api/types/embed.api.types.d.ts +1 -1
  82. package/dist/typescript/src/api/types/embed.api.types.d.ts.map +1 -1
  83. package/dist/typescript/src/components/Embed/EmbedButton.d.ts +5 -25
  84. package/dist/typescript/src/components/Embed/EmbedButton.d.ts.map +1 -1
  85. package/dist/typescript/src/components/Embed/EmbedVoice.d.ts.map +1 -1
  86. package/dist/typescript/src/context/EmbedProvider.d.ts +306 -0
  87. package/dist/typescript/src/context/EmbedProvider.d.ts.map +1 -0
  88. package/dist/typescript/src/events/agent-event-emitter.d.ts +41 -0
  89. package/dist/typescript/src/events/agent-event-emitter.d.ts.map +1 -0
  90. package/dist/typescript/src/events/embed.event.d.ts +39 -21
  91. package/dist/typescript/src/events/embed.event.d.ts.map +1 -1
  92. package/dist/typescript/src/events/embed.types.d.ts +39 -0
  93. package/dist/typescript/src/events/embed.types.d.ts.map +1 -0
  94. package/dist/typescript/src/events/embed.validators.d.ts +17 -0
  95. package/dist/typescript/src/events/embed.validators.d.ts.map +1 -0
  96. package/dist/typescript/src/events/index.d.ts +10 -0
  97. package/dist/typescript/src/events/index.d.ts.map +1 -0
  98. package/dist/typescript/src/hooks/EmbedButton.animations.d.ts +38 -0
  99. package/dist/typescript/src/hooks/EmbedButton.animations.d.ts.map +1 -0
  100. package/dist/typescript/src/hooks/EmbedButton.helpers.d.ts +49 -0
  101. package/dist/typescript/src/hooks/EmbedButton.helpers.d.ts.map +1 -0
  102. package/dist/typescript/src/hooks/EmbedButton.hooks.d.ts +49 -0
  103. package/dist/typescript/src/hooks/EmbedButton.hooks.d.ts.map +1 -0
  104. package/dist/typescript/src/hooks/initialize.d.ts.map +1 -1
  105. package/dist/typescript/src/hooks/types/initialize.types.d.ts +1 -1
  106. package/dist/typescript/src/hooks/types/initialize.types.d.ts.map +1 -1
  107. package/dist/typescript/src/hooks/voiceagent.d.ts.map +1 -1
  108. package/dist/typescript/src/index.d.ts +10 -4
  109. package/dist/typescript/src/index.d.ts.map +1 -1
  110. package/dist/typescript/src/index.types.d.ts +2 -3
  111. package/dist/typescript/src/index.types.d.ts.map +1 -1
  112. package/dist/typescript/src/utils/constant.d.ts +46 -0
  113. package/dist/typescript/src/utils/constant.d.ts.map +1 -0
  114. package/dist/typescript/src/utils/permision.d.ts.map +1 -1
  115. package/dist/typescript/src/utils/reanimated.helper.d.ts.map +1 -1
  116. package/package.json +16 -8
  117. package/react-native.config.js +1 -0
  118. package/dist/commonjs/events/eventEmitter.js +0 -43
  119. package/dist/commonjs/events/eventEmitter.js.map +0 -1
  120. package/dist/module/events/eventEmitter.js +0 -39
  121. package/dist/module/events/eventEmitter.js.map +0 -1
  122. package/dist/typescript/src/events/eventEmitter.d.ts +0 -9
  123. package/dist/typescript/src/events/eventEmitter.d.ts.map +0 -1
@@ -0,0 +1,638 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.trackRageClick = exports.trackFormEvent = exports.trackEmbedEvent = exports.getRouteHierarchy = exports.getNavigationTree = exports.getAllRoutes = exports.getAllDefinedRoutes = exports.default = exports.EmbedProvider = void 0;
7
+ var _react = _interopRequireWildcard(require("react"));
8
+ var _EmbedButton = require("../components/Embed/EmbedButton.js");
9
+ var _embedEvent = _interopRequireWildcard(require("../events/embed.event.js"));
10
+ var _jsxRuntime = require("react/jsx-runtime");
11
+ function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function (e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != typeof e && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (const t in e) "default" !== t && {}.hasOwnProperty.call(e, t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, t)) && (i.get || i.set) ? o(f, t, i) : f[t] = e[t]); return f; })(e, t); }
12
+ /**
13
+ * @file EmbedProvider.tsx
14
+ * @description Core provider component for the Embed React Native library.
15
+ *
16
+ * This provider:
17
+ * - Tracks navigation state and screen changes
18
+ * - Conditionally renders the EmbedButton based on current screen
19
+ * - Provides utilities for extracting navigation hierarchy information
20
+ * - Manages event tracking integration with the Embed system
21
+ *
22
+ * @module EmbedProvider
23
+ */
24
+
25
+ /* ============================================================================
26
+ * TYPE DEFINITIONS
27
+ * ========================================================================== */
28
+
29
+ /**
30
+ * Props for the EmbedProvider component
31
+ * @interface EmbedProviderProps
32
+ */
33
+
34
+ /**
35
+ * Represents the complete hierarchical structure of the current navigation state
36
+ * @interface RouteHierarchy
37
+ */
38
+
39
+ /**
40
+ * Represents a node in the navigation tree structure
41
+ * @interface NavigationTreeNode
42
+ */
43
+
44
+ /* ============================================================================
45
+ * CONSTANTS
46
+ * ========================================================================== */
47
+
48
+ /**
49
+ * Default list of screens where the EmbedButton should be displayed
50
+ * Used when no custom includeScreens prop is provided
51
+ * @constant
52
+ */
53
+ const DEFAULT_INCLUDED_SCREENS = [];
54
+
55
+ /**
56
+ * Delay before setting up navigation listener (allows navigation to stabilize)
57
+ * @constant
58
+ */
59
+ const NAVIGATION_LISTENER_DELAY = 1000;
60
+
61
+ /* ============================================================================
62
+ * UTILITY FUNCTIONS - NAVIGATION HIERARCHY
63
+ * ========================================================================== */
64
+
65
+ /**
66
+ * Extracts complete route hierarchy information from navigation state
67
+ *
68
+ * This function traverses the navigation state tree recursively to build
69
+ * a comprehensive hierarchy object containing the current screen, full path,
70
+ * depth, and route information at each level.
71
+ *
72
+ * @param {any} state - Navigation state from navigationRef.current?.getRootState()
73
+ * @returns {RouteHierarchy | null} Complete route hierarchy or null if state is invalid
74
+ *
75
+ * @example
76
+ * ```typescript
77
+ * const routeInfo = getRouteHierarchy(navigationRef.current?.getRootState());
78
+ * console.log(routeInfo);
79
+ * // {
80
+ * // currentScreen: "Product",
81
+ * // fullPath: "MainApp > Home > Product",
82
+ * // allRoutes: ["MainApp", "Home", "Product"],
83
+ * // depth: 3,
84
+ * // routesByLevel: { 0: "MainApp", 1: "Home", 2: "Product" },
85
+ * // parentRoute: "Home",
86
+ * // routeParams: { id: "123" }
87
+ * // }
88
+ * ```
89
+ */
90
+ const getRouteHierarchy = state => {
91
+ if (!state) return null;
92
+ try {
93
+ const allRoutes = [];
94
+ const routesByLevel = {};
95
+ let currentRouteParams;
96
+
97
+ /**
98
+ * Recursively traverse the navigation state tree
99
+ * @param {any} currentState - Current state node
100
+ * @param {number} level - Current depth level (0 = root)
101
+ */
102
+ const traverse = (currentState, level = 0) => {
103
+ if (!currentState || typeof currentState.index !== 'number') return;
104
+ const route = currentState.routes?.[currentState.index];
105
+ if (!route || !route.name) return;
106
+ const routeName = route.name;
107
+ allRoutes.push(routeName);
108
+ routesByLevel[level] = routeName;
109
+
110
+ // Capture parameters if this is the deepest (active) route
111
+ if (!route.state && route.params) {
112
+ currentRouteParams = route.params;
113
+ }
114
+
115
+ // Recursively traverse nested navigation states
116
+ if (route.state) {
117
+ traverse(route.state, level + 1);
118
+ }
119
+ };
120
+
121
+ // Start traversal from root
122
+ traverse(state);
123
+
124
+ // Return null if no routes were found
125
+ if (allRoutes.length === 0) return null;
126
+
127
+ // Build the hierarchy object
128
+ const currentScreen = allRoutes[allRoutes.length - 1] || 'Unknown';
129
+ const parentRoute = allRoutes.length > 1 ? allRoutes[allRoutes.length - 2] : undefined;
130
+ const depth = allRoutes.length;
131
+ const fullPath = allRoutes.join(' > ');
132
+ return {
133
+ currentScreen,
134
+ fullPath,
135
+ allRoutes,
136
+ depth,
137
+ routesByLevel,
138
+ parentRoute,
139
+ routeParams: currentRouteParams
140
+ };
141
+ } catch (error) {
142
+ // Return null if any error occurs during traversal
143
+ return null;
144
+ }
145
+ };
146
+
147
+ /**
148
+ * Extracts ALL available routes (both mounted and defined) from navigation state
149
+ *
150
+ * This function traverses the navigation state and returns a flat array of:
151
+ * 1. Currently MOUNTED routes (routes that are rendered in the navigation tree)
152
+ * 2. DEFINED routes (from routeNames - routes that exist but may not be rendered yet)
153
+ *
154
+ * This is particularly useful because nested navigators (like tab navigators)
155
+ * won't appear in the state until you navigate to them, but their route names
156
+ * are still defined in the navigator configuration.
157
+ *
158
+ * @param {any} state - Navigation state from navigationRef.current?.getRootState()
159
+ * @returns {string[]} Array of unique route names
160
+ *
161
+ * @example
162
+ * ```typescript
163
+ * const allRoutes = getAllRoutes(navigationRef.current?.getRootState());
164
+ * console.log(allRoutes);
165
+ * // ["Splash", "Welcome", "MainApp", "Home", "Transactions", "Profile"]
166
+ *
167
+ * // Check if a specific route is available
168
+ * const hasProfileScreen = allRoutes.includes("Profile");
169
+ * ```
170
+ */
171
+ exports.getRouteHierarchy = getRouteHierarchy;
172
+ const getAllRoutes = state => {
173
+ if (!state) return [];
174
+
175
+ // Use Set for O(1) lookup instead of O(n) with array.includes
176
+ const allRouteNamesSet = new Set();
177
+
178
+ /**
179
+ * Recursively collect route names from navigation state
180
+ * @param {any} currentState - Current state node
181
+ */
182
+ const collectRoutes = currentState => {
183
+ if (!currentState) return;
184
+
185
+ // Collect defined route names (ALL routes configured in the navigator)
186
+ if (currentState?.routeNames && Array.isArray(currentState.routeNames)) {
187
+ currentState.routeNames.forEach(routeName => {
188
+ if (routeName && typeof routeName === 'string') {
189
+ allRouteNamesSet.add(routeName);
190
+ }
191
+ });
192
+ }
193
+
194
+ // Collect mounted routes (currently rendered routes)
195
+ if (!currentState?.routes || !Array.isArray(currentState.routes)) return;
196
+ currentState.routes.forEach(route => {
197
+ if (route?.name && typeof route.name === 'string') {
198
+ allRouteNamesSet.add(route.name);
199
+ }
200
+
201
+ // Recursively check nested states (for mounted nested navigators)
202
+ if (route?.state) {
203
+ collectRoutes(route.state);
204
+ }
205
+ });
206
+ };
207
+ try {
208
+ collectRoutes(state);
209
+ } catch (error) {
210
+ // Fail silently and return empty array if state traversal fails
211
+ return [];
212
+ }
213
+ return Array.from(allRouteNamesSet);
214
+ };
215
+
216
+ /**
217
+ * Builds a complete navigation tree structure showing all routes and their relationships
218
+ *
219
+ * This function creates a hierarchical tree structure representing the entire
220
+ * navigation state, including all routes at all levels (not just the active path).
221
+ * Useful for visualizing or debugging your navigation structure.
222
+ *
223
+ * @param {any} state - Navigation state from navigationRef.current?.getRootState()
224
+ * @returns {NavigationTreeNode[]} Array of NavigationTreeNode representing the complete tree
225
+ *
226
+ * @example
227
+ * ```typescript
228
+ * const tree = getNavigationTree(navigationRef.current?.getRootState());
229
+ * console.log(JSON.stringify(tree, null, 2));
230
+ *
231
+ * // Example output:
232
+ * // [
233
+ * // {
234
+ * // "name": "MainApp",
235
+ * // "level": 0,
236
+ * // "children": [
237
+ * // {
238
+ * // "name": "Home",
239
+ * // "level": 1,
240
+ * // "children": [
241
+ * // { "name": "HomeMain", "level": 2 },
242
+ * // { "name": "Product", "level": 2, "params": { "id": "123" } }
243
+ * // ]
244
+ * // },
245
+ * // { "name": "Profile", "level": 1 }
246
+ * // ]
247
+ * // }
248
+ * // ]
249
+ * ```
250
+ */
251
+ exports.getAllRoutes = getAllRoutes;
252
+ const getNavigationTree = state => {
253
+ if (!state) return [];
254
+
255
+ /**
256
+ * Recursively build the navigation tree
257
+ * @param {any} currentState - Current state node
258
+ * @param {number} level - Current depth level (0 = root)
259
+ * @returns {NavigationTreeNode[]} Array of tree nodes
260
+ */
261
+ const buildTree = (currentState, level = 0) => {
262
+ if (!currentState?.routes || !Array.isArray(currentState.routes)) {
263
+ return [];
264
+ }
265
+ return currentState.routes.filter(route => route && route.name).map(route => {
266
+ const node = {
267
+ name: route.name,
268
+ level,
269
+ params: route.params
270
+ };
271
+
272
+ // Recursively build children if nested state exists
273
+ if (route.state) {
274
+ node.children = buildTree(route.state, level + 1);
275
+ }
276
+ return node;
277
+ });
278
+ };
279
+ try {
280
+ return buildTree(state);
281
+ } catch (error) {
282
+ // Return empty array if tree building fails
283
+ return [];
284
+ }
285
+ };
286
+
287
+ /**
288
+ * Legacy alias for getAllRoutes()
289
+ * @deprecated Use getAllRoutes() instead
290
+ *
291
+ * Note: React Navigation limitation - nested navigator routes (like tabs inside a stack)
292
+ * only appear in the state AFTER they're mounted/rendered.
293
+ *
294
+ * @param {any} state - Navigation state
295
+ * @returns {string[]} Array of route names
296
+ */
297
+ exports.getNavigationTree = getNavigationTree;
298
+ const getAllDefinedRoutes = state => {
299
+ return getAllRoutes(state);
300
+ };
301
+
302
+ /* ============================================================================
303
+ * UTILITY FUNCTIONS - APP VERSION
304
+ * ========================================================================== */
305
+
306
+ /**
307
+ * Interface for app version information
308
+ * @interface AppVersionInfo
309
+ */
310
+ exports.getAllDefinedRoutes = getAllDefinedRoutes;
311
+ /* ============================================================================
312
+ * UTILITY FUNCTIONS - EVENT TRACKING
313
+ * ========================================================================== */
314
+
315
+ /**
316
+ * Track custom events with the Embed system
317
+ *
318
+ * This function provides a simple interface to send custom event data
319
+ * to the Embed analytics system. All errors are caught and handled silently
320
+ * to prevent analytics issues from affecting app functionality.
321
+ *
322
+ * @param {string} eventName - Name of the event to track
323
+ * @param {Record<string, any>} properties - Event properties/metadata (optional)
324
+ *
325
+ * @example
326
+ * ```typescript
327
+ * // Track a button click
328
+ * trackEmbedEvent('button_clicked', {
329
+ * buttonId: 'submit_form',
330
+ * screenName: 'Profile',
331
+ * });
332
+ *
333
+ * // Track a purchase
334
+ * trackEmbedEvent('purchase_completed', {
335
+ * amount: 99.99,
336
+ * currency: 'USD',
337
+ * items: ['item1', 'item2'],
338
+ * });
339
+ * ```
340
+ */
341
+ const trackEmbedEvent = (eventName, properties = {}) => {
342
+ try {
343
+ _embedEvent.default.Event(_embedEvent.EventKeys.FORM_STATE, {
344
+ type: 'custom_event',
345
+ eventName,
346
+ properties,
347
+ timestamp: new Date().toISOString()
348
+ });
349
+ } catch (error) {
350
+ // Fail silently - analytics errors should not break the app
351
+ // You could log to a monitoring service here if needed
352
+ }
353
+ };
354
+
355
+ /**
356
+ * Track rage clicks (repeated rapid clicks indicating user frustration)
357
+ *
358
+ * Rage clicks are detected when a user clicks the same element multiple times
359
+ * in rapid succession, which can indicate frustration with unresponsive UI.
360
+ * This data helps identify problem areas in the user experience.
361
+ *
362
+ * @param {string} elementId - Unique identifier of the clicked element
363
+ * @param {string} elementType - Type of element (e.g., 'button', 'link', 'text')
364
+ * @param {{ x: number; y: number }} coordinates - Screen coordinates of the clicks
365
+ * @param {number} clickCount - Number of rapid clicks detected
366
+ *
367
+ * @example
368
+ * ```typescript
369
+ * trackRageClick('submit_button', 'button', { x: 100, y: 200 }, 5);
370
+ * ```
371
+ */
372
+ exports.trackEmbedEvent = trackEmbedEvent;
373
+ const trackRageClick = (elementId, elementType, coordinates, clickCount) => {
374
+ try {
375
+ const eventData = {
376
+ type: 'rage_click',
377
+ elementId,
378
+ elementType,
379
+ coordinates,
380
+ clickCount,
381
+ timestamp: new Date().toISOString()
382
+ };
383
+ _embedEvent.default.Event(_embedEvent.EventKeys.FORM_STATE, eventData);
384
+ } catch (error) {
385
+ // Fail silently - analytics errors should not break the app
386
+ }
387
+ };
388
+
389
+ /**
390
+ * Track form-related events (changes, submissions, errors)
391
+ *
392
+ * This function tracks various form interactions to help understand
393
+ * user behavior and identify potential issues in form flows.
394
+ *
395
+ * @param {string} formId - Unique identifier of the form
396
+ * @param {'form_change' | 'form_submit' | 'form_error'} eventType - Type of form event
397
+ * @param {Record<string, any>} formData - Form data/metadata (optional)
398
+ *
399
+ * @example
400
+ * ```typescript
401
+ * // Track form field change
402
+ * trackFormEvent('signup_form', 'form_change', {
403
+ * field: 'email',
404
+ * value: 'user@example.com',
405
+ * });
406
+ *
407
+ * // Track form submission
408
+ * trackFormEvent('signup_form', 'form_submit', {
409
+ * success: true,
410
+ * userId: '12345',
411
+ * });
412
+ *
413
+ * // Track form error
414
+ * trackFormEvent('signup_form', 'form_error', {
415
+ * field: 'password',
416
+ * error: 'Password too short',
417
+ * });
418
+ * ```
419
+ */
420
+ exports.trackRageClick = trackRageClick;
421
+ const trackFormEvent = (formId, eventType, formData = {}) => {
422
+ try {
423
+ const eventData = {
424
+ type: eventType,
425
+ formId,
426
+ formData,
427
+ timestamp: new Date().toISOString()
428
+ };
429
+ _embedEvent.default.Event(_embedEvent.EventKeys.FORM_STATE, eventData);
430
+ } catch (error) {
431
+ // Fail silently - analytics errors should not break the app
432
+ }
433
+ };
434
+
435
+ /* ============================================================================
436
+ * MAIN COMPONENT
437
+ * ========================================================================== */
438
+
439
+ /**
440
+ * EmbedProvider Component
441
+ *
442
+ * Core provider component that wraps your application to enable Embed functionality.
443
+ * This provider:
444
+ * - Monitors navigation state changes
445
+ * - Automatically shows/hides the EmbedButton based on current screen
446
+ * - Tracks screen views and navigation hierarchy
447
+ * - Integrates with the Embed analytics system
448
+ *
449
+ * @param {EmbedProviderProps} props - Component props
450
+ * @returns {JSX.Element} Provider component with children and conditional EmbedButton
451
+ *
452
+ * @example
453
+ * ```typescript
454
+ * import { NavigationContainer } from '@react-navigation/native';
455
+ * import { EmbedProvider } from '@revrag/embed-react-native';
456
+ * import { useRef } from 'react';
457
+ *
458
+ * function App() {
459
+ * const navigationRef = useRef<NavigationContainerRef<any>>(null);
460
+ *
461
+ * return (
462
+ * // IMPORTANT: EmbedProvider must WRAP NavigationContainer
463
+ * <EmbedProvider
464
+ * navigationRef={navigationRef}
465
+ * includeScreens={['Home', 'Profile', 'Dashboard']}
466
+ * >
467
+ * <NavigationContainer ref={navigationRef}>
468
+ * {/* Your navigation stack *\/}
469
+ * </NavigationContainer>
470
+ * </EmbedProvider>
471
+ * );
472
+ * }
473
+ * ```
474
+ */
475
+ exports.trackFormEvent = trackFormEvent;
476
+ const EmbedProvider = ({
477
+ children,
478
+ navigationRef,
479
+ includeScreens = DEFAULT_INCLUDED_SCREENS,
480
+ appVersion: _appVersion
481
+ }) => {
482
+ // ========== Refs ==========
483
+
484
+ /**
485
+ * Navigation reference - use provided ref or create a default one
486
+ * This allows the provider to work both with and without an external navigation ref
487
+ * Note: Using useRef instead of createRef to maintain same ref across renders
488
+ */
489
+ const defaultNavRef = (0, _react.useRef)(null);
490
+ const navRef = navigationRef || defaultNavRef;
491
+
492
+ /**
493
+ * Track if component is mounted to prevent state updates after unmount
494
+ */
495
+ const isMountedRef = (0, _react.useRef)(true);
496
+
497
+ // ========== State ==========
498
+
499
+ /** Whether the EmbedButton should be visible on the current screen */
500
+ const [showEmbedButton, setShowEmbedButton] = (0, _react.useState)(false);
501
+
502
+ // ========== Memoized Values ==========
503
+
504
+ /**
505
+ * Included screens (from prop)
506
+ * Memoized to prevent recalculation on every render and filter falsy values
507
+ */
508
+ const allIncludedScreens = (0, _react.useMemo)(() => {
509
+ return Array.from(new Set(includeScreens.filter(Boolean)));
510
+ }, [includeScreens]);
511
+
512
+ // ========== Effects ==========
513
+
514
+ /**
515
+ * Memoized callback for tracking screen changes
516
+ * Uses useCallback to maintain stable reference and prevent unnecessary re-renders
517
+ */
518
+ const trackScreen = (0, _react.useCallback)(async () => {
519
+ try {
520
+ // Safety check: Ensure navigation ref is available
521
+ if (!navRef.current) {
522
+ return;
523
+ }
524
+ const state = navRef.current.getRootState();
525
+ if (!state) {
526
+ return;
527
+ }
528
+ const routeInfo = getRouteHierarchy(state);
529
+ // Extract current screen name from navigation state
530
+ const screenName = routeInfo?.currentScreen || navRef.current.getCurrentRoute()?.name || '';
531
+
532
+ // Determine if EmbedButton should be visible
533
+ // Show button only on screens specified in includeScreens (prop + backend)
534
+ const hasIncludeFilter = allIncludedScreens.length > 0;
535
+ const isIncluded = allIncludedScreens.includes(screenName);
536
+ const shouldShowButton = screenName !== '' && (!hasIncludeFilter || isIncluded);
537
+ // Only update state if component is still mounted
538
+ if (isMountedRef.current) {
539
+ setShowEmbedButton(shouldShowButton);
540
+ }
541
+
542
+ // Track screen view event (if route info is available)
543
+ if (routeInfo) {
544
+ try {
545
+ // TODO: Uncomment when ready to enable screen view tracking
546
+ _embedEvent.default.Event(_embedEvent.EventKeys.FORM_STATE, {
547
+ type: 'screen_view',
548
+ ...routeInfo,
549
+ screen: routeInfo.currentScreen,
550
+ // allAvailableRoutes: allRoutes,
551
+ app_version: _appVersion,
552
+ timestamp: new Date().toISOString()
553
+ });
554
+ } catch (error) {
555
+ // Silently fail - analytics should not break the app
556
+ }
557
+ }
558
+ } catch (error) {
559
+ // Catch-all error handler to prevent any tracking errors from breaking the app
560
+ }
561
+ }, [navRef, allIncludedScreens, _appVersion]);
562
+
563
+ /**
564
+ * Effect: Navigation State Tracking
565
+ *
566
+ * Sets up listeners for navigation state changes and tracks:
567
+ * - Current screen name
568
+ * - Route hierarchy
569
+ * - Screen view events
570
+ * - EmbedButton visibility
571
+ */
572
+ (0, _react.useEffect)(() => {
573
+ // Validate navigation ref
574
+ if (!navRef) {
575
+ return;
576
+ }
577
+ let unsubscribe;
578
+ let delayTimer;
579
+
580
+ /**
581
+ * Set up navigation state listener
582
+ */
583
+ const setupListener = () => {
584
+ // Only set up if navigation ref is ready
585
+ if (navRef.current) {
586
+ unsubscribe = navRef.current.addListener('state', trackScreen);
587
+ trackScreen(); // Track initial screen immediately
588
+ }
589
+ };
590
+
591
+ // Set up listener immediately for quick feedback
592
+ setupListener();
593
+
594
+ // Also set up after delay in case navigation wasn't ready
595
+ delayTimer = setTimeout(() => {
596
+ if (!unsubscribe && navRef.current) {
597
+ setupListener();
598
+ }
599
+ }, NAVIGATION_LISTENER_DELAY);
600
+
601
+ // Cleanup function
602
+ return () => {
603
+ if (delayTimer) {
604
+ clearTimeout(delayTimer);
605
+ }
606
+ if (unsubscribe) {
607
+ unsubscribe();
608
+ }
609
+ };
610
+ }, [navRef, trackScreen]);
611
+
612
+ /**
613
+ * Effect: Component Lifecycle Management
614
+ *
615
+ * Tracks component mount/unmount state to prevent state updates after unmount
616
+ */
617
+ (0, _react.useEffect)(() => {
618
+ isMountedRef.current = true;
619
+ return () => {
620
+ isMountedRef.current = false;
621
+ };
622
+ }, []);
623
+
624
+ // ========== Render ==========
625
+
626
+ return /*#__PURE__*/(0, _jsxRuntime.jsxs)(_jsxRuntime.Fragment, {
627
+ children: [children, showEmbedButton && /*#__PURE__*/(0, _jsxRuntime.jsx)(_EmbedButton.EmbedButton, {})]
628
+ });
629
+ };
630
+
631
+ /* ============================================================================
632
+ * EXPORTS
633
+ * ========================================================================== */
634
+
635
+ // Default export
636
+ exports.EmbedProvider = EmbedProvider;
637
+ var _default = exports.default = EmbedProvider;
638
+ //# sourceMappingURL=EmbedProvider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["_react","_interopRequireWildcard","require","_EmbedButton","_embedEvent","_jsxRuntime","e","t","WeakMap","r","n","__esModule","o","i","f","__proto__","default","has","get","set","hasOwnProperty","call","Object","defineProperty","getOwnPropertyDescriptor","DEFAULT_INCLUDED_SCREENS","NAVIGATION_LISTENER_DELAY","getRouteHierarchy","state","allRoutes","routesByLevel","currentRouteParams","traverse","currentState","level","index","route","routes","name","routeName","push","params","length","currentScreen","parentRoute","undefined","depth","fullPath","join","routeParams","error","exports","getAllRoutes","allRouteNamesSet","Set","collectRoutes","routeNames","Array","isArray","forEach","add","from","getNavigationTree","buildTree","filter","map","node","children","getAllDefinedRoutes","trackEmbedEvent","eventName","properties","Embed","Event","EventKeys","FORM_STATE","type","timestamp","Date","toISOString","trackRageClick","elementId","elementType","coordinates","clickCount","eventData","trackFormEvent","formId","eventType","formData","EmbedProvider","navigationRef","includeScreens","appVersion","_appVersion","defaultNavRef","useRef","navRef","isMountedRef","showEmbedButton","setShowEmbedButton","useState","allIncludedScreens","useMemo","Boolean","trackScreen","useCallback","current","getRootState","routeInfo","screenName","getCurrentRoute","hasIncludeFilter","isIncluded","includes","shouldShowButton","screen","app_version","useEffect","unsubscribe","delayTimer","setupListener","addListener","setTimeout","clearTimeout","jsxs","Fragment","jsx","EmbedButton","_default"],"sourceRoot":"../../../src","sources":["context/EmbedProvider.tsx"],"mappings":"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","ignoreList":[]}