react-native-inapp-inspector 1.1.24 → 1.1.25

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 (79) hide show
  1. package/dist/commonjs/components/AnalyticsEventCard.js +94 -88
  2. package/dist/commonjs/components/ConsoleLogCard.js +49 -25
  3. package/dist/commonjs/components/Inspector/AnalyticsFilterModal.d.ts +7 -0
  4. package/dist/commonjs/components/Inspector/AnalyticsFilterModal.js +1002 -0
  5. package/dist/commonjs/components/Inspector/AnalyticsTab.js +637 -10
  6. package/dist/commonjs/components/Inspector/BundleTab.d.ts +1 -1
  7. package/dist/commonjs/components/Inspector/BundleTab.js +826 -406
  8. package/dist/commonjs/components/Inspector/InspectorContext.js +6 -1
  9. package/dist/commonjs/components/Inspector/InspectorHeader.js +13 -5
  10. package/dist/commonjs/components/Inspector/LogDetail.js +223 -111
  11. package/dist/commonjs/components/Inspector/MainScreen.js +1 -1
  12. package/dist/commonjs/components/Inspector/NetworkDetail.js +131 -81
  13. package/dist/commonjs/components/Inspector/PerformanceTab.js +20 -10
  14. package/dist/commonjs/components/NetworkIcons.d.ts +14 -0
  15. package/dist/commonjs/components/NetworkIcons.js +93 -1
  16. package/dist/commonjs/components/SegmentedTabs.js +31 -22
  17. package/dist/commonjs/components/TreeNode.js +13 -12
  18. package/dist/commonjs/constants/version.d.ts +1 -1
  19. package/dist/commonjs/constants/version.js +1 -1
  20. package/dist/commonjs/customHooks/bundleAnalyzer.d.ts +5 -1
  21. package/dist/commonjs/customHooks/bundleAnalyzer.js +497 -126
  22. package/dist/commonjs/customHooks/consoleLogger.js +83 -45
  23. package/dist/commonjs/customHooks/networkLogger.js +10 -1
  24. package/dist/commonjs/customHooks/performanceTracker.d.ts +8 -0
  25. package/dist/commonjs/customHooks/performanceTracker.js +44 -3
  26. package/dist/commonjs/decorators/index.d.ts +49 -0
  27. package/dist/commonjs/decorators/index.js +142 -0
  28. package/dist/commonjs/helpers/gaAnalyticsRegistry.d.ts +18 -0
  29. package/dist/commonjs/helpers/gaAnalyticsRegistry.js +174 -0
  30. package/dist/commonjs/helpers/index.d.ts +7 -4
  31. package/dist/commonjs/helpers/index.js +102 -64
  32. package/dist/commonjs/i18n/locales/en.json +51 -4
  33. package/dist/commonjs/index.d.ts +4 -0
  34. package/dist/commonjs/index.js +216 -8
  35. package/dist/commonjs/styles/index.d.ts +4 -1
  36. package/dist/commonjs/styles/index.js +22 -19
  37. package/dist/commonjs/types/enums.d.ts +115 -9
  38. package/dist/commonjs/types/enums.js +103 -2
  39. package/dist/commonjs/types/interfaces.d.ts +19 -0
  40. package/dist/esm/components/AnalyticsEventCard.js +95 -89
  41. package/dist/esm/components/ConsoleLogCard.js +49 -25
  42. package/dist/esm/components/Inspector/AnalyticsFilterModal.d.ts +7 -0
  43. package/dist/esm/components/Inspector/AnalyticsFilterModal.js +964 -0
  44. package/dist/esm/components/Inspector/AnalyticsTab.js +639 -12
  45. package/dist/esm/components/Inspector/BundleTab.d.ts +1 -1
  46. package/dist/esm/components/Inspector/BundleTab.js +827 -407
  47. package/dist/esm/components/Inspector/InspectorContext.js +1 -0
  48. package/dist/esm/components/Inspector/InspectorHeader.js +14 -6
  49. package/dist/esm/components/Inspector/LogDetail.js +223 -111
  50. package/dist/esm/components/Inspector/MainScreen.js +2 -2
  51. package/dist/esm/components/Inspector/NetworkDetail.js +132 -49
  52. package/dist/esm/components/Inspector/PerformanceTab.js +20 -10
  53. package/dist/esm/components/NetworkIcons.d.ts +14 -0
  54. package/dist/esm/components/NetworkIcons.js +78 -0
  55. package/dist/esm/components/SegmentedTabs.js +31 -22
  56. package/dist/esm/components/TreeNode.js +13 -12
  57. package/dist/esm/constants/version.d.ts +1 -1
  58. package/dist/esm/constants/version.js +1 -1
  59. package/dist/esm/customHooks/bundleAnalyzer.d.ts +5 -1
  60. package/dist/esm/customHooks/bundleAnalyzer.js +493 -125
  61. package/dist/esm/customHooks/consoleLogger.js +83 -45
  62. package/dist/esm/customHooks/networkLogger.js +10 -1
  63. package/dist/esm/customHooks/performanceTracker.d.ts +8 -0
  64. package/dist/esm/customHooks/performanceTracker.js +38 -1
  65. package/dist/esm/decorators/index.d.ts +49 -0
  66. package/dist/esm/decorators/index.js +137 -0
  67. package/dist/esm/helpers/gaAnalyticsRegistry.d.ts +18 -0
  68. package/dist/esm/helpers/gaAnalyticsRegistry.js +169 -0
  69. package/dist/esm/helpers/index.d.ts +7 -4
  70. package/dist/esm/helpers/index.js +100 -63
  71. package/dist/esm/i18n/locales/en.json +51 -4
  72. package/dist/esm/index.d.ts +4 -0
  73. package/dist/esm/index.js +190 -8
  74. package/dist/esm/styles/index.d.ts +4 -1
  75. package/dist/esm/styles/index.js +22 -19
  76. package/dist/esm/types/enums.d.ts +115 -9
  77. package/dist/esm/types/enums.js +102 -3
  78. package/dist/esm/types/interfaces.d.ts +19 -0
  79. package/package.json +1 -1
