react-native-inapp-inspector 2.0.0 → 2.0.2
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/README.md +10 -0
- package/android/.gradle/8.9/checksums/checksums.lock +0 -0
- package/android/.gradle/8.9/checksums/md5-checksums.bin +0 -0
- package/android/.gradle/8.9/checksums/sha1-checksums.bin +0 -0
- package/android/.gradle/8.9/dependencies-accessors/gc.properties +0 -0
- package/android/.gradle/8.9/executionHistory/executionHistory.lock +0 -0
- package/android/.gradle/8.9/fileChanges/last-build.bin +0 -0
- package/android/.gradle/8.9/fileHashes/fileHashes.lock +0 -0
- package/android/.gradle/8.9/gc.properties +0 -0
- package/android/.gradle/9.2.0/checksums/checksums.lock +0 -0
- package/android/.gradle/9.2.0/fileChanges/last-build.bin +0 -0
- package/android/.gradle/9.2.0/fileHashes/fileHashes.bin +0 -0
- package/android/.gradle/9.2.0/fileHashes/fileHashes.lock +0 -0
- package/android/.gradle/9.2.0/gc.properties +0 -0
- package/android/.gradle/buildOutputCleanup/buildOutputCleanup.lock +0 -0
- package/android/.gradle/buildOutputCleanup/cache.properties +2 -0
- package/android/.gradle/vcs-1/gc.properties +0 -0
- package/android/build/reports/problems/problems-report.html +659 -0
- package/android/src/main/java/com/inappinspector/NetworkInspectorModule.kt +33 -24
- package/dist/commonjs/components/ConsoleLogCard.js +5 -5
- package/dist/commonjs/components/EndOfListFooter.js +1 -1
- package/dist/commonjs/components/Inspector/AnalyticsTab.js +19 -71
- package/dist/commonjs/components/Inspector/BundleTab.js +670 -188
- package/dist/commonjs/components/Inspector/ConsoleTab.js +109 -98
- package/dist/commonjs/components/Inspector/CrashTab.js +2 -1
- package/dist/commonjs/components/Inspector/InspectorHeader.js +102 -19
- package/dist/commonjs/components/Inspector/MainScreen.js +151 -17
- package/dist/commonjs/components/Inspector/NetworkTab.js +104 -20
- package/dist/commonjs/components/Inspector/SettingsPanel.js +1111 -1385
- package/dist/commonjs/components/Inspector/TabBar.js +3 -4
- package/dist/commonjs/components/Inspector/TelemetryConsentModal.d.ts +3 -0
- package/dist/commonjs/components/Inspector/TelemetryConsentModal.js +212 -0
- package/dist/commonjs/components/JsonViewer.js +9 -4
- package/dist/commonjs/components/LogCard.js +31 -1
- package/dist/commonjs/components/LogSyntaxHighlighter.d.ts +16 -0
- package/dist/commonjs/components/LogSyntaxHighlighter.js +130 -0
- package/dist/commonjs/components/NetworkIcons.d.ts +2 -0
- package/dist/commonjs/components/NetworkIcons.js +10 -1
- package/dist/commonjs/components/Slider.d.ts +13 -0
- package/dist/commonjs/components/Slider.js +261 -0
- package/dist/commonjs/constants/version.d.ts +1 -1
- package/dist/commonjs/constants/version.js +1 -1
- package/dist/commonjs/customHooks/analyticsLogger.js +1 -1
- package/dist/commonjs/customHooks/crashHandler.js +1 -1
- package/dist/commonjs/helpers/index.d.ts +2 -0
- package/dist/commonjs/helpers/index.js +16 -0
- package/dist/commonjs/helpers/searchQueryParser.d.ts +6 -0
- package/dist/commonjs/helpers/searchQueryParser.js +236 -0
- package/dist/commonjs/helpers/settingsStore.js +13 -13
- package/dist/commonjs/helpers/telemetry.d.ts +99 -0
- package/dist/commonjs/helpers/telemetry.js +398 -0
- package/dist/commonjs/index.d.ts +2 -0
- package/dist/commonjs/index.js +30 -21
- package/dist/commonjs/native/NativeInspector.d.ts +5 -0
- package/dist/commonjs/native/NativeInspector.js +3 -2
- package/dist/commonjs/styles/index.js +35 -35
- package/dist/esm/components/ConsoleLogCard.js +5 -5
- package/dist/esm/components/EndOfListFooter.js +2 -2
- package/dist/esm/components/Inspector/AnalyticsTab.js +21 -73
- package/dist/esm/components/Inspector/BundleTab.js +670 -188
- package/dist/esm/components/Inspector/ConsoleTab.js +110 -99
- package/dist/esm/components/Inspector/CrashTab.js +2 -1
- package/dist/esm/components/Inspector/InspectorHeader.js +103 -20
- package/dist/esm/components/Inspector/MainScreen.js +119 -18
- package/dist/esm/components/Inspector/NetworkTab.js +105 -21
- package/dist/esm/components/Inspector/SettingsPanel.js +1114 -1388
- package/dist/esm/components/Inspector/TabBar.js +4 -5
- package/dist/esm/components/Inspector/TelemetryConsentModal.d.ts +3 -0
- package/dist/esm/components/Inspector/TelemetryConsentModal.js +175 -0
- package/dist/esm/components/JsonViewer.js +9 -4
- package/dist/esm/components/LogCard.js +32 -2
- package/dist/esm/components/LogSyntaxHighlighter.d.ts +16 -0
- package/dist/esm/components/LogSyntaxHighlighter.js +123 -0
- package/dist/esm/components/NetworkIcons.d.ts +2 -0
- package/dist/esm/components/NetworkIcons.js +7 -0
- package/dist/esm/components/Slider.d.ts +13 -0
- package/dist/esm/components/Slider.js +222 -0
- package/dist/esm/constants/version.d.ts +1 -1
- package/dist/esm/constants/version.js +1 -1
- package/dist/esm/customHooks/analyticsLogger.js +1 -1
- package/dist/esm/customHooks/crashHandler.js +1 -1
- package/dist/esm/helpers/index.d.ts +2 -0
- package/dist/esm/helpers/index.js +2 -0
- package/dist/esm/helpers/searchQueryParser.d.ts +6 -0
- package/dist/esm/helpers/searchQueryParser.js +233 -0
- package/dist/esm/helpers/settingsStore.js +13 -13
- package/dist/esm/helpers/telemetry.d.ts +99 -0
- package/dist/esm/helpers/telemetry.js +380 -0
- package/dist/esm/index.d.ts +2 -0
- package/dist/esm/index.js +20 -21
- package/dist/esm/native/NativeInspector.d.ts +5 -0
- package/dist/esm/native/NativeInspector.js +3 -2
- package/dist/esm/styles/index.js +35 -35
- package/ios/{NetworkInspectorModule.m → NetworkInspectorModule.mm} +193 -97
- package/package.json +2 -2
|
@@ -1,9 +1,42 @@
|
|
|
1
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
|
+
})();
|
|
2
35
|
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
36
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
37
|
};
|
|
5
38
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
const react_1 =
|
|
39
|
+
const react_1 = __importStar(require("react"));
|
|
7
40
|
const react_native_1 = require("react-native");
|
|
8
41
|
const InspectorContext_1 = require("./InspectorContext");
|
|
9
42
|
const ErrorBoundary_1 = __importDefault(require("../ErrorBoundary"));
|
|
@@ -23,6 +56,7 @@ const PerformanceTab_1 = __importDefault(require("./PerformanceTab"));
|
|
|
23
56
|
const CrashTab_1 = __importDefault(require("./CrashTab"));
|
|
24
57
|
const CrashDetail_1 = __importDefault(require("./CrashDetail"));
|
|
25
58
|
const SettingsPanel_1 = __importDefault(require("./SettingsPanel"));
|
|
59
|
+
const TelemetryConsentModal_1 = __importDefault(require("./TelemetryConsentModal"));
|
|
26
60
|
const Toast_1 = __importDefault(require("../Toast"));
|
|
27
61
|
const styles_1 = __importDefault(require("../../styles"));
|
|
28
62
|
const AppColors_1 = require("../../styles/AppColors");
|
|
@@ -34,6 +68,40 @@ const MainScreen = () => {
|
|
|
34
68
|
(activeTab === 'logs' && selectedLog != null) ||
|
|
35
69
|
(activeTab === 'redux' && (selectedReduxSlice != null || selectedReduxAction != null)) ||
|
|
36
70
|
(activeTab === 'crash' && selectedCrash != null);
|
|
71
|
+
// ─── 60 FPS Transition Animations ──────────────────────────────────────────
|
|
72
|
+
const detailAnim = (0, react_1.useRef)(new react_native_1.Animated.Value(0)).current;
|
|
73
|
+
(0, react_1.useEffect)(() => {
|
|
74
|
+
if (isDetailActive) {
|
|
75
|
+
detailAnim.setValue(0);
|
|
76
|
+
react_native_1.Animated.spring(detailAnim, {
|
|
77
|
+
toValue: 1,
|
|
78
|
+
friction: 8,
|
|
79
|
+
tension: 65,
|
|
80
|
+
useNativeDriver: true,
|
|
81
|
+
}).start();
|
|
82
|
+
}
|
|
83
|
+
}, [isDetailActive]);
|
|
84
|
+
const settingsAnim = (0, react_1.useRef)(new react_native_1.Animated.Value(0)).current;
|
|
85
|
+
(0, react_1.useEffect)(() => {
|
|
86
|
+
if (settingsPage !== null) {
|
|
87
|
+
settingsAnim.setValue(0);
|
|
88
|
+
react_native_1.Animated.spring(settingsAnim, {
|
|
89
|
+
toValue: 1,
|
|
90
|
+
friction: 8,
|
|
91
|
+
tension: 65,
|
|
92
|
+
useNativeDriver: true,
|
|
93
|
+
}).start();
|
|
94
|
+
}
|
|
95
|
+
}, [settingsPage !== null]);
|
|
96
|
+
const tabAnim = (0, react_1.useRef)(new react_native_1.Animated.Value(1)).current;
|
|
97
|
+
(0, react_1.useEffect)(() => {
|
|
98
|
+
tabAnim.setValue(0);
|
|
99
|
+
react_native_1.Animated.timing(tabAnim, {
|
|
100
|
+
toValue: 1,
|
|
101
|
+
duration: 150,
|
|
102
|
+
useNativeDriver: true,
|
|
103
|
+
}).start();
|
|
104
|
+
}, [activeTab]);
|
|
37
105
|
return (<>
|
|
38
106
|
{(react_native_1.Platform.OS === 'ios' || react_native_1.Platform.OS === 'android') &&
|
|
39
107
|
isEnabled &&
|
|
@@ -54,26 +122,92 @@ const MainScreen = () => {
|
|
|
54
122
|
|
|
55
123
|
<InspectorHeader_1.default />
|
|
56
124
|
|
|
57
|
-
{
|
|
58
|
-
|
|
125
|
+
<react_native_1.View style={{ flex: 1 }}>
|
|
126
|
+
{isReady ? (<react_native_1.View style={{ flex: 1 }}>
|
|
127
|
+
{/* ─── Horizontal Scrollable Tab Bar inside Content ─── */}
|
|
128
|
+
{!isDetailActive && <TabBar_1.default />}
|
|
59
129
|
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
{
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
130
|
+
{/* Persistent List Layer - Never unmounted, preserves 100% native scroll with smooth tab transition */}
|
|
131
|
+
<react_native_1.Animated.View style={[
|
|
132
|
+
{
|
|
133
|
+
flex: 1,
|
|
134
|
+
opacity: tabAnim,
|
|
135
|
+
transform: [
|
|
136
|
+
{
|
|
137
|
+
translateY: tabAnim.interpolate({
|
|
138
|
+
inputRange: [0, 1],
|
|
139
|
+
outputRange: [6, 0],
|
|
140
|
+
}),
|
|
141
|
+
},
|
|
142
|
+
],
|
|
143
|
+
},
|
|
144
|
+
(isDetailActive || settingsPage !== null) && {
|
|
145
|
+
pointerEvents: 'none',
|
|
146
|
+
},
|
|
147
|
+
]}>
|
|
148
|
+
{activeTab === 'apis' && <NetworkTab_1.default />}
|
|
149
|
+
{activeTab === 'logs' && <ConsoleTab_1.default />}
|
|
150
|
+
{activeTab === 'analytics' && <AnalyticsTab_1.default />}
|
|
151
|
+
{activeTab === 'redux' && <ReduxTab_1.default />}
|
|
152
|
+
{activeTab === 'bundle' && <BundleTab_1.default />}
|
|
153
|
+
{activeTab === 'performance' && <PerformanceTab_1.default />}
|
|
154
|
+
{activeTab === 'crash' && <CrashTab_1.default />}
|
|
155
|
+
</react_native_1.Animated.View>
|
|
156
|
+
|
|
157
|
+
{/* Detail View Layer - Rendered on top with smooth slide & spring transition */}
|
|
158
|
+
{isDetailActive && (<react_native_1.Animated.View style={[
|
|
159
|
+
react_native_1.StyleSheet.absoluteFill,
|
|
160
|
+
{
|
|
161
|
+
backgroundColor: AppColors_1.AppColors.contentBg,
|
|
162
|
+
opacity: detailAnim,
|
|
163
|
+
transform: [
|
|
164
|
+
{
|
|
165
|
+
translateX: detailAnim.interpolate({
|
|
166
|
+
inputRange: [0, 1],
|
|
167
|
+
outputRange: [32, 0],
|
|
168
|
+
}),
|
|
169
|
+
},
|
|
170
|
+
],
|
|
171
|
+
},
|
|
172
|
+
]}>
|
|
173
|
+
{activeTab === 'apis' && selected != null && (<NetworkDetail_1.default />)}
|
|
174
|
+
{activeTab === 'analytics' && selectedEvent != null && (<AnalyticsDetail_1.default event={selectedEvent}/>)}
|
|
175
|
+
{activeTab === 'logs' && selectedLog != null && (<LogDetail_1.default />)}
|
|
176
|
+
{activeTab === 'redux' && <ReduxDetail_1.default />}
|
|
177
|
+
{activeTab === 'crash' && selectedCrash != null && (<CrashDetail_1.default />)}
|
|
178
|
+
</react_native_1.Animated.View>)}
|
|
179
|
+
</react_native_1.View>) : (<react_native_1.View style={styles_1.default.empty}>
|
|
180
|
+
<react_native_1.ActivityIndicator size="large" color={AppColors_1.AppColors.purple}/>
|
|
181
|
+
<react_native_1.Text style={[styles_1.default.emptySub, { marginTop: 12 }]}>
|
|
182
|
+
Loading logs...
|
|
183
|
+
</react_native_1.Text>
|
|
184
|
+
</react_native_1.View>)}
|
|
185
|
+
|
|
186
|
+
{/* Settings Panel Layer - Rendered on top with smooth slide & spring transition */}
|
|
187
|
+
{settingsPage !== null && (<react_native_1.Animated.View style={[
|
|
188
|
+
react_native_1.StyleSheet.absoluteFill,
|
|
189
|
+
{
|
|
190
|
+
backgroundColor: AppColors_1.AppColors.grayBackground,
|
|
191
|
+
opacity: settingsAnim,
|
|
192
|
+
transform: [
|
|
193
|
+
{
|
|
194
|
+
translateY: settingsAnim.interpolate({
|
|
195
|
+
inputRange: [0, 1],
|
|
196
|
+
outputRange: [24, 0],
|
|
197
|
+
}),
|
|
198
|
+
},
|
|
199
|
+
],
|
|
200
|
+
},
|
|
201
|
+
]}>
|
|
202
|
+
<SettingsPanel_1.default />
|
|
203
|
+
</react_native_1.Animated.View>)}
|
|
204
|
+
</react_native_1.View>
|
|
74
205
|
|
|
75
206
|
{/* Bottom floating toast notification */}
|
|
76
207
|
<Toast_1.default />
|
|
208
|
+
|
|
209
|
+
{/* Anonymous Telemetry Consent Dialog */}
|
|
210
|
+
<TelemetryConsentModal_1.default />
|
|
77
211
|
</react_native_1.View>
|
|
78
212
|
</react_native_1.View>
|
|
79
213
|
</ErrorBoundary_1.default>)}
|
|
@@ -94,29 +94,31 @@ const FilterChip = react_1.default.memo(({ label, color, Icon, badge, active, on
|
|
|
94
94
|
return (<TouchableScale_1.default style={styles_1.default.statusFilterWrap} onPress={onPress} hitSlop={10}>
|
|
95
95
|
<react_native_1.View style={[
|
|
96
96
|
styles_1.default.statusFilterChip,
|
|
97
|
+
{
|
|
98
|
+
paddingHorizontal: 9,
|
|
99
|
+
paddingVertical: 5,
|
|
100
|
+
borderRadius: 7,
|
|
101
|
+
borderWidth: 1,
|
|
102
|
+
borderColor: active ? color : `${AppColors_1.AppColors.grayBorderSecondary}`,
|
|
103
|
+
backgroundColor: active ? `${color}14` : AppColors_1.AppColors.grayBackground,
|
|
104
|
+
},
|
|
97
105
|
active && {
|
|
98
|
-
|
|
99
|
-
|
|
106
|
+
shadowColor: color,
|
|
107
|
+
shadowOffset: { width: 0, height: 1 },
|
|
108
|
+
shadowOpacity: 0.2,
|
|
109
|
+
shadowRadius: 2,
|
|
110
|
+
elevation: 1.5,
|
|
100
111
|
},
|
|
101
112
|
]}>
|
|
102
|
-
<react_native_1.View style={[
|
|
103
|
-
styles_1.default.filterCheckbox,
|
|
104
|
-
active && [
|
|
105
|
-
styles_1.default.filterCheckboxActive,
|
|
106
|
-
{ backgroundColor: color },
|
|
107
|
-
],
|
|
108
|
-
]}>
|
|
109
|
-
{active && (<NetworkIcons_1.CheckIcon color={AppColors_1.AppColors.white} size={10}/>)}
|
|
110
|
-
</react_native_1.View>
|
|
111
113
|
{badge != null ? (<react_native_1.View style={[
|
|
112
114
|
styles_1.default.methodBadgeMini,
|
|
113
115
|
{ backgroundColor: badge },
|
|
114
116
|
]}/>) : (Icon && (<Icon color={iconColor} size={13}/>))}
|
|
115
117
|
<react_native_1.Text numberOfLines={1} style={[
|
|
116
118
|
styles_1.default.statusFilterText,
|
|
117
|
-
|
|
118
|
-
color,
|
|
119
|
-
fontFamily: AppFonts_1.AppFonts.interBold,
|
|
119
|
+
{
|
|
120
|
+
color: active ? color : AppColors_1.AppColors.grayText,
|
|
121
|
+
fontFamily: active ? AppFonts_1.AppFonts.interBold : AppFonts_1.AppFonts.interMedium,
|
|
120
122
|
},
|
|
121
123
|
]}>
|
|
122
124
|
{label}
|
|
@@ -129,6 +131,19 @@ const NetworkTab = react_1.default.memo(() => {
|
|
|
129
131
|
const { t } = (0, i18n_1.useTranslation)();
|
|
130
132
|
const filtersAccordion = (0, useAccordion_1.default)(false, 300, 260);
|
|
131
133
|
const apisListRef = (0, react_1.useRef)(null);
|
|
134
|
+
const [isSearchFocused, setIsSearchFocused] = react_1.default.useState(false);
|
|
135
|
+
const QUICK_API_QUERY_TAGS = (0, react_1.useMemo)(() => [
|
|
136
|
+
{ label: '⚠️ Failed', query: 'is:error' },
|
|
137
|
+
{ label: '🐢 Slow >1s', query: 'slow:>1s' },
|
|
138
|
+
{ label: 'POST', query: 'm:POST' },
|
|
139
|
+
{ label: 'GET', query: 'm:GET' },
|
|
140
|
+
{ label: 'GraphQL', query: 'is:graphql' },
|
|
141
|
+
{ label: 'Axios', query: 'client:axios' },
|
|
142
|
+
{ label: '200 OK', query: 'status:200' },
|
|
143
|
+
{ label: '404', query: 'status:404' },
|
|
144
|
+
{ label: '500', query: 'status:500' },
|
|
145
|
+
{ label: '🔒 HTTPS', query: 'is:https' },
|
|
146
|
+
], []);
|
|
132
147
|
const networkMetrics = (0, react_1.useMemo)(() => {
|
|
133
148
|
if (!logs || logs.length === 0)
|
|
134
149
|
return null;
|
|
@@ -263,12 +278,38 @@ const NetworkTab = react_1.default.memo(() => {
|
|
|
263
278
|
</react_native_1.View>)}
|
|
264
279
|
|
|
265
280
|
<react_native_1.View style={styles_1.default.toolbarRow}>
|
|
266
|
-
<react_native_1.View style={
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
281
|
+
<react_native_1.View style={[
|
|
282
|
+
styles_1.default.searchContainer,
|
|
283
|
+
isSearchFocused && {
|
|
284
|
+
borderColor: AppColors_1.AppColors.purple,
|
|
285
|
+
borderWidth: 1.5,
|
|
286
|
+
},
|
|
287
|
+
]}>
|
|
288
|
+
<NetworkIcons_1.SearchIcon color={isSearchFocused ? AppColors_1.AppColors.purple : AppColors_1.AppColors.grayTextWeak} size={16}/>
|
|
289
|
+
<react_native_1.TextInput placeholder="Search url, body, is:error, slow:>1s..." placeholderTextColor={AppColors_1.AppColors.grayTextWeak} value={search} onChangeText={setSearch} onFocus={() => setIsSearchFocused(true)} onBlur={() => setIsSearchFocused(false)} style={styles_1.default.searchInput} autoCorrect={false} autoCapitalize="none"/>
|
|
290
|
+
{search.length > 0 && (<react_native_1.View style={{
|
|
291
|
+
flexDirection: 'row',
|
|
292
|
+
alignItems: 'center',
|
|
293
|
+
gap: 4,
|
|
294
|
+
}}>
|
|
295
|
+
<react_native_1.View style={{
|
|
296
|
+
backgroundColor: `${AppColors_1.AppColors.purple}20`,
|
|
297
|
+
borderRadius: 10,
|
|
298
|
+
paddingHorizontal: 6,
|
|
299
|
+
paddingVertical: 2,
|
|
300
|
+
}}>
|
|
301
|
+
<react_native_1.Text style={{
|
|
302
|
+
color: AppColors_1.AppColors.purple,
|
|
303
|
+
fontSize: 10,
|
|
304
|
+
fontFamily: AppFonts_1.AppFonts.interBold,
|
|
305
|
+
}}>
|
|
306
|
+
{filteredLogs.length}
|
|
307
|
+
</react_native_1.Text>
|
|
308
|
+
</react_native_1.View>
|
|
309
|
+
<react_native_1.Pressable onPress={() => setSearch('')} hitSlop={10} style={styles_1.default.clearBtn}>
|
|
310
|
+
<NetworkIcons_1.ClearIcon color={AppColors_1.AppColors.grayTextWeak} size={14}/>
|
|
311
|
+
</react_native_1.Pressable>
|
|
312
|
+
</react_native_1.View>)}
|
|
272
313
|
</react_native_1.View>
|
|
273
314
|
|
|
274
315
|
<react_native_1.View style={styles_1.default.toolbarRight}>
|
|
@@ -315,6 +356,49 @@ const NetworkTab = react_1.default.memo(() => {
|
|
|
315
356
|
</react_native_1.View>
|
|
316
357
|
</react_native_1.View>
|
|
317
358
|
|
|
359
|
+
{/* Advanced Search Quick Query Suggestions Bar */}
|
|
360
|
+
{(isSearchFocused || search.length > 0) && (<react_native_1.ScrollView horizontal showsHorizontalScrollIndicator={false} style={{ marginBottom: 6, maxHeight: 30 }} contentContainerStyle={{
|
|
361
|
+
paddingHorizontal: 12,
|
|
362
|
+
flexDirection: 'row',
|
|
363
|
+
alignItems: 'center',
|
|
364
|
+
gap: 6,
|
|
365
|
+
}}>
|
|
366
|
+
{QUICK_API_QUERY_TAGS.map(item => {
|
|
367
|
+
const isSelected = search.includes(item.query);
|
|
368
|
+
return (<TouchableScale_1.default key={item.query} onPress={() => {
|
|
369
|
+
if (isSelected) {
|
|
370
|
+
setSearch(prev => prev.replace(item.query, '').trim());
|
|
371
|
+
}
|
|
372
|
+
else {
|
|
373
|
+
setSearch(prev => prev ? `${prev} ${item.query}`.trim() : item.query);
|
|
374
|
+
}
|
|
375
|
+
}}>
|
|
376
|
+
<react_native_1.View style={{
|
|
377
|
+
paddingHorizontal: 8,
|
|
378
|
+
paddingVertical: 3.5,
|
|
379
|
+
borderRadius: 6,
|
|
380
|
+
backgroundColor: isSelected
|
|
381
|
+
? AppColors_1.AppColors.purple
|
|
382
|
+
: `${AppColors_1.AppColors.purple}14`,
|
|
383
|
+
borderWidth: 1,
|
|
384
|
+
borderColor: isSelected
|
|
385
|
+
? AppColors_1.AppColors.purple
|
|
386
|
+
: `${AppColors_1.AppColors.purple}30`,
|
|
387
|
+
}}>
|
|
388
|
+
<react_native_1.Text style={{
|
|
389
|
+
fontFamily: AppFonts_1.AppFonts.interBold,
|
|
390
|
+
fontSize: 10,
|
|
391
|
+
color: isSelected
|
|
392
|
+
? AppColors_1.AppColors.white
|
|
393
|
+
: AppColors_1.AppColors.purple,
|
|
394
|
+
}}>
|
|
395
|
+
{item.label}
|
|
396
|
+
</react_native_1.Text>
|
|
397
|
+
</react_native_1.View>
|
|
398
|
+
</TouchableScale_1.default>);
|
|
399
|
+
})}
|
|
400
|
+
</react_native_1.ScrollView>)}
|
|
401
|
+
|
|
318
402
|
<react_native_1.Animated.View style={[
|
|
319
403
|
filtersAccordion.bodyStyle,
|
|
320
404
|
{ overflow: 'hidden' },
|