react-native-inapp-inspector 1.1.18 → 1.1.20
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/constants/version.d.ts +1 -1
- package/dist/commonjs/constants/version.js +1 -1
- package/dist/commonjs/styles/index.js +1 -1
- package/dist/esm/constants/version.d.ts +1 -1
- package/dist/esm/constants/version.js +1 -1
- package/dist/esm/styles/index.js +1 -1
- package/package.json +2 -4
- package/assets/banner_dark.svg +0 -186
- package/assets/banner_light.svg +0 -186
- package/assets/icon_circle.svg +0 -148
- package/assets/icon_square.svg +0 -148
- package/assets/social_preview.png +0 -0
- package/assets/walkthrough.gif +0 -0
- package/dist/commonjs/assets/svgAssets.d.ts +0 -3
- package/dist/commonjs/assets/svgAssets.js +0 -17
- package/dist/commonjs/components/AnalyticsTabView.d.ts +0 -15
- package/dist/commonjs/components/AnalyticsTabView.js +0 -157
- package/dist/commonjs/components/ApiDetailView.d.ts +0 -22
- package/dist/commonjs/components/ApiDetailView.js +0 -304
- package/dist/commonjs/components/ApisTabView.d.ts +0 -33
- package/dist/commonjs/components/ApisTabView.js +0 -235
- package/dist/commonjs/components/ConsoleLogDetailView.d.ts +0 -9
- package/dist/commonjs/components/ConsoleLogDetailView.js +0 -278
- package/dist/commonjs/components/ConsoleLogsTabView.d.ts +0 -24
- package/dist/commonjs/components/ConsoleLogsTabView.js +0 -354
- package/dist/commonjs/components/FloatingBubble.d.ts +0 -14
- package/dist/commonjs/components/FloatingBubble.js +0 -75
- package/dist/commonjs/components/Inspector/InsightsDashboard.d.ts +0 -3
- package/dist/commonjs/components/Inspector/InsightsDashboard.js +0 -619
- package/dist/commonjs/components/Inspector/WebViewTab.d.ts +0 -3
- package/dist/commonjs/components/Inspector/WebViewTab.js +0 -757
- package/dist/commonjs/components/InspectorHeader.d.ts +0 -19
- package/dist/commonjs/components/InspectorHeader.js +0 -329
- package/dist/commonjs/components/InspectorTabBar.d.ts +0 -16
- package/dist/commonjs/components/InspectorTabBar.js +0 -90
- package/dist/commonjs/components/NavigationTracker.d.ts +0 -7
- package/dist/commonjs/components/NavigationTracker.js +0 -76
- package/dist/commonjs/components/ReduxTabView.d.ts +0 -9
- package/dist/commonjs/components/ReduxTabView.js +0 -56
- package/dist/commonjs/components/ReduxTreeView.d.ts +0 -16
- package/dist/commonjs/components/ReduxTreeView.js +0 -1257
- package/dist/commonjs/components/SettingsView.d.ts +0 -13
- package/dist/commonjs/components/SettingsView.js +0 -328
- package/dist/commonjs/customHooks/webViewLogger.d.ts +0 -24
- package/dist/commonjs/customHooks/webViewLogger.js +0 -452
- package/dist/commonjs/enums/index.d.ts +0 -39
- package/dist/commonjs/enums/index.js +0 -50
- package/dist/commonjs/i18n/en.json +0 -144
- package/dist/esm/assets/svgAssets.d.ts +0 -3
- package/dist/esm/assets/svgAssets.js +0 -14
- package/dist/esm/components/AnalyticsTabView.d.ts +0 -15
- package/dist/esm/components/AnalyticsTabView.js +0 -151
- package/dist/esm/components/ApiDetailView.d.ts +0 -22
- package/dist/esm/components/ApiDetailView.js +0 -264
- package/dist/esm/components/ApisTabView.d.ts +0 -33
- package/dist/esm/components/ApisTabView.js +0 -196
- package/dist/esm/components/ConsoleLogDetailView.d.ts +0 -9
- package/dist/esm/components/ConsoleLogDetailView.js +0 -271
- package/dist/esm/components/ConsoleLogsTabView.d.ts +0 -24
- package/dist/esm/components/ConsoleLogsTabView.js +0 -348
- package/dist/esm/components/FloatingBubble.d.ts +0 -14
- package/dist/esm/components/FloatingBubble.js +0 -68
- package/dist/esm/components/Inspector/InsightsDashboard.d.ts +0 -3
- package/dist/esm/components/Inspector/InsightsDashboard.js +0 -614
- package/dist/esm/components/Inspector/WebViewTab.d.ts +0 -3
- package/dist/esm/components/Inspector/WebViewTab.js +0 -752
- package/dist/esm/components/InspectorHeader.d.ts +0 -19
- package/dist/esm/components/InspectorHeader.js +0 -323
- package/dist/esm/components/InspectorTabBar.d.ts +0 -16
- package/dist/esm/components/InspectorTabBar.js +0 -84
- package/dist/esm/components/NavigationTracker.d.ts +0 -7
- package/dist/esm/components/NavigationTracker.js +0 -39
- package/dist/esm/components/ReduxTabView.d.ts +0 -9
- package/dist/esm/components/ReduxTabView.js +0 -50
- package/dist/esm/components/ReduxTreeView.d.ts +0 -16
- package/dist/esm/components/ReduxTreeView.js +0 -1218
- package/dist/esm/components/SettingsView.d.ts +0 -13
- package/dist/esm/components/SettingsView.js +0 -321
- package/dist/esm/customHooks/webViewLogger.d.ts +0 -24
- package/dist/esm/customHooks/webViewLogger.js +0 -405
- package/dist/esm/enums/index.d.ts +0 -39
- package/dist/esm/enums/index.js +0 -47
- package/dist/esm/i18n/en.json +0 -144
- package/example/.bundle/config +0 -2
- package/example/.eslintrc.js +0 -4
- package/example/.prettierrc.js +0 -5
- package/example/.watchmanconfig +0 -1
- package/example/App.tsx +0 -879
- package/example/Gemfile +0 -17
- package/example/README.md +0 -53
- package/example/__tests__/App.test.tsx +0 -13
- package/example/android/app/build.gradle +0 -147
- package/example/android/app/debug.keystore +0 -0
- package/example/android/app/proguard-rules.pro +0 -10
- package/example/android/app/src/main/AndroidManifest.xml +0 -27
- package/example/android/app/src/main/java/com/example/MainActivity.kt +0 -22
- package/example/android/app/src/main/java/com/example/MainApplication.kt +0 -52
- package/example/android/app/src/main/res/drawable/rn_edit_text_material.xml +0 -37
- package/example/android/app/src/main/res/mipmap-hdpi/ic_launcher.png +0 -0
- package/example/android/app/src/main/res/mipmap-hdpi/ic_launcher_round.png +0 -0
- package/example/android/app/src/main/res/mipmap-mdpi/ic_launcher.png +0 -0
- package/example/android/app/src/main/res/mipmap-mdpi/ic_launcher_round.png +0 -0
- package/example/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png +0 -0
- package/example/android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png +0 -0
- package/example/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png +0 -0
- package/example/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png +0 -0
- package/example/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png +0 -0
- package/example/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png +0 -0
- package/example/android/app/src/main/res/values/strings.xml +0 -3
- package/example/android/app/src/main/res/values/styles.xml +0 -9
- package/example/android/build.gradle +0 -48
- package/example/android/gradle/wrapper/gradle-wrapper.jar +0 -0
- package/example/android/gradle/wrapper/gradle-wrapper.properties +0 -7
- package/example/android/gradle.properties +0 -45
- package/example/android/gradlew +0 -248
- package/example/android/gradlew.bat +0 -98
- package/example/android/settings.gradle +0 -25
- package/example/app.json +0 -4
- package/example/assets/app_icon.png +0 -0
- package/example/babel.config.js +0 -3
- package/example/guidance/Video-WalkThrough.mp4 +0 -0
- package/example/index.js +0 -9
- package/example/ios/.xcode.env +0 -11
- package/example/ios/Podfile +0 -34
- package/example/ios/Podfile.lock +0 -2303
- package/example/ios/example/AppDelegate.swift +0 -48
- package/example/ios/example/Images.xcassets/AppIcon.appiconset/Contents.json +0 -62
- package/example/ios/example/Images.xcassets/AppIcon.appiconset/app_icon_1024.png +0 -0
- package/example/ios/example/Images.xcassets/Contents.json +0 -6
- package/example/ios/example/Info.plist +0 -60
- package/example/ios/example/LaunchScreen.storyboard +0 -47
- package/example/ios/example/PrivacyInfo.xcprivacy +0 -37
- package/example/ios/example.xcodeproj/project.pbxproj +0 -498
- package/example/ios/example.xcodeproj/xcshareddata/xcschemes/example.xcscheme +0 -88
- package/example/ios/example.xcworkspace/contents.xcworkspacedata +0 -10
- package/example/jest.config.js +0 -3
- package/example/metro.config.js +0 -45
- package/example/package-lock.json +0 -13508
- package/example/package.json +0 -54
- package/example/polyfill.js +0 -13
- package/example/tsconfig.json +0 -8
- package/fonts/Inter/Inter.ttc +0 -0
- package/fonts/Inter/InterVariable-Italic.ttf +0 -0
- package/fonts/Inter/InterVariable.ttf +0 -0
- package/fonts/Inter/LICENSE.txt +0 -92
- package/fonts/Inter/extras/otf/Inter-Black.otf +0 -0
- package/fonts/Inter/extras/otf/Inter-BlackItalic.otf +0 -0
- package/fonts/Inter/extras/otf/Inter-Bold.otf +0 -0
- package/fonts/Inter/extras/otf/Inter-BoldItalic.otf +0 -0
- package/fonts/Inter/extras/otf/Inter-ExtraBold.otf +0 -0
- package/fonts/Inter/extras/otf/Inter-ExtraBoldItalic.otf +0 -0
- package/fonts/Inter/extras/otf/Inter-ExtraLight.otf +0 -0
- package/fonts/Inter/extras/otf/Inter-ExtraLightItalic.otf +0 -0
- package/fonts/Inter/extras/otf/Inter-Italic.otf +0 -0
- package/fonts/Inter/extras/otf/Inter-Light.otf +0 -0
- package/fonts/Inter/extras/otf/Inter-LightItalic.otf +0 -0
- package/fonts/Inter/extras/otf/Inter-Medium.otf +0 -0
- package/fonts/Inter/extras/otf/Inter-MediumItalic.otf +0 -0
- package/fonts/Inter/extras/otf/Inter-Regular.otf +0 -0
- package/fonts/Inter/extras/otf/Inter-SemiBold.otf +0 -0
- package/fonts/Inter/extras/otf/Inter-SemiBoldItalic.otf +0 -0
- package/fonts/Inter/extras/otf/Inter-Thin.otf +0 -0
- package/fonts/Inter/extras/otf/Inter-ThinItalic.otf +0 -0
- package/fonts/Inter/extras/otf/InterDisplay-Black.otf +0 -0
- package/fonts/Inter/extras/otf/InterDisplay-BlackItalic.otf +0 -0
- package/fonts/Inter/extras/otf/InterDisplay-Bold.otf +0 -0
- package/fonts/Inter/extras/otf/InterDisplay-BoldItalic.otf +0 -0
- package/fonts/Inter/extras/otf/InterDisplay-ExtraBold.otf +0 -0
- package/fonts/Inter/extras/otf/InterDisplay-ExtraBoldItalic.otf +0 -0
- package/fonts/Inter/extras/otf/InterDisplay-ExtraLight.otf +0 -0
- package/fonts/Inter/extras/otf/InterDisplay-ExtraLightItalic.otf +0 -0
- package/fonts/Inter/extras/otf/InterDisplay-Italic.otf +0 -0
- package/fonts/Inter/extras/otf/InterDisplay-Light.otf +0 -0
- package/fonts/Inter/extras/otf/InterDisplay-LightItalic.otf +0 -0
- package/fonts/Inter/extras/otf/InterDisplay-Medium.otf +0 -0
- package/fonts/Inter/extras/otf/InterDisplay-MediumItalic.otf +0 -0
- package/fonts/Inter/extras/otf/InterDisplay-Regular.otf +0 -0
- package/fonts/Inter/extras/otf/InterDisplay-SemiBold.otf +0 -0
- package/fonts/Inter/extras/otf/InterDisplay-SemiBoldItalic.otf +0 -0
- package/fonts/Inter/extras/otf/InterDisplay-Thin.otf +0 -0
- package/fonts/Inter/extras/otf/InterDisplay-ThinItalic.otf +0 -0
- package/fonts/Inter/extras/ttf/Inter-Black.ttf +0 -0
- package/fonts/Inter/extras/ttf/Inter-BlackItalic.ttf +0 -0
- package/fonts/Inter/extras/ttf/Inter-Bold.ttf +0 -0
- package/fonts/Inter/extras/ttf/Inter-BoldItalic.ttf +0 -0
- package/fonts/Inter/extras/ttf/Inter-ExtraBold.ttf +0 -0
- package/fonts/Inter/extras/ttf/Inter-ExtraBoldItalic.ttf +0 -0
- package/fonts/Inter/extras/ttf/Inter-ExtraLight.ttf +0 -0
- package/fonts/Inter/extras/ttf/Inter-ExtraLightItalic.ttf +0 -0
- package/fonts/Inter/extras/ttf/Inter-Italic.ttf +0 -0
- package/fonts/Inter/extras/ttf/Inter-Light.ttf +0 -0
- package/fonts/Inter/extras/ttf/Inter-LightItalic.ttf +0 -0
- package/fonts/Inter/extras/ttf/Inter-Medium.ttf +0 -0
- package/fonts/Inter/extras/ttf/Inter-MediumItalic.ttf +0 -0
- package/fonts/Inter/extras/ttf/Inter-Regular.ttf +0 -0
- package/fonts/Inter/extras/ttf/Inter-SemiBold.ttf +0 -0
- package/fonts/Inter/extras/ttf/Inter-SemiBoldItalic.ttf +0 -0
- package/fonts/Inter/extras/ttf/Inter-Thin.ttf +0 -0
- package/fonts/Inter/extras/ttf/Inter-ThinItalic.ttf +0 -0
- package/fonts/Inter/extras/ttf/InterDisplay-Black.ttf +0 -0
- package/fonts/Inter/extras/ttf/InterDisplay-BlackItalic.ttf +0 -0
- package/fonts/Inter/extras/ttf/InterDisplay-Bold.ttf +0 -0
- package/fonts/Inter/extras/ttf/InterDisplay-BoldItalic.ttf +0 -0
- package/fonts/Inter/extras/ttf/InterDisplay-ExtraBold.ttf +0 -0
- package/fonts/Inter/extras/ttf/InterDisplay-ExtraBoldItalic.ttf +0 -0
- package/fonts/Inter/extras/ttf/InterDisplay-ExtraLight.ttf +0 -0
- package/fonts/Inter/extras/ttf/InterDisplay-ExtraLightItalic.ttf +0 -0
- package/fonts/Inter/extras/ttf/InterDisplay-Italic.ttf +0 -0
- package/fonts/Inter/extras/ttf/InterDisplay-Light.ttf +0 -0
- package/fonts/Inter/extras/ttf/InterDisplay-LightItalic.ttf +0 -0
- package/fonts/Inter/extras/ttf/InterDisplay-Medium.ttf +0 -0
- package/fonts/Inter/extras/ttf/InterDisplay-MediumItalic.ttf +0 -0
- package/fonts/Inter/extras/ttf/InterDisplay-Regular.ttf +0 -0
- package/fonts/Inter/extras/ttf/InterDisplay-SemiBold.ttf +0 -0
- package/fonts/Inter/extras/ttf/InterDisplay-SemiBoldItalic.ttf +0 -0
- package/fonts/Inter/extras/ttf/InterDisplay-Thin.ttf +0 -0
- package/fonts/Inter/extras/ttf/InterDisplay-ThinItalic.ttf +0 -0
- package/fonts/Inter/extras/woff-hinted/Inter-Black.woff2 +0 -0
- package/fonts/Inter/extras/woff-hinted/Inter-BlackItalic.woff2 +0 -0
- package/fonts/Inter/extras/woff-hinted/Inter-Bold.woff2 +0 -0
- package/fonts/Inter/extras/woff-hinted/Inter-BoldItalic.woff2 +0 -0
- package/fonts/Inter/extras/woff-hinted/Inter-ExtraBold.woff2 +0 -0
- package/fonts/Inter/extras/woff-hinted/Inter-ExtraBoldItalic.woff2 +0 -0
- package/fonts/Inter/extras/woff-hinted/Inter-ExtraLight.woff2 +0 -0
- package/fonts/Inter/extras/woff-hinted/Inter-ExtraLightItalic.woff2 +0 -0
- package/fonts/Inter/extras/woff-hinted/Inter-Italic.woff2 +0 -0
- package/fonts/Inter/extras/woff-hinted/Inter-Light.woff2 +0 -0
- package/fonts/Inter/extras/woff-hinted/Inter-LightItalic.woff2 +0 -0
- package/fonts/Inter/extras/woff-hinted/Inter-Medium.woff2 +0 -0
- package/fonts/Inter/extras/woff-hinted/Inter-MediumItalic.woff2 +0 -0
- package/fonts/Inter/extras/woff-hinted/Inter-Regular.woff2 +0 -0
- package/fonts/Inter/extras/woff-hinted/Inter-SemiBold.woff2 +0 -0
- package/fonts/Inter/extras/woff-hinted/Inter-SemiBoldItalic.woff2 +0 -0
- package/fonts/Inter/extras/woff-hinted/Inter-Thin.woff2 +0 -0
- package/fonts/Inter/extras/woff-hinted/Inter-ThinItalic.woff2 +0 -0
- package/fonts/Inter/extras/woff-hinted/InterDisplay-Black.woff2 +0 -0
- package/fonts/Inter/extras/woff-hinted/InterDisplay-BlackItalic.woff2 +0 -0
- package/fonts/Inter/extras/woff-hinted/InterDisplay-Bold.woff2 +0 -0
- package/fonts/Inter/extras/woff-hinted/InterDisplay-BoldItalic.woff2 +0 -0
- package/fonts/Inter/extras/woff-hinted/InterDisplay-ExtraBold.woff2 +0 -0
- package/fonts/Inter/extras/woff-hinted/InterDisplay-ExtraBoldItalic.woff2 +0 -0
- package/fonts/Inter/extras/woff-hinted/InterDisplay-ExtraLight.woff2 +0 -0
- package/fonts/Inter/extras/woff-hinted/InterDisplay-ExtraLightItalic.woff2 +0 -0
- package/fonts/Inter/extras/woff-hinted/InterDisplay-Italic.woff2 +0 -0
- package/fonts/Inter/extras/woff-hinted/InterDisplay-Light.woff2 +0 -0
- package/fonts/Inter/extras/woff-hinted/InterDisplay-LightItalic.woff2 +0 -0
- package/fonts/Inter/extras/woff-hinted/InterDisplay-Medium.woff2 +0 -0
- package/fonts/Inter/extras/woff-hinted/InterDisplay-MediumItalic.woff2 +0 -0
- package/fonts/Inter/extras/woff-hinted/InterDisplay-Regular.woff2 +0 -0
- package/fonts/Inter/extras/woff-hinted/InterDisplay-SemiBold.woff2 +0 -0
- package/fonts/Inter/extras/woff-hinted/InterDisplay-SemiBoldItalic.woff2 +0 -0
- package/fonts/Inter/extras/woff-hinted/InterDisplay-Thin.woff2 +0 -0
- package/fonts/Inter/extras/woff-hinted/InterDisplay-ThinItalic.woff2 +0 -0
- package/fonts/Inter/help.txt +0 -165
- package/fonts/Inter/web/Inter-Black.woff2 +0 -0
- package/fonts/Inter/web/Inter-BlackItalic.woff2 +0 -0
- package/fonts/Inter/web/Inter-Bold.woff2 +0 -0
- package/fonts/Inter/web/Inter-BoldItalic.woff2 +0 -0
- package/fonts/Inter/web/Inter-ExtraBold.woff2 +0 -0
- package/fonts/Inter/web/Inter-ExtraBoldItalic.woff2 +0 -0
- package/fonts/Inter/web/Inter-ExtraLight.woff2 +0 -0
- package/fonts/Inter/web/Inter-ExtraLightItalic.woff2 +0 -0
- package/fonts/Inter/web/Inter-Italic.woff2 +0 -0
- package/fonts/Inter/web/Inter-Light.woff2 +0 -0
- package/fonts/Inter/web/Inter-LightItalic.woff2 +0 -0
- package/fonts/Inter/web/Inter-Medium.woff2 +0 -0
- package/fonts/Inter/web/Inter-MediumItalic.woff2 +0 -0
- package/fonts/Inter/web/Inter-Regular.woff2 +0 -0
- package/fonts/Inter/web/Inter-SemiBold.woff2 +0 -0
- package/fonts/Inter/web/Inter-SemiBoldItalic.woff2 +0 -0
- package/fonts/Inter/web/Inter-Thin.woff2 +0 -0
- package/fonts/Inter/web/Inter-ThinItalic.woff2 +0 -0
- package/fonts/Inter/web/InterDisplay-Black.woff2 +0 -0
- package/fonts/Inter/web/InterDisplay-BlackItalic.woff2 +0 -0
- package/fonts/Inter/web/InterDisplay-Bold.woff2 +0 -0
- package/fonts/Inter/web/InterDisplay-BoldItalic.woff2 +0 -0
- package/fonts/Inter/web/InterDisplay-ExtraBold.woff2 +0 -0
- package/fonts/Inter/web/InterDisplay-ExtraBoldItalic.woff2 +0 -0
- package/fonts/Inter/web/InterDisplay-ExtraLight.woff2 +0 -0
- package/fonts/Inter/web/InterDisplay-ExtraLightItalic.woff2 +0 -0
- package/fonts/Inter/web/InterDisplay-Italic.woff2 +0 -0
- package/fonts/Inter/web/InterDisplay-Light.woff2 +0 -0
- package/fonts/Inter/web/InterDisplay-LightItalic.woff2 +0 -0
- package/fonts/Inter/web/InterDisplay-Medium.woff2 +0 -0
- package/fonts/Inter/web/InterDisplay-MediumItalic.woff2 +0 -0
- package/fonts/Inter/web/InterDisplay-Regular.woff2 +0 -0
- package/fonts/Inter/web/InterDisplay-SemiBold.woff2 +0 -0
- package/fonts/Inter/web/InterDisplay-SemiBoldItalic.woff2 +0 -0
- package/fonts/Inter/web/InterDisplay-Thin.woff2 +0 -0
- package/fonts/Inter/web/InterDisplay-ThinItalic.woff2 +0 -0
- package/fonts/Inter/web/InterVariable-Italic.woff2 +0 -0
- package/fonts/Inter/web/InterVariable.woff2 +0 -0
- package/fonts/Inter/web/inter.css +0 -148
package/example/App.tsx
DELETED
|
@@ -1,879 +0,0 @@
|
|
|
1
|
-
import React from 'react';
|
|
2
|
-
import {
|
|
3
|
-
StatusBar,
|
|
4
|
-
StyleSheet,
|
|
5
|
-
Text,
|
|
6
|
-
TouchableOpacity,
|
|
7
|
-
View,
|
|
8
|
-
ScrollView,
|
|
9
|
-
useColorScheme,
|
|
10
|
-
} from 'react-native';
|
|
11
|
-
import { SafeAreaProvider, SafeAreaView } from 'react-native-safe-area-context';
|
|
12
|
-
import { NavigationContainer, createNavigationContainerRef } from '@react-navigation/native';
|
|
13
|
-
import { createNativeStackNavigator } from '@react-navigation/native-stack';
|
|
14
|
-
import axios from 'axios';
|
|
15
|
-
import NetworkInspector, {
|
|
16
|
-
ErrorBoundary,
|
|
17
|
-
connectReduxStore,
|
|
18
|
-
setupNetworkLogger,
|
|
19
|
-
subscribeNetworkLogs,
|
|
20
|
-
subscribeConsoleLogs,
|
|
21
|
-
logAnalyticsEvent,
|
|
22
|
-
subscribeAnalyticsEvents,
|
|
23
|
-
} from 'react-native-inapp-inspector';
|
|
24
|
-
import {WebView} from 'react-native-webview';
|
|
25
|
-
|
|
26
|
-
// ⚡ Call BEFORE any component renders so axios.create() is already patched
|
|
27
|
-
setupNetworkLogger();
|
|
28
|
-
// ─── Mock Redux Store ────────────────────────────────────────────────────────
|
|
29
|
-
const mockStore = {
|
|
30
|
-
state: {
|
|
31
|
-
auth: {
|
|
32
|
-
user: { id: 101, name: 'Venkatesh', role: 'Lead Architect' },
|
|
33
|
-
token: 'bearer-jwt-tok_5548b366d86',
|
|
34
|
-
isAuthenticated: true,
|
|
35
|
-
lastLogin: new Date().toLocaleTimeString(),
|
|
36
|
-
},
|
|
37
|
-
settings: {
|
|
38
|
-
theme: 'dark',
|
|
39
|
-
notifications: true,
|
|
40
|
-
fontSize: 14,
|
|
41
|
-
locales: ['en-US', 'ta-IN'],
|
|
42
|
-
},
|
|
43
|
-
ui: {
|
|
44
|
-
sidebarOpen: false,
|
|
45
|
-
activeModal: null,
|
|
46
|
-
loadingStates: {
|
|
47
|
-
fetchUser: false,
|
|
48
|
-
updateSettings: false,
|
|
49
|
-
},
|
|
50
|
-
},
|
|
51
|
-
},
|
|
52
|
-
listeners: new Set<() => void>(),
|
|
53
|
-
getState() {
|
|
54
|
-
return this.state;
|
|
55
|
-
},
|
|
56
|
-
subscribe(listener: () => void) {
|
|
57
|
-
this.listeners.add(listener);
|
|
58
|
-
return () => {
|
|
59
|
-
this.listeners.delete(listener);
|
|
60
|
-
};
|
|
61
|
-
},
|
|
62
|
-
dispatch(action: any) {
|
|
63
|
-
console.log('[Mock Redux] Dispatching action:', action);
|
|
64
|
-
if (action.type === 'TOGGLE_SIDEBAR') {
|
|
65
|
-
this.state = {
|
|
66
|
-
...this.state,
|
|
67
|
-
ui: {
|
|
68
|
-
...this.state.ui,
|
|
69
|
-
sidebarOpen: !this.state.ui.sidebarOpen,
|
|
70
|
-
},
|
|
71
|
-
};
|
|
72
|
-
} else if (action.type === 'SET_THEME') {
|
|
73
|
-
this.state = {
|
|
74
|
-
...this.state,
|
|
75
|
-
settings: {
|
|
76
|
-
...this.state.settings,
|
|
77
|
-
theme: action.payload,
|
|
78
|
-
},
|
|
79
|
-
};
|
|
80
|
-
} else if (action.type === 'UPDATE_USER_TIME') {
|
|
81
|
-
this.state = {
|
|
82
|
-
...this.state,
|
|
83
|
-
auth: {
|
|
84
|
-
...this.state.auth,
|
|
85
|
-
lastLogin: new Date().toLocaleTimeString(),
|
|
86
|
-
},
|
|
87
|
-
};
|
|
88
|
-
}
|
|
89
|
-
this.listeners.forEach(l => l());
|
|
90
|
-
},
|
|
91
|
-
};
|
|
92
|
-
|
|
93
|
-
// Connect mock store to the inspector
|
|
94
|
-
connectReduxStore(mockStore);
|
|
95
|
-
|
|
96
|
-
function BuggyComponent({ type }: { type: 'js' | 'native' }) {
|
|
97
|
-
if (type === 'js') {
|
|
98
|
-
throw new Error(
|
|
99
|
-
'Simulated JavaScript Crash: ReferenceError: x is not defined in App.tsx at line 67',
|
|
100
|
-
);
|
|
101
|
-
}
|
|
102
|
-
if (type === 'native') {
|
|
103
|
-
throw new Error(
|
|
104
|
-
'Simulated Native Crash: fatal error: Index out of range in Native Swift/Java module at line 70',
|
|
105
|
-
);
|
|
106
|
-
}
|
|
107
|
-
return null;
|
|
108
|
-
}
|
|
109
|
-
|
|
110
|
-
function HomeScreen({ navigation }: any) {
|
|
111
|
-
const [activeCrash, setActiveCrash] = React.useState<
|
|
112
|
-
'none' | 'js' | 'native'
|
|
113
|
-
>('none');
|
|
114
|
-
const [apiCount, setApiCount] = React.useState(0);
|
|
115
|
-
const [logCount, setLogCount] = React.useState(0);
|
|
116
|
-
const [analyticsCount, setAnalyticsCount] = React.useState(0);
|
|
117
|
-
const [reduxState, setReduxState] = React.useState(mockStore.getState());
|
|
118
|
-
|
|
119
|
-
React.useEffect(() => {
|
|
120
|
-
// Subscribe to logs to display live dashboard counters
|
|
121
|
-
const unsubNet = subscribeNetworkLogs(logs => setApiCount(logs.length));
|
|
122
|
-
const unsubConsole = subscribeConsoleLogs(logs => setLogCount(logs.length));
|
|
123
|
-
const unsubAnalytics = subscribeAnalyticsEvents(events =>
|
|
124
|
-
setAnalyticsCount(events.length),
|
|
125
|
-
);
|
|
126
|
-
const unsubRedux = mockStore.subscribe(() =>
|
|
127
|
-
setReduxState(mockStore.getState()),
|
|
128
|
-
);
|
|
129
|
-
|
|
130
|
-
// Initial Logs to populate stats
|
|
131
|
-
console.log('[App] HomeScreen mounted and ready.');
|
|
132
|
-
console.warn('[App] Check the Redux tab to inspect the connected state!');
|
|
133
|
-
|
|
134
|
-
return () => {
|
|
135
|
-
unsubNet();
|
|
136
|
-
unsubConsole();
|
|
137
|
-
unsubAnalytics();
|
|
138
|
-
unsubRedux();
|
|
139
|
-
};
|
|
140
|
-
}, []);
|
|
141
|
-
|
|
142
|
-
// Axios client — interceptors are automatically applied by setupNetworkLogger()
|
|
143
|
-
const axiosClient = React.useMemo(
|
|
144
|
-
() =>
|
|
145
|
-
axios.create({
|
|
146
|
-
baseURL: 'https://jsonplaceholder.typicode.com',
|
|
147
|
-
}),
|
|
148
|
-
[],
|
|
149
|
-
);
|
|
150
|
-
|
|
151
|
-
const triggerAxiosGet = async () => {
|
|
152
|
-
try {
|
|
153
|
-
console.log('[Axios] Triggering GET...');
|
|
154
|
-
const response = await axiosClient.get('/posts/1');
|
|
155
|
-
console.log('[Axios] GET response data title:', response.data.title);
|
|
156
|
-
} catch (error: any) {
|
|
157
|
-
console.error('[Axios] GET failed:', error.message);
|
|
158
|
-
}
|
|
159
|
-
};
|
|
160
|
-
|
|
161
|
-
const triggerAxiosPost = async () => {
|
|
162
|
-
try {
|
|
163
|
-
console.log('[Axios] Triggering POST...');
|
|
164
|
-
const response = await axiosClient.post('/posts', {
|
|
165
|
-
title: 'New Post via Axios',
|
|
166
|
-
body: 'This is a test post body sent via Axios auto-intercept.',
|
|
167
|
-
userId: 1,
|
|
168
|
-
});
|
|
169
|
-
console.log('[Axios] POST response data:', response.data);
|
|
170
|
-
} catch (error: any) {
|
|
171
|
-
console.error('[Axios] POST failed:', error.message);
|
|
172
|
-
}
|
|
173
|
-
};
|
|
174
|
-
|
|
175
|
-
const triggerAxiosPut = async () => {
|
|
176
|
-
try {
|
|
177
|
-
console.log('[Axios] Triggering PUT...');
|
|
178
|
-
const response = await axiosClient.put('/posts/1', {
|
|
179
|
-
id: 1,
|
|
180
|
-
title: 'Updated Title via Axios',
|
|
181
|
-
body: 'This is updated post body content sent via Axios.',
|
|
182
|
-
userId: 1,
|
|
183
|
-
});
|
|
184
|
-
console.log('[Axios] PUT response data:', response.data);
|
|
185
|
-
} catch (error: any) {
|
|
186
|
-
console.error('[Axios] PUT failed:', error.message);
|
|
187
|
-
}
|
|
188
|
-
};
|
|
189
|
-
|
|
190
|
-
const triggerAxiosPatch = async () => {
|
|
191
|
-
try {
|
|
192
|
-
console.log('[Axios] Triggering PATCH...');
|
|
193
|
-
const response = await axiosClient.patch('/posts/1', {
|
|
194
|
-
title: 'Partially Updated Title via Axios',
|
|
195
|
-
});
|
|
196
|
-
console.log('[Axios] PATCH response data:', response.data);
|
|
197
|
-
} catch (error: any) {
|
|
198
|
-
console.error('[Axios] PATCH failed:', error.message);
|
|
199
|
-
}
|
|
200
|
-
};
|
|
201
|
-
|
|
202
|
-
const triggerAxiosDelete = async () => {
|
|
203
|
-
try {
|
|
204
|
-
console.log('[Axios] Triggering DELETE...');
|
|
205
|
-
const response = await axiosClient.delete('/posts/1');
|
|
206
|
-
console.log('[Axios] DELETE response status:', response.status);
|
|
207
|
-
} catch (error: any) {
|
|
208
|
-
console.error('[Axios] DELETE failed:', error.message);
|
|
209
|
-
}
|
|
210
|
-
};
|
|
211
|
-
|
|
212
|
-
const triggerNetworkRequest = async () => {
|
|
213
|
-
try {
|
|
214
|
-
console.log('[API] Triggering fetch user...');
|
|
215
|
-
const response = await fetch(
|
|
216
|
-
'https://jsonplaceholder.typicode.com/users/1',
|
|
217
|
-
);
|
|
218
|
-
const data = await response.json();
|
|
219
|
-
console.log('[API] Fetch completed successfully:', data.name);
|
|
220
|
-
} catch (error) {
|
|
221
|
-
console.error('[API] Fetch failed:', error);
|
|
222
|
-
}
|
|
223
|
-
};
|
|
224
|
-
|
|
225
|
-
const triggerFailedNetworkRequest = async () => {
|
|
226
|
-
try {
|
|
227
|
-
console.log('[API] Triggering failing fetch request...');
|
|
228
|
-
await fetch('https://jsonplaceholder.typicode.com/invalid-route-error');
|
|
229
|
-
} catch (error) {
|
|
230
|
-
console.error('[API] Fetch failed with error:', error);
|
|
231
|
-
}
|
|
232
|
-
};
|
|
233
|
-
|
|
234
|
-
const triggerConsoleLogs = () => {
|
|
235
|
-
console.log(
|
|
236
|
-
'[App] Manual log triggered at ' + new Date().toLocaleTimeString(),
|
|
237
|
-
);
|
|
238
|
-
console.warn('[App] Simulated warning. Please check the API config.');
|
|
239
|
-
console.error('[App] Simulated error! Critical DB connection timeout.');
|
|
240
|
-
};
|
|
241
|
-
|
|
242
|
-
const triggerSampleAll = () => {
|
|
243
|
-
// Fire every sample action at once (with a few random extras)
|
|
244
|
-
const randomConsoleMessages = [
|
|
245
|
-
'[Sample] Fetching latest feed...',
|
|
246
|
-
'[Sample] Cache refreshed for user session',
|
|
247
|
-
'[Sample] Push notification permission granted',
|
|
248
|
-
'[Sample] Background sync completed',
|
|
249
|
-
];
|
|
250
|
-
const randomAnalyticsEvents = [
|
|
251
|
-
'screen_view',
|
|
252
|
-
'button_tapped',
|
|
253
|
-
'list_scrolled',
|
|
254
|
-
'session_started',
|
|
255
|
-
];
|
|
256
|
-
|
|
257
|
-
console.log(
|
|
258
|
-
`[Sample] Firing sample-all at ${new Date().toLocaleTimeString()}`,
|
|
259
|
-
);
|
|
260
|
-
console.warn('[Sample] Randomized warning: throttled API response');
|
|
261
|
-
console.error('[Sample] Randomized error: timeout on retry attempt #3');
|
|
262
|
-
console.log(
|
|
263
|
-
randomConsoleMessages[
|
|
264
|
-
Math.floor(Math.random() * randomConsoleMessages.length)
|
|
265
|
-
],
|
|
266
|
-
);
|
|
267
|
-
|
|
268
|
-
triggerAxiosGet();
|
|
269
|
-
triggerAxiosPost();
|
|
270
|
-
triggerAxiosPut();
|
|
271
|
-
triggerAxiosPatch();
|
|
272
|
-
triggerAxiosDelete();
|
|
273
|
-
triggerNetworkRequest();
|
|
274
|
-
triggerFailedNetworkRequest();
|
|
275
|
-
|
|
276
|
-
logAnalyticsEvent(
|
|
277
|
-
randomAnalyticsEvents[
|
|
278
|
-
Math.floor(Math.random() * randomAnalyticsEvents.length)
|
|
279
|
-
],
|
|
280
|
-
{
|
|
281
|
-
sample_batch: 'all',
|
|
282
|
-
triggered_at: new Date().toISOString(),
|
|
283
|
-
random_value: Math.floor(Math.random() * 1000),
|
|
284
|
-
},
|
|
285
|
-
);
|
|
286
|
-
logAnalyticsEvent('item_purchase', {
|
|
287
|
-
item_id: 'prod_999',
|
|
288
|
-
item_name: 'Premium Debug Kit',
|
|
289
|
-
price: 29.99,
|
|
290
|
-
currency: 'USD',
|
|
291
|
-
});
|
|
292
|
-
|
|
293
|
-
mockStore.dispatch({type: 'TOGGLE_SIDEBAR'});
|
|
294
|
-
mockStore.dispatch({type: 'UPDATE_USER_TIME'});
|
|
295
|
-
|
|
296
|
-
// Random extra fetch to spice up the flood
|
|
297
|
-
fetch(
|
|
298
|
-
`https://jsonplaceholder.typicode.com/posts/${Math.floor(
|
|
299
|
-
Math.random() * 8 + 1,
|
|
300
|
-
)}`,
|
|
301
|
-
)
|
|
302
|
-
.then(r => r.json())
|
|
303
|
-
.then(d => console.log('[Sample] Random fetch completed:', d.title))
|
|
304
|
-
.catch(e => console.error('[Sample] Random fetch failed:', e));
|
|
305
|
-
};
|
|
306
|
-
|
|
307
|
-
const handleToggleSidebar = () => {
|
|
308
|
-
mockStore.dispatch({ type: 'TOGGLE_SIDEBAR' });
|
|
309
|
-
mockStore.dispatch({ type: 'UPDATE_USER_TIME' });
|
|
310
|
-
};
|
|
311
|
-
|
|
312
|
-
return (
|
|
313
|
-
<SafeAreaView style={styles.safeContainer}>
|
|
314
|
-
<ScrollView
|
|
315
|
-
contentContainerStyle={styles.content}
|
|
316
|
-
showsVerticalScrollIndicator={false}
|
|
317
|
-
>
|
|
318
|
-
{/* Header Hero Section */}
|
|
319
|
-
<View style={styles.headerHero}>
|
|
320
|
-
<Text style={styles.headerBadge}>INSPECTOR PLAYGROUND</Text>
|
|
321
|
-
<Text style={styles.headerTitle}>Debug Dashboard</Text>
|
|
322
|
-
<Text style={styles.headerSubtitle}>
|
|
323
|
-
A plug-and-play developer kit for real-time inspection.
|
|
324
|
-
</Text>
|
|
325
|
-
</View>
|
|
326
|
-
|
|
327
|
-
{/* System Status Metrics Card */}
|
|
328
|
-
<View style={styles.statsCard}>
|
|
329
|
-
<Text style={styles.sectionTitle}>SYSTEM STATUS</Text>
|
|
330
|
-
<View style={styles.statsGrid}>
|
|
331
|
-
<View style={styles.statBox}>
|
|
332
|
-
<Text style={styles.statVal}>{apiCount}</Text>
|
|
333
|
-
<Text style={styles.statLbl}>APIs</Text>
|
|
334
|
-
</View>
|
|
335
|
-
<View style={styles.statBox}>
|
|
336
|
-
<Text style={styles.statVal}>{logCount}</Text>
|
|
337
|
-
<Text style={styles.statLbl}>Logs</Text>
|
|
338
|
-
</View>
|
|
339
|
-
<View style={styles.statBox}>
|
|
340
|
-
<Text style={[styles.statVal, { color: '#EA580C' }]}>
|
|
341
|
-
{analyticsCount}
|
|
342
|
-
</Text>
|
|
343
|
-
<Text style={styles.statLbl}>Analytics</Text>
|
|
344
|
-
</View>
|
|
345
|
-
<View style={styles.statBox}>
|
|
346
|
-
<Text style={[styles.statVal, { color: '#A78BFA' }]}>
|
|
347
|
-
{reduxState.ui.sidebarOpen ? 'Open' : 'Closed'}
|
|
348
|
-
</Text>
|
|
349
|
-
<Text style={styles.statLbl}>Sidebar</Text>
|
|
350
|
-
</View>
|
|
351
|
-
</View>
|
|
352
|
-
</View>
|
|
353
|
-
|
|
354
|
-
{/* Trigger Sample All Logs */}
|
|
355
|
-
<View
|
|
356
|
-
style={[
|
|
357
|
-
styles.panelCard,
|
|
358
|
-
{ borderColor: '#22D3EE', marginBottom: 20 },
|
|
359
|
-
]}>
|
|
360
|
-
<Text style={[styles.panelHeader, { color: '#22D3EE' }]}>
|
|
361
|
-
🎲 SAMPLE ALL LOGS
|
|
362
|
-
</Text>
|
|
363
|
-
<TouchableOpacity
|
|
364
|
-
style={[
|
|
365
|
-
styles.fullWidthBtn,
|
|
366
|
-
{ backgroundColor: '#0891B2' },
|
|
367
|
-
]}
|
|
368
|
-
onPress={triggerSampleAll}
|
|
369
|
-
>
|
|
370
|
-
<Text style={styles.fullWidthBtnText}>
|
|
371
|
-
Trigger Sample All Logs At Once
|
|
372
|
-
</Text>
|
|
373
|
-
</TouchableOpacity>
|
|
374
|
-
</View>
|
|
375
|
-
|
|
376
|
-
{/* Action Panel Grid */}
|
|
377
|
-
<View style={styles.panelCard}>
|
|
378
|
-
<Text style={styles.panelHeader}>🌐 API & NETWORK TESTS</Text>
|
|
379
|
-
<View style={styles.btnRow}>
|
|
380
|
-
<TouchableOpacity
|
|
381
|
-
style={[styles.gridBtn, { borderColor: '#38BDF8' }]}
|
|
382
|
-
onPress={triggerNetworkRequest}
|
|
383
|
-
>
|
|
384
|
-
<Text style={[styles.btnText, { color: '#38BDF8' }]}>
|
|
385
|
-
Fetch (200 OK)
|
|
386
|
-
</Text>
|
|
387
|
-
</TouchableOpacity>
|
|
388
|
-
<TouchableOpacity
|
|
389
|
-
style={[styles.gridBtn, { borderColor: '#F43F5E' }]}
|
|
390
|
-
onPress={triggerFailedNetworkRequest}
|
|
391
|
-
>
|
|
392
|
-
<Text style={[styles.btnText, { color: '#F43F5E' }]}>
|
|
393
|
-
Fetch (404 Err)
|
|
394
|
-
</Text>
|
|
395
|
-
</TouchableOpacity>
|
|
396
|
-
</View>
|
|
397
|
-
</View>
|
|
398
|
-
|
|
399
|
-
<View style={styles.panelCard}>
|
|
400
|
-
<Text style={styles.panelHeader}>
|
|
401
|
-
⚡ AXIOS AUTOMATIC INTERCEPTION
|
|
402
|
-
</Text>
|
|
403
|
-
<View style={{ gap: 8 }}>
|
|
404
|
-
<View style={styles.btnRow}>
|
|
405
|
-
<TouchableOpacity
|
|
406
|
-
style={[styles.gridBtn, { borderColor: '#10B981' }]}
|
|
407
|
-
onPress={triggerAxiosGet}
|
|
408
|
-
>
|
|
409
|
-
<Text style={[styles.btnText, { color: '#10B981' }]}>
|
|
410
|
-
Axios GET
|
|
411
|
-
</Text>
|
|
412
|
-
</TouchableOpacity>
|
|
413
|
-
<TouchableOpacity
|
|
414
|
-
style={[styles.gridBtn, { borderColor: '#8B5CF6' }]}
|
|
415
|
-
onPress={triggerAxiosPost}
|
|
416
|
-
>
|
|
417
|
-
<Text style={[styles.btnText, { color: '#8B5CF6' }]}>
|
|
418
|
-
Axios POST
|
|
419
|
-
</Text>
|
|
420
|
-
</TouchableOpacity>
|
|
421
|
-
</View>
|
|
422
|
-
<View style={styles.btnRow}>
|
|
423
|
-
<TouchableOpacity
|
|
424
|
-
style={[styles.gridBtn, { borderColor: '#F59E0B' }]}
|
|
425
|
-
onPress={triggerAxiosPut}
|
|
426
|
-
>
|
|
427
|
-
<Text style={[styles.btnText, { color: '#F59E0B' }]}>
|
|
428
|
-
Axios PUT
|
|
429
|
-
</Text>
|
|
430
|
-
</TouchableOpacity>
|
|
431
|
-
<TouchableOpacity
|
|
432
|
-
style={[styles.gridBtn, { borderColor: '#38BDF8' }]}
|
|
433
|
-
onPress={triggerAxiosPatch}
|
|
434
|
-
>
|
|
435
|
-
<Text style={[styles.btnText, { color: '#38BDF8' }]}>
|
|
436
|
-
Axios PATCH
|
|
437
|
-
</Text>
|
|
438
|
-
</TouchableOpacity>
|
|
439
|
-
<TouchableOpacity
|
|
440
|
-
style={[styles.gridBtn, { borderColor: '#EF4444' }]}
|
|
441
|
-
onPress={triggerAxiosDelete}
|
|
442
|
-
>
|
|
443
|
-
<Text style={[styles.btnText, { color: '#EF4444' }]}>
|
|
444
|
-
Axios DEL
|
|
445
|
-
</Text>
|
|
446
|
-
</TouchableOpacity>
|
|
447
|
-
</View>
|
|
448
|
-
</View>
|
|
449
|
-
</View>
|
|
450
|
-
|
|
451
|
-
<View style={styles.panelCard}>
|
|
452
|
-
<Text style={styles.panelHeader}>📝 CONSOLE EVENT ACTIONS</Text>
|
|
453
|
-
<TouchableOpacity
|
|
454
|
-
style={[styles.fullWidthBtn, { backgroundColor: '#6366F1' }]}
|
|
455
|
-
onPress={triggerConsoleLogs}
|
|
456
|
-
>
|
|
457
|
-
<Text style={styles.fullWidthBtnText}>
|
|
458
|
-
Trigger Log, Warn & Error Logs
|
|
459
|
-
</Text>
|
|
460
|
-
</TouchableOpacity>
|
|
461
|
-
|
|
462
|
-
<View style={[styles.btnRow, {marginTop: 8}]}>
|
|
463
|
-
<TouchableOpacity
|
|
464
|
-
style={[styles.gridBtn, { borderColor: '#8B5CF6' }]}
|
|
465
|
-
onPress={() => {
|
|
466
|
-
console.log(
|
|
467
|
-
'Multi-argument payload inspection:',
|
|
468
|
-
{ userId: 101, username: 'venkatesh', role: 'Lead Architect' },
|
|
469
|
-
['permissions.read', 'permissions.write', 'permissions.admin'],
|
|
470
|
-
{ device: 'iPhone 15 Pro', os: 'iOS 18.0', battery: '92%' },
|
|
471
|
-
);
|
|
472
|
-
}}
|
|
473
|
-
>
|
|
474
|
-
<Text style={[styles.btnText, { color: '#8B5CF6' }]}>
|
|
475
|
-
Multi-Arg Log
|
|
476
|
-
</Text>
|
|
477
|
-
</TouchableOpacity>
|
|
478
|
-
|
|
479
|
-
<TouchableOpacity
|
|
480
|
-
style={[styles.gridBtn, { borderColor: '#EF4444' }]}
|
|
481
|
-
onPress={() => {
|
|
482
|
-
try {
|
|
483
|
-
throw new TypeError('Cannot read properties of undefined (reading "authToken")');
|
|
484
|
-
} catch (err) {
|
|
485
|
-
console.error(err);
|
|
486
|
-
}
|
|
487
|
-
}}
|
|
488
|
-
>
|
|
489
|
-
<Text style={[styles.btnText, { color: '#EF4444' }]}>
|
|
490
|
-
Error Stack Log
|
|
491
|
-
</Text>
|
|
492
|
-
</TouchableOpacity>
|
|
493
|
-
</View>
|
|
494
|
-
</View>
|
|
495
|
-
|
|
496
|
-
<View style={styles.panelCard}>
|
|
497
|
-
<Text style={styles.panelHeader}>📊 ANALYTICS LOG TESTS</Text>
|
|
498
|
-
<View style={styles.btnRow}>
|
|
499
|
-
<TouchableOpacity
|
|
500
|
-
style={[styles.gridBtn, { borderColor: '#EA580C' }]}
|
|
501
|
-
onPress={() => {
|
|
502
|
-
console.log(
|
|
503
|
-
'[App] Logged custom analytics event: click_button',
|
|
504
|
-
);
|
|
505
|
-
logAnalyticsEvent('click_button', {
|
|
506
|
-
button_name: 'test_action',
|
|
507
|
-
screen_name: 'Home',
|
|
508
|
-
clicked_at: new Date().toLocaleTimeString(),
|
|
509
|
-
});
|
|
510
|
-
}}
|
|
511
|
-
>
|
|
512
|
-
<Text style={[styles.btnText, { color: '#EA580C' }]}>
|
|
513
|
-
Log Custom Event
|
|
514
|
-
</Text>
|
|
515
|
-
</TouchableOpacity>
|
|
516
|
-
<TouchableOpacity
|
|
517
|
-
style={[styles.gridBtn, { borderColor: '#E11D48' }]}
|
|
518
|
-
onPress={() => {
|
|
519
|
-
console.log(
|
|
520
|
-
'[App] Logged analytics ecommerce event: item_purchase',
|
|
521
|
-
);
|
|
522
|
-
logAnalyticsEvent(
|
|
523
|
-
'item_purchase',
|
|
524
|
-
{
|
|
525
|
-
item_id: 'prod_999',
|
|
526
|
-
item_name: 'Premium Debug Kit',
|
|
527
|
-
price: 29.99,
|
|
528
|
-
currency: 'USD',
|
|
529
|
-
items: [
|
|
530
|
-
{
|
|
531
|
-
id: 'prod_999',
|
|
532
|
-
name: 'Premium Debug Kit',
|
|
533
|
-
price: 29.99,
|
|
534
|
-
},
|
|
535
|
-
],
|
|
536
|
-
},
|
|
537
|
-
{
|
|
538
|
-
user_tier: 'gold_member',
|
|
539
|
-
signup_platform: 'ios_app',
|
|
540
|
-
},
|
|
541
|
-
);
|
|
542
|
-
}}
|
|
543
|
-
>
|
|
544
|
-
<Text style={[styles.btnText, { color: '#E11D48' }]}>
|
|
545
|
-
Log Purchase
|
|
546
|
-
</Text>
|
|
547
|
-
</TouchableOpacity>
|
|
548
|
-
</View>
|
|
549
|
-
</View>
|
|
550
|
-
|
|
551
|
-
<View style={styles.panelCard}>
|
|
552
|
-
<Text style={styles.panelHeader}>⚙️ REDUX & STATE ACTIONS</Text>
|
|
553
|
-
<View style={styles.btnRow}>
|
|
554
|
-
<TouchableOpacity
|
|
555
|
-
style={[styles.gridBtn, { borderColor: '#10B981' }]}
|
|
556
|
-
onPress={handleToggleSidebar}
|
|
557
|
-
>
|
|
558
|
-
<Text style={[styles.btnText, { color: '#10B981' }]}>
|
|
559
|
-
Toggle Sidebar
|
|
560
|
-
</Text>
|
|
561
|
-
</TouchableOpacity>
|
|
562
|
-
<TouchableOpacity
|
|
563
|
-
style={[styles.gridBtn, { borderColor: '#06B6D4' }]}
|
|
564
|
-
onPress={() => {
|
|
565
|
-
mockStore.dispatch({
|
|
566
|
-
type: 'SET_THEME',
|
|
567
|
-
payload: mockStore.getState().settings.theme === 'dark' ? 'light' : 'dark',
|
|
568
|
-
});
|
|
569
|
-
}}
|
|
570
|
-
>
|
|
571
|
-
<Text style={[styles.btnText, { color: '#06B6D4' }]}>
|
|
572
|
-
Toggle Theme
|
|
573
|
-
</Text>
|
|
574
|
-
</TouchableOpacity>
|
|
575
|
-
</View>
|
|
576
|
-
<TouchableOpacity
|
|
577
|
-
style={[styles.fullWidthBtn, { backgroundColor: '#8B5CF6', marginTop: 8 }]}
|
|
578
|
-
onPress={handleToggleSidebar}
|
|
579
|
-
>
|
|
580
|
-
<Text style={styles.fullWidthBtnText}>
|
|
581
|
-
Dispatch: Toggle Sidebar & Update Time
|
|
582
|
-
</Text>
|
|
583
|
-
</TouchableOpacity>
|
|
584
|
-
</View>
|
|
585
|
-
|
|
586
|
-
<View style={styles.panelCard}>
|
|
587
|
-
<Text style={styles.panelHeader}>➔ ROUTING & WEBVIEW</Text>
|
|
588
|
-
<View style={styles.btnRow}>
|
|
589
|
-
<TouchableOpacity
|
|
590
|
-
style={[styles.gridBtn, { borderColor: '#10B981' }]}
|
|
591
|
-
onPress={() => navigation.navigate('Details')}
|
|
592
|
-
>
|
|
593
|
-
<Text style={[styles.btnText, { color: '#10B981' }]}>
|
|
594
|
-
Go to Details
|
|
595
|
-
</Text>
|
|
596
|
-
</TouchableOpacity>
|
|
597
|
-
<TouchableOpacity
|
|
598
|
-
style={[styles.gridBtn, { borderColor: '#F59E0B' }]}
|
|
599
|
-
onPress={() => navigation.navigate('WebView')}
|
|
600
|
-
>
|
|
601
|
-
<Text style={[styles.btnText, { color: '#F59E0B' }]}>
|
|
602
|
-
Go to WebView
|
|
603
|
-
</Text>
|
|
604
|
-
</TouchableOpacity>
|
|
605
|
-
</View>
|
|
606
|
-
</View>
|
|
607
|
-
|
|
608
|
-
<View style={[styles.panelCard, { borderColor: '#F43F5E' }]}>
|
|
609
|
-
<Text style={[styles.panelHeader, { color: '#F43F5E' }]}>
|
|
610
|
-
💥 CRASH SIMULATION TESTS
|
|
611
|
-
</Text>
|
|
612
|
-
<View style={styles.btnRow}>
|
|
613
|
-
<TouchableOpacity
|
|
614
|
-
style={[
|
|
615
|
-
styles.gridBtn,
|
|
616
|
-
{
|
|
617
|
-
borderColor: '#F43F5E',
|
|
618
|
-
backgroundColor: 'rgba(244,63,94,0.05)',
|
|
619
|
-
},
|
|
620
|
-
]}
|
|
621
|
-
onPress={() => setActiveCrash('js')}
|
|
622
|
-
>
|
|
623
|
-
<Text style={[styles.btnText, { color: '#F43F5E' }]}>
|
|
624
|
-
JS Crash
|
|
625
|
-
</Text>
|
|
626
|
-
</TouchableOpacity>
|
|
627
|
-
<TouchableOpacity
|
|
628
|
-
style={[
|
|
629
|
-
styles.gridBtn,
|
|
630
|
-
{
|
|
631
|
-
borderColor: '#EF4444',
|
|
632
|
-
backgroundColor: 'rgba(239,68,68,0.1)',
|
|
633
|
-
},
|
|
634
|
-
]}
|
|
635
|
-
onPress={() => setActiveCrash('native')}
|
|
636
|
-
>
|
|
637
|
-
<Text style={[styles.btnText, { color: '#EF4444' }]}>
|
|
638
|
-
Native Crash
|
|
639
|
-
</Text>
|
|
640
|
-
</TouchableOpacity>
|
|
641
|
-
</View>
|
|
642
|
-
</View>
|
|
643
|
-
</ScrollView>
|
|
644
|
-
{activeCrash !== 'none' && <BuggyComponent type={activeCrash} />}
|
|
645
|
-
</SafeAreaView>
|
|
646
|
-
);
|
|
647
|
-
}
|
|
648
|
-
|
|
649
|
-
function DetailsScreen({ navigation }: any) {
|
|
650
|
-
const triggerDetailLogs = () => {
|
|
651
|
-
console.log('[Details] User triggered log from Details screen.');
|
|
652
|
-
};
|
|
653
|
-
|
|
654
|
-
React.useEffect(() => {
|
|
655
|
-
console.log('[Test] DetailsScreen mounted!');
|
|
656
|
-
}, []);
|
|
657
|
-
|
|
658
|
-
return (
|
|
659
|
-
<SafeAreaView style={styles.safeContainer}>
|
|
660
|
-
<ScrollView contentContainerStyle={styles.content}>
|
|
661
|
-
<View style={styles.headerHero}>
|
|
662
|
-
<Text style={styles.headerBadge}>DETAILS MODULE</Text>
|
|
663
|
-
<Text style={styles.headerTitle}>Navigation Tracking</Text>
|
|
664
|
-
<Text style={styles.headerSubtitle}>
|
|
665
|
-
The breadcrumbs inside the inspector track your stack route in
|
|
666
|
-
real-time.
|
|
667
|
-
</Text>
|
|
668
|
-
</View>
|
|
669
|
-
|
|
670
|
-
<View style={styles.panelCard}>
|
|
671
|
-
<Text style={styles.panelHeader}>MODULE ACTIONS</Text>
|
|
672
|
-
<TouchableOpacity
|
|
673
|
-
style={[
|
|
674
|
-
styles.fullWidthBtn,
|
|
675
|
-
{ backgroundColor: '#10B981', marginBottom: 12 },
|
|
676
|
-
]}
|
|
677
|
-
onPress={triggerDetailLogs}
|
|
678
|
-
>
|
|
679
|
-
<Text style={styles.fullWidthBtnText}>
|
|
680
|
-
Trigger Log from Details Screen
|
|
681
|
-
</Text>
|
|
682
|
-
</TouchableOpacity>
|
|
683
|
-
|
|
684
|
-
<TouchableOpacity
|
|
685
|
-
style={[styles.fullWidthBtn, { backgroundColor: '#475569' }]}
|
|
686
|
-
onPress={() => navigation.goBack()}
|
|
687
|
-
>
|
|
688
|
-
<Text style={styles.fullWidthBtnText}>Go Back Home</Text>
|
|
689
|
-
</TouchableOpacity>
|
|
690
|
-
</View>
|
|
691
|
-
</ScrollView>
|
|
692
|
-
</SafeAreaView>
|
|
693
|
-
);
|
|
694
|
-
}
|
|
695
|
-
|
|
696
|
-
function WebViewScreen({ navigation }: any) {
|
|
697
|
-
React.useEffect(() => {
|
|
698
|
-
console.log('[WebView] WebViewScreen mounted, loading apple.com...');
|
|
699
|
-
}, []);
|
|
700
|
-
|
|
701
|
-
return (
|
|
702
|
-
<SafeAreaView style={styles.safeContainer}>
|
|
703
|
-
<View style={{ flex: 1 }}>
|
|
704
|
-
<WebView
|
|
705
|
-
source={{ uri: 'https://apple.com' }}
|
|
706
|
-
style={{ flex: 1 }}
|
|
707
|
-
onLoadStart={() =>
|
|
708
|
-
console.log('[WebView] Navigation started to apple.com')
|
|
709
|
-
}
|
|
710
|
-
onLoadEnd={() =>
|
|
711
|
-
console.log('[WebView] Navigation finished loading apple.com')
|
|
712
|
-
}
|
|
713
|
-
/>
|
|
714
|
-
</View>
|
|
715
|
-
</SafeAreaView>
|
|
716
|
-
);
|
|
717
|
-
}
|
|
718
|
-
|
|
719
|
-
const Stack = createNativeStackNavigator();
|
|
720
|
-
const navigationRef = createNavigationContainerRef();
|
|
721
|
-
|
|
722
|
-
function App() {
|
|
723
|
-
const isDarkMode = useColorScheme() === 'dark';
|
|
724
|
-
|
|
725
|
-
return (
|
|
726
|
-
<SafeAreaProvider>
|
|
727
|
-
<StatusBar barStyle={isDarkMode ? 'light-content' : 'dark-content'} />
|
|
728
|
-
<ErrorBoundary>
|
|
729
|
-
<NavigationContainer ref={navigationRef}>
|
|
730
|
-
<Stack.Navigator
|
|
731
|
-
screenOptions={{
|
|
732
|
-
headerShown: false,
|
|
733
|
-
contentStyle: {
|
|
734
|
-
backgroundColor: '#0F172A',
|
|
735
|
-
},
|
|
736
|
-
}}
|
|
737
|
-
>
|
|
738
|
-
<Stack.Screen name="Home" component={HomeScreen} />
|
|
739
|
-
<Stack.Screen name="Details" component={DetailsScreen} />
|
|
740
|
-
<Stack.Screen name="WebView" component={WebViewScreen} />
|
|
741
|
-
</Stack.Navigator>
|
|
742
|
-
</NavigationContainer>
|
|
743
|
-
{/* Render inspector globally exactly once at the root level */}
|
|
744
|
-
<NetworkInspector
|
|
745
|
-
navigationRef={navigationRef}
|
|
746
|
-
appIcon={require('./assets/app_icon.png')}
|
|
747
|
-
environment="DEV"
|
|
748
|
-
/>
|
|
749
|
-
</ErrorBoundary>
|
|
750
|
-
</SafeAreaProvider>
|
|
751
|
-
);
|
|
752
|
-
}
|
|
753
|
-
|
|
754
|
-
const styles = StyleSheet.create({
|
|
755
|
-
safeContainer: {
|
|
756
|
-
flex: 1,
|
|
757
|
-
backgroundColor: '#0F172A',
|
|
758
|
-
paddingTop: 12,
|
|
759
|
-
},
|
|
760
|
-
content: {
|
|
761
|
-
paddingHorizontal: 20,
|
|
762
|
-
paddingBottom: 40,
|
|
763
|
-
},
|
|
764
|
-
headerHero: {
|
|
765
|
-
marginTop: 20,
|
|
766
|
-
marginBottom: 24,
|
|
767
|
-
alignItems: 'center',
|
|
768
|
-
},
|
|
769
|
-
headerBadge: {
|
|
770
|
-
fontSize: 10,
|
|
771
|
-
fontWeight: 'bold',
|
|
772
|
-
color: '#818CF8',
|
|
773
|
-
letterSpacing: 1.5,
|
|
774
|
-
marginBottom: 6,
|
|
775
|
-
},
|
|
776
|
-
headerTitle: {
|
|
777
|
-
fontSize: 14,
|
|
778
|
-
fontWeight: '900',
|
|
779
|
-
color: '#F8FAFC',
|
|
780
|
-
marginBottom: 8,
|
|
781
|
-
},
|
|
782
|
-
headerSubtitle: {
|
|
783
|
-
fontSize: 14,
|
|
784
|
-
color: '#94A3B8',
|
|
785
|
-
textAlign: 'center',
|
|
786
|
-
lineHeight: 20,
|
|
787
|
-
},
|
|
788
|
-
statsCard: {
|
|
789
|
-
backgroundColor: '#1E293B',
|
|
790
|
-
borderRadius: 16,
|
|
791
|
-
padding: 16,
|
|
792
|
-
borderWidth: 1,
|
|
793
|
-
borderColor: '#334155',
|
|
794
|
-
marginBottom: 20,
|
|
795
|
-
},
|
|
796
|
-
sectionTitle: {
|
|
797
|
-
fontSize: 11,
|
|
798
|
-
fontWeight: '800',
|
|
799
|
-
color: '#94A3B8',
|
|
800
|
-
letterSpacing: 1.2,
|
|
801
|
-
marginBottom: 12,
|
|
802
|
-
},
|
|
803
|
-
statsGrid: {
|
|
804
|
-
flexDirection: 'row',
|
|
805
|
-
justifyContent: 'space-between',
|
|
806
|
-
gap: 12,
|
|
807
|
-
},
|
|
808
|
-
statBox: {
|
|
809
|
-
flex: 1,
|
|
810
|
-
backgroundColor: '#0F172A',
|
|
811
|
-
borderRadius: 12,
|
|
812
|
-
paddingVertical: 12,
|
|
813
|
-
alignItems: 'center',
|
|
814
|
-
borderWidth: 1,
|
|
815
|
-
borderColor: '#1E293B',
|
|
816
|
-
},
|
|
817
|
-
statVal: {
|
|
818
|
-
fontSize: 18,
|
|
819
|
-
fontWeight: 'bold',
|
|
820
|
-
color: '#38BDF8',
|
|
821
|
-
},
|
|
822
|
-
statLbl: {
|
|
823
|
-
fontSize: 10,
|
|
824
|
-
color: '#64748B',
|
|
825
|
-
marginTop: 2,
|
|
826
|
-
fontWeight: '600',
|
|
827
|
-
},
|
|
828
|
-
panelCard: {
|
|
829
|
-
backgroundColor: '#1E293B',
|
|
830
|
-
borderRadius: 16,
|
|
831
|
-
padding: 16,
|
|
832
|
-
borderWidth: 1,
|
|
833
|
-
borderColor: '#334155',
|
|
834
|
-
marginBottom: 16,
|
|
835
|
-
},
|
|
836
|
-
panelHeader: {
|
|
837
|
-
fontSize: 12,
|
|
838
|
-
fontWeight: '800',
|
|
839
|
-
color: '#F8FAFC',
|
|
840
|
-
letterSpacing: 0.8,
|
|
841
|
-
marginBottom: 12,
|
|
842
|
-
},
|
|
843
|
-
btnRow: {
|
|
844
|
-
flexDirection: 'row',
|
|
845
|
-
gap: 12,
|
|
846
|
-
},
|
|
847
|
-
gridBtn: {
|
|
848
|
-
flex: 1,
|
|
849
|
-
height: 44,
|
|
850
|
-
borderRadius: 10,
|
|
851
|
-
borderWidth: 1.5,
|
|
852
|
-
justifyContent: 'center',
|
|
853
|
-
alignItems: 'center',
|
|
854
|
-
backgroundColor: 'rgba(255,255,255,0.02)',
|
|
855
|
-
},
|
|
856
|
-
btnText: {
|
|
857
|
-
fontSize: 13,
|
|
858
|
-
fontWeight: 'bold',
|
|
859
|
-
},
|
|
860
|
-
fullWidthBtn: {
|
|
861
|
-
width: '100%',
|
|
862
|
-
height: 44,
|
|
863
|
-
borderRadius: 10,
|
|
864
|
-
justifyContent: 'center',
|
|
865
|
-
alignItems: 'center',
|
|
866
|
-
shadowColor: '#000',
|
|
867
|
-
shadowOffset: { width: 0, height: 2 },
|
|
868
|
-
shadowOpacity: 0.2,
|
|
869
|
-
shadowRadius: 4,
|
|
870
|
-
elevation: 3,
|
|
871
|
-
},
|
|
872
|
-
fullWidthBtnText: {
|
|
873
|
-
fontSize: 13,
|
|
874
|
-
fontWeight: 'bold',
|
|
875
|
-
color: '#FFFFFF',
|
|
876
|
-
},
|
|
877
|
-
});
|
|
878
|
-
|
|
879
|
-
export default App;
|