@@ -0,0 +1,1002 @@
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
+ var __importDefault = (this && this.__importDefault) || function (mod) {
36
+ return (mod && mod.__esModule) ? mod : { "default": mod };
37
+ };
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ const react_1 = __importStar(require("react"));
40
+ const react_native_1 = require("react-native");
41
+ const InspectorContext_1 = require("./InspectorContext");
42
+ const AppColors_1 = require("../../styles/AppColors");
43
+ const AppFonts_1 = require("../../styles/AppFonts");
44
+ const helpers_1 = require("../../helpers");
45
+ const NetworkIcons_1 = require("../NetworkIcons");
46
+ const TouchableScale_1 = __importDefault(require("../TouchableScale"));
47
+ const DEFAULT_FILTERS = {
48
+ categories: new Set(['all']),
49
+ screens: new Set(),
50
+ sources: new Set(['all']),
51
+ userTypes: new Set(['all']),
52
+ timeWindow: 'all',
53
+ payloadComplexity: 'all',
54
+ hasRevenue: false,
55
+ hasItems: false,
56
+ hasUserProps: false,
57
+ hasParams: false,
58
+ onlyDuplicates: false,
59
+ onlyConversions: false,
60
+ sortBy: 'time_desc',
61
+ };
62
+ const AnalyticsFilterModal = ({ visible, onClose, }) => {
63
+ const { analyticsEvents, analyticsSearch, analyticsFilters, setAnalyticsFilters, } = (0, InspectorContext_1.useInspector)();
64
+ // Staged Draft State: applied ONLY on tapping "Apply Filters"
65
+ const [draft, setDraft] = (0, react_1.useState)(() => ({
66
+ ...analyticsFilters,
67
+ categories: new Set(analyticsFilters.categories),
68
+ screens: new Set(analyticsFilters.screens),
69
+ sources: new Set(analyticsFilters.sources || ['all']),
70
+ userTypes: new Set(analyticsFilters.userTypes || ['all']),
71
+ }));
72
+ // Re-sync draft whenever modal opens
73
+ (0, react_1.useEffect)(() => {
74
+ if (visible) {
75
+ setDraft({
76
+ ...analyticsFilters,
77
+ categories: new Set(analyticsFilters.categories),
78
+ screens: new Set(analyticsFilters.screens),
79
+ sources: new Set(analyticsFilters.sources || ['all']),
80
+ userTypes: new Set(analyticsFilters.userTypes || ['all']),
81
+ });
82
+ }
83
+ }, [visible, analyticsFilters]);
84
+ // Extract unique screen names from logged events
85
+ const uniqueScreens = (0, react_1.useMemo)(() => {
86
+ const screens = new Set();
87
+ for (const e of analyticsEvents) {
88
+ const scr = e.screenName ||
89
+ e.params?.firebase_screen ||
90
+ e.params?.screen_name ||
91
+ e.params?.firebase_screen_class ||
92
+ e.screenClass;
93
+ if (scr && typeof scr === 'string' && scr.trim() !== '') {
94
+ screens.add(scr.trim());
95
+ }
96
+ }
97
+ return Array.from(screens);
98
+ }, [analyticsEvents]);
99
+ // Toggle Category in Draft
100
+ const toggleCategory = (cat) => {
101
+ setDraft(prev => {
102
+ const next = new Set(prev.categories);
103
+ if (cat === 'all') {
104
+ return { ...prev, categories: new Set(['all']) };
105
+ }
106
+ next.delete('all');
107
+ if (next.has(cat)) {
108
+ next.delete(cat);
109
+ if (next.size === 0)
110
+ next.add('all');
111
+ }
112
+ else {
113
+ next.add(cat);
114
+ }
115
+ return { ...prev, categories: next };
116
+ });
117
+ };
118
+ // Toggle Screen in Draft
119
+ const toggleScreen = (scr) => {
120
+ setDraft(prev => {
121
+ const next = new Set(prev.screens);
122
+ if (next.has(scr)) {
123
+ next.delete(scr);
124
+ }
125
+ else {
126
+ next.add(scr);
127
+ }
128
+ return { ...prev, screens: next };
129
+ });
130
+ };
131
+ // Toggle Source in Draft
132
+ const toggleSource = (src) => {
133
+ setDraft(prev => {
134
+ const next = new Set(prev.sources);
135
+ if (src === 'all') {
136
+ return { ...prev, sources: new Set(['all']) };
137
+ }
138
+ next.delete('all');
139
+ if (next.has(src)) {
140
+ next.delete(src);
141
+ if (next.size === 0)
142
+ next.add('all');
143
+ }
144
+ else {
145
+ next.add(src);
146
+ }
147
+ return { ...prev, sources: next };
148
+ });
149
+ };
150
+ // Toggle User Type in Draft
151
+ const toggleUserType = (ut) => {
152
+ setDraft(prev => {
153
+ const next = new Set(prev.userTypes);
154
+ if (ut === 'all') {
155
+ return { ...prev, userTypes: new Set(['all']) };
156
+ }
157
+ next.delete('all');
158
+ if (next.has(ut)) {
159
+ next.delete(ut);
160
+ if (next.size === 0)
161
+ next.add('all');
162
+ }
163
+ else {
164
+ next.add(ut);
165
+ }
166
+ return { ...prev, userTypes: next };
167
+ });
168
+ };
169
+ // Toggle Boolean Flag in Draft
170
+ const toggleFlag = (key) => {
171
+ setDraft(prev => ({
172
+ ...prev,
173
+ [key]: !prev[key],
174
+ }));
175
+ };
176
+ // Set Time Window in Draft
177
+ const setTimeWindow = (tw) => {
178
+ setDraft(prev => ({ ...prev, timeWindow: tw }));
179
+ };
180
+ // Set Payload Complexity in Draft
181
+ const setPayloadComplexity = (pc) => {
182
+ setDraft(prev => ({ ...prev, payloadComplexity: pc }));
183
+ };
184
+ // Set Sort in Draft
185
+ const setSort = (sortBy) => {
186
+ setDraft(prev => ({ ...prev, sortBy }));
187
+ };
188
+ // Reset Draft to default
189
+ const handleResetDraft = () => {
190
+ setDraft({
191
+ categories: new Set(['all']),
192
+ screens: new Set(),
193
+ sources: new Set(['all']),
194
+ userTypes: new Set(['all']),
195
+ timeWindow: 'all',
196
+ payloadComplexity: 'all',
197
+ hasRevenue: false,
198
+ hasItems: false,
199
+ hasUserProps: false,
200
+ hasParams: false,
201
+ onlyDuplicates: false,
202
+ onlyConversions: false,
203
+ sortBy: 'time_desc',
204
+ });
205
+ };
206
+ // Commit Draft to actual filters
207
+ const handleApply = () => {
208
+ setAnalyticsFilters({
209
+ ...draft,
210
+ categories: new Set(draft.categories),
211
+ screens: new Set(draft.screens),
212
+ sources: new Set(draft.sources),
213
+ userTypes: new Set(draft.userTypes),
214
+ });
215
+ onClose();
216
+ };
217
+ // Discard changes & close
218
+ const handleDiscard = () => {
219
+ setDraft({
220
+ ...analyticsFilters,
221
+ categories: new Set(analyticsFilters.categories),
222
+ screens: new Set(analyticsFilters.screens),
223
+ sources: new Set(analyticsFilters.sources || ['all']),
224
+ userTypes: new Set(analyticsFilters.userTypes || ['all']),
225
+ });
226
+ onClose();
227
+ };
228
+ // Calculate matching count for Draft in real-time
229
+ const draftMatchCount = (0, react_1.useMemo)(() => {
230
+ let events = analyticsEvents;
231
+ if (analyticsSearch) {
232
+ const s = analyticsSearch.toLowerCase();
233
+ events = events.filter(e => e.name.toLowerCase().includes(s) ||
234
+ JSON.stringify(e.params || {}).toLowerCase().includes(s) ||
235
+ (e.screenName ?? '').toLowerCase().includes(s) ||
236
+ (e.pageTitle ?? '').toLowerCase().includes(s));
237
+ }
238
+ if (draft.categories.size > 0 && !draft.categories.has('all')) {
239
+ events = events.filter(e => {
240
+ const cat = (0, helpers_1.getEventCategory)(e.name);
241
+ return draft.categories.has(cat);
242
+ });
243
+ }
244
+ if (draft.timeWindow !== 'all') {
245
+ const now = Date.now();
246
+ const cutoff = draft.timeWindow === '1m'
247
+ ? now - 60 * 1000
248
+ : draft.timeWindow === '5m'
249
+ ? now - 5 * 60 * 1000
250
+ : draft.timeWindow === '15m'
251
+ ? now - 15 * 60 * 1000
252
+ : now - 60 * 60 * 1000;
253
+ events = events.filter(e => e.timestamp >= cutoff);
254
+ }
255
+ if (draft.sources.size > 0 && !draft.sources.has('all')) {
256
+ events = events.filter(e => draft.sources.has(e.source || 'manual'));
257
+ }
258
+ if (draft.userTypes.size > 0 && !draft.userTypes.has('all')) {
259
+ events = events.filter(e => {
260
+ const isIdentified = Boolean(e.userId && e.userId.trim() !== '');
261
+ if (draft.userTypes.has('identified') && isIdentified)
262
+ return true;
263
+ if (draft.userTypes.has('anonymous') && !isIdentified)
264
+ return true;
265
+ return false;
266
+ });
267
+ }
268
+ if (draft.payloadComplexity !== 'all') {
269
+ events = events.filter(e => {
270
+ const count = e.params ? Object.keys(e.params).length : 0;
271
+ if (draft.payloadComplexity === 'none')
272
+ return count === 0;
273
+ if (draft.payloadComplexity === 'simple')
274
+ return count >= 1 && count <= 5;
275
+ if (draft.payloadComplexity === 'heavy')
276
+ return count > 5;
277
+ return true;
278
+ });
279
+ }
280
+ if (draft.onlyConversions) {
281
+ const CONVERSION_PATTERNS = [
282
+ 'purchase',
283
+ 'item_purchase',
284
+ 'ecommerce_purchase',
285
+ 'sign_up',
286
+ 'login',
287
+ 'lead',
288
+ 'generate_lead',
289
+ 'tutorial_complete',
290
+ 'add_payment_info',
291
+ 'begin_checkout',
292
+ ];
293
+ events = events.filter(e => CONVERSION_PATTERNS.some(pat => e.name.toLowerCase().includes(pat)));
294
+ }
295
+ if (draft.screens.size > 0) {
296
+ events = events.filter(e => {
297
+ const scr = e.screenName ||
298
+ e.params?.firebase_screen ||
299
+ e.params?.screen_name ||
300
+ e.params?.firebase_screen_class ||
301
+ e.screenClass ||
302
+ '';
303
+ return draft.screens.has(scr);
304
+ });
305
+ }
306
+ if (draft.hasRevenue) {
307
+ events = events.filter(e => {
308
+ const val = e.params?.value ?? e.params?.price;
309
+ return val !== undefined && val !== null && Number(val) > 0;
310
+ });
311
+ }
312
+ if (draft.hasItems) {
313
+ events = events.filter(e => Array.isArray(e.params?.items) && e.params.items.length > 0);
314
+ }
315
+ if (draft.hasUserProps) {
316
+ events = events.filter(e => e.userProperties && Object.keys(e.userProperties).length > 0);
317
+ }
318
+ if (draft.hasParams) {
319
+ events = events.filter(e => e.params && Object.keys(e.params).length > 0);
320
+ }
321
+ return events.length;
322
+ }, [analyticsEvents, analyticsSearch, draft]);
323
+ const isAllCategories = draft.categories.has('all') || draft.categories.size === 0;
324
+ const isAllSources = draft.sources.has('all') || draft.sources.size === 0;
325
+ const isAllUserTypes = draft.userTypes.has('all') || draft.userTypes.size === 0;
326
+ return (<react_native_1.Modal visible={visible} transparent animationType="fade" onRequestClose={handleDiscard}>
327
+ <react_native_1.View style={styles.backdrop}>
328
+ <react_native_1.Pressable style={react_native_1.StyleSheet.absoluteFill} onPress={handleDiscard}/>
329
+
330
+ <react_native_1.View style={styles.modalCard}>
331
+ {/* ─── Header ──────────────────────────────────────────────────────── */}
332
+ <react_native_1.View style={styles.header}>
333
+ <react_native_1.View style={{ flexDirection: 'row', alignItems: 'center', gap: 8 }}>
334
+ <react_native_1.View style={styles.headerIconBox}>
335
+ <NetworkIcons_1.FilterIcon color={AppColors_1.AppColors.brandPurple} size={15}/>
336
+ </react_native_1.View>
337
+ <react_native_1.View>
338
+ <react_native_1.Text style={styles.headerTitle}>Analytics Filters</react_native_1.Text>
339
+ <react_native_1.Text style={styles.headerSubtitle}>
340
+ GA4 Telemetry Dimensions & Metrics
341
+ </react_native_1.Text>
342
+ </react_native_1.View>
343
+ </react_native_1.View>
344
+
345
+ <react_native_1.View style={{ flexDirection: 'row', alignItems: 'center', gap: 8 }}>
346
+ <react_native_1.TouchableOpacity onPress={handleResetDraft} hitSlop={8} style={styles.resetBtn}>
347
+ <react_native_1.Text style={styles.resetBtnText}>Reset All</react_native_1.Text>
348
+ </react_native_1.TouchableOpacity>
349
+
350
+ <react_native_1.TouchableOpacity onPress={handleDiscard} hitSlop={10} style={styles.closeBtn}>
351
+ <NetworkIcons_1.CloseWhite />
352
+ </react_native_1.TouchableOpacity>
353
+ </react_native_1.View>
354
+ </react_native_1.View>
355
+
356
+ {/* ─── Scrollable Filter Options ──────────────────────────────────── */}
357
+ <react_native_1.ScrollView style={{ maxHeight: 460 }} contentContainerStyle={styles.scrollContent} showsVerticalScrollIndicator={true}>
358
+ {/* 1. Time Horizon Window */}
359
+ <react_native_1.View style={styles.section}>
360
+ <react_native_1.View style={styles.sectionHeaderRow}>
361
+ <NetworkIcons_1.ClockIcon color={AppColors_1.AppColors.grayTextWeak} size={12}/>
362
+ <react_native_1.Text style={styles.sectionTitle}>TIME HORIZON</react_native_1.Text>
363
+ </react_native_1.View>
364
+ <react_native_1.View style={styles.chipsWrap}>
365
+ {[
366
+ { key: 'all', label: 'All Time' },
367
+ { key: '1m', label: 'Last 1 min' },
368
+ { key: '5m', label: 'Last 5 mins' },
369
+ { key: '15m', label: 'Last 15 mins' },
370
+ { key: '1h', label: 'Last 1 hour' },
371
+ ].map(item => (<TouchableScale_1.default key={item.key} onPress={() => setTimeWindow(item.key)} style={[
372
+ styles.filterPill,
373
+ draft.timeWindow === item.key &&
374
+ styles.filterPillActive,
375
+ ]}>
376
+ <react_native_1.Text style={[
377
+ styles.filterPillText,
378
+ draft.timeWindow === item.key &&
379
+ styles.filterPillTextActive,
380
+ ]}>
381
+ {item.label}
382
+ </react_native_1.Text>
383
+ </TouchableScale_1.default>))}
384
+ </react_native_1.View>
385
+ </react_native_1.View>
386
+
387
+ {/* 2. Category Dimensions */}
388
+ <react_native_1.View style={styles.section}>
389
+ <react_native_1.View style={styles.sectionHeaderRow}>
390
+ <NetworkIcons_1.TargetGoalIcon color={AppColors_1.AppColors.grayTextWeak} size={12}/>
391
+ <react_native_1.Text style={styles.sectionTitle}>EVENT CATEGORIES</react_native_1.Text>
392
+ </react_native_1.View>
393
+ <react_native_1.View style={styles.chipsWrap}>
394
+ <TouchableScale_1.default onPress={() => toggleCategory('all')} style={[
395
+ styles.filterPill,
396
+ isAllCategories && styles.filterPillActive,
397
+ ]}>
398
+ {isAllCategories && (<NetworkIcons_1.CheckIcon color={AppColors_1.AppColors.white} size={12}/>)}
399
+ <react_native_1.Text style={[
400
+ styles.filterPillText,
401
+ isAllCategories && styles.filterPillTextActive,
402
+ ]}>
403
+ All Categories
404
+ </react_native_1.Text>
405
+ </TouchableScale_1.default>
406
+
407
+ <TouchableScale_1.default onPress={() => toggleCategory('ecommerce')} style={[
408
+ styles.filterPill,
409
+ draft.categories.has('ecommerce') &&
410
+ styles.filterPillActive,
411
+ ]}>
412
+ <NetworkIcons_1.CartIcon color={draft.categories.has('ecommerce')
413
+ ? AppColors_1.AppColors.white
414
+ : AppColors_1.AppColors.amber700} size={13}/>
415
+ <react_native_1.Text style={[
416
+ styles.filterPillText,
417
+ draft.categories.has('ecommerce') &&
418
+ styles.filterPillTextActive,
419
+ ]}>
420
+ Ecommerce
421
+ </react_native_1.Text>
422
+ </TouchableScale_1.default>
423
+
424
+ <TouchableScale_1.default onPress={() => toggleCategory('page_view')} style={[
425
+ styles.filterPill,
426
+ draft.categories.has('page_view') &&
427
+ styles.filterPillActive,
428
+ ]}>
429
+ <NetworkIcons_1.GlobeIcon color={draft.categories.has('page_view')
430
+ ? AppColors_1.AppColors.white
431
+ : AppColors_1.AppColors.sky600} size={13}/>
432
+ <react_native_1.Text style={[
433
+ styles.filterPillText,
434
+ draft.categories.has('page_view') &&
435
+ styles.filterPillTextActive,
436
+ ]}>
437
+ Screens & Pages
438
+ </react_native_1.Text>
439
+ </TouchableScale_1.default>
440
+
441
+ <TouchableScale_1.default onPress={() => toggleCategory('system')} style={[
442
+ styles.filterPill,
443
+ draft.categories.has('system') &&
444
+ styles.filterPillActive,
445
+ ]}>
446
+ <NetworkIcons_1.BoltIcon color={draft.categories.has('system')
447
+ ? AppColors_1.AppColors.white
448
+ : AppColors_1.AppColors.purple} size={13}/>
449
+ <react_native_1.Text style={[
450
+ styles.filterPillText,
451
+ draft.categories.has('system') &&
452
+ styles.filterPillTextActive,
453
+ ]}>
454
+ System & Lifecycle
455
+ </react_native_1.Text>
456
+ </TouchableScale_1.default>
457
+
458
+ <TouchableScale_1.default onPress={() => toggleCategory('custom')} style={[
459
+ styles.filterPill,
460
+ draft.categories.has('custom') &&
461
+ styles.filterPillActive,
462
+ ]}>
463
+ <NetworkIcons_1.SparkleIcon color={draft.categories.has('custom')
464
+ ? AppColors_1.AppColors.white
465
+ : AppColors_1.AppColors.brandPurple} size={13}/>
466
+ <react_native_1.Text style={[
467
+ styles.filterPillText,
468
+ draft.categories.has('custom') &&
469
+ styles.filterPillTextActive,
470
+ ]}>
471
+ Custom Events
472
+ </react_native_1.Text>
473
+ </TouchableScale_1.default>
474
+ </react_native_1.View>
475
+ </react_native_1.View>
476
+
477
+ {/* 3. Goals, Monetization & Attributes */}
478
+ <react_native_1.View style={styles.section}>
479
+ <react_native_1.View style={styles.sectionHeaderRow}>
480
+ <NetworkIcons_1.MoneyIcon color={AppColors_1.AppColors.grayTextWeak} size={12}/>
481
+ <react_native_1.Text style={styles.sectionTitle}>
482
+ MONETIZATION & ATTRIBUTES
483
+ </react_native_1.Text>
484
+ </react_native_1.View>
485
+ <react_native_1.View style={styles.chipsWrap}>
486
+ <TouchableScale_1.default onPress={() => toggleFlag('onlyConversions')} style={[
487
+ styles.filterPill,
488
+ draft.onlyConversions && styles.filterPillActive,
489
+ ]}>
490
+ <NetworkIcons_1.TargetGoalIcon color={draft.onlyConversions
491
+ ? AppColors_1.AppColors.white
492
+ : AppColors_1.AppColors.brandPurple} size={13}/>
493
+ <react_native_1.Text style={[
494
+ styles.filterPillText,
495
+ draft.onlyConversions && styles.filterPillTextActive,
496
+ ]}>
497
+ Conversion Events Only
498
+ </react_native_1.Text>
499
+ </TouchableScale_1.default>
500
+
501
+ <TouchableScale_1.default onPress={() => toggleFlag('hasRevenue')} style={[
502
+ styles.filterPill,
503
+ draft.hasRevenue && styles.filterPillActive,
504
+ ]}>
505
+ <NetworkIcons_1.MoneyIcon color={draft.hasRevenue
506
+ ? AppColors_1.AppColors.white
507
+ : AppColors_1.AppColors.emerald600} size={13}/>
508
+ <react_native_1.Text style={[
509
+ styles.filterPillText,
510
+ draft.hasRevenue && styles.filterPillTextActive,
511
+ ]}>
512
+ With Revenue (Value &gt; 0)
513
+ </react_native_1.Text>
514
+ </TouchableScale_1.default>
515
+
516
+ <TouchableScale_1.default onPress={() => toggleFlag('hasItems')} style={[
517
+ styles.filterPill,
518
+ draft.hasItems && styles.filterPillActive,
519
+ ]}>
520
+ <NetworkIcons_1.PackageBoxIcon color={draft.hasItems
521
+ ? AppColors_1.AppColors.white
522
+ : AppColors_1.AppColors.amber700} size={13}/>
523
+ <react_native_1.Text style={[
524
+ styles.filterPillText,
525
+ draft.hasItems && styles.filterPillTextActive,
526
+ ]}>
527
+ With Items Payload
528
+ </react_native_1.Text>
529
+ </TouchableScale_1.default>
530
+
531
+ <TouchableScale_1.default onPress={() => toggleFlag('hasUserProps')} style={[
532
+ styles.filterPill,
533
+ draft.hasUserProps && styles.filterPillActive,
534
+ ]}>
535
+ <NetworkIcons_1.SparkleIcon color={draft.hasUserProps
536
+ ? AppColors_1.AppColors.white
537
+ : AppColors_1.AppColors.brandPurple} size={13}/>
538
+ <react_native_1.Text style={[
539
+ styles.filterPillText,
540
+ draft.hasUserProps && styles.filterPillTextActive,
541
+ ]}>
542
+ With User Properties
543
+ </react_native_1.Text>
544
+ </TouchableScale_1.default>
545
+
546
+ <TouchableScale_1.default onPress={() => toggleFlag('hasParams')} style={[
547
+ styles.filterPill,
548
+ draft.hasParams && styles.filterPillActive,
549
+ ]}>
550
+ <NetworkIcons_1.CodeBracketsIcon color={draft.hasParams
551
+ ? AppColors_1.AppColors.white
552
+ : AppColors_1.AppColors.grayText} size={13}/>
553
+ <react_native_1.Text style={[
554
+ styles.filterPillText,
555
+ draft.hasParams && styles.filterPillTextActive,
556
+ ]}>
557
+ With Custom Params
558
+ </react_native_1.Text>
559
+ </TouchableScale_1.default>
560
+
561
+ <TouchableScale_1.default onPress={() => toggleFlag('onlyDuplicates')} style={[
562
+ styles.filterPill,
563
+ draft.onlyDuplicates && styles.filterPillActive,
564
+ ]}>
565
+ <NetworkIcons_1.RepeatIcon color={draft.onlyDuplicates
566
+ ? AppColors_1.AppColors.white
567
+ : AppColors_1.AppColors.rose600} size={13}/>
568
+ <react_native_1.Text style={[
569
+ styles.filterPillText,
570
+ draft.onlyDuplicates && styles.filterPillTextActive,
571
+ ]}>
572
+ Frequent Only (&gt; 1×)
573
+ </react_native_1.Text>
574
+ </TouchableScale_1.default>
575
+ </react_native_1.View>
576
+ </react_native_1.View>
577
+
578
+ {/* 4. User Identification */}
579
+ <react_native_1.View style={styles.section}>
580
+ <react_native_1.View style={styles.sectionHeaderRow}>
581
+ <NetworkIcons_1.UserIcon color={AppColors_1.AppColors.grayTextWeak} size={12}/>
582
+ <react_native_1.Text style={styles.sectionTitle}>USER IDENTIFICATION</react_native_1.Text>
583
+ </react_native_1.View>
584
+ <react_native_1.View style={styles.chipsWrap}>
585
+ <TouchableScale_1.default onPress={() => toggleUserType('all')} style={[
586
+ styles.filterPill,
587
+ isAllUserTypes && styles.filterPillActive,
588
+ ]}>
589
+ {isAllUserTypes && (<NetworkIcons_1.CheckIcon color={AppColors_1.AppColors.white} size={12}/>)}
590
+ <react_native_1.Text style={[
591
+ styles.filterPillText,
592
+ isAllUserTypes && styles.filterPillTextActive,
593
+ ]}>
594
+ All Users
595
+ </react_native_1.Text>
596
+ </TouchableScale_1.default>
597
+
598
+ <TouchableScale_1.default onPress={() => toggleUserType('identified')} style={[
599
+ styles.filterPill,
600
+ draft.userTypes.has('identified') &&
601
+ styles.filterPillActive,
602
+ ]}>
603
+ <NetworkIcons_1.UserCheckIcon color={draft.userTypes.has('identified')
604
+ ? AppColors_1.AppColors.white
605
+ : AppColors_1.AppColors.greenColor} size={13}/>
606
+ <react_native_1.Text style={[
607
+ styles.filterPillText,
608
+ draft.userTypes.has('identified') &&
609
+ styles.filterPillTextActive,
610
+ ]}>
611
+ Identified (User ID)
612
+ </react_native_1.Text>
613
+ </TouchableScale_1.default>
614
+
615
+ <TouchableScale_1.default onPress={() => toggleUserType('anonymous')} style={[
616
+ styles.filterPill,
617
+ draft.userTypes.has('anonymous') &&
618
+ styles.filterPillActive,
619
+ ]}>
620
+ <NetworkIcons_1.UserIcon color={draft.userTypes.has('anonymous')
621
+ ? AppColors_1.AppColors.white
622
+ : AppColors_1.AppColors.grayTextWeak} size={13}/>
623
+ <react_native_1.Text style={[
624
+ styles.filterPillText,
625
+ draft.userTypes.has('anonymous') &&
626
+ styles.filterPillTextActive,
627
+ ]}>
628
+ Anonymous
629
+ </react_native_1.Text>
630
+ </TouchableScale_1.default>
631
+ </react_native_1.View>
632
+ </react_native_1.View>
633
+
634
+ {/* 5. Source Logger SDK */}
635
+ <react_native_1.View style={styles.section}>
636
+ <react_native_1.View style={styles.sectionHeaderRow}>
637
+ <NetworkIcons_1.BoltIcon color={AppColors_1.AppColors.grayTextWeak} size={12}/>
638
+ <react_native_1.Text style={styles.sectionTitle}>EVENT SOURCE</react_native_1.Text>
639
+ </react_native_1.View>
640
+ <react_native_1.View style={styles.chipsWrap}>
641
+ <TouchableScale_1.default onPress={() => toggleSource('all')} style={[
642
+ styles.filterPill,
643
+ isAllSources && styles.filterPillActive,
644
+ ]}>
645
+ {isAllSources && (<NetworkIcons_1.CheckIcon color={AppColors_1.AppColors.white} size={12}/>)}
646
+ <react_native_1.Text style={[
647
+ styles.filterPillText,
648
+ isAllSources && styles.filterPillTextActive,
649
+ ]}>
650
+ All Sources
651
+ </react_native_1.Text>
652
+ </TouchableScale_1.default>
653
+
654
+ <TouchableScale_1.default onPress={() => toggleSource('firebase')} style={[
655
+ styles.filterPill,
656
+ draft.sources.has('firebase') &&
657
+ styles.filterPillActive,
658
+ ]}>
659
+ <react_native_1.Text style={[
660
+ styles.filterPillText,
661
+ draft.sources.has('firebase') &&
662
+ styles.filterPillTextActive,
663
+ ]}>
664
+ Firebase / GA SDK
665
+ </react_native_1.Text>
666
+ </TouchableScale_1.default>
667
+
668
+ <TouchableScale_1.default onPress={() => toggleSource('manual')} style={[
669
+ styles.filterPill,
670
+ draft.sources.has('manual') &&
671
+ styles.filterPillActive,
672
+ ]}>
673
+ <react_native_1.Text style={[
674
+ styles.filterPillText,
675
+ draft.sources.has('manual') &&
676
+ styles.filterPillTextActive,
677
+ ]}>
678
+ In-App Logger
679
+ </react_native_1.Text>
680
+ </TouchableScale_1.default>
681
+ </react_native_1.View>
682
+ </react_native_1.View>
683
+
684
+ {/* 6. Payload Complexity */}
685
+ <react_native_1.View style={styles.section}>
686
+ <react_native_1.View style={styles.sectionHeaderRow}>
687
+ <NetworkIcons_1.CodeBracketsIcon color={AppColors_1.AppColors.grayTextWeak} size={12}/>
688
+ <react_native_1.Text style={styles.sectionTitle}>PAYLOAD COMPLEXITY</react_native_1.Text>
689
+ </react_native_1.View>
690
+ <react_native_1.View style={styles.chipsWrap}>
691
+ {[
692
+ { key: 'all', label: 'All Payloads' },
693
+ { key: 'none', label: '0 Params' },
694
+ { key: 'simple', label: '1 - 5 Params' },
695
+ { key: 'heavy', label: '> 5 Params' },
696
+ ].map(item => (<TouchableScale_1.default key={item.key} onPress={() => setPayloadComplexity(item.key)} style={[
697
+ styles.filterPill,
698
+ draft.payloadComplexity === item.key &&
699
+ styles.filterPillActive,
700
+ ]}>
701
+ <react_native_1.Text style={[
702
+ styles.filterPillText,
703
+ draft.payloadComplexity === item.key &&
704
+ styles.filterPillTextActive,
705
+ ]}>
706
+ {item.label}
707
+ </react_native_1.Text>
708
+ </TouchableScale_1.default>))}
709
+ </react_native_1.View>
710
+ </react_native_1.View>
711
+
712
+ {/* 7. Discovered Screens (Dimensions) */}
713
+ {uniqueScreens.length > 0 && (<react_native_1.View style={styles.section}>
714
+ <react_native_1.View style={styles.sectionHeaderRow}>
715
+ <NetworkIcons_1.PinIcon color={AppColors_1.AppColors.grayTextWeak} size={12}/>
716
+ <react_native_1.Text style={styles.sectionTitle}>
717
+ DISCOVERED SCREENS ({uniqueScreens.length})
718
+ </react_native_1.Text>
719
+ </react_native_1.View>
720
+ <react_native_1.View style={styles.chipsWrap}>
721
+ {uniqueScreens.map(scr => {
722
+ const isSelected = draft.screens.has(scr);
723
+ return (<TouchableScale_1.default key={scr} onPress={() => toggleScreen(scr)} style={[
724
+ styles.filterPill,
725
+ isSelected && styles.filterPillActive,
726
+ ]}>
727
+ <NetworkIcons_1.PinIcon color={isSelected
728
+ ? AppColors_1.AppColors.white
729
+ : AppColors_1.AppColors.amber700} size={12}/>
730
+ <react_native_1.Text style={[
731
+ styles.filterPillText,
732
+ isSelected && styles.filterPillTextActive,
733
+ ]}>
734
+ {scr}
735
+ </react_native_1.Text>
736
+ </TouchableScale_1.default>);
737
+ })}
738
+ </react_native_1.View>
739
+ </react_native_1.View>)}
740
+
741
+ {/* 8. Sort Order */}
742
+ <react_native_1.View style={styles.section}>
743
+ <react_native_1.View style={styles.sectionHeaderRow}>
744
+ <NetworkIcons_1.ClockIcon color={AppColors_1.AppColors.grayTextWeak} size={12}/>
745
+ <react_native_1.Text style={styles.sectionTitle}>SORT ORDER</react_native_1.Text>
746
+ </react_native_1.View>
747
+ <react_native_1.View style={styles.chipsWrap}>
748
+ <TouchableScale_1.default onPress={() => setSort('time_desc')} style={[
749
+ styles.filterPill,
750
+ draft.sortBy === 'time_desc' &&
751
+ styles.filterPillActive,
752
+ ]}>
753
+ <NetworkIcons_1.ClockIcon color={draft.sortBy === 'time_desc'
754
+ ? AppColors_1.AppColors.white
755
+ : AppColors_1.AppColors.grayText} size={12}/>
756
+ <react_native_1.Text style={[
757
+ styles.filterPillText,
758
+ draft.sortBy === 'time_desc' &&
759
+ styles.filterPillTextActive,
760
+ ]}>
761
+ Newest First (Default)
762
+ </react_native_1.Text>
763
+ </TouchableScale_1.default>
764
+
765
+ <TouchableScale_1.default onPress={() => setSort('time_asc')} style={[
766
+ styles.filterPill,
767
+ draft.sortBy === 'time_asc' &&
768
+ styles.filterPillActive,
769
+ ]}>
770
+ <NetworkIcons_1.HourglassIcon color={draft.sortBy === 'time_asc'
771
+ ? AppColors_1.AppColors.white
772
+ : AppColors_1.AppColors.grayText} size={12}/>
773
+ <react_native_1.Text style={[
774
+ styles.filterPillText,
775
+ draft.sortBy === 'time_asc' &&
776
+ styles.filterPillTextActive,
777
+ ]}>
778
+ Oldest First
779
+ </react_native_1.Text>
780
+ </TouchableScale_1.default>
781
+
782
+ <TouchableScale_1.default onPress={() => setSort('revenue_desc')} style={[
783
+ styles.filterPill,
784
+ draft.sortBy === 'revenue_desc' &&
785
+ styles.filterPillActive,
786
+ ]}>
787
+ <NetworkIcons_1.MoneyIcon color={draft.sortBy === 'revenue_desc'
788
+ ? AppColors_1.AppColors.white
789
+ : AppColors_1.AppColors.emerald600} size={12}/>
790
+ <react_native_1.Text style={[
791
+ styles.filterPillText,
792
+ draft.sortBy === 'revenue_desc' &&
793
+ styles.filterPillTextActive,
794
+ ]}>
795
+ Highest Revenue
796
+ </react_native_1.Text>
797
+ </TouchableScale_1.default>
798
+
799
+ <TouchableScale_1.default onPress={() => setSort('count_desc')} style={[
800
+ styles.filterPill,
801
+ draft.sortBy === 'count_desc' &&
802
+ styles.filterPillActive,
803
+ ]}>
804
+ <NetworkIcons_1.FlameIcon color={draft.sortBy === 'count_desc'
805
+ ? AppColors_1.AppColors.white
806
+ : AppColors_1.AppColors.darkOrange} size={12}/>
807
+ <react_native_1.Text style={[
808
+ styles.filterPillText,
809
+ draft.sortBy === 'count_desc' &&
810
+ styles.filterPillTextActive,
811
+ ]}>
812
+ Most Frequent
813
+ </react_native_1.Text>
814
+ </TouchableScale_1.default>
815
+ </react_native_1.View>
816
+ </react_native_1.View>
817
+ </react_native_1.ScrollView>
818
+
819
+ {/* ─── Footer Action Bar (Discard + Apply) ────────────────────────── */}
820
+ <react_native_1.View style={styles.footer}>
821
+ <react_native_1.TouchableOpacity onPress={handleDiscard} style={styles.discardBtn} activeOpacity={0.8}>
822
+ <react_native_1.Text style={styles.discardBtnText}>Discard</react_native_1.Text>
823
+ </react_native_1.TouchableOpacity>
824
+
825
+ <react_native_1.TouchableOpacity onPress={handleApply} style={styles.applyBtn} activeOpacity={0.85}>
826
+ <react_native_1.Text style={styles.applyBtnText}>
827
+ Apply ({draftMatchCount} Events)
828
+ </react_native_1.Text>
829
+ </react_native_1.TouchableOpacity>
830
+ </react_native_1.View>
831
+ </react_native_1.View>
832
+ </react_native_1.View>
833
+ </react_native_1.Modal>);
834
+ };
835
+ const styles = react_native_1.StyleSheet.create({
836
+ backdrop: {
837
+ flex: 1,
838
+ backgroundColor: `${AppColors_1.AppColors.primaryBlack}85`,
839
+ justifyContent: 'center',
840
+ alignItems: 'center',
841
+ padding: 16,
842
+ },
843
+ modalCard: {
844
+ width: '100%',
845
+ maxWidth: 440,
846
+ backgroundColor: AppColors_1.AppColors.white,
847
+ borderRadius: 14,
848
+ borderWidth: 1,
849
+ borderColor: AppColors_1.AppColors.dividerColor,
850
+ shadowColor: AppColors_1.AppColors.black,
851
+ shadowOpacity: 0.18,
852
+ shadowRadius: 12,
853
+ shadowOffset: { width: 0, height: 4 },
854
+ elevation: 8,
855
+ overflow: 'hidden',
856
+ },
857
+ header: {
858
+ flexDirection: 'row',
859
+ alignItems: 'center',
860
+ justifyContent: 'space-between',
861
+ paddingHorizontal: 14,
862
+ paddingVertical: 12,
863
+ borderBottomWidth: 1,
864
+ borderBottomColor: AppColors_1.AppColors.dividerColor,
865
+ backgroundColor: `${AppColors_1.AppColors.brandPurple}08`,
866
+ },
867
+ headerIconBox: {
868
+ width: 28,
869
+ height: 28,
870
+ borderRadius: 7,
871
+ backgroundColor: `${AppColors_1.AppColors.brandPurple}18`,
872
+ alignItems: 'center',
873
+ justifyContent: 'center',
874
+ },
875
+ headerTitle: {
876
+ fontFamily: AppFonts_1.AppFonts.interBold,
877
+ fontSize: 13.5,
878
+ color: AppColors_1.AppColors.primaryBlack,
879
+ },
880
+ headerSubtitle: {
881
+ fontFamily: AppFonts_1.AppFonts.interMedium,
882
+ fontSize: 10,
883
+ color: AppColors_1.AppColors.grayTextWeak,
884
+ },
885
+ resetBtn: {
886
+ paddingHorizontal: 8,
887
+ paddingVertical: 4,
888
+ borderRadius: 5,
889
+ backgroundColor: `${AppColors_1.AppColors.darkOrange}14`,
890
+ borderWidth: 1,
891
+ borderColor: `${AppColors_1.AppColors.darkOrange}30`,
892
+ },
893
+ resetBtnText: {
894
+ fontFamily: AppFonts_1.AppFonts.interBold,
895
+ fontSize: 10,
896
+ color: AppColors_1.AppColors.darkOrange,
897
+ },
898
+ closeBtn: {
899
+ width: 24,
900
+ height: 24,
901
+ borderRadius: 12,
902
+ backgroundColor: `${AppColors_1.AppColors.primaryBlack}18`,
903
+ alignItems: 'center',
904
+ justifyContent: 'center',
905
+ },
906
+ scrollContent: {
907
+ padding: 14,
908
+ gap: 14,
909
+ },
910
+ section: {
911
+ gap: 7,
912
+ },
913
+ sectionHeaderRow: {
914
+ flexDirection: 'row',
915
+ alignItems: 'center',
916
+ gap: 5,
917
+ },
918
+ sectionTitle: {
919
+ fontFamily: AppFonts_1.AppFonts.interBold,
920
+ fontSize: 9.5,
921
+ color: AppColors_1.AppColors.grayTextWeak,
922
+ letterSpacing: 0.5,
923
+ },
924
+ chipsWrap: {
925
+ flexDirection: 'row',
926
+ flexWrap: 'wrap',
927
+ gap: 6.5,
928
+ },
929
+ filterPill: {
930
+ flexDirection: 'row',
931
+ alignItems: 'center',
932
+ gap: 5,
933
+ paddingHorizontal: 9,
934
+ paddingVertical: 5.5,
935
+ borderRadius: 7,
936
+ backgroundColor: AppColors_1.AppColors.grayBackground,
937
+ borderWidth: 1,
938
+ borderColor: AppColors_1.AppColors.dividerColor,
939
+ },
940
+ filterPillActive: {
941
+ backgroundColor: AppColors_1.AppColors.brandPurple,
942
+ borderColor: AppColors_1.AppColors.brandPurple,
943
+ shadowColor: AppColors_1.AppColors.brandPurple,
944
+ shadowOffset: { width: 0, height: 1 },
945
+ shadowOpacity: 0.25,
946
+ shadowRadius: 3,
947
+ elevation: 2,
948
+ },
949
+ filterPillText: {
950
+ fontFamily: AppFonts_1.AppFonts.interMedium,
951
+ fontSize: 11,
952
+ color: AppColors_1.AppColors.primaryBlack,
953
+ },
954
+ filterPillTextActive: {
955
+ color: AppColors_1.AppColors.white,
956
+ fontFamily: AppFonts_1.AppFonts.interBold,
957
+ },
958
+ footer: {
959
+ flexDirection: 'row',
960
+ alignItems: 'center',
961
+ gap: 10,
962
+ paddingHorizontal: 14,
963
+ paddingVertical: 12,
964
+ borderTopWidth: 1,
965
+ borderTopColor: AppColors_1.AppColors.dividerColor,
966
+ backgroundColor: AppColors_1.AppColors.grayBackground,
967
+ },
968
+ discardBtn: {
969
+ flex: 1,
970
+ paddingVertical: 9.5,
971
+ borderRadius: 8,
972
+ borderWidth: 1,
973
+ borderColor: AppColors_1.AppColors.dividerColor,
974
+ backgroundColor: AppColors_1.AppColors.white,
975
+ alignItems: 'center',
976
+ justifyContent: 'center',
977
+ },
978
+ discardBtnText: {
979
+ fontFamily: AppFonts_1.AppFonts.interBold,
980
+ fontSize: 12.5,
981
+ color: AppColors_1.AppColors.grayTextStrong,
982
+ },
983
+ applyBtn: {
984
+ flex: 2,
985
+ backgroundColor: AppColors_1.AppColors.brandPurple,
986
+ paddingVertical: 9.5,
987
+ borderRadius: 8,
988
+ alignItems: 'center',
989
+ justifyContent: 'center',
990
+ shadowColor: AppColors_1.AppColors.brandPurple,
991
+ shadowOffset: { width: 0, height: 1 },
992
+ shadowOpacity: 0.25,
993
+ shadowRadius: 3,
994
+ elevation: 2,
995
+ },
996
+ applyBtnText: {
997
+ fontFamily: AppFonts_1.AppFonts.interBold,
998
+ fontSize: 12.5,
999
+ color: AppColors_1.AppColors.white,
1000
+ },
1001
+ });
1002
+ exports.default = AnalyticsFilterModal;