react-native-inapp-inspector 2.0.3 → 2.0.5
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/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/dist/commonjs/components/Inspector/InspectorHeader.js +87 -50
- package/dist/commonjs/components/Inspector/MainScreen.js +1 -0
- package/dist/commonjs/components/Inspector/NetworkTab.js +317 -12
- package/dist/commonjs/components/Inspector/NpmUpdateToast.js +88 -39
- package/dist/commonjs/components/Inspector/SettingsPanel.js +525 -359
- package/dist/commonjs/components/Inspector/UpdateAvailableModal.d.ts +8 -0
- package/dist/commonjs/components/Inspector/UpdateAvailableModal.js +469 -0
- package/dist/commonjs/constants/version.d.ts +1 -1
- package/dist/commonjs/constants/version.js +1 -1
- package/dist/commonjs/helpers/searchQueryParser.d.ts +8 -3
- package/dist/commonjs/helpers/searchQueryParser.js +85 -31
- package/dist/commonjs/helpers/telemetry.js +4 -4
- package/dist/commonjs/index.js +58 -7
- package/dist/commonjs/types/interfaces.d.ts +9 -0
- package/dist/esm/components/Inspector/InspectorHeader.js +87 -50
- package/dist/esm/components/Inspector/MainScreen.js +1 -0
- package/dist/esm/components/Inspector/NetworkTab.js +317 -12
- package/dist/esm/components/Inspector/NpmUpdateToast.js +88 -39
- package/dist/esm/components/Inspector/SettingsPanel.js +526 -360
- package/dist/esm/components/Inspector/UpdateAvailableModal.d.ts +8 -0
- package/dist/esm/components/Inspector/UpdateAvailableModal.js +432 -0
- package/dist/esm/constants/version.d.ts +1 -1
- package/dist/esm/constants/version.js +1 -1
- package/dist/esm/helpers/searchQueryParser.d.ts +8 -3
- package/dist/esm/helpers/searchQueryParser.js +85 -31
- package/dist/esm/helpers/telemetry.js +4 -4
- package/dist/esm/index.js +58 -7
- package/dist/esm/types/interfaces.d.ts +9 -0
- package/package.json +1 -1
|
@@ -18,10 +18,13 @@ import { isReduxConnected } from '../../customHooks/reduxLogger';
|
|
|
18
18
|
import { isAnalyticsConnected } from '../../customHooks/analyticsLogger';
|
|
19
19
|
import { useTranslation } from '../../i18n';
|
|
20
20
|
import { getTelemetryConsentStatus, setTelemetryConsent, sendSessionTelemetryPing, } from '../../helpers/telemetry';
|
|
21
|
-
import { SignalIcon, TerminalIcon, AnalyticsIcon, SettingsIcon, SunIcon, MoonIcon, ScreenIcon, MotionIcon, LayersIcon, EyeIcon, CheckIcon, TrashIcon, PackageIcon, ReduxIcon, PerformanceIcon, CrashIcon, ShieldAlertIcon, ForwardChevronIcon, ChevronDownIcon, } from '../NetworkIcons';
|
|
21
|
+
import { SignalIcon, TerminalIcon, AnalyticsIcon, SettingsIcon, SunIcon, MoonIcon, ScreenIcon, MotionIcon, LayersIcon, EyeIcon, CheckIcon, TrashIcon, PackageIcon, ReduxIcon, PerformanceIcon, CrashIcon, ShieldAlertIcon, ForwardChevronIcon, ChevronDownIcon, NpmIcon, } from '../NetworkIcons';
|
|
22
|
+
import { LIB_VERSION } from '../../constants';
|
|
23
|
+
import { copyToClipboard } from '../../helpers';
|
|
24
|
+
import { showToast } from '../../helpers/toast';
|
|
22
25
|
const SettingsPanel = () => {
|
|
23
26
|
const { t } = useTranslation();
|
|
24
|
-
const { settingsPage, setSettingsPage, settingsActiveSubTab, setSettingsActiveSubTab, tabVisibility, toggleTabVisibility, defaultTab, setDefaultTab, isDark, setIsDark, modalHeightPercent, setModalHeightPercent, modalAnimationType, setModalAnimationType, showDuplicateLogs, setShowDuplicateLogs, showUpdateToast, setShowUpdateToast, showConsoleLevels, setShowConsoleLevels, resetToDefaults, storage, logs, consoleLogs, analyticsEvents, reduxState, maxNetworkLogs, setMaxNetworkLogs, maxConsoleLogs, setMaxConsoleLogs, maxAnalyticsEventsLimit, setMaxAnalyticsEventsLimit, isAutoRamLimitEnabled, setIsAutoRamLimitEnabled, deviceFreeRamMb, reduxAutoRefresh, setReduxAutoRefreshState, reduxExpandDepth, setReduxExpandDepth, switchActiveTab, setSelected, setSelectedEvent, setReduxState, crashRecords, maxCrashLogs, setMaxCrashLogs, } = useInspector();
|
|
27
|
+
const { settingsPage, setSettingsPage, settingsActiveSubTab, setSettingsActiveSubTab, tabVisibility, toggleTabVisibility, defaultTab, setDefaultTab, isDark, setIsDark, modalHeightPercent, setModalHeightPercent, modalAnimationType, setModalAnimationType, showDuplicateLogs, setShowDuplicateLogs, showUpdateToast, setShowUpdateToast, showConsoleLevels, setShowConsoleLevels, resetToDefaults, storage, logs, consoleLogs, analyticsEvents, reduxState, maxNetworkLogs, setMaxNetworkLogs, maxConsoleLogs, setMaxConsoleLogs, maxAnalyticsEventsLimit, setMaxAnalyticsEventsLimit, isAutoRamLimitEnabled, setIsAutoRamLimitEnabled, deviceFreeRamMb, reduxAutoRefresh, setReduxAutoRefreshState, reduxExpandDepth, setReduxExpandDepth, switchActiveTab, setSelected, setSelectedEvent, setReduxState, crashRecords, maxCrashLogs, setMaxCrashLogs, updateAvailable, latestNpmVersion, } = useInspector();
|
|
25
28
|
const [stagedHeight, setStagedHeight] = useState(modalHeightPercent);
|
|
26
29
|
const [telemetryConsent, setTelemetryConsentState] = useState(true);
|
|
27
30
|
useEffect(() => {
|
|
@@ -220,13 +223,15 @@ const SettingsPanel = () => {
|
|
|
220
223
|
MAX
|
|
221
224
|
</Text>
|
|
222
225
|
</View>
|
|
223
|
-
{opts.numericInput.min !== undefined ||
|
|
226
|
+
{opts.numericInput.min !== undefined ||
|
|
227
|
+
opts.numericInput.max !== undefined ? (<Text style={{
|
|
224
228
|
fontFamily: AppFonts.interRegular,
|
|
225
229
|
fontSize: 10,
|
|
226
230
|
lineHeight: 13,
|
|
227
231
|
color: AppColors.grayTextWeak,
|
|
228
232
|
}}>
|
|
229
|
-
Range: {opts.numericInput.min ?? 1} -
|
|
233
|
+
Range: {opts.numericInput.min ?? 1} -{' '}
|
|
234
|
+
{opts.numericInput.max ?? '∞'}
|
|
230
235
|
</Text>) : null}
|
|
231
236
|
</View>)}
|
|
232
237
|
{opts.picker && (<View style={{
|
|
@@ -269,8 +274,8 @@ const SettingsPanel = () => {
|
|
|
269
274
|
backgroundColor: AppColors.grayBackground,
|
|
270
275
|
}}>
|
|
271
276
|
<ScrollView style={{ flex: 1 }} contentContainerStyle={{ padding: 16, paddingBottom: 100, gap: 14 }} showsVerticalScrollIndicator={false}>
|
|
272
|
-
|
|
273
|
-
|
|
277
|
+
{/* Segmented Top Navigation Sub-Tabs */}
|
|
278
|
+
<View style={{
|
|
274
279
|
flexDirection: 'row',
|
|
275
280
|
backgroundColor: AppColors.primaryLight,
|
|
276
281
|
borderRadius: 12,
|
|
@@ -282,7 +287,7 @@ const SettingsPanel = () => {
|
|
|
282
287
|
shadowRadius: 4,
|
|
283
288
|
shadowOffset: { width: 0, height: 2 },
|
|
284
289
|
}}>
|
|
285
|
-
|
|
290
|
+
<TouchableScale accessible={true} accessibilityRole="tab" accessibilityLabel={t('settings.modulesAndTools')} accessibilityState={{ selected: settingsActiveSubTab === 'module' }} onPress={() => {
|
|
286
291
|
animateNextLayout();
|
|
287
292
|
setSettingsActiveSubTab('module');
|
|
288
293
|
}} style={{
|
|
@@ -297,10 +302,10 @@ const SettingsPanel = () => {
|
|
|
297
302
|
? AppColors.purple
|
|
298
303
|
: 'transparent',
|
|
299
304
|
}}>
|
|
300
|
-
|
|
305
|
+
<LayersIcon color={settingsActiveSubTab === 'module'
|
|
301
306
|
? AppColors.white
|
|
302
307
|
: AppColors.grayText} size={13}/>
|
|
303
|
-
|
|
308
|
+
<Text style={{
|
|
304
309
|
fontFamily: AppFonts.interBold,
|
|
305
310
|
fontSize: 12.5,
|
|
306
311
|
lineHeight: 16,
|
|
@@ -308,11 +313,11 @@ const SettingsPanel = () => {
|
|
|
308
313
|
? AppColors.white
|
|
309
314
|
: AppColors.grayText,
|
|
310
315
|
}}>
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
316
|
+
{t('settings.modulesAndTools')}
|
|
317
|
+
</Text>
|
|
318
|
+
</TouchableScale>
|
|
314
319
|
|
|
315
|
-
|
|
320
|
+
<TouchableScale accessible={true} accessibilityRole="tab" accessibilityLabel={t('settings.uiPreferences')} accessibilityState={{ selected: settingsActiveSubTab === 'ui' }} onPress={() => {
|
|
316
321
|
animateNextLayout();
|
|
317
322
|
setSettingsActiveSubTab('ui');
|
|
318
323
|
}} style={{
|
|
@@ -327,10 +332,10 @@ const SettingsPanel = () => {
|
|
|
327
332
|
? AppColors.purple
|
|
328
333
|
: 'transparent',
|
|
329
334
|
}}>
|
|
330
|
-
|
|
335
|
+
<ScreenIcon color={settingsActiveSubTab === 'ui'
|
|
331
336
|
? AppColors.white
|
|
332
337
|
: AppColors.grayText} size={13}/>
|
|
333
|
-
|
|
338
|
+
<Text style={{
|
|
334
339
|
fontFamily: AppFonts.interBold,
|
|
335
340
|
fontSize: 12.5,
|
|
336
341
|
lineHeight: 16,
|
|
@@ -338,15 +343,15 @@ const SettingsPanel = () => {
|
|
|
338
343
|
? AppColors.white
|
|
339
344
|
: AppColors.grayText,
|
|
340
345
|
}}>
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
346
|
+
{t('settings.uiPreferences')}
|
|
347
|
+
</Text>
|
|
348
|
+
</TouchableScale>
|
|
349
|
+
</View>
|
|
345
350
|
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
351
|
+
{settingsActiveSubTab === 'module' ? (<View style={{ gap: 12 }}>
|
|
352
|
+
{/* Individual Module Cards with Left Checkboxes */}
|
|
353
|
+
<View style={{ gap: 10 }}>
|
|
354
|
+
{allModules.map(moduleItem => {
|
|
350
355
|
const isReduxAvail = isReduxConnected();
|
|
351
356
|
const isAnalyticsAvail = isAnalyticsConnected();
|
|
352
357
|
const isUnavailable = (moduleItem.key === 'redux' && !isReduxAvail) ||
|
|
@@ -384,14 +389,14 @@ const SettingsPanel = () => {
|
|
|
384
389
|
shadowRadius: 5,
|
|
385
390
|
shadowOffset: { width: 0, height: 2 },
|
|
386
391
|
}}>
|
|
387
|
-
|
|
388
|
-
|
|
392
|
+
{/* Top Row: [Checkbox] -> [Icon Tile] -> [Title & Subtitle] */}
|
|
393
|
+
<View style={{
|
|
389
394
|
flexDirection: 'row',
|
|
390
395
|
alignItems: 'flex-start',
|
|
391
396
|
gap: 10,
|
|
392
397
|
}}>
|
|
393
|
-
|
|
394
|
-
|
|
398
|
+
{/* 1. Checkbox on the Left */}
|
|
399
|
+
<TouchableScale accessible={true} accessibilityRole="checkbox" accessibilityLabel={`Select ${moduleItem.label}`} accessibilityState={{
|
|
395
400
|
checked: isChecked,
|
|
396
401
|
disabled: isLocked,
|
|
397
402
|
}} disabled={isLocked} onPress={() => {
|
|
@@ -424,14 +429,14 @@ const SettingsPanel = () => {
|
|
|
424
429
|
shadowRadius: 2,
|
|
425
430
|
elevation: isChecked ? 2 : 0,
|
|
426
431
|
}}>
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
432
|
+
{moduleItem.key === 'apis' ? (<CheckIcon size={12} color={AppColors.blue500}/>) : isChecked ? (<CheckIcon size={12} color={AppColors.white}/>) : isLocked ? (<Svg width={10} height={10} viewBox="0 0 24 24" fill="none">
|
|
433
|
+
<Path d="M7 10V7a5 5 0 0 1 10 0v3" stroke={AppColors.grayText} strokeWidth="2.2" strokeLinecap="round"/>
|
|
434
|
+
<Path d="M5 10h14v9a1 1 0 0 1-1 1H6a1 1 0 0 1-1-1z" fill={AppColors.grayText}/>
|
|
435
|
+
</Svg>) : null}
|
|
436
|
+
</TouchableScale>
|
|
432
437
|
|
|
433
|
-
|
|
434
|
-
|
|
438
|
+
{/* 2. Middle Tap Zone: Icon + Title & Desc */}
|
|
439
|
+
<TouchableScale accessible={true} accessibilityRole="button" accessibilityLabel={`${moduleItem.label} settings`} disabled={isUnavailable} onPress={() => {
|
|
435
440
|
animateNextLayout();
|
|
436
441
|
setSettingsPage(moduleItem.key);
|
|
437
442
|
}} style={{
|
|
@@ -440,8 +445,8 @@ const SettingsPanel = () => {
|
|
|
440
445
|
alignItems: 'flex-start',
|
|
441
446
|
gap: 10,
|
|
442
447
|
}}>
|
|
443
|
-
|
|
444
|
-
|
|
448
|
+
{/* Icon Tile */}
|
|
449
|
+
<View style={{
|
|
445
450
|
width: 36,
|
|
446
451
|
height: 36,
|
|
447
452
|
borderRadius: 10,
|
|
@@ -460,38 +465,38 @@ const SettingsPanel = () => {
|
|
|
460
465
|
justifyContent: 'center',
|
|
461
466
|
marginTop: 1,
|
|
462
467
|
}}>
|
|
463
|
-
|
|
468
|
+
{moduleItem.icon === 'apis' && (<SignalIcon color={isChecked
|
|
464
469
|
? AppColors.purple
|
|
465
470
|
: AppColors.grayTextWeak} size={16}/>)}
|
|
466
|
-
|
|
471
|
+
{moduleItem.icon === 'logs' && (<TerminalIcon color={isChecked
|
|
467
472
|
? AppColors.purple
|
|
468
473
|
: AppColors.grayTextWeak} size={16}/>)}
|
|
469
|
-
|
|
474
|
+
{moduleItem.icon === 'performance' && (<PerformanceIcon color={isChecked
|
|
470
475
|
? AppColors.purple
|
|
471
476
|
: AppColors.grayTextWeak} size={16}/>)}
|
|
472
|
-
|
|
477
|
+
{moduleItem.icon === 'bundle' && (<PackageIcon color={isChecked
|
|
473
478
|
? AppColors.purple
|
|
474
479
|
: AppColors.grayTextWeak} size={16}/>)}
|
|
475
|
-
|
|
480
|
+
{moduleItem.icon === 'crash' && (<CrashIcon color={isChecked
|
|
476
481
|
? AppColors.purple
|
|
477
482
|
: AppColors.grayTextWeak} size={16}/>)}
|
|
478
|
-
|
|
483
|
+
{moduleItem.icon === 'analytics' && (<AnalyticsIcon color={isChecked
|
|
479
484
|
? AppColors.purple
|
|
480
485
|
: AppColors.grayTextWeak} size={16}/>)}
|
|
481
|
-
|
|
486
|
+
{moduleItem.icon === 'redux' && (<ReduxIcon color={isChecked
|
|
482
487
|
? AppColors.purple
|
|
483
488
|
: AppColors.grayTextWeak} size={16}/>)}
|
|
484
|
-
|
|
489
|
+
</View>
|
|
485
490
|
|
|
486
|
-
|
|
487
|
-
|
|
488
|
-
|
|
491
|
+
{/* Titles & Status Pill */}
|
|
492
|
+
<View style={{ flex: 1, gap: 2 }}>
|
|
493
|
+
<View style={{
|
|
489
494
|
flexDirection: 'row',
|
|
490
495
|
alignItems: 'center',
|
|
491
496
|
gap: 6,
|
|
492
497
|
flexWrap: 'wrap',
|
|
493
498
|
}}>
|
|
494
|
-
|
|
499
|
+
<Text style={{
|
|
495
500
|
fontFamily: AppFonts.interBold,
|
|
496
501
|
fontSize: 14,
|
|
497
502
|
lineHeight: 18,
|
|
@@ -499,11 +504,11 @@ const SettingsPanel = () => {
|
|
|
499
504
|
? AppColors.grayText
|
|
500
505
|
: AppColors.primaryBlack,
|
|
501
506
|
}}>
|
|
502
|
-
|
|
503
|
-
|
|
507
|
+
{moduleItem.label}
|
|
508
|
+
</Text>
|
|
504
509
|
|
|
505
|
-
|
|
506
|
-
|
|
510
|
+
{/* Default Startup Tab Badge */}
|
|
511
|
+
{moduleItem.key === defaultTab &&
|
|
507
512
|
!isUnavailable && (<View style={{
|
|
508
513
|
flexDirection: 'row',
|
|
509
514
|
alignItems: 'center',
|
|
@@ -515,25 +520,25 @@ const SettingsPanel = () => {
|
|
|
515
520
|
borderColor: `${AppColors.purple}2E`,
|
|
516
521
|
gap: 3,
|
|
517
522
|
}}>
|
|
518
|
-
|
|
523
|
+
<View style={{
|
|
519
524
|
width: 4,
|
|
520
525
|
height: 4,
|
|
521
526
|
borderRadius: 2,
|
|
522
527
|
backgroundColor: AppColors.purple,
|
|
523
528
|
}}/>
|
|
524
|
-
|
|
529
|
+
<Text style={{
|
|
525
530
|
fontFamily: AppFonts.interBold,
|
|
526
531
|
fontSize: 8,
|
|
527
532
|
lineHeight: 11,
|
|
528
533
|
color: AppColors.purple,
|
|
529
534
|
letterSpacing: 0.4,
|
|
530
535
|
}}>
|
|
531
|
-
|
|
532
|
-
|
|
533
|
-
|
|
536
|
+
{t('settings.defaultBadge')}
|
|
537
|
+
</Text>
|
|
538
|
+
</View>)}
|
|
534
539
|
|
|
535
|
-
|
|
536
|
-
|
|
540
|
+
{/* Status Pill */}
|
|
541
|
+
{moduleItem.key === 'apis' ? (<View style={{
|
|
537
542
|
backgroundColor: `${AppColors.blue500}14`,
|
|
538
543
|
borderRadius: 4,
|
|
539
544
|
paddingHorizontal: 5,
|
|
@@ -541,16 +546,16 @@ const SettingsPanel = () => {
|
|
|
541
546
|
borderWidth: 1,
|
|
542
547
|
borderColor: `${AppColors.blue500}33`,
|
|
543
548
|
}}>
|
|
544
|
-
|
|
549
|
+
<Text style={{
|
|
545
550
|
fontFamily: AppFonts.interBold,
|
|
546
551
|
fontSize: 8,
|
|
547
552
|
lineHeight: 11,
|
|
548
553
|
color: AppColors.blue500,
|
|
549
554
|
letterSpacing: 0.3,
|
|
550
555
|
}}>
|
|
551
|
-
|
|
552
|
-
|
|
553
|
-
|
|
556
|
+
{t('settings.coreBadge')}
|
|
557
|
+
</Text>
|
|
558
|
+
</View>) : isUnavailable ? (<View style={{
|
|
554
559
|
backgroundColor: `${AppColors.amber500}18`,
|
|
555
560
|
borderRadius: 4,
|
|
556
561
|
paddingHorizontal: 5,
|
|
@@ -558,18 +563,18 @@ const SettingsPanel = () => {
|
|
|
558
563
|
borderWidth: 1,
|
|
559
564
|
borderColor: `${AppColors.amber500}35`,
|
|
560
565
|
}}>
|
|
561
|
-
|
|
566
|
+
<Text style={{
|
|
562
567
|
fontFamily: AppFonts.interBold,
|
|
563
568
|
fontSize: 8,
|
|
564
569
|
lineHeight: 11,
|
|
565
570
|
color: AppColors.amber700,
|
|
566
571
|
letterSpacing: 0.3,
|
|
567
572
|
}}>
|
|
568
|
-
|
|
573
|
+
{moduleItem.key === 'redux'
|
|
569
574
|
? t('settings.notConnectedBadge')
|
|
570
575
|
: t('settings.notDetectedBadge')}
|
|
571
|
-
|
|
572
|
-
|
|
576
|
+
</Text>
|
|
577
|
+
</View>) : isChecked ? (<View style={{
|
|
573
578
|
backgroundColor: `${AppColors.liveGreen}18`,
|
|
574
579
|
borderRadius: 4,
|
|
575
580
|
paddingHorizontal: 5,
|
|
@@ -577,16 +582,16 @@ const SettingsPanel = () => {
|
|
|
577
582
|
borderWidth: 1,
|
|
578
583
|
borderColor: `${AppColors.liveGreen}38`,
|
|
579
584
|
}}>
|
|
580
|
-
|
|
585
|
+
<Text style={{
|
|
581
586
|
fontFamily: AppFonts.interBold,
|
|
582
587
|
fontSize: 8,
|
|
583
588
|
lineHeight: 11,
|
|
584
589
|
color: AppColors.green700,
|
|
585
590
|
letterSpacing: 0.3,
|
|
586
591
|
}}>
|
|
587
|
-
|
|
588
|
-
|
|
589
|
-
|
|
592
|
+
{t('settings.activeBadge')}
|
|
593
|
+
</Text>
|
|
594
|
+
</View>) : (<View style={{
|
|
590
595
|
backgroundColor: `${AppColors.grayTextWeak}18`,
|
|
591
596
|
borderRadius: 4,
|
|
592
597
|
paddingHorizontal: 5,
|
|
@@ -594,33 +599,33 @@ const SettingsPanel = () => {
|
|
|
594
599
|
borderWidth: 1,
|
|
595
600
|
borderColor: `${AppColors.grayTextWeak}2E`,
|
|
596
601
|
}}>
|
|
597
|
-
|
|
602
|
+
<Text style={{
|
|
598
603
|
fontFamily: AppFonts.interBold,
|
|
599
604
|
fontSize: 8,
|
|
600
605
|
lineHeight: 11,
|
|
601
606
|
color: AppColors.grayTextWeak,
|
|
602
607
|
letterSpacing: 0.3,
|
|
603
608
|
}}>
|
|
604
|
-
|
|
605
|
-
|
|
606
|
-
|
|
607
|
-
|
|
609
|
+
{t('settings.dormantBadge')}
|
|
610
|
+
</Text>
|
|
611
|
+
</View>)}
|
|
612
|
+
</View>
|
|
608
613
|
|
|
609
|
-
|
|
614
|
+
<Text style={{
|
|
610
615
|
fontFamily: AppFonts.interRegular,
|
|
611
616
|
fontSize: 11,
|
|
612
617
|
color: AppColors.grayText,
|
|
613
618
|
lineHeight: 15,
|
|
614
619
|
marginTop: 1,
|
|
615
620
|
}}>
|
|
616
|
-
|
|
617
|
-
|
|
618
|
-
|
|
619
|
-
|
|
620
|
-
|
|
621
|
+
{moduleItem.desc}
|
|
622
|
+
</Text>
|
|
623
|
+
</View>
|
|
624
|
+
</TouchableScale>
|
|
625
|
+
</View>
|
|
621
626
|
|
|
622
|
-
|
|
623
|
-
|
|
627
|
+
{/* Card Footer: Live Stats + Configure Button */}
|
|
628
|
+
{!isUnavailable && (<View style={{
|
|
624
629
|
flexDirection: 'row',
|
|
625
630
|
alignItems: 'center',
|
|
626
631
|
justifyContent: 'space-between',
|
|
@@ -628,14 +633,14 @@ const SettingsPanel = () => {
|
|
|
628
633
|
borderTopWidth: 1,
|
|
629
634
|
borderTopColor: AppColors.dividerColor,
|
|
630
635
|
}}>
|
|
631
|
-
|
|
632
|
-
|
|
636
|
+
{/* Live Info Pill */}
|
|
637
|
+
<View style={{
|
|
633
638
|
flexDirection: 'row',
|
|
634
639
|
alignItems: 'center',
|
|
635
640
|
gap: 6,
|
|
636
641
|
flex: 1,
|
|
637
642
|
}}>
|
|
638
|
-
|
|
643
|
+
<View style={{
|
|
639
644
|
width: 6,
|
|
640
645
|
height: 6,
|
|
641
646
|
borderRadius: 3,
|
|
@@ -643,18 +648,18 @@ const SettingsPanel = () => {
|
|
|
643
648
|
? AppColors.liveGreen
|
|
644
649
|
: AppColors.grayTextWeak,
|
|
645
650
|
}}/>
|
|
646
|
-
|
|
651
|
+
<Text style={{
|
|
647
652
|
fontFamily: AppFonts.interMedium,
|
|
648
653
|
fontSize: 11,
|
|
649
654
|
color: AppColors.grayText,
|
|
650
655
|
lineHeight: 14,
|
|
651
656
|
}}>
|
|
652
|
-
|
|
653
|
-
|
|
654
|
-
|
|
657
|
+
{liveStats}
|
|
658
|
+
</Text>
|
|
659
|
+
</View>
|
|
655
660
|
|
|
656
|
-
|
|
657
|
-
|
|
661
|
+
{/* Sleek Configure Button */}
|
|
662
|
+
<TouchableScale accessible={true} accessibilityRole="button" accessibilityLabel={`Configure ${moduleItem.label} settings`} onPress={() => {
|
|
658
663
|
animateNextLayout();
|
|
659
664
|
setSettingsPage(moduleItem.key);
|
|
660
665
|
}} style={{
|
|
@@ -668,24 +673,24 @@ const SettingsPanel = () => {
|
|
|
668
673
|
borderWidth: 1,
|
|
669
674
|
borderColor: `${AppColors.purple}26`,
|
|
670
675
|
}}>
|
|
671
|
-
|
|
672
|
-
|
|
676
|
+
<SettingsIcon color={AppColors.purple} size={11}/>
|
|
677
|
+
<Text style={{
|
|
673
678
|
fontFamily: AppFonts.interBold,
|
|
674
679
|
fontSize: 11,
|
|
675
680
|
lineHeight: 14,
|
|
676
681
|
color: AppColors.purple,
|
|
677
682
|
}}>
|
|
678
|
-
|
|
679
|
-
|
|
680
|
-
|
|
681
|
-
|
|
682
|
-
|
|
683
|
-
|
|
683
|
+
{t('settings.configure')}
|
|
684
|
+
</Text>
|
|
685
|
+
<ForwardChevronIcon color={AppColors.purple} size={9}/>
|
|
686
|
+
</TouchableScale>
|
|
687
|
+
</View>)}
|
|
688
|
+
</View>);
|
|
684
689
|
})}
|
|
685
|
-
|
|
690
|
+
</View>
|
|
686
691
|
|
|
687
|
-
|
|
688
|
-
|
|
692
|
+
{/* Section 3.5: RAM-Based Auto Limits */}
|
|
693
|
+
<View style={{
|
|
689
694
|
backgroundColor: AppColors.primaryLight,
|
|
690
695
|
borderRadius: 14,
|
|
691
696
|
borderWidth: 1,
|
|
@@ -694,29 +699,29 @@ const SettingsPanel = () => {
|
|
|
694
699
|
padding: 14,
|
|
695
700
|
gap: 12,
|
|
696
701
|
}}>
|
|
697
|
-
|
|
702
|
+
<Text style={{
|
|
698
703
|
fontFamily: AppFonts.interBold,
|
|
699
704
|
fontSize: 11,
|
|
700
705
|
lineHeight: 14,
|
|
701
706
|
color: AppColors.grayTextWeak,
|
|
702
707
|
letterSpacing: 0.8,
|
|
703
708
|
}}>
|
|
704
|
-
|
|
705
|
-
|
|
709
|
+
RAM-Based Auto Limits
|
|
710
|
+
</Text>
|
|
706
711
|
|
|
707
|
-
|
|
708
|
-
|
|
712
|
+
{/* Auto RAM Limit Toggle */}
|
|
713
|
+
<View style={{
|
|
709
714
|
flexDirection: 'row',
|
|
710
715
|
alignItems: 'center',
|
|
711
716
|
justifyContent: 'space-between',
|
|
712
717
|
}}>
|
|
713
|
-
|
|
718
|
+
<View style={{
|
|
714
719
|
flexDirection: 'row',
|
|
715
720
|
alignItems: 'center',
|
|
716
721
|
gap: 10,
|
|
717
722
|
flex: 1,
|
|
718
723
|
}}>
|
|
719
|
-
|
|
724
|
+
<View style={{
|
|
720
725
|
width: 32,
|
|
721
726
|
height: 32,
|
|
722
727
|
borderRadius: 8,
|
|
@@ -724,30 +729,31 @@ const SettingsPanel = () => {
|
|
|
724
729
|
alignItems: 'center',
|
|
725
730
|
justifyContent: 'center',
|
|
726
731
|
}}>
|
|
727
|
-
|
|
728
|
-
|
|
729
|
-
|
|
730
|
-
|
|
732
|
+
<PerformanceIcon color={AppColors.purple} size={15}/>
|
|
733
|
+
</View>
|
|
734
|
+
<View style={{ flex: 1 }}>
|
|
735
|
+
<Text style={{
|
|
731
736
|
fontFamily: AppFonts.interBold,
|
|
732
737
|
fontSize: 13.5,
|
|
733
738
|
lineHeight: 18,
|
|
734
739
|
color: AppColors.primaryBlack,
|
|
735
740
|
}}>
|
|
736
|
-
|
|
737
|
-
|
|
738
|
-
|
|
741
|
+
Auto-Calculate Limits from Device RAM
|
|
742
|
+
</Text>
|
|
743
|
+
<Text style={{
|
|
739
744
|
fontFamily: AppFonts.interRegular,
|
|
740
745
|
fontSize: 11,
|
|
741
746
|
lineHeight: 15,
|
|
742
747
|
color: AppColors.grayText,
|
|
743
748
|
marginTop: 1,
|
|
744
749
|
}}>
|
|
745
|
-
|
|
746
|
-
|
|
747
|
-
</
|
|
750
|
+
Automatically set API, Logs, Analytics & Crash limits
|
|
751
|
+
based on available memory
|
|
752
|
+
</Text>
|
|
748
753
|
</View>
|
|
754
|
+
</View>
|
|
749
755
|
|
|
750
|
-
|
|
756
|
+
<TouchableScale accessible={true} accessibilityRole="switch" accessibilityLabel="Toggle auto RAM limit calculation" accessibilityState={{ checked: isAutoRamLimitEnabled }} onPress={() => setIsAutoRamLimitEnabled(prev => !prev)} style={{
|
|
751
757
|
width: 42,
|
|
752
758
|
height: 24,
|
|
753
759
|
borderRadius: 12,
|
|
@@ -756,9 +762,11 @@ const SettingsPanel = () => {
|
|
|
756
762
|
: AppColors.grayBorderSecondary,
|
|
757
763
|
padding: 2,
|
|
758
764
|
justifyContent: 'center',
|
|
759
|
-
alignItems: isAutoRamLimitEnabled
|
|
765
|
+
alignItems: isAutoRamLimitEnabled
|
|
766
|
+
? 'flex-end'
|
|
767
|
+
: 'flex-start',
|
|
760
768
|
}}>
|
|
761
|
-
|
|
769
|
+
<View style={{
|
|
762
770
|
width: 20,
|
|
763
771
|
height: 20,
|
|
764
772
|
borderRadius: 10,
|
|
@@ -768,14 +776,14 @@ const SettingsPanel = () => {
|
|
|
768
776
|
shadowRadius: 2,
|
|
769
777
|
shadowOffset: { width: 0, height: 1 },
|
|
770
778
|
}}/>
|
|
771
|
-
|
|
772
|
-
|
|
779
|
+
</TouchableScale>
|
|
780
|
+
</View>
|
|
773
781
|
|
|
774
|
-
|
|
782
|
+
<View style={{ height: 1, backgroundColor: AppColors.dividerColor }}/>
|
|
775
783
|
|
|
776
|
-
|
|
777
|
-
|
|
778
|
-
|
|
784
|
+
{/* Device Free RAM Display */}
|
|
785
|
+
<View style={{ flexDirection: 'row', alignItems: 'center', gap: 10 }}>
|
|
786
|
+
<View style={{
|
|
779
787
|
width: 32,
|
|
780
788
|
height: 32,
|
|
781
789
|
borderRadius: 8,
|
|
@@ -785,10 +793,12 @@ const SettingsPanel = () => {
|
|
|
785
793
|
alignItems: 'center',
|
|
786
794
|
justifyContent: 'center',
|
|
787
795
|
}}>
|
|
788
|
-
|
|
789
|
-
|
|
790
|
-
|
|
791
|
-
|
|
796
|
+
<SignalIcon color={isAutoRamLimitEnabled
|
|
797
|
+
? AppColors.purple
|
|
798
|
+
: AppColors.grayTextWeak} size={15}/>
|
|
799
|
+
</View>
|
|
800
|
+
<View style={{ flex: 1 }}>
|
|
801
|
+
<Text style={{
|
|
792
802
|
fontFamily: AppFonts.interBold,
|
|
793
803
|
fontSize: 13.5,
|
|
794
804
|
lineHeight: 18,
|
|
@@ -796,19 +806,19 @@ const SettingsPanel = () => {
|
|
|
796
806
|
? AppColors.primaryBlack
|
|
797
807
|
: AppColors.grayText,
|
|
798
808
|
}}>
|
|
799
|
-
|
|
800
|
-
|
|
801
|
-
|
|
809
|
+
Detected Free RAM
|
|
810
|
+
</Text>
|
|
811
|
+
<Text style={{
|
|
802
812
|
fontFamily: AppFonts.interRegular,
|
|
803
813
|
fontSize: 11,
|
|
804
814
|
lineHeight: 15,
|
|
805
815
|
color: AppColors.grayText,
|
|
806
816
|
marginTop: 1,
|
|
807
817
|
}}>
|
|
808
|
-
|
|
809
|
-
|
|
810
|
-
|
|
811
|
-
|
|
818
|
+
{deviceFreeRamMb} MB available
|
|
819
|
+
</Text>
|
|
820
|
+
</View>
|
|
821
|
+
<View style={{
|
|
812
822
|
paddingHorizontal: 10,
|
|
813
823
|
paddingVertical: 5,
|
|
814
824
|
borderRadius: 8,
|
|
@@ -820,7 +830,7 @@ const SettingsPanel = () => {
|
|
|
820
830
|
? `${AppColors.purple}26`
|
|
821
831
|
: AppColors.dividerColor,
|
|
822
832
|
}}>
|
|
823
|
-
|
|
833
|
+
<Text style={{
|
|
824
834
|
fontFamily: AppFonts.interBold,
|
|
825
835
|
fontSize: 12,
|
|
826
836
|
lineHeight: 15,
|
|
@@ -828,27 +838,49 @@ const SettingsPanel = () => {
|
|
|
828
838
|
? AppColors.purple
|
|
829
839
|
: AppColors.grayText,
|
|
830
840
|
}}>
|
|
831
|
-
|
|
832
|
-
|
|
833
|
-
</View>
|
|
841
|
+
{deviceFreeRamMb} MB
|
|
842
|
+
</Text>
|
|
834
843
|
</View>
|
|
844
|
+
</View>
|
|
835
845
|
|
|
836
|
-
|
|
837
|
-
|
|
838
|
-
|
|
846
|
+
{/* Current Auto-Calculated Limits Preview */}
|
|
847
|
+
{isAutoRamLimitEnabled && (<View style={{
|
|
848
|
+
marginTop: 8,
|
|
849
|
+
paddingTop: 8,
|
|
850
|
+
borderTopWidth: 1,
|
|
851
|
+
borderTopColor: AppColors.dividerColor,
|
|
852
|
+
gap: 6,
|
|
853
|
+
}}>
|
|
854
|
+
<Text style={{
|
|
839
855
|
fontFamily: AppFonts.interBold,
|
|
840
856
|
fontSize: 11.5,
|
|
841
857
|
lineHeight: 15,
|
|
842
858
|
color: AppColors.purple,
|
|
843
859
|
}}>
|
|
844
|
-
|
|
845
|
-
|
|
846
|
-
|
|
847
|
-
|
|
848
|
-
{
|
|
849
|
-
|
|
850
|
-
|
|
851
|
-
|
|
860
|
+
Auto Profile: {autoRamProfile.profileName}
|
|
861
|
+
</Text>
|
|
862
|
+
<View style={{ flexDirection: 'row', flexWrap: 'wrap', gap: 8 }}>
|
|
863
|
+
{[
|
|
864
|
+
{
|
|
865
|
+
label: 'APIs',
|
|
866
|
+
value: autoRamProfile.maxNetworkLogs,
|
|
867
|
+
color: AppColors.blue500,
|
|
868
|
+
},
|
|
869
|
+
{
|
|
870
|
+
label: 'Logs',
|
|
871
|
+
value: autoRamProfile.maxConsoleLogs,
|
|
872
|
+
color: AppColors.sky500,
|
|
873
|
+
},
|
|
874
|
+
{
|
|
875
|
+
label: 'Analytics',
|
|
876
|
+
value: autoRamProfile.maxAnalyticsEvents,
|
|
877
|
+
color: AppColors.purple,
|
|
878
|
+
},
|
|
879
|
+
{
|
|
880
|
+
label: 'Crash',
|
|
881
|
+
value: autoRamProfile.maxCrashRecords,
|
|
882
|
+
color: AppColors.errorColor,
|
|
883
|
+
},
|
|
852
884
|
].map(item => (<View key={item.label} style={{
|
|
853
885
|
flexDirection: 'row',
|
|
854
886
|
alignItems: 'center',
|
|
@@ -860,29 +892,29 @@ const SettingsPanel = () => {
|
|
|
860
892
|
borderWidth: 1,
|
|
861
893
|
borderColor: `${item.color}33`,
|
|
862
894
|
}}>
|
|
863
|
-
|
|
895
|
+
<Text style={{
|
|
864
896
|
fontFamily: AppFonts.interBold,
|
|
865
897
|
fontSize: 10.5,
|
|
866
898
|
lineHeight: 14,
|
|
867
899
|
color: item.color,
|
|
868
900
|
}}>
|
|
869
|
-
|
|
870
|
-
|
|
871
|
-
|
|
901
|
+
{item.label}
|
|
902
|
+
</Text>
|
|
903
|
+
<Text style={{
|
|
872
904
|
fontFamily: AppFonts.interBold,
|
|
873
905
|
fontSize: 10.5,
|
|
874
906
|
lineHeight: 14,
|
|
875
907
|
color: item.color,
|
|
876
908
|
}}>
|
|
877
|
-
|
|
878
|
-
|
|
879
|
-
|
|
880
|
-
|
|
881
|
-
|
|
882
|
-
|
|
883
|
-
|
|
884
|
-
|
|
885
|
-
|
|
909
|
+
{item.value}
|
|
910
|
+
</Text>
|
|
911
|
+
</View>))}
|
|
912
|
+
</View>
|
|
913
|
+
</View>)}
|
|
914
|
+
</View>
|
|
915
|
+
</View>) : (<View style={{ gap: 14 }}>
|
|
916
|
+
{/* Section 1: Appearance */}
|
|
917
|
+
<View style={{
|
|
886
918
|
backgroundColor: AppColors.primaryLight,
|
|
887
919
|
borderRadius: 14,
|
|
888
920
|
borderWidth: 1,
|
|
@@ -891,28 +923,28 @@ const SettingsPanel = () => {
|
|
|
891
923
|
padding: 14,
|
|
892
924
|
gap: 12,
|
|
893
925
|
}}>
|
|
894
|
-
|
|
926
|
+
<Text style={{
|
|
895
927
|
fontFamily: AppFonts.interBold,
|
|
896
928
|
fontSize: 11,
|
|
897
929
|
lineHeight: 14,
|
|
898
930
|
color: AppColors.grayTextWeak,
|
|
899
931
|
letterSpacing: 0.8,
|
|
900
932
|
}}>
|
|
901
|
-
|
|
902
|
-
|
|
933
|
+
{t('settings.appearanceTheme')}
|
|
934
|
+
</Text>
|
|
903
935
|
|
|
904
|
-
|
|
936
|
+
<View style={{
|
|
905
937
|
flexDirection: 'row',
|
|
906
938
|
alignItems: 'center',
|
|
907
939
|
justifyContent: 'space-between',
|
|
908
940
|
}}>
|
|
909
|
-
|
|
941
|
+
<View style={{
|
|
910
942
|
flexDirection: 'row',
|
|
911
943
|
alignItems: 'center',
|
|
912
944
|
gap: 10,
|
|
913
945
|
flex: 1,
|
|
914
946
|
}}>
|
|
915
|
-
|
|
947
|
+
<View style={{
|
|
916
948
|
width: 32,
|
|
917
949
|
height: 32,
|
|
918
950
|
borderRadius: 8,
|
|
@@ -920,30 +952,30 @@ const SettingsPanel = () => {
|
|
|
920
952
|
alignItems: 'center',
|
|
921
953
|
justifyContent: 'center',
|
|
922
954
|
}}>
|
|
923
|
-
|
|
924
|
-
|
|
925
|
-
|
|
926
|
-
|
|
955
|
+
{isDark ? (<SunIcon color={AppColors.purple} size={15}/>) : (<MoonIcon color={AppColors.purple} size={15}/>)}
|
|
956
|
+
</View>
|
|
957
|
+
<View style={{ flex: 1 }}>
|
|
958
|
+
<Text style={{
|
|
927
959
|
fontFamily: AppFonts.interBold,
|
|
928
960
|
fontSize: 13.5,
|
|
929
961
|
lineHeight: 18,
|
|
930
962
|
color: AppColors.primaryBlack,
|
|
931
963
|
}}>
|
|
932
|
-
|
|
933
|
-
|
|
934
|
-
|
|
964
|
+
{t('settings.general.darkMode')}
|
|
965
|
+
</Text>
|
|
966
|
+
<Text style={{
|
|
935
967
|
fontFamily: AppFonts.interRegular,
|
|
936
968
|
fontSize: 11,
|
|
937
969
|
lineHeight: 15,
|
|
938
970
|
color: AppColors.grayText,
|
|
939
971
|
marginTop: 1,
|
|
940
972
|
}}>
|
|
941
|
-
|
|
942
|
-
|
|
943
|
-
</View>
|
|
973
|
+
{t('settings.general.darkModeDescription')}
|
|
974
|
+
</Text>
|
|
944
975
|
</View>
|
|
976
|
+
</View>
|
|
945
977
|
|
|
946
|
-
|
|
978
|
+
<TouchableScale accessible={true} accessibilityRole="switch" accessibilityLabel="Toggle Dark Theme" accessibilityState={{ checked: isDark }} onPress={() => {
|
|
947
979
|
const newTheme = !isDark;
|
|
948
980
|
setIsDark(newTheme);
|
|
949
981
|
toggleGlobalTheme(newTheme);
|
|
@@ -958,7 +990,7 @@ const SettingsPanel = () => {
|
|
|
958
990
|
justifyContent: 'center',
|
|
959
991
|
alignItems: isDark ? 'flex-end' : 'flex-start',
|
|
960
992
|
}}>
|
|
961
|
-
|
|
993
|
+
<View style={{
|
|
962
994
|
width: 20,
|
|
963
995
|
height: 20,
|
|
964
996
|
borderRadius: 10,
|
|
@@ -968,12 +1000,12 @@ const SettingsPanel = () => {
|
|
|
968
1000
|
shadowRadius: 2,
|
|
969
1001
|
shadowOffset: { width: 0, height: 1 },
|
|
970
1002
|
}}/>
|
|
971
|
-
|
|
972
|
-
</View>
|
|
1003
|
+
</TouchableScale>
|
|
973
1004
|
</View>
|
|
1005
|
+
</View>
|
|
974
1006
|
|
|
975
|
-
|
|
976
|
-
|
|
1007
|
+
{/* Section 2: Window & Layout */}
|
|
1008
|
+
<View style={{
|
|
977
1009
|
backgroundColor: AppColors.primaryLight,
|
|
978
1010
|
borderRadius: 14,
|
|
979
1011
|
borderWidth: 1,
|
|
@@ -982,31 +1014,31 @@ const SettingsPanel = () => {
|
|
|
982
1014
|
padding: 14,
|
|
983
1015
|
gap: 14,
|
|
984
1016
|
}}>
|
|
985
|
-
|
|
1017
|
+
<Text style={{
|
|
986
1018
|
fontFamily: AppFonts.interBold,
|
|
987
1019
|
fontSize: 11,
|
|
988
1020
|
lineHeight: 14,
|
|
989
1021
|
color: AppColors.grayTextWeak,
|
|
990
1022
|
letterSpacing: 0.8,
|
|
991
1023
|
}}>
|
|
992
|
-
|
|
993
|
-
|
|
1024
|
+
{t('settings.windowLayout')}
|
|
1025
|
+
</Text>
|
|
994
1026
|
|
|
995
|
-
|
|
996
|
-
|
|
997
|
-
|
|
1027
|
+
{/* Modal Height */}
|
|
1028
|
+
<View style={{ gap: 8 }}>
|
|
1029
|
+
<View style={{
|
|
998
1030
|
flexDirection: 'row',
|
|
999
1031
|
alignItems: 'center',
|
|
1000
1032
|
justifyContent: 'space-between',
|
|
1001
1033
|
gap: 10,
|
|
1002
1034
|
}}>
|
|
1003
|
-
|
|
1035
|
+
<View style={{
|
|
1004
1036
|
flexDirection: 'row',
|
|
1005
1037
|
alignItems: 'center',
|
|
1006
1038
|
gap: 10,
|
|
1007
1039
|
flex: 1,
|
|
1008
1040
|
}}>
|
|
1009
|
-
|
|
1041
|
+
<View style={{
|
|
1010
1042
|
width: 32,
|
|
1011
1043
|
height: 32,
|
|
1012
1044
|
borderRadius: 8,
|
|
@@ -1014,30 +1046,30 @@ const SettingsPanel = () => {
|
|
|
1014
1046
|
alignItems: 'center',
|
|
1015
1047
|
justifyContent: 'center',
|
|
1016
1048
|
}}>
|
|
1017
|
-
|
|
1018
|
-
|
|
1019
|
-
|
|
1020
|
-
|
|
1049
|
+
<ScreenIcon color={AppColors.purple} size={15}/>
|
|
1050
|
+
</View>
|
|
1051
|
+
<View style={{ flex: 1 }}>
|
|
1052
|
+
<Text style={{
|
|
1021
1053
|
fontFamily: AppFonts.interBold,
|
|
1022
1054
|
fontSize: 13.5,
|
|
1023
1055
|
lineHeight: 18,
|
|
1024
1056
|
color: AppColors.primaryBlack,
|
|
1025
1057
|
}}>
|
|
1026
|
-
|
|
1027
|
-
|
|
1028
|
-
|
|
1058
|
+
{t('settings.general.modalHeight')}
|
|
1059
|
+
</Text>
|
|
1060
|
+
<Text style={{
|
|
1029
1061
|
fontFamily: AppFonts.interRegular,
|
|
1030
1062
|
fontSize: 11,
|
|
1031
1063
|
lineHeight: 15,
|
|
1032
1064
|
color: AppColors.grayText,
|
|
1033
1065
|
marginTop: 1,
|
|
1034
1066
|
}}>
|
|
1035
|
-
|
|
1036
|
-
|
|
1037
|
-
</View>
|
|
1067
|
+
{t('settings.general.modalHeightDescription')}
|
|
1068
|
+
</Text>
|
|
1038
1069
|
</View>
|
|
1070
|
+
</View>
|
|
1039
1071
|
|
|
1040
|
-
|
|
1072
|
+
{stagedHeight !== modalHeightPercent && (<TouchableScale onPress={() => {
|
|
1041
1073
|
setModalHeightPercent(stagedHeight);
|
|
1042
1074
|
}} style={{
|
|
1043
1075
|
flexDirection: 'row',
|
|
@@ -1053,32 +1085,32 @@ const SettingsPanel = () => {
|
|
|
1053
1085
|
shadowRadius: 2,
|
|
1054
1086
|
elevation: 2,
|
|
1055
1087
|
}}>
|
|
1056
|
-
|
|
1057
|
-
|
|
1088
|
+
<CheckIcon size={11} color={AppColors.white}/>
|
|
1089
|
+
<Text style={{
|
|
1058
1090
|
fontFamily: AppFonts.interBold,
|
|
1059
1091
|
fontSize: 11,
|
|
1060
1092
|
color: AppColors.white,
|
|
1061
1093
|
}}>
|
|
1062
|
-
|
|
1063
|
-
|
|
1064
|
-
|
|
1065
|
-
|
|
1094
|
+
Save ({stagedHeight}%)
|
|
1095
|
+
</Text>
|
|
1096
|
+
</TouchableScale>)}
|
|
1097
|
+
</View>
|
|
1066
1098
|
|
|
1067
|
-
|
|
1068
|
-
|
|
1069
|
-
</View>
|
|
1099
|
+
<View style={{ marginTop: 6 }}>
|
|
1100
|
+
<Slider value={stagedHeight} onValueChange={setStagedHeight} min={50} max={90} step={5} quickPresets={[50, 60, 70, 80, 90]} formatLabel={val => `${Math.round(val)}%`}/>
|
|
1070
1101
|
</View>
|
|
1102
|
+
</View>
|
|
1071
1103
|
|
|
1072
|
-
|
|
1104
|
+
<View style={{ height: 1, backgroundColor: AppColors.dividerColor }}/>
|
|
1073
1105
|
|
|
1074
|
-
|
|
1075
|
-
|
|
1076
|
-
|
|
1106
|
+
{/* Modal Animation */}
|
|
1107
|
+
<View style={{ gap: 8 }}>
|
|
1108
|
+
<View style={{
|
|
1077
1109
|
flexDirection: 'row',
|
|
1078
1110
|
alignItems: 'center',
|
|
1079
1111
|
gap: 10,
|
|
1080
1112
|
}}>
|
|
1081
|
-
|
|
1113
|
+
<View style={{
|
|
1082
1114
|
width: 32,
|
|
1083
1115
|
height: 32,
|
|
1084
1116
|
borderRadius: 8,
|
|
@@ -1086,30 +1118,30 @@ const SettingsPanel = () => {
|
|
|
1086
1118
|
alignItems: 'center',
|
|
1087
1119
|
justifyContent: 'center',
|
|
1088
1120
|
}}>
|
|
1089
|
-
|
|
1090
|
-
|
|
1091
|
-
|
|
1092
|
-
|
|
1121
|
+
<MotionIcon color={AppColors.purple} size={15}/>
|
|
1122
|
+
</View>
|
|
1123
|
+
<View style={{ flex: 1 }}>
|
|
1124
|
+
<Text style={{
|
|
1093
1125
|
fontFamily: AppFonts.interBold,
|
|
1094
1126
|
fontSize: 13.5,
|
|
1095
1127
|
lineHeight: 18,
|
|
1096
1128
|
color: AppColors.primaryBlack,
|
|
1097
1129
|
}}>
|
|
1098
|
-
|
|
1099
|
-
|
|
1100
|
-
|
|
1130
|
+
{t('settings.general.modalAnimation')}
|
|
1131
|
+
</Text>
|
|
1132
|
+
<Text style={{
|
|
1101
1133
|
fontFamily: AppFonts.interRegular,
|
|
1102
1134
|
fontSize: 11,
|
|
1103
1135
|
lineHeight: 15,
|
|
1104
1136
|
color: AppColors.grayText,
|
|
1105
1137
|
marginTop: 1,
|
|
1106
1138
|
}}>
|
|
1107
|
-
|
|
1108
|
-
|
|
1109
|
-
</View>
|
|
1139
|
+
{t('settings.general.modalAnimationDescription')}
|
|
1140
|
+
</Text>
|
|
1110
1141
|
</View>
|
|
1142
|
+
</View>
|
|
1111
1143
|
|
|
1112
|
-
|
|
1144
|
+
<View style={{
|
|
1113
1145
|
flexDirection: 'row',
|
|
1114
1146
|
backgroundColor: AppColors.grayBackground,
|
|
1115
1147
|
borderRadius: 10,
|
|
@@ -1117,7 +1149,7 @@ const SettingsPanel = () => {
|
|
|
1117
1149
|
borderWidth: 1,
|
|
1118
1150
|
borderColor: AppColors.dividerColor,
|
|
1119
1151
|
}}>
|
|
1120
|
-
|
|
1152
|
+
{[
|
|
1121
1153
|
{ key: 'slide', label: 'Slide Up' },
|
|
1122
1154
|
{ key: 'fade', label: 'Fade' },
|
|
1123
1155
|
{ key: 'none', label: 'None' },
|
|
@@ -1132,7 +1164,7 @@ const SettingsPanel = () => {
|
|
|
1132
1164
|
? AppColors.purple
|
|
1133
1165
|
: 'transparent',
|
|
1134
1166
|
}}>
|
|
1135
|
-
|
|
1167
|
+
<Text style={{
|
|
1136
1168
|
fontFamily: AppFonts.interBold,
|
|
1137
1169
|
fontSize: 11.5,
|
|
1138
1170
|
lineHeight: 15,
|
|
@@ -1140,16 +1172,16 @@ const SettingsPanel = () => {
|
|
|
1140
1172
|
? AppColors.white
|
|
1141
1173
|
: AppColors.grayText,
|
|
1142
1174
|
}}>
|
|
1143
|
-
|
|
1144
|
-
|
|
1145
|
-
|
|
1175
|
+
{opt.label}
|
|
1176
|
+
</Text>
|
|
1177
|
+
</TouchableScale>);
|
|
1146
1178
|
})}
|
|
1147
|
-
</View>
|
|
1148
1179
|
</View>
|
|
1149
1180
|
</View>
|
|
1181
|
+
</View>
|
|
1150
1182
|
|
|
1151
|
-
|
|
1152
|
-
|
|
1183
|
+
{/* Section 3: Default Startup Tab */}
|
|
1184
|
+
<View style={{
|
|
1153
1185
|
backgroundColor: AppColors.primaryLight,
|
|
1154
1186
|
borderRadius: 14,
|
|
1155
1187
|
borderWidth: 1,
|
|
@@ -1158,22 +1190,22 @@ const SettingsPanel = () => {
|
|
|
1158
1190
|
padding: 14,
|
|
1159
1191
|
gap: 12,
|
|
1160
1192
|
}}>
|
|
1161
|
-
|
|
1193
|
+
<Text style={{
|
|
1162
1194
|
fontFamily: AppFonts.interBold,
|
|
1163
1195
|
fontSize: 11,
|
|
1164
1196
|
lineHeight: 14,
|
|
1165
1197
|
color: AppColors.grayTextWeak,
|
|
1166
1198
|
letterSpacing: 0.8,
|
|
1167
1199
|
}}>
|
|
1168
|
-
|
|
1169
|
-
|
|
1200
|
+
{t('settings.startupDefault')}
|
|
1201
|
+
</Text>
|
|
1170
1202
|
|
|
1171
|
-
|
|
1203
|
+
<View style={{
|
|
1172
1204
|
flexDirection: 'row',
|
|
1173
1205
|
alignItems: 'center',
|
|
1174
1206
|
gap: 10,
|
|
1175
1207
|
}}>
|
|
1176
|
-
|
|
1208
|
+
<View style={{
|
|
1177
1209
|
width: 32,
|
|
1178
1210
|
height: 32,
|
|
1179
1211
|
borderRadius: 8,
|
|
@@ -1181,32 +1213,32 @@ const SettingsPanel = () => {
|
|
|
1181
1213
|
alignItems: 'center',
|
|
1182
1214
|
justifyContent: 'center',
|
|
1183
1215
|
}}>
|
|
1184
|
-
|
|
1185
|
-
|
|
1186
|
-
|
|
1187
|
-
|
|
1216
|
+
<LayersIcon color={AppColors.purple} size={15}/>
|
|
1217
|
+
</View>
|
|
1218
|
+
<View style={{ flex: 1 }}>
|
|
1219
|
+
<Text style={{
|
|
1188
1220
|
fontFamily: AppFonts.interBold,
|
|
1189
1221
|
fontSize: 13.5,
|
|
1190
1222
|
lineHeight: 18,
|
|
1191
1223
|
color: AppColors.primaryBlack,
|
|
1192
1224
|
}}>
|
|
1193
|
-
|
|
1194
|
-
|
|
1195
|
-
|
|
1225
|
+
{t('settings.general.defaultOpeningTab')}
|
|
1226
|
+
</Text>
|
|
1227
|
+
<Text style={{
|
|
1196
1228
|
fontFamily: AppFonts.interRegular,
|
|
1197
1229
|
fontSize: 11,
|
|
1198
1230
|
lineHeight: 15,
|
|
1199
1231
|
color: AppColors.grayText,
|
|
1200
1232
|
marginTop: 1,
|
|
1201
1233
|
}}>
|
|
1202
|
-
|
|
1203
|
-
|
|
1204
|
-
</View>
|
|
1234
|
+
{t('settings.general.defaultOpeningTabDesc')}
|
|
1235
|
+
</Text>
|
|
1205
1236
|
</View>
|
|
1237
|
+
</View>
|
|
1206
1238
|
|
|
1207
|
-
|
|
1208
|
-
|
|
1209
|
-
|
|
1239
|
+
{/* Sleek Interactive Dropdown Picker */}
|
|
1240
|
+
<View style={{ marginTop: 6, gap: 6 }}>
|
|
1241
|
+
<TouchableScale accessible={true} accessibilityRole="button" accessibilityLabel={`Default opening tab: ${allModules.find(m => m.key === defaultTab)?.label || 'APIs'}`} onPress={() => setIsDefaultTabDropdownOpen(prev => !prev)} style={{
|
|
1210
1242
|
flexDirection: 'row',
|
|
1211
1243
|
alignItems: 'center',
|
|
1212
1244
|
justifyContent: 'space-between',
|
|
@@ -1219,53 +1251,54 @@ const SettingsPanel = () => {
|
|
|
1219
1251
|
paddingHorizontal: 14,
|
|
1220
1252
|
paddingVertical: 11,
|
|
1221
1253
|
}}>
|
|
1222
|
-
|
|
1254
|
+
<View style={{
|
|
1223
1255
|
flexDirection: 'row',
|
|
1224
1256
|
alignItems: 'center',
|
|
1225
1257
|
gap: 10,
|
|
1226
1258
|
flex: 1,
|
|
1227
1259
|
}}>
|
|
1228
|
-
|
|
1260
|
+
<View style={{
|
|
1229
1261
|
width: 8,
|
|
1230
1262
|
height: 8,
|
|
1231
1263
|
borderRadius: 4,
|
|
1232
1264
|
backgroundColor: AppColors.purple,
|
|
1233
1265
|
}}/>
|
|
1234
|
-
|
|
1266
|
+
<Text style={{
|
|
1235
1267
|
fontFamily: AppFonts.interBold,
|
|
1236
1268
|
fontSize: 13.5,
|
|
1237
1269
|
lineHeight: 18,
|
|
1238
1270
|
color: AppColors.primaryBlack,
|
|
1239
1271
|
}}>
|
|
1240
|
-
|
|
1241
|
-
|
|
1242
|
-
|
|
1272
|
+
{allModules.find(m => m.key === defaultTab)?.label ||
|
|
1273
|
+
'APIs (Network)'}
|
|
1274
|
+
</Text>
|
|
1275
|
+
<View style={{
|
|
1243
1276
|
backgroundColor: `${AppColors.purple}14`,
|
|
1244
1277
|
paddingHorizontal: 6,
|
|
1245
1278
|
paddingVertical: 1.5,
|
|
1246
1279
|
borderRadius: 6,
|
|
1247
1280
|
}}>
|
|
1248
|
-
|
|
1281
|
+
<Text style={{
|
|
1249
1282
|
fontFamily: AppFonts.interBold,
|
|
1250
1283
|
fontSize: 8.5,
|
|
1251
1284
|
color: AppColors.purple,
|
|
1252
1285
|
}}>
|
|
1253
|
-
|
|
1254
|
-
|
|
1255
|
-
</View>
|
|
1286
|
+
DEFAULT
|
|
1287
|
+
</Text>
|
|
1256
1288
|
</View>
|
|
1289
|
+
</View>
|
|
1257
1290
|
|
|
1258
|
-
|
|
1291
|
+
<View style={{
|
|
1259
1292
|
transform: [
|
|
1260
1293
|
{ rotate: isDefaultTabDropdownOpen ? '180deg' : '0deg' },
|
|
1261
1294
|
],
|
|
1262
1295
|
}}>
|
|
1263
|
-
|
|
1264
|
-
|
|
1265
|
-
|
|
1296
|
+
<ChevronDownIcon color={AppColors.grayText} size={15}/>
|
|
1297
|
+
</View>
|
|
1298
|
+
</TouchableScale>
|
|
1266
1299
|
|
|
1267
|
-
|
|
1268
|
-
|
|
1300
|
+
{/* Dropdown Options List */}
|
|
1301
|
+
{isDefaultTabDropdownOpen && (<View style={{
|
|
1269
1302
|
backgroundColor: AppColors.primaryLight,
|
|
1270
1303
|
borderRadius: 10,
|
|
1271
1304
|
borderWidth: 1,
|
|
@@ -1277,7 +1310,7 @@ const SettingsPanel = () => {
|
|
|
1277
1310
|
shadowOffset: { width: 0, height: 3 },
|
|
1278
1311
|
elevation: 4,
|
|
1279
1312
|
}}>
|
|
1280
|
-
|
|
1313
|
+
{allModules
|
|
1281
1314
|
.filter(tab => tab.key === 'apis' ||
|
|
1282
1315
|
stagedTabVisibility?.[tab.key] ||
|
|
1283
1316
|
tabVisibility?.[tab.key])
|
|
@@ -1299,12 +1332,12 @@ const SettingsPanel = () => {
|
|
|
1299
1332
|
borderBottomWidth: isLast ? 0 : 1,
|
|
1300
1333
|
borderBottomColor: AppColors.dividerColor,
|
|
1301
1334
|
}}>
|
|
1302
|
-
|
|
1335
|
+
<View style={{
|
|
1303
1336
|
flexDirection: 'row',
|
|
1304
1337
|
alignItems: 'center',
|
|
1305
1338
|
gap: 10,
|
|
1306
1339
|
}}>
|
|
1307
|
-
|
|
1340
|
+
<View style={{
|
|
1308
1341
|
width: 6,
|
|
1309
1342
|
height: 6,
|
|
1310
1343
|
borderRadius: 3,
|
|
@@ -1312,7 +1345,7 @@ const SettingsPanel = () => {
|
|
|
1312
1345
|
? AppColors.purple
|
|
1313
1346
|
: AppColors.grayTextWeak,
|
|
1314
1347
|
}}/>
|
|
1315
|
-
|
|
1348
|
+
<Text style={{
|
|
1316
1349
|
fontFamily: isActive
|
|
1317
1350
|
? AppFonts.interBold
|
|
1318
1351
|
: AppFonts.interMedium,
|
|
@@ -1321,18 +1354,18 @@ const SettingsPanel = () => {
|
|
|
1321
1354
|
? AppColors.purple
|
|
1322
1355
|
: AppColors.primaryBlack,
|
|
1323
1356
|
}}>
|
|
1324
|
-
|
|
1325
|
-
|
|
1326
|
-
|
|
1327
|
-
|
|
1328
|
-
|
|
1357
|
+
{tab.label}
|
|
1358
|
+
</Text>
|
|
1359
|
+
</View>
|
|
1360
|
+
{isActive && (<CheckIcon size={14} color={AppColors.purple}/>)}
|
|
1361
|
+
</TouchableScale>);
|
|
1329
1362
|
})}
|
|
1330
|
-
|
|
1331
|
-
</View>
|
|
1363
|
+
</View>)}
|
|
1332
1364
|
</View>
|
|
1365
|
+
</View>
|
|
1333
1366
|
|
|
1334
|
-
|
|
1335
|
-
|
|
1367
|
+
{/* Section 4: Privacy & Diagnostics */}
|
|
1368
|
+
<View style={{
|
|
1336
1369
|
backgroundColor: AppColors.primaryLight,
|
|
1337
1370
|
borderRadius: 14,
|
|
1338
1371
|
borderWidth: 1,
|
|
@@ -1341,29 +1374,29 @@ const SettingsPanel = () => {
|
|
|
1341
1374
|
padding: 14,
|
|
1342
1375
|
gap: 12,
|
|
1343
1376
|
}}>
|
|
1344
|
-
|
|
1377
|
+
<Text style={{
|
|
1345
1378
|
fontFamily: AppFonts.interBold,
|
|
1346
1379
|
fontSize: 11,
|
|
1347
1380
|
lineHeight: 14,
|
|
1348
1381
|
color: AppColors.grayTextWeak,
|
|
1349
1382
|
letterSpacing: 0.8,
|
|
1350
1383
|
}}>
|
|
1351
|
-
|
|
1352
|
-
|
|
1384
|
+
PRIVACY & ANONYMOUS DIAGNOSTICS
|
|
1385
|
+
</Text>
|
|
1353
1386
|
|
|
1354
|
-
|
|
1387
|
+
<View style={{
|
|
1355
1388
|
flexDirection: 'row',
|
|
1356
1389
|
alignItems: 'center',
|
|
1357
1390
|
justifyContent: 'space-between',
|
|
1358
1391
|
}}>
|
|
1359
|
-
|
|
1392
|
+
<View style={{
|
|
1360
1393
|
flexDirection: 'row',
|
|
1361
1394
|
alignItems: 'center',
|
|
1362
1395
|
gap: 10,
|
|
1363
1396
|
flex: 1,
|
|
1364
1397
|
marginRight: 10,
|
|
1365
1398
|
}}>
|
|
1366
|
-
|
|
1399
|
+
<View style={{
|
|
1367
1400
|
width: 32,
|
|
1368
1401
|
height: 32,
|
|
1369
1402
|
borderRadius: 8,
|
|
@@ -1371,30 +1404,32 @@ const SettingsPanel = () => {
|
|
|
1371
1404
|
alignItems: 'center',
|
|
1372
1405
|
justifyContent: 'center',
|
|
1373
1406
|
}}>
|
|
1374
|
-
|
|
1375
|
-
|
|
1376
|
-
|
|
1377
|
-
|
|
1407
|
+
<ShieldAlertIcon color={AppColors.purple} size={15}/>
|
|
1408
|
+
</View>
|
|
1409
|
+
<View style={{ flex: 1 }}>
|
|
1410
|
+
<Text style={{
|
|
1378
1411
|
fontFamily: AppFonts.interBold,
|
|
1379
1412
|
fontSize: 13.5,
|
|
1380
1413
|
lineHeight: 18,
|
|
1381
1414
|
color: AppColors.primaryBlack,
|
|
1382
1415
|
}}>
|
|
1383
|
-
|
|
1384
|
-
|
|
1385
|
-
|
|
1416
|
+
Help Improve In-App Inspector
|
|
1417
|
+
</Text>
|
|
1418
|
+
<Text style={{
|
|
1386
1419
|
fontFamily: AppFonts.interRegular,
|
|
1387
1420
|
fontSize: 11,
|
|
1388
1421
|
lineHeight: 15,
|
|
1389
1422
|
color: AppColors.grayText,
|
|
1390
1423
|
marginTop: 1,
|
|
1391
1424
|
}}>
|
|
1392
|
-
|
|
1393
|
-
|
|
1394
|
-
|
|
1425
|
+
Share non-identifiable technical metrics (RN version, JS
|
|
1426
|
+
engine, device model). No user data or network payloads
|
|
1427
|
+
are captured.
|
|
1428
|
+
</Text>
|
|
1395
1429
|
</View>
|
|
1430
|
+
</View>
|
|
1396
1431
|
|
|
1397
|
-
|
|
1432
|
+
<TouchableScale accessible={true} accessibilityRole="switch" accessibilityLabel="Toggle Anonymous Telemetry" accessibilityState={{ checked: telemetryConsent }} onPress={handleToggleTelemetry} style={{
|
|
1398
1433
|
width: 42,
|
|
1399
1434
|
height: 24,
|
|
1400
1435
|
borderRadius: 12,
|
|
@@ -1405,7 +1440,7 @@ const SettingsPanel = () => {
|
|
|
1405
1440
|
justifyContent: 'center',
|
|
1406
1441
|
alignItems: telemetryConsent ? 'flex-end' : 'flex-start',
|
|
1407
1442
|
}}>
|
|
1408
|
-
|
|
1443
|
+
<View style={{
|
|
1409
1444
|
width: 20,
|
|
1410
1445
|
height: 20,
|
|
1411
1446
|
borderRadius: 10,
|
|
@@ -1415,12 +1450,12 @@ const SettingsPanel = () => {
|
|
|
1415
1450
|
shadowRadius: 2,
|
|
1416
1451
|
shadowOffset: { width: 0, height: 1 },
|
|
1417
1452
|
}}/>
|
|
1418
|
-
|
|
1419
|
-
</View>
|
|
1453
|
+
</TouchableScale>
|
|
1420
1454
|
</View>
|
|
1455
|
+
</View>
|
|
1421
1456
|
|
|
1422
|
-
|
|
1423
|
-
|
|
1457
|
+
{/* Section 5: Notifications & Toasts */}
|
|
1458
|
+
<View style={{
|
|
1424
1459
|
backgroundColor: AppColors.primaryLight,
|
|
1425
1460
|
borderRadius: 14,
|
|
1426
1461
|
borderWidth: 1,
|
|
@@ -1429,29 +1464,29 @@ const SettingsPanel = () => {
|
|
|
1429
1464
|
padding: 14,
|
|
1430
1465
|
gap: 12,
|
|
1431
1466
|
}}>
|
|
1432
|
-
|
|
1467
|
+
<Text style={{
|
|
1433
1468
|
fontFamily: AppFonts.interBold,
|
|
1434
1469
|
fontSize: 11,
|
|
1435
1470
|
lineHeight: 14,
|
|
1436
1471
|
color: AppColors.grayTextWeak,
|
|
1437
1472
|
letterSpacing: 0.8,
|
|
1438
1473
|
}}>
|
|
1439
|
-
|
|
1440
|
-
|
|
1474
|
+
NOTIFICATIONS & TOASTS
|
|
1475
|
+
</Text>
|
|
1441
1476
|
|
|
1442
|
-
|
|
1477
|
+
<View style={{
|
|
1443
1478
|
flexDirection: 'row',
|
|
1444
1479
|
alignItems: 'center',
|
|
1445
1480
|
justifyContent: 'space-between',
|
|
1446
1481
|
}}>
|
|
1447
|
-
|
|
1482
|
+
<View style={{
|
|
1448
1483
|
flexDirection: 'row',
|
|
1449
1484
|
alignItems: 'center',
|
|
1450
1485
|
gap: 10,
|
|
1451
1486
|
flex: 1,
|
|
1452
1487
|
marginRight: 10,
|
|
1453
1488
|
}}>
|
|
1454
|
-
|
|
1489
|
+
<View style={{
|
|
1455
1490
|
width: 32,
|
|
1456
1491
|
height: 32,
|
|
1457
1492
|
borderRadius: 8,
|
|
@@ -1459,30 +1494,31 @@ const SettingsPanel = () => {
|
|
|
1459
1494
|
alignItems: 'center',
|
|
1460
1495
|
justifyContent: 'center',
|
|
1461
1496
|
}}>
|
|
1462
|
-
|
|
1463
|
-
|
|
1464
|
-
|
|
1465
|
-
|
|
1497
|
+
<PackageIcon color={AppColors.purple} size={15}/>
|
|
1498
|
+
</View>
|
|
1499
|
+
<View style={{ flex: 1 }}>
|
|
1500
|
+
<Text style={{
|
|
1466
1501
|
fontFamily: AppFonts.interBold,
|
|
1467
1502
|
fontSize: 13.5,
|
|
1468
1503
|
lineHeight: 18,
|
|
1469
1504
|
color: AppColors.primaryBlack,
|
|
1470
1505
|
}}>
|
|
1471
|
-
|
|
1472
|
-
|
|
1473
|
-
|
|
1506
|
+
NPM Update Toast
|
|
1507
|
+
</Text>
|
|
1508
|
+
<Text style={{
|
|
1474
1509
|
fontFamily: AppFonts.interRegular,
|
|
1475
1510
|
fontSize: 11,
|
|
1476
1511
|
lineHeight: 15,
|
|
1477
1512
|
color: AppColors.grayText,
|
|
1478
1513
|
marginTop: 1,
|
|
1479
1514
|
}}>
|
|
1480
|
-
|
|
1481
|
-
|
|
1482
|
-
</
|
|
1515
|
+
Show a floating toast banner with countdown progress when
|
|
1516
|
+
a newer release is published on npm.
|
|
1517
|
+
</Text>
|
|
1483
1518
|
</View>
|
|
1519
|
+
</View>
|
|
1484
1520
|
|
|
1485
|
-
|
|
1521
|
+
<TouchableScale accessible={true} accessibilityRole="switch" accessibilityLabel="Toggle NPM Update Toast" accessibilityState={{ checked: showUpdateToast }} onPress={() => setShowUpdateToast(prev => !prev)} style={{
|
|
1486
1522
|
width: 42,
|
|
1487
1523
|
height: 24,
|
|
1488
1524
|
borderRadius: 12,
|
|
@@ -1493,7 +1529,7 @@ const SettingsPanel = () => {
|
|
|
1493
1529
|
justifyContent: 'center',
|
|
1494
1530
|
alignItems: showUpdateToast ? 'flex-end' : 'flex-start',
|
|
1495
1531
|
}}>
|
|
1496
|
-
|
|
1532
|
+
<View style={{
|
|
1497
1533
|
width: 20,
|
|
1498
1534
|
height: 20,
|
|
1499
1535
|
borderRadius: 10,
|
|
@@ -1503,15 +1539,137 @@ const SettingsPanel = () => {
|
|
|
1503
1539
|
shadowRadius: 2,
|
|
1504
1540
|
shadowOffset: { width: 0, height: 1 },
|
|
1505
1541
|
}}/>
|
|
1506
|
-
|
|
1542
|
+
</TouchableScale>
|
|
1543
|
+
</View>
|
|
1544
|
+
</View>
|
|
1545
|
+
|
|
1546
|
+
{/* Section 6: NPM Package & Updates */}
|
|
1547
|
+
<View style={{
|
|
1548
|
+
backgroundColor: AppColors.primaryLight,
|
|
1549
|
+
borderRadius: 14,
|
|
1550
|
+
borderWidth: 1,
|
|
1551
|
+
borderColor: AppColors.grayBorderSecondary,
|
|
1552
|
+
overflow: 'hidden',
|
|
1553
|
+
padding: 14,
|
|
1554
|
+
gap: 12,
|
|
1555
|
+
}}>
|
|
1556
|
+
<Text style={{
|
|
1557
|
+
fontFamily: AppFonts.interBold,
|
|
1558
|
+
fontSize: 11,
|
|
1559
|
+
lineHeight: 14,
|
|
1560
|
+
color: AppColors.grayTextWeak,
|
|
1561
|
+
letterSpacing: 0.8,
|
|
1562
|
+
}}>
|
|
1563
|
+
PACKAGE VERSION & UPDATES
|
|
1564
|
+
</Text>
|
|
1565
|
+
|
|
1566
|
+
<View style={{
|
|
1567
|
+
flexDirection: 'row',
|
|
1568
|
+
alignItems: 'center',
|
|
1569
|
+
justifyContent: 'space-between',
|
|
1570
|
+
}}>
|
|
1571
|
+
<View style={{
|
|
1572
|
+
flexDirection: 'row',
|
|
1573
|
+
alignItems: 'center',
|
|
1574
|
+
gap: 10,
|
|
1575
|
+
flex: 1,
|
|
1576
|
+
marginRight: 8,
|
|
1577
|
+
}}>
|
|
1578
|
+
<View style={{
|
|
1579
|
+
width: 32,
|
|
1580
|
+
height: 32,
|
|
1581
|
+
borderRadius: 8,
|
|
1582
|
+
backgroundColor: '#CB383715',
|
|
1583
|
+
alignItems: 'center',
|
|
1584
|
+
justifyContent: 'center',
|
|
1585
|
+
}}>
|
|
1586
|
+
<NpmIcon color="#CB3837" size={16}/>
|
|
1587
|
+
</View>
|
|
1588
|
+
<View style={{ flex: 1 }}>
|
|
1589
|
+
<View style={{
|
|
1590
|
+
flexDirection: 'row',
|
|
1591
|
+
alignItems: 'center',
|
|
1592
|
+
gap: 6,
|
|
1593
|
+
}}>
|
|
1594
|
+
<Text style={{
|
|
1595
|
+
fontFamily: AppFonts.interBold,
|
|
1596
|
+
fontSize: 13.5,
|
|
1597
|
+
lineHeight: 18,
|
|
1598
|
+
color: AppColors.primaryBlack,
|
|
1599
|
+
}}>
|
|
1600
|
+
v{LIB_VERSION}
|
|
1601
|
+
</Text>
|
|
1602
|
+
{updateAvailable ? (<View style={{
|
|
1603
|
+
backgroundColor: '#F59E0B20',
|
|
1604
|
+
paddingHorizontal: 6,
|
|
1605
|
+
paddingVertical: 1.5,
|
|
1606
|
+
borderRadius: 5,
|
|
1607
|
+
borderWidth: 1,
|
|
1608
|
+
borderColor: '#F59E0B60',
|
|
1609
|
+
}}>
|
|
1610
|
+
<Text style={{
|
|
1611
|
+
fontFamily: AppFonts.interBold,
|
|
1612
|
+
fontSize: 9.5,
|
|
1613
|
+
color: '#D97706',
|
|
1614
|
+
}}>
|
|
1615
|
+
v{latestNpmVersion} Available ⚡
|
|
1616
|
+
</Text>
|
|
1617
|
+
</View>) : (<View style={{
|
|
1618
|
+
backgroundColor: `${AppColors.emerald500}20`,
|
|
1619
|
+
paddingHorizontal: 6,
|
|
1620
|
+
paddingVertical: 1.5,
|
|
1621
|
+
borderRadius: 5,
|
|
1622
|
+
borderWidth: 1,
|
|
1623
|
+
borderColor: `${AppColors.emerald500}50`,
|
|
1624
|
+
}}>
|
|
1625
|
+
<Text style={{
|
|
1626
|
+
fontFamily: AppFonts.interBold,
|
|
1627
|
+
fontSize: 9.5,
|
|
1628
|
+
color: AppColors.emerald600,
|
|
1629
|
+
}}>
|
|
1630
|
+
Up to date
|
|
1631
|
+
</Text>
|
|
1632
|
+
</View>)}
|
|
1633
|
+
</View>
|
|
1634
|
+
<Text style={{
|
|
1635
|
+
fontFamily: AppFonts.interRegular,
|
|
1636
|
+
fontSize: 11,
|
|
1637
|
+
lineHeight: 15,
|
|
1638
|
+
color: AppColors.grayText,
|
|
1639
|
+
marginTop: 1,
|
|
1640
|
+
}}>
|
|
1641
|
+
{updateAvailable
|
|
1642
|
+
? `A newer version (v${latestNpmVersion}) is available on npm registry.`
|
|
1643
|
+
: 'You are running the latest version from npm registry.'}
|
|
1644
|
+
</Text>
|
|
1645
|
+
</View>
|
|
1507
1646
|
</View>
|
|
1647
|
+
|
|
1648
|
+
{updateAvailable && (<TouchableScale onPress={() => {
|
|
1649
|
+
copyToClipboard('npm install react-native-inapp-inspector@latest', 'Install Command');
|
|
1650
|
+
showToast('Copied npm install command!');
|
|
1651
|
+
}} style={{
|
|
1652
|
+
backgroundColor: AppColors.purple,
|
|
1653
|
+
paddingVertical: 6,
|
|
1654
|
+
paddingHorizontal: 10,
|
|
1655
|
+
borderRadius: 8,
|
|
1656
|
+
}}>
|
|
1657
|
+
<Text style={{
|
|
1658
|
+
fontFamily: AppFonts.interBold,
|
|
1659
|
+
fontSize: 11,
|
|
1660
|
+
color: AppColors.white,
|
|
1661
|
+
}}>
|
|
1662
|
+
Copy Upgrade
|
|
1663
|
+
</Text>
|
|
1664
|
+
</TouchableScale>)}
|
|
1508
1665
|
</View>
|
|
1509
|
-
</View>
|
|
1510
|
-
|
|
1511
|
-
|
|
1666
|
+
</View>
|
|
1667
|
+
</View>)}
|
|
1668
|
+
<View style={{ height: 48 }}/>
|
|
1669
|
+
</ScrollView>
|
|
1512
1670
|
|
|
1513
|
-
|
|
1514
|
-
|
|
1671
|
+
{/* Bottom Sticky Action Bar for Save Changes */}
|
|
1672
|
+
{settingsActiveSubTab === 'module' && (<View style={{
|
|
1515
1673
|
paddingHorizontal: 16,
|
|
1516
1674
|
paddingTop: 12,
|
|
1517
1675
|
paddingBottom: Platform.OS === 'ios' ? 36 : 24,
|
|
@@ -1527,16 +1685,16 @@ const SettingsPanel = () => {
|
|
|
1527
1685
|
shadowOffset: { width: 0, height: -3 },
|
|
1528
1686
|
elevation: 8,
|
|
1529
1687
|
}}>
|
|
1530
|
-
|
|
1531
|
-
|
|
1688
|
+
<View style={{ flex: 1 }}>
|
|
1689
|
+
<Text style={{
|
|
1532
1690
|
fontFamily: AppFonts.interBold,
|
|
1533
1691
|
fontSize: 13,
|
|
1534
1692
|
lineHeight: 17,
|
|
1535
1693
|
color: AppColors.primaryBlack,
|
|
1536
1694
|
}}>
|
|
1537
|
-
|
|
1538
|
-
|
|
1539
|
-
|
|
1695
|
+
{stagedActiveCount} of {allModules.length} Modules Active
|
|
1696
|
+
</Text>
|
|
1697
|
+
<Text style={{
|
|
1540
1698
|
fontFamily: AppFonts.interRegular,
|
|
1541
1699
|
fontSize: 11,
|
|
1542
1700
|
lineHeight: 15,
|
|
@@ -1545,13 +1703,13 @@ const SettingsPanel = () => {
|
|
|
1545
1703
|
: AppColors.grayText,
|
|
1546
1704
|
marginTop: 1,
|
|
1547
1705
|
}}>
|
|
1548
|
-
|
|
1706
|
+
{hasUnsavedChanges
|
|
1549
1707
|
? t('settings.unsavedPending')
|
|
1550
1708
|
: t('settings.allSynchronized')}
|
|
1551
|
-
|
|
1552
|
-
|
|
1709
|
+
</Text>
|
|
1710
|
+
</View>
|
|
1553
1711
|
|
|
1554
|
-
|
|
1712
|
+
<TouchableScale accessible={true} accessibilityRole="button" accessibilityLabel="Save Changes" onPress={handleSaveChanges} style={{
|
|
1555
1713
|
flexDirection: 'row',
|
|
1556
1714
|
alignItems: 'center',
|
|
1557
1715
|
gap: 6,
|
|
@@ -1562,18 +1720,18 @@ const SettingsPanel = () => {
|
|
|
1562
1720
|
paddingVertical: 10,
|
|
1563
1721
|
borderRadius: 10,
|
|
1564
1722
|
}}>
|
|
1565
|
-
|
|
1566
|
-
|
|
1723
|
+
<CheckIcon size={14} color={hasUnsavedChanges ? AppColors.white : AppColors.purple}/>
|
|
1724
|
+
<Text style={{
|
|
1567
1725
|
fontFamily: AppFonts.interBold,
|
|
1568
1726
|
fontSize: 13,
|
|
1569
1727
|
lineHeight: 17,
|
|
1570
1728
|
color: hasUnsavedChanges ? AppColors.white : AppColors.purple,
|
|
1571
1729
|
}}>
|
|
1572
|
-
|
|
1573
|
-
|
|
1574
|
-
|
|
1575
|
-
|
|
1576
|
-
|
|
1730
|
+
{t('settings.saveChanges')}
|
|
1731
|
+
</Text>
|
|
1732
|
+
</TouchableScale>
|
|
1733
|
+
</View>)}
|
|
1734
|
+
</View>);
|
|
1577
1735
|
let content = null;
|
|
1578
1736
|
let title = '';
|
|
1579
1737
|
let icon = null;
|
|
@@ -1615,7 +1773,9 @@ const SettingsPanel = () => {
|
|
|
1615
1773
|
{renderSettingRow({
|
|
1616
1774
|
icon: <TrashIcon color={AppColors.errorColor} size={16}/>,
|
|
1617
1775
|
label: t('settings.apis.clearNetworkLogs'),
|
|
1618
|
-
description: t('settings.apis.clearNetworkLogsDescription', {
|
|
1776
|
+
description: t('settings.apis.clearNetworkLogsDescription', {
|
|
1777
|
+
count: logs.length,
|
|
1778
|
+
}),
|
|
1619
1779
|
isLast: true,
|
|
1620
1780
|
onPress: () => {
|
|
1621
1781
|
clearNetworkLogs();
|
|
@@ -1802,9 +1962,7 @@ const SettingsPanel = () => {
|
|
|
1802
1962
|
: AppColors.grayBorderSecondary,
|
|
1803
1963
|
padding: 2,
|
|
1804
1964
|
justifyContent: 'center',
|
|
1805
|
-
alignItems: showDuplicateLogs
|
|
1806
|
-
? 'flex-end'
|
|
1807
|
-
: 'flex-start',
|
|
1965
|
+
alignItems: showDuplicateLogs ? 'flex-end' : 'flex-start',
|
|
1808
1966
|
}}>
|
|
1809
1967
|
<View style={{
|
|
1810
1968
|
width: 20,
|
|
@@ -1830,7 +1988,9 @@ const SettingsPanel = () => {
|
|
|
1830
1988
|
{renderSettingRow({
|
|
1831
1989
|
icon: <TrashIcon color={AppColors.errorColor} size={16}/>,
|
|
1832
1990
|
label: t('settings.logs.clearConsoleLogs'),
|
|
1833
|
-
description: t('settings.logs.clearConsoleLogsDescription', {
|
|
1991
|
+
description: t('settings.logs.clearConsoleLogsDescription', {
|
|
1992
|
+
count: consoleLogs.length,
|
|
1993
|
+
}),
|
|
1834
1994
|
isLast: true,
|
|
1835
1995
|
onPress: () => {
|
|
1836
1996
|
clearConsoleLogs();
|
|
@@ -1873,7 +2033,9 @@ const SettingsPanel = () => {
|
|
|
1873
2033
|
{renderSettingRow({
|
|
1874
2034
|
icon: <AnalyticsIcon color={AppColors.purple} size={16}/>,
|
|
1875
2035
|
label: t('settings.analytics.maxAnalyticsEvents'),
|
|
1876
|
-
description: t('settings.analytics.maxAnalyticsEventsDescription', {
|
|
2036
|
+
description: t('settings.analytics.maxAnalyticsEventsDescription', {
|
|
2037
|
+
count: analyticsEvents.length,
|
|
2038
|
+
}),
|
|
1877
2039
|
numericInput: {
|
|
1878
2040
|
value: maxAnalyticsEventsLimit,
|
|
1879
2041
|
onChange: setMaxAnalyticsEventsLimit,
|
|
@@ -1926,7 +2088,9 @@ const SettingsPanel = () => {
|
|
|
1926
2088
|
else if (settingsPage === 'redux') {
|
|
1927
2089
|
title = t('settings.redux.title');
|
|
1928
2090
|
icon = <ReduxIcon color={AppColors.white} size={16}/>;
|
|
1929
|
-
rightInfo = t('settings.redux.reducers', {
|
|
2091
|
+
rightInfo = t('settings.redux.reducers', {
|
|
2092
|
+
count: Object.keys(reduxState || {}).length,
|
|
2093
|
+
});
|
|
1930
2094
|
content = (<ScrollView style={{ flex: 1 }} contentContainerStyle={{ padding: 16, paddingBottom: 100, gap: 12 }}>
|
|
1931
2095
|
<View style={{
|
|
1932
2096
|
backgroundColor: AppColors.primaryLight,
|
|
@@ -2071,7 +2235,9 @@ const SettingsPanel = () => {
|
|
|
2071
2235
|
{renderSettingRow({
|
|
2072
2236
|
icon: <TrashIcon color={AppColors.errorColor} size={16}/>,
|
|
2073
2237
|
label: t('settings.crash.clearHistory'),
|
|
2074
|
-
description: t('settings.crash.clearHistoryDesc', {
|
|
2238
|
+
description: t('settings.crash.clearHistoryDesc', {
|
|
2239
|
+
count: crashRecords?.length || 0,
|
|
2240
|
+
}),
|
|
2075
2241
|
isLast: true,
|
|
2076
2242
|
onPress: () => {
|
|
2077
2243
|
clearCrashRecords();
|