react-native-inapp-inspector 2.0.6 → 2.0.7
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/dist/commonjs/components/Inspector/FirstTimeWalkthroughModal.d.ts +7 -0
- package/dist/commonjs/components/Inspector/FirstTimeWalkthroughModal.js +600 -0
- package/dist/commonjs/components/Inspector/MainScreen.js +5 -1
- package/dist/commonjs/components/Inspector/SettingsPanel.js +123 -35
- package/dist/commonjs/constants/version.d.ts +1 -1
- package/dist/commonjs/constants/version.js +1 -1
- package/dist/commonjs/helpers/settingsStore.d.ts +1 -1
- package/dist/commonjs/helpers/settingsStore.js +4 -2
- package/dist/commonjs/index.js +14 -0
- package/dist/commonjs/types/interfaces.d.ts +4 -0
- package/dist/esm/components/Inspector/FirstTimeWalkthroughModal.d.ts +7 -0
- package/dist/esm/components/Inspector/FirstTimeWalkthroughModal.js +560 -0
- package/dist/esm/components/Inspector/MainScreen.js +5 -1
- package/dist/esm/components/Inspector/SettingsPanel.js +124 -36
- package/dist/esm/constants/version.d.ts +1 -1
- package/dist/esm/constants/version.js +1 -1
- package/dist/esm/helpers/settingsStore.d.ts +1 -1
- package/dist/esm/helpers/settingsStore.js +4 -2
- package/dist/esm/index.js +14 -0
- package/dist/esm/types/interfaces.d.ts +4 -0
- package/package.json +1 -1
|
@@ -0,0 +1,600 @@
|
|
|
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
|
+
exports.FirstTimeWalkthroughModal = void 0;
|
|
40
|
+
const react_1 = __importStar(require("react"));
|
|
41
|
+
const react_native_1 = require("react-native");
|
|
42
|
+
const react_native_svg_1 = __importStar(require("react-native-svg"));
|
|
43
|
+
const TouchableScale_1 = __importDefault(require("../TouchableScale"));
|
|
44
|
+
const AppFonts_1 = require("../../styles/AppFonts");
|
|
45
|
+
const settingsStore_1 = require("../../helpers/settingsStore");
|
|
46
|
+
const NetworkIcons_1 = require("../NetworkIcons");
|
|
47
|
+
// ─── SVG Icons for Walkthrough Steps ──────────────────────────────────────────
|
|
48
|
+
const ModulesIconSvg = ({ size = 18, color = '#818CF8', }) => (<react_native_svg_1.default width={size} height={size} viewBox="0 0 24 24" fill="none">
|
|
49
|
+
<react_native_svg_1.Rect x="3" y="3" width="7.5" height="7.5" rx="2" fill="rgba(129, 140, 248, 0.2)" stroke={color} strokeWidth="2"/>
|
|
50
|
+
<react_native_svg_1.Rect x="13.5" y="3" width="7.5" height="7.5" rx="2" fill="rgba(129, 140, 248, 0.2)" stroke={color} strokeWidth="2"/>
|
|
51
|
+
<react_native_svg_1.Rect x="3" y="13.5" width="7.5" height="7.5" rx="2" fill="rgba(129, 140, 248, 0.2)" stroke={color} strokeWidth="2"/>
|
|
52
|
+
<react_native_svg_1.Rect x="13.5" y="13.5" width="7.5" height="7.5" rx="2" fill="rgba(129, 140, 248, 0.2)" stroke={color} strokeWidth="2"/>
|
|
53
|
+
</react_native_svg_1.default>);
|
|
54
|
+
const SettingsGearIconSvg = ({ size = 18, color = '#818CF8', }) => (<react_native_svg_1.default width={size} height={size} viewBox="0 0 24 24" fill="none">
|
|
55
|
+
<react_native_svg_1.Circle cx="12" cy="12" r="3" stroke={color} strokeWidth="2" fill="rgba(129, 140, 248, 0.2)"/>
|
|
56
|
+
<react_native_svg_1.Path d="M19.4 15a1.65 1.65 0 00.33 1.82l.06.06a2 2 0 010 2.83 2 2 0 01-2.83 0l-.06-.06a1.65 1.65 0 00-1.82-.33 1.65 1.65 0 00-1 1.51V21a2 2 0 01-2 2 2 2 0 01-2-2v-.09A1.65 1.65 0 009 19.4a1.65 1.65 0 00-1.82.33l-.06.06a2 2 0 01-2.83 0 2 2 0 010-2.83l.06-.06a1.65 1.65 0 00.33-1.82 1.65 1.65 0 00-1.51-1H3a2 2 0 01-2-2 2 2 0 012-2h.09A1.65 1.65 0 004.6 9a1.65 1.65 0 00-.33-1.82l-.06-.06a2 2 0 010-2.83 2 2 0 012.83 0l.06.06a1.65 1.65 0 001.82.33H9a1.65 1.65 0 001-1.51V3a2 2 0 012-2 2 2 0 012 2v.09a1.65 1.65 0 001 1.51 1.65 1.65 0 001.82-.33l.06-.06a2 2 0 012.83 0 2 2 0 010 2.83l-.06.06a1.65 1.65 0 00-.33 1.82V9a1.65 1.65 0 001.51 1H21a2 2 0 012 2 2 2 0 01-2 2h-.09a1.65 1.65 0 00-1.51 1z" stroke={color} strokeWidth="2" strokeLinecap="round" strokeLinejoin="round"/>
|
|
57
|
+
</react_native_svg_1.default>);
|
|
58
|
+
const DetailWorkbenchIconSvg = ({ size = 18, color = '#818CF8', }) => (<react_native_svg_1.default width={size} height={size} viewBox="0 0 24 24" fill="none">
|
|
59
|
+
<react_native_svg_1.Path d="M16 18l6-6-6-6M8 6l-6 6 6 6" stroke={color} strokeWidth="2.4" strokeLinecap="round" strokeLinejoin="round"/>
|
|
60
|
+
</react_native_svg_1.default>);
|
|
61
|
+
const NetworkGlobeIconSvg = ({ size = 18, color = '#818CF8', }) => (<react_native_svg_1.default width={size} height={size} viewBox="0 0 24 24" fill="none">
|
|
62
|
+
<react_native_svg_1.Circle cx="12" cy="12" r="9.5" stroke={color} strokeWidth="2" fill="rgba(129, 140, 248, 0.15)"/>
|
|
63
|
+
<react_native_svg_1.Path d="M2.5 12h19M12 2.5a14.5 14.5 0 013.8 9.5 14.5 14.5 0 01-3.8 9.5 14.5 14.5 0 01-3.8-9.5 14.5 14.5 0 013.8-9.5z" stroke={color} strokeWidth="1.8" strokeLinecap="round" strokeLinejoin="round"/>
|
|
64
|
+
</react_native_svg_1.default>);
|
|
65
|
+
const SearchFiltersIconSvg = ({ size = 18, color = '#818CF8', }) => (<react_native_svg_1.default width={size} height={size} viewBox="0 0 24 24" fill="none">
|
|
66
|
+
<react_native_svg_1.Circle cx="11" cy="11" r="7.5" stroke={color} strokeWidth="2" fill="rgba(129, 140, 248, 0.15)"/>
|
|
67
|
+
<react_native_svg_1.Path d="M20.5 20.5l-4.2-4.2" stroke={color} strokeWidth="2.4" strokeLinecap="round" strokeLinejoin="round"/>
|
|
68
|
+
</react_native_svg_1.default>);
|
|
69
|
+
const SkipIconSvg = ({ size = 12, color = '#CBD5E1', }) => (<react_native_svg_1.default width={size} height={size} viewBox="0 0 24 24" fill="none">
|
|
70
|
+
<react_native_svg_1.Path d="M5 4l10 8-10 8V4zM19 5v14" stroke={color} strokeWidth="2.2" strokeLinecap="round" strokeLinejoin="round"/>
|
|
71
|
+
</react_native_svg_1.default>);
|
|
72
|
+
const NextArrowSvg = ({ size = 12, color = '#FFFFFF', }) => (<react_native_svg_1.default width={size} height={size} viewBox="0 0 24 24" fill="none">
|
|
73
|
+
<react_native_svg_1.Path d="M5 12h14M12 5l7 7-7 7" stroke={color} strokeWidth="2.5" strokeLinecap="round" strokeLinejoin="round"/>
|
|
74
|
+
</react_native_svg_1.default>);
|
|
75
|
+
const BackArrowSvg = ({ size = 12, color = '#E0E7FF', }) => (<react_native_svg_1.default width={size} height={size} viewBox="0 0 24 24" fill="none">
|
|
76
|
+
<react_native_svg_1.Path d="M19 12H5M12 19l-7-7 7-7" stroke={color} strokeWidth="2.5" strokeLinecap="round" strokeLinejoin="round"/>
|
|
77
|
+
</react_native_svg_1.default>);
|
|
78
|
+
const PointerTopSvg = ({ align, offset = 24 }) => {
|
|
79
|
+
const containerStyle = [
|
|
80
|
+
styles.pointerSvgTop,
|
|
81
|
+
align === 'left' && { left: offset },
|
|
82
|
+
align === 'center' && { alignSelf: 'center' },
|
|
83
|
+
align === 'right' && { right: offset },
|
|
84
|
+
];
|
|
85
|
+
return (<react_native_1.View style={containerStyle} pointerEvents="none">
|
|
86
|
+
<react_native_svg_1.default width={20} height={10} viewBox="0 0 20 10">
|
|
87
|
+
<react_native_svg_1.Path d="M0 10 L10 1 L20 10" fill="#13182C" stroke="rgba(129, 140, 248, 0.5)" strokeWidth="1.2"/>
|
|
88
|
+
<react_native_svg_1.Path d="M1 10 L19 10" stroke="#13182C" strokeWidth="2.5"/>
|
|
89
|
+
</react_native_svg_1.default>
|
|
90
|
+
</react_native_1.View>);
|
|
91
|
+
};
|
|
92
|
+
const PointerBottomSvg = ({ align, offset = 24 }) => {
|
|
93
|
+
const containerStyle = [
|
|
94
|
+
styles.pointerSvgBottom,
|
|
95
|
+
align === 'left' && { left: offset },
|
|
96
|
+
align === 'center' && { alignSelf: 'center' },
|
|
97
|
+
align === 'right' && { right: offset },
|
|
98
|
+
];
|
|
99
|
+
return (<react_native_1.View style={containerStyle} pointerEvents="none">
|
|
100
|
+
<react_native_svg_1.default width={20} height={10} viewBox="0 0 20 10">
|
|
101
|
+
<react_native_svg_1.Path d="M0 0 L10 9 L20 0" fill="#13182C" stroke="rgba(129, 140, 248, 0.5)" strokeWidth="1.2"/>
|
|
102
|
+
<react_native_svg_1.Path d="M1 0 L19 0" stroke="#13182C" strokeWidth="2.5"/>
|
|
103
|
+
</react_native_svg_1.default>
|
|
104
|
+
</react_native_1.View>);
|
|
105
|
+
};
|
|
106
|
+
const TOOLTIP_STEPS = [
|
|
107
|
+
{
|
|
108
|
+
id: 'developer-modules',
|
|
109
|
+
stepNumber: 1,
|
|
110
|
+
totalSteps: 5,
|
|
111
|
+
badge: '1/5 • DEVELOPER MODULES',
|
|
112
|
+
iconComponent: <ModulesIconSvg size={18} color="#A5B4FC"/>,
|
|
113
|
+
title: '10+ Developer Tool Modules',
|
|
114
|
+
description: 'Switch seamlessly across Network APIs, Console Logs, Analytics event streams, Redux state trees, AsyncStorage/MMKV viewer, Device hardware/OS specs, and Performance audits.',
|
|
115
|
+
pointerPosition: 'top',
|
|
116
|
+
pointerAlign: 'left',
|
|
117
|
+
pointerOffset: 36,
|
|
118
|
+
cardTop: 108,
|
|
119
|
+
highlightBox: {
|
|
120
|
+
top: 54,
|
|
121
|
+
left: 8,
|
|
122
|
+
right: 8,
|
|
123
|
+
height: 46,
|
|
124
|
+
borderRadius: 10,
|
|
125
|
+
},
|
|
126
|
+
},
|
|
127
|
+
{
|
|
128
|
+
id: 'settings-hud',
|
|
129
|
+
stepNumber: 2,
|
|
130
|
+
totalSteps: 5,
|
|
131
|
+
badge: '2/5 • SETTINGS & CONTROLS',
|
|
132
|
+
iconComponent: <SettingsGearIconSvg size={18} color="#A5B4FC"/>,
|
|
133
|
+
title: 'Settings, RAM Limits & Live HUD',
|
|
134
|
+
description: 'Configure RAM-based auto limits to prevent memory bloat, customize tab ordering, toggle Dark/Light theme, and enable the live 60 FPS floating HUD overlay for on-screen performance monitoring.',
|
|
135
|
+
pointerPosition: 'top',
|
|
136
|
+
pointerAlign: 'right',
|
|
137
|
+
pointerOffset: 58,
|
|
138
|
+
cardTop: 56,
|
|
139
|
+
highlightBox: {
|
|
140
|
+
top: 8,
|
|
141
|
+
right: 52,
|
|
142
|
+
width: 38,
|
|
143
|
+
height: 38,
|
|
144
|
+
borderRadius: 10,
|
|
145
|
+
},
|
|
146
|
+
},
|
|
147
|
+
{
|
|
148
|
+
id: 'request-replay',
|
|
149
|
+
stepNumber: 3,
|
|
150
|
+
totalSteps: 5,
|
|
151
|
+
badge: '3/5 • DETAIL INSPECTOR & WORKBENCH',
|
|
152
|
+
iconComponent: <DetailWorkbenchIconSvg size={18} color="#A5B4FC"/>,
|
|
153
|
+
title: 'Deep Detail Pages & Replay Sandbox',
|
|
154
|
+
description: 'Tap any item to inspect syntax-highlighted JSON trees, payload diffs, full headers, and stack traces. Tap the Replay icon to launch the isolated Edit & Resend workbench.',
|
|
155
|
+
pointerPosition: 'top',
|
|
156
|
+
pointerAlign: 'center',
|
|
157
|
+
cardTop: 272,
|
|
158
|
+
highlightBox: {
|
|
159
|
+
top: 176,
|
|
160
|
+
left: 10,
|
|
161
|
+
right: 10,
|
|
162
|
+
height: 88,
|
|
163
|
+
borderRadius: 12,
|
|
164
|
+
},
|
|
165
|
+
},
|
|
166
|
+
{
|
|
167
|
+
id: 'network-apis',
|
|
168
|
+
stepNumber: 4,
|
|
169
|
+
totalSteps: 5,
|
|
170
|
+
badge: '4/5 • NETWORK TELEMETRY',
|
|
171
|
+
iconComponent: <NetworkGlobeIconSvg size={18} color="#A5B4FC"/>,
|
|
172
|
+
title: 'Real-Time Network Telemetry',
|
|
173
|
+
description: 'Zero-config auto-interception for Fetch, Axios, and XHR. Inspect round-trip latency, status codes, query params, headers, and colorized JSON response trees with instant cURL export.',
|
|
174
|
+
pointerPosition: 'top',
|
|
175
|
+
pointerAlign: 'left',
|
|
176
|
+
pointerOffset: 46,
|
|
177
|
+
cardTop: 106,
|
|
178
|
+
highlightBox: {
|
|
179
|
+
top: 57,
|
|
180
|
+
left: 12,
|
|
181
|
+
width: 92,
|
|
182
|
+
height: 38,
|
|
183
|
+
borderRadius: 10,
|
|
184
|
+
},
|
|
185
|
+
},
|
|
186
|
+
{
|
|
187
|
+
id: 'search-filters',
|
|
188
|
+
stepNumber: 5,
|
|
189
|
+
totalSteps: 5,
|
|
190
|
+
badge: '5/5 • SEARCH & SMART FILTERS',
|
|
191
|
+
iconComponent: <SearchFiltersIconSvg size={18} color="#A5B4FC"/>,
|
|
192
|
+
title: 'Instant Search & Status Filters',
|
|
193
|
+
description: 'Filter network traffic and logs instantly by status (2xx OK, Errors, Slow >500ms), regex expressions, or deep content matching across URLs, headers, and JSON keys.',
|
|
194
|
+
pointerPosition: 'top',
|
|
195
|
+
pointerAlign: 'center',
|
|
196
|
+
cardTop: 182,
|
|
197
|
+
highlightBox: {
|
|
198
|
+
top: 102,
|
|
199
|
+
left: 10,
|
|
200
|
+
right: 10,
|
|
201
|
+
height: 72,
|
|
202
|
+
borderRadius: 12,
|
|
203
|
+
},
|
|
204
|
+
},
|
|
205
|
+
];
|
|
206
|
+
const FirstTimeWalkthroughModal = ({ visible, onClose }) => {
|
|
207
|
+
const [currentStepIndex, setCurrentStepIndex] = (0, react_1.useState)(0);
|
|
208
|
+
const [dontShowAgain, setDontShowAgain] = (0, react_1.useState)(true);
|
|
209
|
+
react_1.default.useEffect(() => {
|
|
210
|
+
if (visible) {
|
|
211
|
+
setCurrentStepIndex(0);
|
|
212
|
+
}
|
|
213
|
+
}, [visible]);
|
|
214
|
+
if (!visible)
|
|
215
|
+
return null;
|
|
216
|
+
const currentStep = TOOLTIP_STEPS[currentStepIndex];
|
|
217
|
+
const isLastStep = currentStepIndex === TOOLTIP_STEPS.length - 1;
|
|
218
|
+
const handleFinish = async () => {
|
|
219
|
+
if (dontShowAgain) {
|
|
220
|
+
try {
|
|
221
|
+
await (0, settingsStore_1.saveSettings)({ hasCompletedWalkthrough: true });
|
|
222
|
+
}
|
|
223
|
+
catch {
|
|
224
|
+
// Safe fallback
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
onClose();
|
|
228
|
+
};
|
|
229
|
+
const handleNext = () => {
|
|
230
|
+
if (isLastStep) {
|
|
231
|
+
handleFinish();
|
|
232
|
+
}
|
|
233
|
+
else {
|
|
234
|
+
setCurrentStepIndex(prev => prev + 1);
|
|
235
|
+
}
|
|
236
|
+
};
|
|
237
|
+
const handlePrevious = () => {
|
|
238
|
+
if (currentStepIndex > 0) {
|
|
239
|
+
setCurrentStepIndex(prev => prev - 1);
|
|
240
|
+
}
|
|
241
|
+
};
|
|
242
|
+
return (<react_native_1.View style={styles.backdrop} pointerEvents="box-none">
|
|
243
|
+
{/* Semi-transparent Dimming Layer */}
|
|
244
|
+
<react_native_1.Pressable style={styles.scrim} onPress={handleFinish}/>
|
|
245
|
+
|
|
246
|
+
{/* Spotlight Halo Box around targeted UI element */}
|
|
247
|
+
{currentStep.highlightBox && (<react_native_1.View style={[
|
|
248
|
+
styles.spotlightRing,
|
|
249
|
+
{
|
|
250
|
+
top: currentStep.highlightBox.top,
|
|
251
|
+
bottom: currentStep.highlightBox.bottom,
|
|
252
|
+
left: currentStep.highlightBox.left,
|
|
253
|
+
right: currentStep.highlightBox.right,
|
|
254
|
+
width: currentStep.highlightBox.width,
|
|
255
|
+
height: currentStep.highlightBox.height,
|
|
256
|
+
borderRadius: currentStep.highlightBox.borderRadius || 12,
|
|
257
|
+
},
|
|
258
|
+
]} pointerEvents="none"/>)}
|
|
259
|
+
|
|
260
|
+
{/* Contextual Tooltip Balloon Card */}
|
|
261
|
+
<react_native_1.View style={[
|
|
262
|
+
styles.tooltipCard,
|
|
263
|
+
currentStep.cardTop != null && { top: currentStep.cardTop },
|
|
264
|
+
currentStep.cardBottom != null && { bottom: currentStep.cardBottom },
|
|
265
|
+
]}>
|
|
266
|
+
{/* Seamless SVG Pointer Beak (Pointing Up towards target) */}
|
|
267
|
+
{currentStep.pointerPosition === 'top' && (<PointerTopSvg align={currentStep.pointerAlign} offset={currentStep.pointerOffset}/>)}
|
|
268
|
+
|
|
269
|
+
{/* ─── 1. TOP HEADER & CONTROLS ─── */}
|
|
270
|
+
<react_native_1.View style={styles.cardHeader}>
|
|
271
|
+
<react_native_1.View style={styles.badgePill}>
|
|
272
|
+
<react_native_1.View style={styles.badgeDot}/>
|
|
273
|
+
<react_native_1.Text style={styles.badgeText}>{currentStep.badge}</react_native_1.Text>
|
|
274
|
+
</react_native_1.View>
|
|
275
|
+
|
|
276
|
+
<react_native_1.View style={styles.topActions}>
|
|
277
|
+
<TouchableScale_1.default style={styles.skipHeaderBtn} onPress={handleFinish} hitSlop={8}>
|
|
278
|
+
<SkipIconSvg size={11} color="#CBD5E1"/>
|
|
279
|
+
<react_native_1.Text style={styles.skipHeaderText}>Skip Tour</react_native_1.Text>
|
|
280
|
+
</TouchableScale_1.default>
|
|
281
|
+
|
|
282
|
+
<TouchableScale_1.default style={styles.closeBtn} onPress={handleFinish} hitSlop={10}>
|
|
283
|
+
<NetworkIcons_1.CloseWhite size={11} color="#CBD5E1"/>
|
|
284
|
+
</TouchableScale_1.default>
|
|
285
|
+
</react_native_1.View>
|
|
286
|
+
</react_native_1.View>
|
|
287
|
+
|
|
288
|
+
{/* ─── 2. TITLE & DESCRIPTION ─── */}
|
|
289
|
+
<react_native_1.View style={styles.contentSection}>
|
|
290
|
+
<react_native_1.View style={styles.titleRow}>
|
|
291
|
+
<react_native_1.View style={styles.iconContainer}>
|
|
292
|
+
{currentStep.iconComponent}
|
|
293
|
+
</react_native_1.View>
|
|
294
|
+
<react_native_1.Text style={styles.titleText} numberOfLines={1}>
|
|
295
|
+
{currentStep.title}
|
|
296
|
+
</react_native_1.Text>
|
|
297
|
+
</react_native_1.View>
|
|
298
|
+
<react_native_1.Text style={styles.descriptionText}>{currentStep.description}</react_native_1.Text>
|
|
299
|
+
</react_native_1.View>
|
|
300
|
+
|
|
301
|
+
{/* ─── 3. FOOTER (DOTS & NAVIGATION ACTIONS) ─── */}
|
|
302
|
+
<react_native_1.View style={styles.footerRow}>
|
|
303
|
+
{/* Progress Dots Indicator */}
|
|
304
|
+
<react_native_1.View style={styles.dotsContainer}>
|
|
305
|
+
{TOOLTIP_STEPS.map((s, idx) => (<react_native_1.Pressable key={s.id} onPress={() => setCurrentStepIndex(idx)} hitSlop={6}>
|
|
306
|
+
<react_native_1.View style={[
|
|
307
|
+
styles.dot,
|
|
308
|
+
currentStepIndex === idx && styles.dotActive,
|
|
309
|
+
]}/>
|
|
310
|
+
</react_native_1.Pressable>))}
|
|
311
|
+
</react_native_1.View>
|
|
312
|
+
|
|
313
|
+
{/* Action Buttons */}
|
|
314
|
+
<react_native_1.View style={styles.btnGroup}>
|
|
315
|
+
{currentStepIndex > 0 && (<TouchableScale_1.default style={styles.backBtn} onPress={handlePrevious} hitSlop={6}>
|
|
316
|
+
<BackArrowSvg size={11} color="#E0E7FF"/>
|
|
317
|
+
<react_native_1.Text style={styles.backBtnText}>Back</react_native_1.Text>
|
|
318
|
+
</TouchableScale_1.default>)}
|
|
319
|
+
|
|
320
|
+
<TouchableScale_1.default style={[
|
|
321
|
+
styles.nextBtn,
|
|
322
|
+
isLastStep && styles.nextBtnFinal,
|
|
323
|
+
]} onPress={handleNext} hitSlop={6}>
|
|
324
|
+
<react_native_1.Text style={styles.nextBtnText}>
|
|
325
|
+
{isLastStep ? 'Got It 🚀' : 'Next'}
|
|
326
|
+
</react_native_1.Text>
|
|
327
|
+
{!isLastStep && <NextArrowSvg size={11} color="#FFFFFF"/>}
|
|
328
|
+
</TouchableScale_1.default>
|
|
329
|
+
</react_native_1.View>
|
|
330
|
+
</react_native_1.View>
|
|
331
|
+
|
|
332
|
+
{/* Don't show again toggle */}
|
|
333
|
+
<TouchableScale_1.default style={styles.dontShowRow} onPress={() => setDontShowAgain(prev => !prev)} hitSlop={6}>
|
|
334
|
+
<react_native_1.View style={[
|
|
335
|
+
styles.checkbox,
|
|
336
|
+
dontShowAgain && styles.checkboxActive,
|
|
337
|
+
]}>
|
|
338
|
+
{dontShowAgain && <NetworkIcons_1.CheckIcon size={9} color="#FFFFFF"/>}
|
|
339
|
+
</react_native_1.View>
|
|
340
|
+
<react_native_1.Text style={styles.dontShowText}>
|
|
341
|
+
Don't show tour on startup
|
|
342
|
+
</react_native_1.Text>
|
|
343
|
+
</TouchableScale_1.default>
|
|
344
|
+
|
|
345
|
+
{/* Seamless SVG Pointer Beak (Pointing Down towards target) */}
|
|
346
|
+
{currentStep.pointerPosition === 'bottom' && (<PointerBottomSvg align={currentStep.pointerAlign} offset={currentStep.pointerOffset}/>)}
|
|
347
|
+
</react_native_1.View>
|
|
348
|
+
</react_native_1.View>);
|
|
349
|
+
};
|
|
350
|
+
exports.FirstTimeWalkthroughModal = FirstTimeWalkthroughModal;
|
|
351
|
+
const styles = react_native_1.StyleSheet.create({
|
|
352
|
+
backdrop: {
|
|
353
|
+
position: 'absolute',
|
|
354
|
+
top: 0,
|
|
355
|
+
bottom: 0,
|
|
356
|
+
left: 0,
|
|
357
|
+
right: 0,
|
|
358
|
+
width: '100%',
|
|
359
|
+
height: '100%',
|
|
360
|
+
zIndex: 999999,
|
|
361
|
+
elevation: 999999,
|
|
362
|
+
},
|
|
363
|
+
scrim: {
|
|
364
|
+
position: 'absolute',
|
|
365
|
+
top: 0,
|
|
366
|
+
bottom: 0,
|
|
367
|
+
left: 0,
|
|
368
|
+
right: 0,
|
|
369
|
+
width: '100%',
|
|
370
|
+
height: '100%',
|
|
371
|
+
backgroundColor: 'rgba(0, 0, 0, 0.72)',
|
|
372
|
+
},
|
|
373
|
+
spotlightRing: {
|
|
374
|
+
position: 'absolute',
|
|
375
|
+
borderWidth: 2,
|
|
376
|
+
borderColor: '#818CF8', // Electric neon violet/indigo
|
|
377
|
+
backgroundColor: 'rgba(99, 102, 241, 0.18)',
|
|
378
|
+
shadowColor: '#818CF8',
|
|
379
|
+
shadowOpacity: 0.9,
|
|
380
|
+
shadowRadius: 12,
|
|
381
|
+
shadowOffset: { width: 0, height: 0 },
|
|
382
|
+
zIndex: 1000000,
|
|
383
|
+
elevation: 1000000,
|
|
384
|
+
},
|
|
385
|
+
tooltipCard: {
|
|
386
|
+
position: 'absolute',
|
|
387
|
+
left: 12,
|
|
388
|
+
right: 12,
|
|
389
|
+
backgroundColor: '#13182C', // Luxurious Deep Space Navy Indigo
|
|
390
|
+
borderRadius: 16,
|
|
391
|
+
paddingHorizontal: 16,
|
|
392
|
+
paddingTop: 14,
|
|
393
|
+
paddingBottom: 13,
|
|
394
|
+
shadowColor: '#000000',
|
|
395
|
+
shadowOpacity: 0.6,
|
|
396
|
+
shadowRadius: 20,
|
|
397
|
+
shadowOffset: { width: 0, height: 10 },
|
|
398
|
+
elevation: 24,
|
|
399
|
+
zIndex: 1000001,
|
|
400
|
+
borderWidth: 1.2,
|
|
401
|
+
borderColor: 'rgba(129, 140, 248, 0.45)', // Neon Indigo glowing border
|
|
402
|
+
},
|
|
403
|
+
pointerSvgTop: {
|
|
404
|
+
position: 'absolute',
|
|
405
|
+
top: -9,
|
|
406
|
+
zIndex: 1000002,
|
|
407
|
+
},
|
|
408
|
+
pointerSvgBottom: {
|
|
409
|
+
position: 'absolute',
|
|
410
|
+
bottom: -9,
|
|
411
|
+
zIndex: 1000002,
|
|
412
|
+
},
|
|
413
|
+
cardHeader: {
|
|
414
|
+
flexDirection: 'row',
|
|
415
|
+
alignItems: 'center',
|
|
416
|
+
justifyContent: 'space-between',
|
|
417
|
+
marginBottom: 10,
|
|
418
|
+
},
|
|
419
|
+
badgePill: {
|
|
420
|
+
flexDirection: 'row',
|
|
421
|
+
alignItems: 'center',
|
|
422
|
+
gap: 5,
|
|
423
|
+
backgroundColor: 'rgba(99, 102, 241, 0.22)',
|
|
424
|
+
paddingHorizontal: 9,
|
|
425
|
+
paddingVertical: 3.5,
|
|
426
|
+
borderRadius: 7,
|
|
427
|
+
borderWidth: 0.8,
|
|
428
|
+
borderColor: 'rgba(165, 180, 252, 0.35)',
|
|
429
|
+
},
|
|
430
|
+
badgeDot: {
|
|
431
|
+
width: 5,
|
|
432
|
+
height: 5,
|
|
433
|
+
borderRadius: 2.5,
|
|
434
|
+
backgroundColor: '#818CF8',
|
|
435
|
+
},
|
|
436
|
+
badgeText: {
|
|
437
|
+
fontFamily: AppFonts_1.AppFonts.interBold,
|
|
438
|
+
fontSize: 9.5,
|
|
439
|
+
color: '#E0E7FF',
|
|
440
|
+
letterSpacing: 0.6,
|
|
441
|
+
},
|
|
442
|
+
topActions: {
|
|
443
|
+
flexDirection: 'row',
|
|
444
|
+
alignItems: 'center',
|
|
445
|
+
gap: 6,
|
|
446
|
+
},
|
|
447
|
+
skipHeaderBtn: {
|
|
448
|
+
flexDirection: 'row',
|
|
449
|
+
alignItems: 'center',
|
|
450
|
+
gap: 4,
|
|
451
|
+
backgroundColor: 'rgba(255, 255, 255, 0.08)',
|
|
452
|
+
paddingHorizontal: 8,
|
|
453
|
+
paddingVertical: 3.5,
|
|
454
|
+
borderRadius: 6,
|
|
455
|
+
borderWidth: 0.8,
|
|
456
|
+
borderColor: 'rgba(255, 255, 255, 0.14)',
|
|
457
|
+
},
|
|
458
|
+
skipHeaderIcon: {
|
|
459
|
+
fontSize: 9.5,
|
|
460
|
+
},
|
|
461
|
+
skipHeaderText: {
|
|
462
|
+
fontFamily: AppFonts_1.AppFonts.interMedium,
|
|
463
|
+
fontSize: 10.5,
|
|
464
|
+
color: '#CBD5E1',
|
|
465
|
+
},
|
|
466
|
+
closeBtn: {
|
|
467
|
+
width: 22,
|
|
468
|
+
height: 22,
|
|
469
|
+
borderRadius: 11,
|
|
470
|
+
backgroundColor: 'rgba(255, 255, 255, 0.08)',
|
|
471
|
+
alignItems: 'center',
|
|
472
|
+
justifyContent: 'center',
|
|
473
|
+
borderWidth: 0.8,
|
|
474
|
+
borderColor: 'rgba(255, 255, 255, 0.14)',
|
|
475
|
+
},
|
|
476
|
+
contentSection: {
|
|
477
|
+
marginBottom: 12,
|
|
478
|
+
},
|
|
479
|
+
titleRow: {
|
|
480
|
+
flexDirection: 'row',
|
|
481
|
+
alignItems: 'center',
|
|
482
|
+
gap: 8,
|
|
483
|
+
marginBottom: 6,
|
|
484
|
+
},
|
|
485
|
+
iconContainer: {
|
|
486
|
+
width: 28,
|
|
487
|
+
height: 28,
|
|
488
|
+
borderRadius: 7,
|
|
489
|
+
backgroundColor: 'rgba(99, 102, 241, 0.28)',
|
|
490
|
+
borderWidth: 0.8,
|
|
491
|
+
borderColor: 'rgba(165, 180, 252, 0.25)',
|
|
492
|
+
alignItems: 'center',
|
|
493
|
+
justifyContent: 'center',
|
|
494
|
+
},
|
|
495
|
+
titleEmoji: {
|
|
496
|
+
fontSize: 15,
|
|
497
|
+
},
|
|
498
|
+
titleText: {
|
|
499
|
+
flex: 1,
|
|
500
|
+
fontFamily: AppFonts_1.AppFonts.interBold,
|
|
501
|
+
fontSize: 15,
|
|
502
|
+
color: '#FFFFFF',
|
|
503
|
+
letterSpacing: -0.2,
|
|
504
|
+
},
|
|
505
|
+
descriptionText: {
|
|
506
|
+
fontFamily: AppFonts_1.AppFonts.interRegular,
|
|
507
|
+
fontSize: 12.5,
|
|
508
|
+
color: '#CBD5E1', // Clean slate-300
|
|
509
|
+
lineHeight: 18.5,
|
|
510
|
+
},
|
|
511
|
+
footerRow: {
|
|
512
|
+
flexDirection: 'row',
|
|
513
|
+
alignItems: 'center',
|
|
514
|
+
justifyContent: 'space-between',
|
|
515
|
+
paddingTop: 10,
|
|
516
|
+
borderTopWidth: 1,
|
|
517
|
+
borderTopColor: 'rgba(255, 255, 255, 0.12)',
|
|
518
|
+
marginBottom: 10,
|
|
519
|
+
},
|
|
520
|
+
dotsContainer: {
|
|
521
|
+
flexDirection: 'row',
|
|
522
|
+
alignItems: 'center',
|
|
523
|
+
gap: 5,
|
|
524
|
+
},
|
|
525
|
+
dot: {
|
|
526
|
+
width: 6,
|
|
527
|
+
height: 6,
|
|
528
|
+
borderRadius: 3,
|
|
529
|
+
backgroundColor: 'rgba(255, 255, 255, 0.2)',
|
|
530
|
+
},
|
|
531
|
+
dotActive: {
|
|
532
|
+
width: 18,
|
|
533
|
+
height: 6,
|
|
534
|
+
borderRadius: 3,
|
|
535
|
+
backgroundColor: '#818CF8', // Neon active pill
|
|
536
|
+
},
|
|
537
|
+
btnGroup: {
|
|
538
|
+
flexDirection: 'row',
|
|
539
|
+
alignItems: 'center',
|
|
540
|
+
gap: 8,
|
|
541
|
+
},
|
|
542
|
+
backBtn: {
|
|
543
|
+
paddingHorizontal: 11,
|
|
544
|
+
paddingVertical: 7,
|
|
545
|
+
borderRadius: 8,
|
|
546
|
+
backgroundColor: 'rgba(255, 255, 255, 0.08)',
|
|
547
|
+
borderWidth: 0.8,
|
|
548
|
+
borderColor: 'rgba(255, 255, 255, 0.14)',
|
|
549
|
+
},
|
|
550
|
+
backBtnText: {
|
|
551
|
+
fontFamily: AppFonts_1.AppFonts.interMedium,
|
|
552
|
+
fontSize: 12,
|
|
553
|
+
color: '#E0E7FF',
|
|
554
|
+
},
|
|
555
|
+
nextBtn: {
|
|
556
|
+
backgroundColor: '#6366F1', // Royal Indigo
|
|
557
|
+
paddingHorizontal: 16,
|
|
558
|
+
paddingVertical: 7.5,
|
|
559
|
+
borderRadius: 8,
|
|
560
|
+
shadowColor: '#6366F1',
|
|
561
|
+
shadowOpacity: 0.45,
|
|
562
|
+
shadowRadius: 6,
|
|
563
|
+
shadowOffset: { width: 0, height: 2 },
|
|
564
|
+
},
|
|
565
|
+
nextBtnFinal: {
|
|
566
|
+
backgroundColor: '#10B981', // Emerald green
|
|
567
|
+
shadowColor: '#10B981',
|
|
568
|
+
},
|
|
569
|
+
nextBtnText: {
|
|
570
|
+
fontFamily: AppFonts_1.AppFonts.interBold,
|
|
571
|
+
fontSize: 12.5,
|
|
572
|
+
color: '#FFFFFF',
|
|
573
|
+
},
|
|
574
|
+
dontShowRow: {
|
|
575
|
+
flexDirection: 'row',
|
|
576
|
+
alignItems: 'center',
|
|
577
|
+
gap: 6,
|
|
578
|
+
alignSelf: 'flex-start',
|
|
579
|
+
},
|
|
580
|
+
checkbox: {
|
|
581
|
+
width: 14,
|
|
582
|
+
height: 14,
|
|
583
|
+
borderRadius: 3.5,
|
|
584
|
+
borderWidth: 1.2,
|
|
585
|
+
borderColor: 'rgba(165, 180, 252, 0.5)',
|
|
586
|
+
backgroundColor: 'transparent',
|
|
587
|
+
alignItems: 'center',
|
|
588
|
+
justifyContent: 'center',
|
|
589
|
+
},
|
|
590
|
+
checkboxActive: {
|
|
591
|
+
backgroundColor: '#6366F1',
|
|
592
|
+
borderColor: '#6366F1',
|
|
593
|
+
},
|
|
594
|
+
dontShowText: {
|
|
595
|
+
fontFamily: AppFonts_1.AppFonts.interRegular,
|
|
596
|
+
fontSize: 10.5,
|
|
597
|
+
color: '#94A3B8',
|
|
598
|
+
},
|
|
599
|
+
});
|
|
600
|
+
exports.default = exports.FirstTimeWalkthroughModal;
|
|
@@ -60,6 +60,7 @@ const DeviceTab_1 = __importDefault(require("./DeviceTab"));
|
|
|
60
60
|
const AuditTab_1 = __importDefault(require("./AuditTab"));
|
|
61
61
|
const SettingsPanel_1 = __importDefault(require("./SettingsPanel"));
|
|
62
62
|
const TelemetryConsentModal_1 = __importDefault(require("./TelemetryConsentModal"));
|
|
63
|
+
const FirstTimeWalkthroughModal_1 = __importDefault(require("./FirstTimeWalkthroughModal"));
|
|
63
64
|
const NpmUpdateToast_1 = __importDefault(require("./NpmUpdateToast"));
|
|
64
65
|
const Toast_1 = __importDefault(require("../Toast"));
|
|
65
66
|
const styles_1 = __importDefault(require("../../styles"));
|
|
@@ -67,7 +68,7 @@ const AppColors_1 = require("../../styles/AppColors");
|
|
|
67
68
|
const NavigationTracker_1 = __importDefault(require("./NavigationTracker"));
|
|
68
69
|
const PerformanceHud_1 = __importDefault(require("./PerformanceHud"));
|
|
69
70
|
const MainScreen = () => {
|
|
70
|
-
const { visible, setVisible, switchActiveTab, modalAnimationType, closeModal, modalHeightPercent, selected, selectedEvent, selectedLog, selectedReduxSlice, selectedReduxAction, selectedCrash, settingsPage, activeTab, isReady, isEnabled, isPerformanceHudEnabled, useNativeFab, hasNavigationContext, setNavState, } = (0, InspectorContext_1.useInspector)();
|
|
71
|
+
const { visible, setVisible, switchActiveTab, modalAnimationType, closeModal, modalHeightPercent, isWalkthroughVisible, setIsWalkthroughVisible, selected, selectedEvent, selectedLog, selectedReduxSlice, selectedReduxAction, selectedCrash, settingsPage, activeTab, isReady, isEnabled, isPerformanceHudEnabled, useNativeFab, hasNavigationContext, setNavState, } = (0, InspectorContext_1.useInspector)();
|
|
71
72
|
const isDetailActive = (activeTab === 'apis' && selected != null) ||
|
|
72
73
|
(activeTab === 'analytics' && selectedEvent != null) ||
|
|
73
74
|
(activeTab === 'logs' && selectedLog != null) ||
|
|
@@ -223,6 +224,9 @@ const MainScreen = () => {
|
|
|
223
224
|
|
|
224
225
|
{/* NPM Version Update Toast with timeout progress bar */}
|
|
225
226
|
<NpmUpdateToast_1.default />
|
|
227
|
+
|
|
228
|
+
{/* First-Time Walkthrough & Quick Guide Modal */}
|
|
229
|
+
<FirstTimeWalkthroughModal_1.default visible={isWalkthroughVisible} onClose={() => setIsWalkthroughVisible(false)}/>
|
|
226
230
|
</react_native_1.View>
|
|
227
231
|
</react_native_1.View>
|
|
228
232
|
</ErrorBoundary_1.default>)}
|