react-native-inapp-inspector 2.3.25 → 2.4.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (125) hide show
  1. package/README.md +26 -5
  2. package/dist/commonjs/components/AnalyticsDetail.js +9 -6
  3. package/dist/commonjs/components/AppHeaderLogo.js +4 -6
  4. package/dist/commonjs/components/Inspector/AnalyticsFilterModal.js +1 -1
  5. package/dist/commonjs/components/Inspector/AnalyticsTab.js +18 -22
  6. package/dist/commonjs/components/Inspector/ConsoleTab.js +13 -16
  7. package/dist/commonjs/components/Inspector/CrashDetail.js +7 -6
  8. package/dist/commonjs/components/Inspector/CrashTab.js +23 -23
  9. package/dist/commonjs/components/Inspector/DebuggingTab.js +6 -6
  10. package/dist/commonjs/components/Inspector/DeviceInfoTab.js +77 -43
  11. package/dist/commonjs/components/Inspector/FabLauncher.js +8 -9
  12. package/dist/commonjs/components/Inspector/InspectorHeader.js +93 -70
  13. package/dist/commonjs/components/Inspector/LogDetail.js +10 -7
  14. package/dist/commonjs/components/Inspector/MainScreen.js +67 -29
  15. package/dist/commonjs/components/Inspector/NetworkDetail.js +29 -28
  16. package/dist/commonjs/components/Inspector/NetworkFilterModal.js +1 -1
  17. package/dist/commonjs/components/Inspector/NetworkTab.js +87 -85
  18. package/dist/commonjs/components/Inspector/PushCard.d.ts +4 -0
  19. package/dist/commonjs/components/Inspector/PushCard.js +89 -0
  20. package/dist/commonjs/components/Inspector/PushDetail.d.ts +4 -0
  21. package/dist/commonjs/components/Inspector/PushDetail.js +190 -0
  22. package/dist/commonjs/components/Inspector/PushTab.d.ts +3 -0
  23. package/dist/commonjs/components/Inspector/PushTab.js +45 -0
  24. package/dist/commonjs/components/Inspector/ReduxDetail.js +16 -13
  25. package/dist/commonjs/components/Inspector/ReduxTab.js +18 -28
  26. package/dist/commonjs/components/Inspector/SettingsPanel.js +253 -105
  27. package/dist/commonjs/components/Inspector/StorageTab.js +40 -40
  28. package/dist/commonjs/components/Inspector/TabBar.js +9 -8
  29. package/dist/commonjs/components/Inspector/UpdateAvailableModal.js +2 -2
  30. package/dist/commonjs/components/JsonViewer.js +77 -90
  31. package/dist/commonjs/components/LogCard.js +9 -6
  32. package/dist/commonjs/components/ModuleErrorBoundary.d.ts +24 -0
  33. package/dist/commonjs/components/ModuleErrorBoundary.js +33 -0
  34. package/dist/commonjs/components/NetworkIcons.d.ts +3 -3
  35. package/dist/commonjs/components/NetworkIcons.js +10 -6
  36. package/dist/commonjs/components/SegmentedTabs.d.ts +4 -1
  37. package/dist/commonjs/components/SegmentedTabs.js +12 -8
  38. package/dist/commonjs/components/ShareButton.d.ts +11 -0
  39. package/dist/commonjs/components/ShareButton.js +6 -0
  40. package/dist/commonjs/constants/version.d.ts +1 -1
  41. package/dist/commonjs/constants/version.js +1 -1
  42. package/dist/commonjs/customHooks/crashHandler.js +4 -4
  43. package/dist/commonjs/customHooks/networkLogger.js +1 -1
  44. package/dist/commonjs/customHooks/pushNotificationLogger.d.ts +19 -0
  45. package/dist/commonjs/customHooks/pushNotificationLogger.js +1 -0
  46. package/dist/commonjs/helpers/memoryManager.d.ts +2 -1
  47. package/dist/commonjs/helpers/memoryManager.js +1 -1
  48. package/dist/commonjs/helpers/settingsStore.d.ts +1 -0
  49. package/dist/commonjs/helpers/settingsStore.js +1 -1
  50. package/dist/commonjs/helpers/shareFormatter.d.ts +13 -0
  51. package/dist/commonjs/helpers/shareFormatter.js +7 -0
  52. package/dist/commonjs/i18n/locales/en.json +1 -1
  53. package/dist/commonjs/index.d.ts +5 -2
  54. package/dist/commonjs/index.js +4 -4
  55. package/dist/commonjs/push.d.ts +4 -0
  56. package/dist/commonjs/push.js +1 -0
  57. package/dist/commonjs/types/enums.d.ts +30 -0
  58. package/dist/commonjs/types/enums.js +1 -1
  59. package/dist/commonjs/types/index.d.ts +10 -0
  60. package/dist/commonjs/types/interfaces.d.ts +63 -7
  61. package/dist/esm/components/AnalyticsDetail.js +28 -25
  62. package/dist/esm/components/AppHeaderLogo.js +5 -7
  63. package/dist/esm/components/Inspector/AnalyticsFilterModal.js +14 -14
  64. package/dist/esm/components/Inspector/AnalyticsTab.js +36 -40
  65. package/dist/esm/components/Inspector/ConsoleTab.js +52 -55
  66. package/dist/esm/components/Inspector/CrashDetail.js +11 -10
  67. package/dist/esm/components/Inspector/CrashTab.js +23 -23
  68. package/dist/esm/components/Inspector/DebuggingTab.js +10 -10
  69. package/dist/esm/components/Inspector/DeviceInfoTab.js +208 -174
  70. package/dist/esm/components/Inspector/FabLauncher.js +41 -42
  71. package/dist/esm/components/Inspector/InspectorHeader.js +138 -115
  72. package/dist/esm/components/Inspector/LogDetail.js +24 -21
  73. package/dist/esm/components/Inspector/MainScreen.js +100 -62
  74. package/dist/esm/components/Inspector/NetworkDetail.js +88 -87
  75. package/dist/esm/components/Inspector/NetworkFilterModal.js +8 -8
  76. package/dist/esm/components/Inspector/NetworkTab.js +136 -134
  77. package/dist/esm/components/Inspector/PushCard.d.ts +4 -0
  78. package/dist/esm/components/Inspector/PushCard.js +89 -0
  79. package/dist/esm/components/Inspector/PushDetail.d.ts +4 -0
  80. package/dist/esm/components/Inspector/PushDetail.js +190 -0
  81. package/dist/esm/components/Inspector/PushTab.d.ts +3 -0
  82. package/dist/esm/components/Inspector/PushTab.js +45 -0
  83. package/dist/esm/components/Inspector/ReduxDetail.js +40 -37
  84. package/dist/esm/components/Inspector/ReduxTab.js +109 -119
  85. package/dist/esm/components/Inspector/SettingsPanel.js +406 -258
  86. package/dist/esm/components/Inspector/StorageTab.js +174 -174
  87. package/dist/esm/components/Inspector/TabBar.js +28 -27
  88. package/dist/esm/components/Inspector/UpdateAvailableModal.js +1 -1
  89. package/dist/esm/components/JsonViewer.js +101 -114
  90. package/dist/esm/components/LogCard.js +25 -22
  91. package/dist/esm/components/ModuleErrorBoundary.d.ts +24 -0
  92. package/dist/esm/components/ModuleErrorBoundary.js +33 -0
  93. package/dist/esm/components/NetworkIcons.d.ts +3 -3
  94. package/dist/esm/components/NetworkIcons.js +7 -3
  95. package/dist/esm/components/SegmentedTabs.d.ts +4 -1
  96. package/dist/esm/components/SegmentedTabs.js +12 -8
  97. package/dist/esm/components/ShareButton.d.ts +11 -0
  98. package/dist/esm/components/ShareButton.js +6 -0
  99. package/dist/esm/constants/version.d.ts +1 -1
  100. package/dist/esm/constants/version.js +1 -1
  101. package/dist/esm/customHooks/crashHandler.js +6 -6
  102. package/dist/esm/customHooks/networkLogger.js +1 -1
  103. package/dist/esm/customHooks/pushNotificationLogger.d.ts +19 -0
  104. package/dist/esm/customHooks/pushNotificationLogger.js +1 -0
  105. package/dist/esm/helpers/memoryManager.d.ts +2 -1
  106. package/dist/esm/helpers/memoryManager.js +1 -1
  107. package/dist/esm/helpers/settingsStore.d.ts +1 -0
  108. package/dist/esm/helpers/settingsStore.js +1 -1
  109. package/dist/esm/helpers/shareFormatter.d.ts +13 -0
  110. package/dist/esm/helpers/shareFormatter.js +7 -0
  111. package/dist/esm/i18n/locales/en.json +1 -1
  112. package/dist/esm/index.d.ts +5 -2
  113. package/dist/esm/index.js +7 -7
  114. package/dist/esm/push.d.ts +4 -0
  115. package/dist/esm/push.js +1 -0
  116. package/dist/esm/types/enums.d.ts +30 -0
  117. package/dist/esm/types/enums.js +1 -1
  118. package/dist/esm/types/index.d.ts +10 -0
  119. package/dist/esm/types/interfaces.d.ts +63 -7
  120. package/package.json +53 -10
  121. package/src/native/NativeInspector.ts +0 -1
  122. package/dist/commonjs/components/BrandSquareIcon.d.ts +0 -5
  123. package/dist/commonjs/components/BrandSquareIcon.js +0 -112
  124. package/dist/esm/components/BrandSquareIcon.d.ts +0 -5
  125. package/dist/esm/components/BrandSquareIcon.js +0 -112
@@ -1,74 +1,71 @@
1
- import $,{useCallback as O,useMemo as B,useRef as eo}from"react";import{FlatList as So,Platform as ho,Pressable as Co,ScrollView as D,Text as A,TextInput as Io,View as S}from"react-native";import{useInspector as To}from"./InspectorContext";import{useTranslation as xo}from"../../i18n";import V from"../TouchableScale";import Ao from"../AnimatedEntrance";import{ConsoleLogCard as Lo}from"../ConsoleLogCard";import Po from"../EmptyState";import Vo from"../EndOfListFooter";import C from"../../styles";import{AppColors as o}from"../../styles/AppColors";import{AppFonts as z}from"../../styles/AppFonts";import{LogFilter as L}from"../../types";import{SearchIcon as Bo,ClearIcon as Fo,SortArrowIcon as Ho,TrashIcon as Eo,LayersIcon as Ro,UserIcon as $o,InfoCircleIcon as Oo,WarningTriangleIcon as Wo,ErrorCircleIcon as No,AnalyticsIcon as Uo,HeaderPauseIcon as Do}from"../NetworkIcons";const Go=$.memo(()=>{const{t:b}=xo(),{logSearch:h,setLogSearch:k,logSortOrder:G,setLogSortOrder:v,handleDelete:M,logFilters:w,setLogFilters:F,logCounts:T,filteredConsoleLogs:f,visibleConsoleLogs:W,isConsolePaused:H,setIsConsolePaused:_}=To(),Q=eo(null),[N,Y]=$.useState(100),E=B(()=>f.slice(0,N),[f,N]),K=O(({item:e,index:r})=><Ao index={r}distance={8}>
2
- <Lo item={e}searchStr={h}/>
3
- </Ao>,[h]),X=O((e,r)=>({length:148,offset:148*r,index:r}),[]),j=O((e,r)=>e?.id?.toString()??r.toString(),[]),q=B(()=>{const e=W.length,r=f.length;if(w.has("all")||!Array.from(w).some(P=>P!=="all"))return<S style={{paddingHorizontal:12,paddingTop:8,paddingBottom:3}}>
4
- <A style={{fontFamily:z.interMedium,fontSize:11,color:o.grayTextWeak,letterSpacing:.2}}>
5
- {r===e?`Showing ${e} logs`:`Showing ${r} of ${e} logs`}
6
- </A>
7
- </S>;{const P=Array.from(w).filter(I=>I!=="all").map(I=>I==="user-log"?"Log":I==="analytics"?"Analytics":I.charAt(0).toUpperCase()+I.slice(1));return<S style={{paddingHorizontal:12,paddingTop:8,paddingBottom:3}}>
8
- <A style={{fontFamily:z.interMedium,fontSize:11,color:o.grayTextWeak,letterSpacing:.2}}>
9
- Filtered by {P.join(", ")} ({r} of {e} logs)
10
- </A>
11
- </S>}},[W.length,f.length,w]),[R,U]=$.useState(!1),J=B(()=>["[AXIOS]","[API]","[GRAPHQL]","[REDUX]","[ANALYTICS]","[AUTH]","[NAV]","[STORAGE]","[PERF]","[WS]","[PUSH]","[PAYMENT]","[SYNC]","[BLE]","[LOCATION]","[TEST]","[DEBUG]"],[]),Z=B(()=>[{id:L.All,label:b("common.all","All"),count:T.all?.split("/")?.[0]??"0",color:o.purple,Icon:Ro},{id:L.UserLog,label:b("console.log","Log"),count:T["user-log"]?.split("/")?.[0]??"0",color:o.teal600,Icon:$o},{id:L.Info,label:b("console.info","Info"),count:T.info?.split("/")?.[0]??"0",color:o.sky600,Icon:Oo},{id:L.Warn,label:b("console.warning","Warn"),count:T.warn?.split("/")?.[0]??"0",color:o.amber600,Icon:Wo},{id:L.Error,label:b("console.error","Error"),count:T.error?.split("/")?.[0]??"0",color:o.errorColor,Icon:No},{id:L.Analytics,label:b("console.analytics","Analytics"),count:T.analytics?.split("/")?.[0]??"0",color:o.violet600,Icon:Uo}],[T,b]);return<S style={{flex:1}}>
12
- <S style={{backgroundColor:o.white,borderBottomWidth:1,borderBottomColor:o.dividerColor,paddingBottom:6}}>
13
- <S style={[C.toolbarRow,{marginTop:12,marginBottom:8}]}>
14
- <S style={[C.searchContainer,R&&{borderColor:o.purple,borderWidth:1.5}]}>
15
- <Bo color={R?o.purple:o.grayTextWeak}size={16}/>
16
- <Io placeholder={b("console.searchPlaceholder")}placeholderTextColor={o.grayTextWeak}value={h}onChangeText={k}onFocus={()=>U(!0)}onBlur={()=>U(!1)}style={C.searchInput}autoCorrect={!1}autoCapitalize="none"/>
1
+ import F,{useCallback as $,useMemo as k,useRef as lo}from"react";import{FlatList as So,Platform as ho,Pressable as Co,ScrollView as _,Text as L,TextInput as To,View as S}from"react-native";import{useInspector as Io}from"./InspectorContext";import{useTranslation as xo}from"../../i18n";import H from"../TouchableScale";import Ao from"../AnimatedEntrance";import{ConsoleLogCard as Lo}from"../ConsoleLogCard";import Vo from"../EmptyState";import Eo from"../EndOfListFooter";import I from"../../styles";import{AppColors as e}from"../../styles/AppColors";import{AppFonts as z}from"../../styles/AppFonts";import{LogFilter as V}from"../../types";import{SearchIcon as Bo,ClearIcon as Fo,SortArrowIcon as Ho,TrashIcon as Po,LayersIcon as Ro,UserIcon as Oo,InfoCircleIcon as Wo,WarningTriangleIcon as $o,ErrorCircleIcon as Do,AnalyticsIcon as No}from"../NetworkIcons";const Q=10,Uo=F.memo(()=>{const{t:b}=xo(),{logSearch:h,setLogSearch:E,logSortOrder:Y,setLogSortOrder:K,handleDelete:X,logFilters:C,setLogFilters:P,logCounts:x,filteredConsoleLogs:w,visibleConsoleLogs:D,maxConsoleLogs:R}=Io(),j=R||100,N=lo(null),[U,G]=F.useState(j);F.useEffect(()=>{G(R||100),N.current?.scrollToOffset({offset:0,animated:!1})},[h,C,R]);const O=k(()=>w.slice(0,U),[w,U]),q=$(({item:o,index:t})=><Ao index={t}distance={8}>
2
+ <Lo item={o}searchStr={h}/>
3
+ </Ao>,[h]),J=$((o,t)=>({length:148,offset:148*t,index:t}),[]),Z=$((o,t)=>o?.id?.toString()??t.toString(),[]),oo=k(()=>{const o=D.length,t=w.length;if(C.has("all")||!Array.from(C).some(B=>B!=="all"))return<S style={{paddingHorizontal:12,paddingTop:8,paddingBottom:3}}>
4
+ <L style={{fontFamily:z.interMedium,fontSize:11,color:e.grayTextWeak,letterSpacing:.2}}>
5
+ {t===o?`Showing ${o} logs`:`Showing ${t} of ${o} logs`}
6
+ </L>
7
+ </S>;{const B=Array.from(C).filter(T=>T!=="all").map(T=>T==="user-log"?"Log":T==="analytics"?"Analytics":T.charAt(0).toUpperCase()+T.slice(1));return<S style={{paddingHorizontal:12,paddingTop:8,paddingBottom:3}}>
8
+ <L style={{fontFamily:z.interMedium,fontSize:11,color:e.grayTextWeak,letterSpacing:.2}}>
9
+ Filtered by {B.join(", ")} ({t} of {o} logs)
10
+ </L>
11
+ </S>}},[D.length,w.length,C]),[W,M]=F.useState(!1),eo=k(()=>["[AXIOS]","[API]","[GRAPHQL]","[REDUX]","[ANALYTICS]","[AUTH]","[NAV]","[STORAGE]","[PERF]","[WS]","[PUSH]","[PAYMENT]","[SYNC]","[BLE]","[LOCATION]","[TEST]","[DEBUG]"],[]),to=k(()=>[{id:V.All,label:b("common.all","All"),count:x.all?.split("/")?.[0]??"0",color:e.purple,Icon:Ro},{id:V.UserLog,label:b("console.log","Log"),count:x["user-log"]?.split("/")?.[0]??"0",color:e.teal600,Icon:Oo},{id:V.Info,label:b("console.info","Info"),count:x.info?.split("/")?.[0]??"0",color:e.sky600,Icon:Wo},{id:V.Warn,label:b("console.warning","Warn"),count:x.warn?.split("/")?.[0]??"0",color:e.amber600,Icon:$o},{id:V.Error,label:b("console.error","Error"),count:x.error?.split("/")?.[0]??"0",color:e.errorColor,Icon:Do},{id:V.Analytics,label:b("console.analytics","Analytics"),count:x.analytics?.split("/")?.[0]??"0",color:e.violet600,Icon:No}],[x,b]);return<S style={{flex:1}}>
12
+ <S style={{backgroundColor:e.white,borderBottomWidth:1,borderBottomColor:e.dividerColor,paddingBottom:6}}>
13
+ <S style={[I.toolbarRow,{marginTop:12,marginBottom:8}]}>
14
+ <S style={[I.searchContainer,W&&{borderColor:e.purple,borderWidth:1.5}]}>
15
+ <Bo color={W?e.purple:e.grayTextWeak}size={16}/>
16
+ <To placeholder={b("console.searchPlaceholder")}placeholderTextColor={e.grayTextWeak}value={h}onChangeText={E}onFocus={()=>M(!0)}onBlur={()=>M(!1)}style={I.searchInput}autoCorrect={!1}autoCapitalize="none"/>
17
17
  {h.length>0&&<S style={{flexDirection:"row",alignItems:"center",gap:4}}>
18
- <S style={{backgroundColor:`${o.purple}20`,borderRadius:10,paddingHorizontal:6,paddingVertical:2}}>
19
- <A style={{color:o.purple,fontSize:10,fontFamily:z.interBold}}>
20
- {f.length}
21
- </A>
18
+ <S style={{backgroundColor:`${e.purple}20`,borderRadius:10,paddingHorizontal:6,paddingVertical:2}}>
19
+ <L style={{color:e.purple,fontSize:10,fontFamily:z.interBold}}>
20
+ {w.length}
21
+ </L>
22
22
  </S>
23
- <Co onPress={()=>k("")}hitSlop={10}style={C.clearBtn}>
24
- <Fo color={o.grayTextWeak}size={14}/>
23
+ <Co onPress={()=>E("")}hitSlop={10}style={I.clearBtn}>
24
+ <Fo color={e.grayTextWeak}size={14}/>
25
25
  </Co>
26
26
  </S>}
27
27
  </S>
28
28
 
29
- <S style={C.toolbarRight}>
30
- <V style={[C.toolbarBtn,H&&{borderColor:`${o.darkOrange}50`,backgroundColor:`${o.darkOrange}18`}]}onPress={()=>_(e=>!e)}hitSlop={6}>
31
- <Do isPaused={H}color={H?o.darkOrange:o.grayTextStrong}size={16}/>
32
- </V>
33
- <V style={C.toolbarBtn}onPress={()=>v(e=>e==="newest"?"oldest":"newest")}hitSlop={10}>
34
- <Ho color={o.grayTextStrong}size={18}direction={G==="newest"?"down":"up"}/>
35
- </V>
36
- <V style={[C.toolbarBtn,{borderColor:`${o.errorColor}38`,backgroundColor:`${o.errorColor}0F`}]}onPress={M}hitSlop={6}>
37
- <Eo color={o.errorColor}size={15}/>
38
- </V>
29
+ <S style={I.toolbarRight}>
30
+ <H style={I.toolbarBtn}onPress={()=>K(o=>o==="newest"?"oldest":"newest")}hitSlop={10}>
31
+ <Ho color={e.grayTextStrong}size={18}direction={Y==="newest"?"down":"up"}/>
32
+ </H>
33
+ <H style={[I.toolbarBtn,{borderColor:`${e.errorColor}38`,backgroundColor:`${e.errorColor}0F`}]}onPress={X}hitSlop={6}>
34
+ <Po color={e.errorColor}size={15}/>
35
+ </H>
39
36
  </S>
40
37
  </S>
41
38
 
42
39
 
43
- {(R||h.length>0)&&<D horizontal showsHorizontalScrollIndicator={!1}style={{marginBottom:6,maxHeight:30}}contentContainerStyle={{paddingHorizontal:16,flexDirection:"row",alignItems:"center",gap:6}}>
44
- {J.map(e=>{const r=h.includes(e);return<V key={e}onPress={()=>{k(r?t=>t.replace(e,"").trim():t=>t?`${t} ${e}`.trim():e)}}>
45
- <S style={{paddingHorizontal:8,paddingVertical:3,borderRadius:6,backgroundColor:r?o.purple:`${o.purple}14`,borderWidth:1,borderColor:r?o.purple:`${o.purple}30`}}>
46
- <A style={{fontFamily:z.interBold,fontSize:10,color:r?o.white:o.purple}}>
47
- {e}
48
- </A>
40
+ {(W||h.length>0)&&<_ horizontal showsHorizontalScrollIndicator={!1}style={{marginBottom:6,maxHeight:30}}contentContainerStyle={{paddingHorizontal:16,flexDirection:"row",alignItems:"center",gap:6}}>
41
+ {eo.map(o=>{const t=h.includes(o);return<H key={o}onPress={()=>{E(t?r=>r.replace(o,"").trim():r=>r?`${r} ${o}`.trim():o)}}>
42
+ <S style={{paddingHorizontal:8,paddingVertical:3,borderRadius:6,backgroundColor:t?e.purple:`${e.purple}14`,borderWidth:1,borderColor:t?e.purple:`${e.purple}30`}}>
43
+ <L style={{fontFamily:z.interBold,fontSize:10,color:t?e.white:e.purple}}>
44
+ {o}
45
+ </L>
49
46
  </S>
50
- </V>})}
51
- </D>}
47
+ </H>})}
48
+ </_>}
52
49
 
53
50
 
54
51
  <S style={{flexDirection:"row",alignItems:"center",marginBottom:8,paddingHorizontal:12,gap:6}}>
55
- <D horizontal showsHorizontalScrollIndicator={!1}style={{flex:1}}contentContainerStyle={{flexDirection:"row",alignItems:"center",gap:6,paddingRight:6}}>
56
- {Z.map(e=>{const r=e.id==="all"?w.has("all"):w.has(e.id)&&!w.has("all"),t=e.color||o.purple,P=r?o.white:t,I=e.Icon;return<V key={e.id}onPress={()=>{e.id==="all"?F(new Set(["all"])):F(oo=>{const x=new Set(oo);return x.delete("all"),x.has(e.id)?x.delete(e.id):x.add(e.id),x.size===0&&x.add("all"),x})}}>
57
- <S style={{flexDirection:"row",alignItems:"center",paddingHorizontal:9,paddingVertical:4.5,borderRadius:8,backgroundColor:r?t:`${t}12`,borderWidth:1,borderColor:r?t:`${t}30`,gap:5}}>
58
- <I size={11}color={P}/>
59
- <A style={{fontFamily:z.interBold,fontSize:10.5,color:r?o.white:o.primaryBlack}}>
60
- {e.label}
61
- </A>
62
- <S style={{backgroundColor:r?"rgba(255,255,255,0.25)":`${t}20`,paddingHorizontal:5,paddingVertical:1,borderRadius:8}}>
63
- <A style={{fontFamily:z.interBold,fontSize:9,color:r?o.white:t}}>
64
- {e.count}
65
- </A>
52
+ <_ horizontal showsHorizontalScrollIndicator={!1}style={{flex:1}}contentContainerStyle={{flexDirection:"row",alignItems:"center",gap:6,paddingRight:6}}>
53
+ {to.map(o=>{const t=o.id==="all"?C.has("all"):C.has(o.id)&&!C.has("all"),r=o.color||e.purple,B=t?e.white:r,T=o.Icon;return<H key={o.id}onPress={()=>{o.id==="all"?P(new Set(["all"])):P(ro=>{const A=new Set(ro);return A.delete("all"),A.has(o.id)?A.delete(o.id):A.add(o.id),A.size===0&&A.add("all"),A})}}>
54
+ <S style={{flexDirection:"row",alignItems:"center",paddingHorizontal:9,paddingVertical:4.5,borderRadius:8,backgroundColor:t?r:`${r}12`,borderWidth:1,borderColor:t?r:`${r}30`,gap:5}}>
55
+ <T size={11}color={B}/>
56
+ <L style={{fontFamily:z.interBold,fontSize:10.5,color:t?e.white:e.primaryBlack}}>
57
+ {o.label}
58
+ </L>
59
+ <S style={{backgroundColor:t?"rgba(255,255,255,0.25)":`${r}20`,paddingHorizontal:5,paddingVertical:1,borderRadius:8}}>
60
+ <L style={{fontFamily:z.interBold,fontSize:9,color:t?e.white:r}}>
61
+ {o.count}
62
+ </L>
66
63
  </S>
67
64
  </S>
68
- </V>})}
69
- </D>
65
+ </H>})}
66
+ </_>
70
67
  </S>
71
68
  </S>
72
69
 
73
- <So ref={Q}data={E}keyExtractor={j}ListHeaderComponent={q}renderItem={K}getItemLayout={X}initialNumToRender={15}maxToRenderPerBatch={10}windowSize={9}removeClippedSubviews={ho.OS==="android"}renderToHardwareTextureAndroid={!0}ListEmptyComponent={<Po isSearch={h.length>0||!w.has("all")}searchQuery={h}customTitle={h.length>0?"No matching console logs":"No console logs"}onClearSearch={()=>{k(""),F(new Set(["all"]))}}/>}ListFooterComponent={f.length>0?<Vo count={E.length}totalCount={f.length}label="logs"hasMore={E.length<f.length}onLoadMore={()=>Y(e=>e+10)}/>:null}contentContainerStyle={[C.listContent,f.length===0&&{flexGrow:1}]}keyboardShouldPersistTaps="handled"/>
74
- </S>});export default Go;
70
+ <So ref={N}data={O}keyExtractor={Z}ListHeaderComponent={oo}renderItem={q}getItemLayout={J}initialNumToRender={15}maxToRenderPerBatch={10}windowSize={9}removeClippedSubviews={ho.OS==="android"}renderToHardwareTextureAndroid={!0}ListEmptyComponent={<Vo isSearch={h.length>0||!C.has("all")}searchQuery={h}customTitle={h.length>0?"No matching console logs":"No console logs"}onClearSearch={()=>{E(""),P(new Set(["all"]))}}/>}ListFooterComponent={w.length>0?<Eo count={O.length}totalCount={w.length}label="logs"loadMoreStep={Q}hasMore={O.length<w.length}onLoadMore={()=>G(o=>o+Q)}/>:null}contentContainerStyle={[I.listContent,w.length===0&&{flexGrow:1}]}keyboardShouldPersistTaps="handled"/>
71
+ </S>});export default Uo;
@@ -1,4 +1,4 @@
1
- import ae,{useMemo as L,useState as H}from"react";import{Platform as W,ScrollView as E,StyleSheet as ie,Text as S,TextInput as Ce,View as C}from"react-native";import{useTranslation as Te}from"../../i18n";import{useInspector as xe}from"./InspectorContext";import D from"../TouchableScale";import Se from"../SegmentedTabs";import Q from"../HighlightText";import _ from"../JsonViewer";import $ from"../CopyButton";import{AppColors as e}from"../../styles/AppColors";import{AppFonts as V}from"../../styles/AppFonts";import{exportCrashReport as Be,parseCrashStackTrace as Ve}from"../../customHooks/crashHandler";import{copyToClipboard as q}from"../../helpers";import{SearchIcon as Ie,ClearIcon as Fe,CopyIcon as K,TerminalIcon as Re,LayersIcon as X,ClockIcon as Le,CircleCheckIcon as Y,GlobeIcon as He,AppleIcon as De,AndroidIcon as Ae,StackTraceIcon as We,DiagnosticsIcon as $e,TrailIcon as Me,RawJsonIcon as Oe,AppFramesIcon as Ge,AllFramesIcon as Je}from"../NetworkIcons";const Ne=ae.memo(()=>{const{t:B}=Te(),{selectedCrash:T}=xe(),[F,Z]=H("stack"),[R,G]=H(""),[I,j]=H("app"),[A,J]=H(!1),[N,P]=H(null);if(!T)return null;const z=L(()=>T.parsedStack&&T.parsedStack.length>0?T.parsedStack:T.stack?Ve(T.stack):[],[T]),ee=L(()=>{try{return JSON.parse(JSON.stringify(T))}catch{return T}},[T]),v=L(()=>z.filter(x=>x.isAppCode),[z]),U=L(()=>I==="app"&&v.length>0?v:z,[I,v,z]),M=L(()=>v[0]||z[0]||null,[v,z]),re=()=>{const x=Be(T);q(x,"Crash Report"),J(!0),setTimeout(()=>J(!1),2e3)},te=(x,k)=>{const O=x.raw||`${x.method}@${x.file}:${x.lineNumber}:${x.column}`;q(O,"Stack Frame"),P(k),setTimeout(()=>P(null),1500)},oe=[{key:"stack",label:B("crash.tabStack",{count:z.length}),icon:x=><We size={12}color={x?e.white:e.grayText}/>},{key:"diagnostics",label:B("crash.tabDiagnostics"),icon:x=><$e size={12}color={x?e.white:e.grayText}/>},{key:"breadcrumbs",label:B("crash.tabTrail",{count:T.breadcrumbs?.length||0}),icon:x=><Me size={12}color={x?e.white:e.grayText}/>},{key:"raw",label:B("crash.tabRawJson"),icon:x=><Oe size={12}color={x?e.white:e.grayText}/>}];return<C style={{flex:1,backgroundColor:e.grayBackground}}>
1
+ import ae,{useMemo as L,useState as H}from"react";import{Platform as W,ScrollView as E,StyleSheet as ie,Text as S,TextInput as Ce,View as C}from"react-native";import{useTranslation as Te}from"../../i18n";import{useInspector as xe}from"./InspectorContext";import D from"../TouchableScale";import Se from"../SegmentedTabs";import Q from"../HighlightText";import _ from"../JsonViewer";import $ from"../CopyButton";import Be from"../ShareButton";import{AppColors as e}from"../../styles/AppColors";import{AppFonts as V}from"../../styles/AppFonts";import{exportCrashReport as Ve,parseCrashStackTrace as ke}from"../../customHooks/crashHandler";import{copyToClipboard as q}from"../../helpers";import{shareCrashReport as Ie}from"../../helpers/shareFormatter";import{SearchIcon as Fe,ClearIcon as Re,CopyIcon as K,TerminalIcon as Le,LayersIcon as X,ClockIcon as He,CircleCheckIcon as Y,GlobeIcon as De,AppleIcon as Ae,AndroidIcon as We,StackTraceIcon as $e,DiagnosticsIcon as Me,TrailIcon as Oe,RawJsonIcon as Ge,AppFramesIcon as Je,AllFramesIcon as Ne}from"../NetworkIcons";const Pe=ae.memo(()=>{const{t:B}=Te(),{selectedCrash:T}=xe(),[F,Z]=H("stack"),[R,G]=H(""),[I,j]=H("app"),[A,J]=H(!1),[N,P]=H(null);if(!T)return null;const z=L(()=>T.parsedStack&&T.parsedStack.length>0?T.parsedStack:T.stack?ke(T.stack):[],[T]),ee=L(()=>{try{return JSON.parse(JSON.stringify(T))}catch{return T}},[T]),v=L(()=>z.filter(x=>x.isAppCode),[z]),U=L(()=>I==="app"&&v.length>0?v:z,[I,v,z]),M=L(()=>v[0]||z[0]||null,[v,z]),re=()=>{const x=Ve(T);q(x,"Crash Report"),J(!0),setTimeout(()=>J(!1),2e3)},te=(x,k)=>{const O=x.raw||`${x.method}@${x.file}:${x.lineNumber}:${x.column}`;q(O,"Stack Frame"),P(k),setTimeout(()=>P(null),1500)},oe=[{key:"stack",label:B("crash.tabStack",{count:z.length}),icon:x=><$e size={12}color={x?e.white:e.grayText}/>},{key:"diagnostics",label:B("crash.tabDiagnostics"),icon:x=><Me size={12}color={x?e.white:e.grayText}/>},{key:"breadcrumbs",label:B("crash.tabTrail",{count:T.breadcrumbs?.length||0}),icon:x=><Oe size={12}color={x?e.white:e.grayText}/>},{key:"raw",label:B("crash.tabRawJson"),icon:x=><Ge size={12}color={x?e.white:e.grayText}/>}];return<C style={{flex:1,backgroundColor:e.grayBackground}}>
2
2
 
3
3
  <C style={{paddingHorizontal:8,paddingTop:6}}>
4
4
  <C style={r.infoBar}>
@@ -22,6 +22,7 @@ import ae,{useMemo as L,useState as H}from"react";import{Platform as W,ScrollVie
22
22
  <C style={{flex:1}}/>
23
23
 
24
24
 
25
+ <Be onShare={()=>Ie(T)}/>
25
26
  <D onPress={re}hitSlop={10}style={[r.actionButton,A&&{backgroundColor:e.mintGreenBg,borderColor:e.mintGreenBorder}]}>
26
27
  {A?<Y color={e.mintGreenText}size={12}/>:<K color={e.purple}size={12}/>}
27
28
  <S style={[r.actionButtonText,A&&{color:e.mintGreenText}]}>
@@ -38,21 +39,21 @@ import ae,{useMemo as L,useState as H}from"react";import{Platform as W,ScrollVie
38
39
 
39
40
  <E horizontal showsHorizontalScrollIndicator={!1}contentContainerStyle={r.metaRow}>
40
41
  {M&&<C style={r.metaChip}>
41
- <Re color={e.grayText}size={11}/>
42
+ <Le color={e.grayText}size={11}/>
42
43
  <S style={r.metaChipText}numberOfLines={2}>
43
44
  {M.file}:{M.lineNumber}
44
45
  </S>
45
46
  </C>}
46
47
 
47
48
  <C style={r.metaChip}>
48
- <Le color={e.grayText}size={11}/>
49
+ <He color={e.grayText}size={11}/>
49
50
  <S style={r.metaChipText}>
50
51
  {T.timeStr||new Date(T.timestamp).toLocaleTimeString()}
51
52
  </S>
52
53
  </C>
53
54
 
54
55
  {T.deviceInfo?.platform&&<C style={r.metaChip}>
55
- {T.deviceInfo.platform==="ios"?<De color={e.grayText}size={11}/>:<Ae color={e.grayText}size={11}/>}
56
+ {T.deviceInfo.platform==="ios"?<Ae color={e.grayText}size={11}/>:<We color={e.grayText}size={11}/>}
56
57
  <S style={r.metaChipText}>
57
58
  {T.deviceInfo.platform.toUpperCase()} {T.deviceInfo.osVersion}
58
59
  </S>
@@ -69,10 +70,10 @@ import ae,{useMemo as L,useState as H}from"react";import{Platform as W,ScrollVie
69
70
 
70
71
  {(F==="stack"||F==="raw")&&<C style={{paddingHorizontal:12,paddingBottom:6}}>
71
72
  <C style={r.searchContainer}>
72
- <Ie color={e.grayText}size={14}/>
73
+ <Fe color={e.grayText}size={14}/>
73
74
  <Ce style={r.searchInput}placeholder={B("crash.searchDetailPlaceholder")}placeholderTextColor={e.grayTextWeak}value={R}onChangeText={G}autoCapitalize="none"autoCorrect={!1}/>
74
75
  {R.length>0&&<D onPress={()=>G("")}hitSlop={10}>
75
- <Fe color={e.grayText}size={13}/>
76
+ <Re color={e.grayText}size={13}/>
76
77
  </D>}
77
78
  </C>
78
79
  </C>}
@@ -84,14 +85,14 @@ import ae,{useMemo as L,useState as H}from"react";import{Platform as W,ScrollVie
84
85
 
85
86
  <C style={r.filterChipsRow}>
86
87
  <D onPress={()=>j("app")}style={[r.filterChip,I==="app"&&r.filterChipActive]}>
87
- <Ge size={12}color={I==="app"?e.white:e.purple}/>
88
+ <Je size={12}color={I==="app"?e.white:e.purple}/>
88
89
  <S style={[r.filterChipText,I==="app"&&r.filterChipTextActive]}>
89
90
  {B("crash.appFrames",{count:v.length})}
90
91
  </S>
91
92
  </D>
92
93
 
93
94
  <D onPress={()=>j("all")}style={[r.filterChip,I==="all"&&r.filterChipActive]}>
94
- <Je size={12}color={I==="all"?e.white:e.purple}/>
95
+ <Ne size={12}color={I==="all"?e.white:e.purple}/>
95
96
  <S style={[r.filterChipText,I==="all"&&r.filterChipTextActive]}>
96
97
  {B("crash.allFrames",{count:z.length})}
97
98
  </S>
@@ -162,7 +163,7 @@ import ae,{useMemo as L,useState as H}from"react";import{Platform as W,ScrollVie
162
163
  <C style={r.sectionCard}>
163
164
  <C style={[r.sectionCardHeader,{justifyContent:"space-between"}]}>
164
165
  <C style={{flexDirection:"row",alignItems:"center",gap:6}}>
165
- <He color={e.purple}size={14}/>
166
+ <De color={e.purple}size={14}/>
166
167
  <S style={r.sectionCardTitle}>
167
168
  {B("crash.deviceEnvironment")}
168
169
  </S>
@@ -280,4 +281,4 @@ import ae,{useMemo as L,useState as H}from"react";import{Platform as W,ScrollVie
280
281
  <_ data={ee}search={R}wrap/>
281
282
  </C>}
282
283
  </E>
283
- </C>});export default Ne;const r=ie.create({infoBar:{backgroundColor:e.primaryLight,borderRadius:12,padding:12,borderWidth:1,borderColor:e.grayBorderSecondary,shadowColor:e.black,shadowOffset:{width:0,height:1},shadowOpacity:.05,shadowRadius:3,elevation:2,gap:8},badgeRow:{flexDirection:"row",alignItems:"center",gap:8},pillBadge:{flexDirection:"row",alignItems:"center",paddingHorizontal:8,paddingVertical:3,borderRadius:12,borderWidth:1,gap:5},statusDot:{width:6,height:6,borderRadius:3},pillBadgeText:{fontFamily:V.interBold,fontSize:9.5,letterSpacing:.4},actionButton:{flexDirection:"row",alignItems:"center",gap:4,backgroundColor:`${e.purple}14`,borderColor:`${e.purple}33`,borderWidth:1,paddingHorizontal:8,paddingVertical:4,borderRadius:8},actionButtonText:{fontFamily:V.interBold,fontSize:10.5,color:e.purple},titleText:{fontFamily:V.interBold,fontSize:14,color:e.primaryBlack,lineHeight:19},metaRow:{flexDirection:"row",alignItems:"center",gap:6,paddingVertical:2},metaChip:{flexDirection:"row",alignItems:"center",gap:4,backgroundColor:e.grayBackground,paddingHorizontal:7,paddingVertical:3,borderRadius:6,borderWidth:1,borderColor:e.dividerColor},metaChipText:{fontFamily:V.interMedium,fontSize:10,color:e.grayText},searchContainer:{flexDirection:"row",alignItems:"center",backgroundColor:e.primaryLight,borderWidth:1,borderColor:e.grayBorderSecondary,borderRadius:8,paddingHorizontal:10,height:36,gap:8},searchInput:{flex:1,fontFamily:V.interRegular,fontSize:12,color:e.primaryBlack,paddingVertical:0},filterChipsRow:{flexDirection:"row",alignItems:"center",gap:8},filterChip:{flexDirection:"row",alignItems:"center",gap:5,paddingHorizontal:10,paddingVertical:5,borderRadius:8,backgroundColor:e.primaryLight,borderWidth:1,borderColor:e.grayBorderSecondary},filterChipActive:{backgroundColor:e.purple,borderColor:e.purple},filterChipText:{fontFamily:V.interMedium,fontSize:11,color:e.grayText},filterChipTextActive:{fontFamily:V.interBold,color:e.white},frameCard:{backgroundColor:e.primaryLight,borderRadius:8,padding:10,borderWidth:1,borderColor:e.grayBorderSecondary,gap:4},originFrameCard:{borderColor:e.greenMintBorder,backgroundColor:e.greenMintBg},frameCardHeader:{flexDirection:"row",alignItems:"center",gap:8},frameIndexBadge:{minWidth:24,height:18,paddingHorizontal:4,borderRadius:4,backgroundColor:`${e.purple}14`,alignItems:"center",justifyContent:"center"},frameIndexBadgeText:{fontFamily:V.interBold,fontSize:9,color:e.purple},frameTypeBadge:{paddingHorizontal:5,paddingVertical:2,borderRadius:4,borderWidth:1},frameTypeBadgeText:{fontFamily:V.interBold,fontSize:8.5},frameMethodText:{fontFamily:V.interBold,fontSize:12,color:e.primaryBlack,flex:1},frameLocationRow:{flexDirection:"row",alignItems:"center"},frameFileText:{fontFamily:V.interRegular,fontSize:11,color:e.grayText,flex:1},frameLineText:{fontFamily:V.interBold,fontSize:11,color:e.purple},frameCopyBtn:{flexDirection:"row",alignItems:"center",gap:3,paddingHorizontal:6,paddingVertical:3,borderRadius:5,backgroundColor:e.grayBackground,borderWidth:1,borderColor:e.dividerColor},frameCopyBtnText:{fontFamily:V.interBold,fontSize:9,color:e.grayText},frameRawText:{fontFamily:V.interRegular,fontSize:9.5,color:e.grayTextWeak,backgroundColor:`${e.primaryBlack}06`,borderRadius:5,paddingHorizontal:7,paddingVertical:4,overflow:"hidden"},componentStackText:{fontFamily:V.interRegular,fontSize:11,lineHeight:16,color:e.grayText,backgroundColor:`${e.primaryBlack}06`,borderRadius:6,padding:10},sectionCard:{backgroundColor:e.primaryLight,borderRadius:10,padding:12,borderWidth:1,borderColor:e.grayBorderSecondary,gap:10},sectionCardHeader:{flexDirection:"row",alignItems:"center",gap:6,paddingBottom:6,borderBottomWidth:1,borderBottomColor:e.dividerColor},sectionCardTitle:{fontFamily:V.interBold,fontSize:12.5,color:e.primaryBlack},diagGrid:{flexDirection:"row",flexWrap:"wrap",rowGap:8,columnGap:12},diagItem:{width:"47%",gap:2},diagLabel:{fontFamily:V.interRegular,fontSize:10,color:e.grayTextWeak},diagValue:{fontFamily:V.interBold,fontSize:11.5,color:e.primaryBlack},breadcrumbCard:{backgroundColor:e.primaryLight,borderRadius:8,padding:10,borderWidth:1,borderColor:e.grayBorderSecondary,gap:4},breadcrumbHeader:{flexDirection:"row",alignItems:"center",justifyContent:"space-between"},breadcrumbTag:{backgroundColor:`${e.purple}14`,paddingHorizontal:6,paddingVertical:2,borderRadius:4},breadcrumbTagText:{fontFamily:V.interBold,fontSize:9,color:e.purple},breadcrumbTime:{fontFamily:V.interRegular,fontSize:10,color:e.grayTextWeak},breadcrumbMessage:{fontFamily:V.interRegular,fontSize:11.5,color:e.primaryBlack,marginTop:2},rawContainer:{backgroundColor:e.primaryLight,borderRadius:10,padding:10,borderWidth:1,borderColor:e.grayBorderSecondary},emptyContainer:{padding:16,alignItems:"center",justifyContent:"center",backgroundColor:e.primaryLight,borderRadius:8,borderWidth:1,borderColor:e.grayBorderSecondary},emptyText:{fontFamily:V.interRegular,fontSize:11,color:e.grayText,textAlign:"center"}});
284
+ </C>});export default Pe;const r=ie.create({infoBar:{backgroundColor:e.primaryLight,borderRadius:12,padding:12,borderWidth:1,borderColor:e.grayBorderSecondary,shadowColor:e.black,shadowOffset:{width:0,height:1},shadowOpacity:.05,shadowRadius:3,elevation:2,gap:8},badgeRow:{flexDirection:"row",alignItems:"center",gap:8},pillBadge:{flexDirection:"row",alignItems:"center",paddingHorizontal:8,paddingVertical:3,borderRadius:12,borderWidth:1,gap:5},statusDot:{width:6,height:6,borderRadius:3},pillBadgeText:{fontFamily:V.interBold,fontSize:9.5,letterSpacing:.4},actionButton:{flexDirection:"row",alignItems:"center",gap:4,backgroundColor:`${e.purple}14`,borderColor:`${e.purple}33`,borderWidth:1,paddingHorizontal:8,paddingVertical:4,borderRadius:8},actionButtonText:{fontFamily:V.interBold,fontSize:10.5,color:e.purple},titleText:{fontFamily:V.interBold,fontSize:14,color:e.primaryBlack,lineHeight:19},metaRow:{flexDirection:"row",alignItems:"center",gap:6,paddingVertical:2},metaChip:{flexDirection:"row",alignItems:"center",gap:4,backgroundColor:e.grayBackground,paddingHorizontal:7,paddingVertical:3,borderRadius:6,borderWidth:1,borderColor:e.dividerColor},metaChipText:{fontFamily:V.interMedium,fontSize:10,color:e.grayText},searchContainer:{flexDirection:"row",alignItems:"center",backgroundColor:e.primaryLight,borderWidth:1,borderColor:e.grayBorderSecondary,borderRadius:8,paddingHorizontal:10,height:36,gap:8},searchInput:{flex:1,fontFamily:V.interRegular,fontSize:12,color:e.primaryBlack,paddingVertical:0},filterChipsRow:{flexDirection:"row",alignItems:"center",gap:8},filterChip:{flexDirection:"row",alignItems:"center",gap:5,paddingHorizontal:10,paddingVertical:5,borderRadius:8,backgroundColor:e.primaryLight,borderWidth:1,borderColor:e.grayBorderSecondary},filterChipActive:{backgroundColor:e.purple,borderColor:e.purple},filterChipText:{fontFamily:V.interMedium,fontSize:11,color:e.grayText},filterChipTextActive:{fontFamily:V.interBold,color:e.white},frameCard:{backgroundColor:e.primaryLight,borderRadius:8,padding:10,borderWidth:1,borderColor:e.grayBorderSecondary,gap:4},originFrameCard:{borderColor:e.greenMintBorder,backgroundColor:e.greenMintBg},frameCardHeader:{flexDirection:"row",alignItems:"center",gap:8},frameIndexBadge:{minWidth:24,height:18,paddingHorizontal:4,borderRadius:4,backgroundColor:`${e.purple}14`,alignItems:"center",justifyContent:"center"},frameIndexBadgeText:{fontFamily:V.interBold,fontSize:9,color:e.purple},frameTypeBadge:{paddingHorizontal:5,paddingVertical:2,borderRadius:4,borderWidth:1},frameTypeBadgeText:{fontFamily:V.interBold,fontSize:8.5},frameMethodText:{fontFamily:V.interBold,fontSize:12,color:e.primaryBlack,flex:1},frameLocationRow:{flexDirection:"row",alignItems:"center"},frameFileText:{fontFamily:V.interRegular,fontSize:11,color:e.grayText,flex:1},frameLineText:{fontFamily:V.interBold,fontSize:11,color:e.purple},frameCopyBtn:{flexDirection:"row",alignItems:"center",gap:3,paddingHorizontal:6,paddingVertical:3,borderRadius:5,backgroundColor:e.grayBackground,borderWidth:1,borderColor:e.dividerColor},frameCopyBtnText:{fontFamily:V.interBold,fontSize:9,color:e.grayText},frameRawText:{fontFamily:V.interRegular,fontSize:9.5,color:e.grayTextWeak,backgroundColor:`${e.primaryBlack}06`,borderRadius:5,paddingHorizontal:7,paddingVertical:4,overflow:"hidden"},componentStackText:{fontFamily:V.interRegular,fontSize:11,lineHeight:16,color:e.grayText,backgroundColor:`${e.primaryBlack}06`,borderRadius:6,padding:10},sectionCard:{backgroundColor:e.primaryLight,borderRadius:10,padding:12,borderWidth:1,borderColor:e.grayBorderSecondary,gap:10},sectionCardHeader:{flexDirection:"row",alignItems:"center",gap:6,paddingBottom:6,borderBottomWidth:1,borderBottomColor:e.dividerColor},sectionCardTitle:{fontFamily:V.interBold,fontSize:12.5,color:e.primaryBlack},diagGrid:{flexDirection:"row",flexWrap:"wrap",rowGap:8,columnGap:12},diagItem:{width:"47%",gap:2},diagLabel:{fontFamily:V.interRegular,fontSize:10,color:e.grayTextWeak},diagValue:{fontFamily:V.interBold,fontSize:11.5,color:e.primaryBlack},breadcrumbCard:{backgroundColor:e.primaryLight,borderRadius:8,padding:10,borderWidth:1,borderColor:e.grayBorderSecondary,gap:4},breadcrumbHeader:{flexDirection:"row",alignItems:"center",justifyContent:"space-between"},breadcrumbTag:{backgroundColor:`${e.purple}14`,paddingHorizontal:6,paddingVertical:2,borderRadius:4},breadcrumbTagText:{fontFamily:V.interBold,fontSize:9,color:e.purple},breadcrumbTime:{fontFamily:V.interRegular,fontSize:10,color:e.grayTextWeak},breadcrumbMessage:{fontFamily:V.interRegular,fontSize:11.5,color:e.primaryBlack,marginTop:2},rawContainer:{backgroundColor:e.primaryLight,borderRadius:10,padding:10,borderWidth:1,borderColor:e.grayBorderSecondary},emptyContainer:{padding:16,alignItems:"center",justifyContent:"center",backgroundColor:e.primaryLight,borderRadius:8,borderWidth:1,borderColor:e.grayBorderSecondary},emptyText:{fontFamily:V.interRegular,fontSize:11,color:e.grayText,textAlign:"center"}});
@@ -1,5 +1,5 @@
1
- import Z,{useCallback as ee,useMemo as _,useRef as te,useState as W}from"react";import{Alert as re,FlatList as Ce,Platform as be,ScrollView as N,StyleSheet as Te,Text as T,TextInput as Se,TouchableOpacity as Ie,View as C}from"react-native";import{useTranslation as Be}from"../../i18n";import{useInspector as Ve}from"./InspectorContext";import A from"../TouchableScale";import Fe from"../AnimatedEntrance";import Re from"../EndOfListFooter";import He from"./FeatureUnderDevNotice";import Pe from"../HighlightText";import{AppColors as e}from"../../styles/AppColors";import{AppFonts as k}from"../../styles/AppFonts";import{clearCrashRecords as Le}from"../../customHooks/crashHandler";import We,{DEFAULT_CRASH_FILTERS as q,isCrashFiltersDefault as $}from"./CrashFilterModal";import{SearchIcon as $e,ClearIcon as De,TrashIcon as Ae,TerminalIcon as Me,LayersIcon as je,ClockIcon as Oe,ShieldAlertIcon as Ne,FlameIcon as Ee,JsIcon as Je,HourglassIcon as Ue,SkullIcon as Qe,LayoutIcon as _e,ChipIcon as qe,AppleIcon as Ge,AndroidIcon as Ke,RepeatIcon as Xe,CodeBracketsIcon as Ye,FilterIcon as Ze,ForwardChevronIcon as Ct}from"../NetworkIcons";const bt=S=>{const R=Date.now(),E=Math.max(0,R-S),L=Math.floor(E/1e3),D=Math.floor(L/60),v=Math.floor(D/60),j=Math.floor(v/24);return L<60?`${L}s ago`:D<60?`${D}m ago`:v<24?`${v}h ago`:`${j}d ago`},Tt=Z.memo(()=>{const{t:S}=Be(),{crashRecords:R,selectedCrash:E,setSelectedCrash:L}=Ve(),D=te(null),[v,j]=W(100),[B,O]=W(""),[z,J]=W("all"),[w,U]=W(q),[G,Q]=W(!1),[xt,wt]=W("stack"),V=_(()=>{const r=R.length;let o=0,x=0,F=0,I=0,M=0;return R.forEach(P=>{P.isFatal&&o++,P.type==="js"?x++:P.type==="promise"?F++:P.type==="render"?I++:P.type==="native"&&M++}),{total:r,fatalCount:o,jsCount:x,promiseCount:F,renderCount:I,nativeCount:M}},[R]),H=_(()=>{let r=R.filter(o=>{if(z==="fatal"&&!o.isFatal||z==="js"&&o.type!=="js"||z==="promise"&&o.type!=="promise"||z==="render"&&o.type!=="render"||z==="native"&&o.type!=="native"||w.types.size>0&&!w.types.has("all")&&!(w.types.has("fatal")&&o.isFatal||w.types.has("js")&&o.type==="js"||w.types.has("promise")&&o.type==="promise"||w.types.has("render")&&o.type==="render"||w.types.has("native")&&o.type==="native"))return!1;if(w.timeWindow!=="all"){const x=Date.now(),F=w.timeWindow==="15m"?x-900*1e3:w.timeWindow==="1h"?x-3600*1e3:w.timeWindow==="24h"?x-1440*60*1e3:x-10080*60*1e3;if(o.timestamp<F)return!1}if(w.platform!=="all"&&(o.deviceInfo?.platform||"").toLowerCase()!==w.platform)return!1;if(w.engine!=="all"){const x=o.deviceInfo?.isHermes;if(w.engine==="hermes"&&x!==!0||w.engine==="jsc"&&x===!0)return!1}if(B.trim().length>0){const x=B.trim().toLowerCase().split(/\s+/).filter(Boolean),F=[o.message||"",o.name||"",o.stack||"",o.type||"",o.deviceInfo?.platform||"",...(o.breadcrumbs||[]).map(I=>`${I.type||""} ${I.message||""}`)].join(" ").toLowerCase();return x.every(I=>F.includes(I))}return!0});return w.sortBy==="time_asc"&&(r=[...r].sort((o,x)=>o.timestamp-x.timestamp)),r},[R,z,B,w]),K=()=>{re.alert(S("crash.clearTitle"),S("crash.clearMessage"),[{text:S("crash.clearCancel"),style:"cancel"},{text:S("crash.clearConfirm"),style:"destructive",onPress:()=>Le()}])},X=ee(({item:r,index:o})=>{const x=r.isFatal,F=r.type.toUpperCase(),I=r.parsedStack&&r.parsedStack.length>0?r.parsedStack.find(Y=>Y.isAppCode)||r.parsedStack[0]:null,M=r.type==="native"?`${e.errorColor}22`:r.type==="render"?`${e.purple}22`:r.type==="promise"?`${e.darkOrange}22`:`${e.offerPurple}22`,P=r.type==="native"?e.errorColor:r.type==="render"?e.purple:r.type==="promise"?e.darkOrange:e.offerPurple;return<Fe index={o}distance={8}>
2
- <A onPress={()=>{L(r)}}style={[t.cardContainer,x&&t.fatalCardBorder]}>
1
+ import te,{useCallback as re,useEffect as oe,useMemo as q,useRef as ae,useState as A}from"react";import{Alert as le,FlatList as Ce,Platform as be,ScrollView as N,StyleSheet as Te,Text as T,TextInput as Se,TouchableOpacity as Ie,View as C}from"react-native";import{useTranslation as Be}from"../../i18n";import{useInspector as Ve}from"./InspectorContext";import M from"../TouchableScale";import Fe from"../AnimatedEntrance";import Re from"../EndOfListFooter";import He from"./FeatureUnderDevNotice";import Pe from"../HighlightText";import{AppColors as e}from"../../styles/AppColors";import{AppFonts as k}from"../../styles/AppFonts";import{clearCrashRecords as Le}from"../../customHooks/crashHandler";import We,{DEFAULT_CRASH_FILTERS as G,isCrashFiltersDefault as W}from"./CrashFilterModal";import{SearchIcon as $e,ClearIcon as De,TrashIcon as Ae,TerminalIcon as Me,LayersIcon as je,ClockIcon as Oe,ShieldAlertIcon as Ee,FlameIcon as Ne,JsIcon as Je,HourglassIcon as _e,SkullIcon as Ue,LayoutIcon as Qe,ChipIcon as qe,AppleIcon as Ge,AndroidIcon as Ke,RepeatIcon as Xe,CodeBracketsIcon as Ye,FilterIcon as Ze,ForwardChevronIcon as Ct}from"../NetworkIcons";const bt=S=>{const R=Date.now(),j=Math.max(0,R-S),v=Math.floor(j/1e3),$=Math.floor(v/60),L=Math.floor($/60),D=Math.floor(L/24);return v<60?`${v}s ago`:$<60?`${$}m ago`:L<24?`${L}h ago`:`${D}d ago`},K=10,Tt=te.memo(()=>{const{t:S}=Be(),{crashRecords:R,setSelectedCrash:j,maxCrashLogs:v}=Ve(),$=v||50,L=ae(null),[D,J]=A($),[B,E]=A(""),[z,_]=A("all"),[w,U]=A(G),[X,Q]=A(!1);oe(()=>{J(v||50),L.current?.scrollToOffset({offset:0,animated:!1})},[B,z,w,v]);const V=q(()=>{const r=R.length;let o=0,x=0,F=0,I=0,O=0;return R.forEach(P=>{P.isFatal&&o++,P.type==="js"?x++:P.type==="promise"?F++:P.type==="render"?I++:P.type==="native"&&O++}),{total:r,fatalCount:o,jsCount:x,promiseCount:F,renderCount:I,nativeCount:O}},[R]),H=q(()=>{let r=R.filter(o=>{if(z==="fatal"&&!o.isFatal||z==="js"&&o.type!=="js"||z==="promise"&&o.type!=="promise"||z==="render"&&o.type!=="render"||z==="native"&&o.type!=="native"||w.types.size>0&&!w.types.has("all")&&!(w.types.has("fatal")&&o.isFatal||w.types.has("js")&&o.type==="js"||w.types.has("promise")&&o.type==="promise"||w.types.has("render")&&o.type==="render"||w.types.has("native")&&o.type==="native"))return!1;if(w.timeWindow!=="all"){const x=Date.now(),F=w.timeWindow==="15m"?x-900*1e3:w.timeWindow==="1h"?x-3600*1e3:w.timeWindow==="24h"?x-1440*60*1e3:x-10080*60*1e3;if(o.timestamp<F)return!1}if(w.platform!=="all"&&(o.deviceInfo?.platform||"").toLowerCase()!==w.platform)return!1;if(w.engine!=="all"){const x=o.deviceInfo?.isHermes;if(w.engine==="hermes"&&x!==!0||w.engine==="jsc"&&x===!0)return!1}if(B.trim().length>0){const x=B.trim().toLowerCase().split(/\s+/).filter(Boolean),F=[o.message||"",o.name||"",o.stack||"",o.type||"",o.deviceInfo?.platform||"",...(o.breadcrumbs||[]).map(I=>`${I.type||""} ${I.message||""}`)].join(" ").toLowerCase();return x.every(I=>F.includes(I))}return!0});return w.sortBy==="time_asc"&&(r=[...r].sort((o,x)=>o.timestamp-x.timestamp)),r},[R,z,B,w]),Y=()=>{le.alert(S("crash.clearTitle"),S("crash.clearMessage"),[{text:S("crash.clearCancel"),style:"cancel"},{text:S("crash.clearConfirm"),style:"destructive",onPress:()=>Le()}])},Z=re(({item:r,index:o})=>{const x=r.isFatal,F=r.type.toUpperCase(),I=r.parsedStack&&r.parsedStack.length>0?r.parsedStack.find(ee=>ee.isAppCode)||r.parsedStack[0]:null,O=r.type==="native"?`${e.errorColor}22`:r.type==="render"?`${e.purple}22`:r.type==="promise"?`${e.darkOrange}22`:`${e.offerPurple}22`,P=r.type==="native"?e.errorColor:r.type==="render"?e.purple:r.type==="promise"?e.darkOrange:e.offerPurple;return<Fe index={o}distance={8}>
2
+ <M onPress={()=>{j(r)}}style={[t.cardContainer,x&&t.fatalCardBorder]}>
3
3
 
4
4
  <C style={t.cardHeader}>
5
5
  <C style={t.badgeRow}>
@@ -8,13 +8,13 @@ import Z,{useCallback as ee,useMemo as _,useRef as te,useState as W}from"react";
8
8
  </C>
9
9
 
10
10
  {x?<C style={t.fatalBadge}>
11
- <Ee size={10}color={e.white}/>
11
+ <Ne size={10}color={e.white}/>
12
12
  <T style={t.fatalBadgeText}>{S("crash.fatalBadge")}</T>
13
13
  </C>:<C style={t.caughtBadge}>
14
14
  <T style={t.caughtBadgeText}>{S("crash.handledBadge")}</T>
15
15
  </C>}
16
16
 
17
- <C style={[t.typeBadge,{backgroundColor:M}]}>
17
+ <C style={[t.typeBadge,{backgroundColor:O}]}>
18
18
  <T style={[t.typeBadgeText,{color:P}]}>
19
19
  {F}
20
20
  </T>
@@ -83,8 +83,8 @@ import Z,{useCallback as ee,useMemo as _,useRef as te,useState as W}from"react";
83
83
  </C>}
84
84
  </C>
85
85
  </C>
86
- </A>
87
- </Fe>},[B,L]);return<C style={t.container}>
86
+ </M>
87
+ </Fe>},[B,j]);return<C style={t.container}>
88
88
  {R.length>0&&<>
89
89
 
90
90
  <C style={t.statsBar}>
@@ -136,29 +136,29 @@ import Z,{useCallback as ee,useMemo as _,useRef as te,useState as W}from"react";
136
136
  <C style={t.searchRow}>
137
137
  <C style={t.searchInputWrapper}>
138
138
  <$e color={e.grayTextWeak}size={14}/>
139
- <Se value={B}onChangeText={O}placeholder={S("crash.searchPlaceholder")}placeholderTextColor={e.grayTextWeak}style={t.searchInput}autoCapitalize="none"autoCorrect={!1}/>
139
+ <Se value={B}onChangeText={E}placeholder={S("crash.searchPlaceholder")}placeholderTextColor={e.grayTextWeak}style={t.searchInput}autoCapitalize="none"autoCorrect={!1}/>
140
140
  {B.length>0&&<C style={{flexDirection:"row",alignItems:"center",gap:4}}>
141
141
  <C style={{backgroundColor:`${e.purple}20`,borderRadius:10,paddingHorizontal:6,paddingVertical:1.5}}>
142
142
  <T style={{color:e.purple,fontSize:9.5,fontFamily:k.interBold}}>
143
143
  {H.length}
144
144
  </T>
145
145
  </C>
146
- <Ie onPress={()=>O("")}hitSlop={8}>
146
+ <Ie onPress={()=>E("")}hitSlop={8}>
147
147
  <De color={e.grayTextWeak}size={14}/>
148
148
  </Ie>
149
149
  </C>}
150
150
  </C>
151
151
 
152
152
 
153
- <A onPress={()=>Q(!0)}style={[t.filterButton,!$(w)&&{borderColor:`${e.brandPurple}60`,backgroundColor:`${e.brandPurple}15`}]}>
154
- <Ze size={14}color={$(w)?e.grayTextStrong:e.brandPurple}/>
155
- {!$(w)&&<C style={{position:"absolute",top:2,right:2,width:7,height:7,borderRadius:3.5,backgroundColor:e.darkOrange,borderWidth:1,borderColor:e.white}}/>}
156
- </A>
153
+ <M onPress={()=>Q(!0)}style={[t.filterButton,!W(w)&&{borderColor:`${e.brandPurple}60`,backgroundColor:`${e.brandPurple}15`}]}>
154
+ <Ze size={14}color={W(w)?e.grayTextStrong:e.brandPurple}/>
155
+ {!W(w)&&<C style={{position:"absolute",top:2,right:2,width:7,height:7,borderRadius:3.5,backgroundColor:e.darkOrange,borderWidth:1,borderColor:e.white}}/>}
156
+ </M>
157
157
 
158
158
 
159
- <A onPress={K}style={t.clearButton}>
159
+ <M onPress={Y}style={t.clearButton}>
160
160
  <Ae size={14}color={e.errorColor}/>
161
- </A>
161
+ </M>
162
162
  </C>
163
163
 
164
164
  <He featureName="Crash & Exception Sentinel"/>
@@ -166,7 +166,7 @@ import Z,{useCallback as ee,useMemo as _,useRef as te,useState as W}from"react";
166
166
 
167
167
  <C style={{flexDirection:"row",alignItems:"center",marginBottom:8,paddingHorizontal:12,gap:6}}>
168
168
  <N horizontal showsHorizontalScrollIndicator={!1}style={{flex:1}}contentContainerStyle={{flexDirection:"row",alignItems:"center",gap:6,paddingRight:6}}>
169
- {[{key:"all",label:S("crash.filterAll"),Icon:je,count:V.total,themeColor:e.purple},{key:"fatal",label:S("crash.filterFatal"),Icon:Qe,count:V.fatalCount,themeColor:e.errorColor},{key:"js",label:S("crash.filterJsError"),Icon:Je,count:V.jsCount,themeColor:e.amber600},{key:"promise",label:S("crash.filterPromise"),Icon:Ue,count:V.promiseCount,themeColor:e.orange600},{key:"render",label:S("crash.filterRender"),Icon:_e,count:V.renderCount,themeColor:e.violet600},{key:"native",label:S("crash.filterNative"),Icon:qe,count:V.nativeCount,themeColor:e.cyan600}].map(r=>{const o=z===r.key,x=r.themeColor||e.purple,F=o?e.white:x,I=r.Icon;return<A key={r.key}onPress={()=>J(r.key)}>
169
+ {[{key:"all",label:S("crash.filterAll"),Icon:je,count:V.total,themeColor:e.purple},{key:"fatal",label:S("crash.filterFatal"),Icon:Ue,count:V.fatalCount,themeColor:e.errorColor},{key:"js",label:S("crash.filterJsError"),Icon:Je,count:V.jsCount,themeColor:e.amber600},{key:"promise",label:S("crash.filterPromise"),Icon:_e,count:V.promiseCount,themeColor:e.orange600},{key:"render",label:S("crash.filterRender"),Icon:Qe,count:V.renderCount,themeColor:e.violet600},{key:"native",label:S("crash.filterNative"),Icon:qe,count:V.nativeCount,themeColor:e.cyan600}].map(r=>{const o=z===r.key,x=r.themeColor||e.purple,F=o?e.white:x,I=r.Icon;return<M key={r.key}onPress={()=>_(r.key)}>
170
170
  <C style={{flexDirection:"row",alignItems:"center",paddingHorizontal:9,paddingVertical:4.5,borderRadius:8,backgroundColor:o?x:`${x}12`,borderWidth:1,borderColor:o?x:`${x}30`,gap:5}}>
171
171
  <I size={11}color={F}/>
172
172
  <T style={{fontFamily:k.interBold,fontSize:10.5,color:o?e.white:e.primaryBlack}}>
@@ -178,7 +178,7 @@ import Z,{useCallback as ee,useMemo as _,useRef as te,useState as W}from"react";
178
178
  </T>
179
179
  </C>
180
180
  </C>
181
- </A>})}
181
+ </M>})}
182
182
  </N>
183
183
  </C>
184
184
  </C>
@@ -187,23 +187,23 @@ import Z,{useCallback as ee,useMemo as _,useRef as te,useState as W}from"react";
187
187
 
188
188
  {H.length===0?<N contentContainerStyle={t.emptyContainer}showsVerticalScrollIndicator={!1}>
189
189
  <C style={t.emptyIconCircle}>
190
- <Ne size={38}color={e.greenColor}/>
190
+ <Ee size={38}color={e.greenColor}/>
191
191
  </C>
192
192
  <T style={t.emptyTitle}>
193
- {B.length>0?"No matching crash entries":z!=="all"||!$(w)?"No crashes match filters":S("crash.emptyTitle")}
193
+ {B.length>0?"No matching crash entries":z!=="all"||!W(w)?"No crashes match filters":S("crash.emptyTitle")}
194
194
  </T>
195
195
  <T style={t.emptySub}>
196
- {B?`No crash entries matched "${B}"`:z!=="all"||!$(w)?"Try adjusting your filters or search keywords.":S("crash.emptySubtitle")}
196
+ {B?`No crash entries matched "${B}"`:z!=="all"||!W(w)?"Try adjusting your filters or search keywords.":S("crash.emptySubtitle")}
197
197
  </T>
198
- {(B.length>0||z!=="all"||!$(w))&&<A onPress={()=>{O(""),J("all"),U(q)}}style={{marginTop:10,paddingHorizontal:14,paddingVertical:7,borderRadius:8,backgroundColor:e.purple}}>
198
+ {(B.length>0||z!=="all"||!W(w))&&<M onPress={()=>{E(""),_("all"),U(G)}}style={{marginTop:10,paddingHorizontal:14,paddingVertical:7,borderRadius:8,backgroundColor:e.purple}}>
199
199
  <T style={{fontFamily:k.interBold,fontSize:11.5,color:e.white}}>
200
200
  Clear Search & Filters
201
201
  </T>
202
- </A>}
202
+ </M>}
203
203
  </N>:<>
204
- <Ce ref={D}data={H.slice(0,v)}keyExtractor={r=>r.id}renderItem={X}initialNumToRender={12}maxToRenderPerBatch={8}windowSize={5}removeClippedSubviews={be.OS==="android"}renderToHardwareTextureAndroid={!0}contentContainerStyle={t.listContent}showsVerticalScrollIndicator={!1}ListFooterComponent={H.length>0?<Re count={Math.min(v,H.length)}totalCount={H.length}label="crashes"hasMore={H.length>v}onLoadMore={()=>j(r=>r+10)}/>:null}/>
204
+ <Ce ref={L}data={H.slice(0,D)}keyExtractor={r=>r.id}renderItem={Z}initialNumToRender={12}maxToRenderPerBatch={8}windowSize={5}removeClippedSubviews={be.OS==="android"}renderToHardwareTextureAndroid={!0}contentContainerStyle={t.listContent}showsVerticalScrollIndicator={!1}ListFooterComponent={H.length>0?<Re count={Math.min(D,H.length)}totalCount={H.length}label="crashes"loadMoreStep={K}hasMore={H.length>D}onLoadMore={()=>J(r=>r+K)}/>:null}/>
205
205
  </>}
206
206
 
207
207
 
208
- <We visible={G}onClose={()=>Q(!1)}filters={w}onApply={U}searchQuery={B}/>
208
+ <We visible={X}onClose={()=>Q(!1)}filters={w}onApply={U}searchQuery={B}/>
209
209
  </C>});export default Tt;const t=Te.create({container:{flex:1,backgroundColor:e.grayBackground},statsBar:{backgroundColor:e.primaryLight,borderBottomWidth:1,borderBottomColor:e.grayBorderSecondary,paddingVertical:10},statsScrollContent:{paddingHorizontal:16,gap:8},statChip:{flexDirection:"row",alignItems:"center",gap:6,paddingHorizontal:10,paddingVertical:5,borderRadius:8,backgroundColor:e.purpleShade50,borderWidth:1,borderColor:`${e.purple}14`},statChipActive:{backgroundColor:`${e.purple}14`,borderColor:`${e.purple}33`},statChipValue:{fontFamily:k.interBold,fontSize:13,color:e.primaryBlack},statChipLabel:{fontFamily:k.interMedium,fontSize:11,color:e.grayText},controlsContainer:{paddingHorizontal:16,paddingTop:12,paddingBottom:6,backgroundColor:e.grayBackground},searchRow:{flexDirection:"row",alignItems:"center",gap:8},searchInputWrapper:{flex:1,flexDirection:"row",alignItems:"center",backgroundColor:e.primaryLight,borderWidth:1,borderColor:e.grayBorderSecondary,borderRadius:10,paddingHorizontal:10,height:38,gap:8},searchInput:{flex:1,fontFamily:k.interRegular,fontSize:13,color:e.primaryBlack,paddingVertical:0},clearButton:{width:38,height:38,borderRadius:10,backgroundColor:`${e.errorColor}14`,borderWidth:1,borderColor:`${e.errorColor}22`,alignItems:"center",justifyContent:"center"},filterButton:{width:38,height:38,borderRadius:10,backgroundColor:`${e.brandPurple}0F`,borderWidth:1,borderColor:`${e.brandPurple}30`,alignItems:"center",justifyContent:"center"},filterScrollContent:{paddingVertical:10,gap:6},filterChip:{flexDirection:"row",alignItems:"center",gap:5,paddingHorizontal:12,paddingVertical:6,borderRadius:8,backgroundColor:e.primaryLight,borderWidth:1,borderColor:e.grayBorderSecondary},filterChipActive:{backgroundColor:e.purple,borderColor:e.purple},filterChipText:{fontFamily:k.interMedium,fontSize:12,color:e.grayText},filterChipTextActive:{fontFamily:k.interBold,color:e.white},listContent:{paddingHorizontal:16,paddingTop:4,paddingBottom:24,gap:10},cardContainer:{backgroundColor:e.primaryLight,borderRadius:12,borderWidth:1,borderColor:e.grayBorderSecondary,padding:14,shadowColor:e.shadowColorString,shadowOffset:{width:0,height:1},shadowOpacity:.05,shadowRadius:3,elevation:2},fatalCardBorder:{borderColor:`${e.errorColor}44`},cardHeader:{flexDirection:"row",alignItems:"center",justifyContent:"space-between"},badgeRow:{flexDirection:"row",alignItems:"center",gap:6,flexShrink:1},sNoBadge:{backgroundColor:e.grayBackground,borderWidth:1,borderColor:e.grayBorderSecondary,paddingHorizontal:6,paddingVertical:3,borderRadius:5},sNoBadgeText:{fontFamily:k.interBold,fontSize:9.5,color:e.grayText,letterSpacing:.3},fatalBadge:{flexDirection:"row",alignItems:"center",gap:4,backgroundColor:e.errorColor,paddingHorizontal:6,paddingVertical:3,borderRadius:5},fatalBadgeText:{fontFamily:k.interBold,fontSize:9.5,color:e.white,letterSpacing:.5},caughtBadge:{backgroundColor:`${e.greenColor}1F`,paddingHorizontal:6,paddingVertical:3,borderRadius:5},caughtBadgeText:{fontFamily:k.interBold,fontSize:9.5,color:e.greenColor,letterSpacing:.5},typeBadge:{paddingHorizontal:6,paddingVertical:3,borderRadius:5},typeBadgeText:{fontFamily:k.interBold,fontSize:9.5,letterSpacing:.5},timeRow:{flexDirection:"row",alignItems:"center",gap:4,flexShrink:1},timestampText:{fontFamily:k.interRegular,fontSize:11,color:e.grayTextWeak},relativeTimeText:{fontFamily:k.interBold,fontSize:10,color:e.grayTextWeak,backgroundColor:e.grayBackground,paddingHorizontal:5,paddingVertical:1,borderRadius:4,overflow:"hidden"},errorMessageText:{fontFamily:k.interBold,fontSize:13.5,color:e.primaryBlack,lineHeight:18},locationRow:{flexDirection:"row",alignItems:"center",gap:6,marginTop:2,marginBottom:6,backgroundColor:e.purpleShade50,paddingHorizontal:8,paddingVertical:4,borderRadius:6},locationText:{fontFamily:k.interRegular,fontSize:11,color:e.grayText,flex:1},cardFooter:{flexDirection:"row",alignItems:"center",justifyContent:"space-between",marginTop:6,paddingTop:8,borderTopWidth:1,borderTopColor:e.dividerColor},metaPill:{flexDirection:"row",alignItems:"center",gap:4,backgroundColor:e.purpleShade50,paddingHorizontal:6,paddingVertical:2,borderRadius:4},metaPillText:{fontFamily:k.interMedium,fontSize:10,color:e.grayTextWeak},emptyContainer:{flexGrow:1,alignItems:"center",justifyContent:"center",padding:32,paddingBottom:80},emptyIconCircle:{width:72,height:72,borderRadius:36,backgroundColor:`${e.greenColor}1F`,alignItems:"center",justifyContent:"center",marginBottom:16},emptyTitle:{fontFamily:k.interBold,fontSize:17,color:e.primaryBlack,marginBottom:6},emptySub:{fontFamily:k.interRegular,fontSize:13,color:e.grayText,textAlign:"center",lineHeight:18,maxWidth:280}});
@@ -1,6 +1,6 @@
1
- import{useState as M,useEffect as _,useMemo as Le,useCallback as ie,useRef as X}from"react";import{View as T,Text as C,ScrollView as Te,StyleSheet as We,NativeModules as Pe,Share as He,TouchableOpacity as G,ActivityIndicator as Ce,Animated as Z}from"react-native";import{AppColors as e}from"../../styles/AppColors";import{AppFonts as B}from"../../styles/AppFonts";import $e from"../QRCodeView";import Se from"../TouchableScale";import{showToast as J}from"../../helpers/toast";import{triggerNativeHaptic as L}from"../../native/NativeInspector";import{InfoCircleIcon as Ne,CheckIcon as Be,BoltIcon as Re,CircleXIcon as Ie,SparkleIcon as Ee,AndroidIcon as Ge,RepeatIcon as Ue,WrenchIcon as _e}from"../NetworkIcons";import Ke,{Path as Qe}from"react-native-svg";const Xe=({color:I=e.purple,size:N=13})=><Ke width={N}height={N}viewBox="0 0 24 24"fill="none">
1
+ import{useState as M,useEffect as _,useMemo as We,useCallback as re,useRef as X}from"react";import{View as T,Text as C,ScrollView as Te,StyleSheet as Pe,NativeModules as He,TouchableOpacity as G,ActivityIndicator as Ce,Animated as Z}from"react-native";import{AppColors as e}from"../../styles/AppColors";import{AppFonts as B}from"../../styles/AppFonts";import $e from"../QRCodeView";import Se from"../TouchableScale";import{showToast as J}from"../../helpers/toast";import{triggerNativeHaptic as P}from"../../native/NativeInspector";import{InfoCircleIcon as Ne,CheckIcon as Be,BoltIcon as Re,CircleXIcon as Ie,SparkleIcon as Ee,AndroidIcon as Ge,RepeatIcon as Ue,WrenchIcon as _e}from"../NetworkIcons";import Ke,{Path as Qe}from"react-native-svg";const Xe=({color:I=e.purple,size:N=13})=><Ke width={N}height={N}viewBox="0 0 24 24"fill="none">
2
2
  <Qe d="M4 17l6-6-6-6M12 19h8"stroke={I}strokeWidth="2"strokeLinecap="round"strokeLinejoin="round"/>
3
- </Ke>;export const DebuggingTab=()=>{const I=Le(()=>{const k=Pe.SourceCode?.scriptURL||"";let V="localhost",S=8081;try{if(k.includes("://")){const v=k.split("://")[1].split("/")[0];if(v.includes(":")){const A=v.split(":");V=A[0];const P=parseInt(A[1],10);isNaN(P)||(S=P)}else V=v}}catch{}return{host:V,port:S,scriptURL:k}},[]),[N,Ve]=M(()=>I.host&&I.host!=="localhost"&&I.host!=="127.0.0.1"&&I.host!=="10.0.2.2"?I.host:"192.168.1.2"),[H,ze]=M(I.port||8083),[De,Y]=M("app-debug.apk"),[q,ee]=M(null),[F,oe]=M("assembleRelease"),[W,ve]=M(!0),[R,U]=M({status:"idle",scheme:"assembleRelease",clean:!0,progress:0,currentTask:"",error:null,apkName:null,apkSize:null}),D=X(null),K=X(new Z.Value(0)).current,[Q,Ae]=M(!0),te=X(null);_(()=>{Z.timing(K,{toValue:Math.max(0,Math.min(100,R.progress)),duration:350,useNativeDriver:!1}).start()},[R.progress,K]),_(()=>{R.logs&&R.logs.length>0&&setTimeout(()=>{te.current?.scrollToEnd({animated:!0})},50)},[R.logs]);const E=ie(async()=>{const k=Array.from(new Set([I.host,"10.0.2.2","localhost","127.0.0.1"].filter(Boolean))),V=Array.from(new Set([I.port,8083,8081,8082].filter(Boolean)));for(const S of k)for(const O of V)try{const v=new AbortController,A=setTimeout(()=>v.abort(),1200),P=await fetch(`http://${S}:${O}/__inapp_inspector/apk-info`,{signal:v.signal});if(clearTimeout(A),P.ok){const z=await P.json();z.hostIp&&z.hostIp!=="127.0.0.1"&&z.hostIp!=="localhost"&&z.hostIp!=="10.0.2.2"&&Ve(z.hostIp),z.port&&ze(z.port),z.apkName&&Y(z.apkName),z.apkSize&&ee((z.apkSize/(1024*1024)).toFixed(1));return}}catch{}},[I.host,I.port]);_(()=>{E()},[E]),_(()=>()=>{D.current&&clearInterval(D.current)},[]);const Fe=ie(()=>{D.current&&clearInterval(D.current);const k=I.host||"10.0.2.2";D.current=setInterval(async()=>{try{const V=await fetch(`http://${k}:${H}/__inapp_inspector/build-status`);if(V.ok){const S=await V.json();U(S),S.status==="completed"?(D.current&&clearInterval(D.current),L("success"),J("\u2713 APK Build Generated Successfully!"),S.apkSize&&ee((S.apkSize/(1024*1024)).toFixed(1)),S.apkName&&Y(S.apkName),E()):S.status==="failed"&&(D.current&&clearInterval(D.current),L("error"),J("\u2715 Build Failed: "+(S.error||"Gradle error")))}}catch{}},1e3)},[I.host,H,E]),Oe=async()=>{L("medium"),U({status:"running",scheme:F,clean:W,progress:5,currentTask:W?"Cleaning build cache...":"Initializing build...",error:null,apkName:null,apkSize:null});const k=Array.from(new Set([I.host,"10.0.2.2","localhost","127.0.0.1"].filter(Boolean))),V=Array.from(new Set([H,8083,8081,8082].filter(Boolean)));let S=!1;for(const O of k)for(const v of V)try{const A=new AbortController,P=setTimeout(()=>A.abort(),2e3),z=await fetch(`http://${O}:${v}/__inapp_inspector/build-apk?scheme=${F}&clean=${W}`,{signal:A.signal});if(clearTimeout(P),z.ok){S=!0,Fe();return}}catch{}S||U(O=>({...O,status:"failed",error:"Cannot reach build server. Ensure npm start or npm run serve-apk is running on host."}))},Me=async()=>{L("warning"),D.current&&clearInterval(D.current);const k=Array.from(new Set([I.host,"10.0.2.2","localhost","127.0.0.1"].filter(Boolean))),V=Array.from(new Set([H,8083,8081,8082].filter(Boolean)));for(const S of k)for(const O of V)try{const v=new AbortController,A=setTimeout(()=>v.abort(),1500);await fetch(`http://${S}:${O}/__inapp_inspector/stop-build`,{signal:v.signal}),clearTimeout(A)}catch{}U(S=>({...S,status:"idle",currentTask:"Build cancelled by user",logs:[...S.logs||[],"\u{1F6D1} Build cancelled by user."]})),J("Build cancelled")},re=`http://${N}:${H}/${De.replace(/^\/+/,"")}`,Ze=()=>{L("light"),He.share({message:re,title:"Install Android APK"})},$=R.status==="running";return<Te style={o.scrollArea}contentContainerStyle={o.scrollContent}showsVerticalScrollIndicator={!1}>
3
+ </Ke>;export const DebuggingTab=()=>{const I=We(()=>{const k=He.SourceCode?.scriptURL||"";let V="localhost",S=8081;try{if(k.includes("://")){const v=k.split("://")[1].split("/")[0];if(v.includes(":")){const A=v.split(":");V=A[0];const W=parseInt(A[1],10);isNaN(W)||(S=W)}else V=v}}catch{}return{host:V,port:S,scriptURL:k}},[]),[N,Ve]=M(()=>I.host&&I.host!=="localhost"&&I.host!=="127.0.0.1"&&I.host!=="10.0.2.2"?I.host:"192.168.1.2"),[H,ze]=M(I.port||8083),[De,Y]=M("app-debug.apk"),[q,ee]=M(null),[F,oe]=M("assembleRelease"),[L,ve]=M(!0),[R,U]=M({status:"idle",scheme:"assembleRelease",clean:!0,progress:0,currentTask:"",error:null,apkName:null,apkSize:null}),D=X(null),K=X(new Z.Value(0)).current,[Q,Ae]=M(!0),te=X(null);_(()=>{Z.timing(K,{toValue:Math.max(0,Math.min(100,R.progress)),duration:350,useNativeDriver:!1}).start()},[R.progress,K]),_(()=>{R.logs&&R.logs.length>0&&setTimeout(()=>{te.current?.scrollToEnd({animated:!0})},50)},[R.logs]);const E=re(async()=>{const k=Array.from(new Set([I.host,"10.0.2.2","localhost","127.0.0.1"].filter(Boolean))),V=Array.from(new Set([I.port,8083,8081,8082].filter(Boolean)));for(const S of k)for(const O of V)try{const v=new AbortController,A=setTimeout(()=>v.abort(),1200),W=await fetch(`http://${S}:${O}/__inapp_inspector/apk-info`,{signal:v.signal});if(clearTimeout(A),W.ok){const z=await W.json();z.hostIp&&z.hostIp!=="127.0.0.1"&&z.hostIp!=="localhost"&&z.hostIp!=="10.0.2.2"&&Ve(z.hostIp),z.port&&ze(z.port),z.apkName&&Y(z.apkName),z.apkSize&&ee((z.apkSize/(1024*1024)).toFixed(1));return}}catch{}},[I.host,I.port]);_(()=>{E()},[E]),_(()=>()=>{D.current&&clearInterval(D.current)},[]);const Fe=re(()=>{D.current&&clearInterval(D.current);const k=I.host||"10.0.2.2";D.current=setInterval(async()=>{try{const V=await fetch(`http://${k}:${H}/__inapp_inspector/build-status`);if(V.ok){const S=await V.json();U(S),S.status==="completed"?(D.current&&clearInterval(D.current),P("success"),J("\u2713 APK Build Generated Successfully!"),S.apkSize&&ee((S.apkSize/(1024*1024)).toFixed(1)),S.apkName&&Y(S.apkName),E()):S.status==="failed"&&(D.current&&clearInterval(D.current),P("error"),J("\u2715 Build Failed: "+(S.error||"Gradle error")))}}catch{}},1e3)},[I.host,H,E]),Oe=async()=>{P("medium"),U({status:"running",scheme:F,clean:L,progress:5,currentTask:L?"Cleaning build cache...":"Initializing build...",error:null,apkName:null,apkSize:null});const k=Array.from(new Set([I.host,"10.0.2.2","localhost","127.0.0.1"].filter(Boolean))),V=Array.from(new Set([H,8083,8081,8082].filter(Boolean)));let S=!1;for(const O of k)for(const v of V)try{const A=new AbortController,W=setTimeout(()=>A.abort(),2e3),z=await fetch(`http://${O}:${v}/__inapp_inspector/build-apk?scheme=${F}&clean=${L}`,{signal:A.signal});if(clearTimeout(W),z.ok){S=!0,Fe();return}}catch{}S||U(O=>({...O,status:"failed",error:"Cannot reach build server. Ensure npm start or npm run serve-apk is running on host."}))},Me=async()=>{P("warning"),D.current&&clearInterval(D.current);const k=Array.from(new Set([I.host,"10.0.2.2","localhost","127.0.0.1"].filter(Boolean))),V=Array.from(new Set([H,8083,8081,8082].filter(Boolean)));for(const S of k)for(const O of V)try{const v=new AbortController,A=setTimeout(()=>v.abort(),1500);await fetch(`http://${S}:${O}/__inapp_inspector/stop-build`,{signal:v.signal}),clearTimeout(A)}catch{}U(S=>({...S,status:"idle",currentTask:"Build cancelled by user",logs:[...S.logs||[],"\u{1F6D1} Build cancelled by user."]})),J("Build cancelled")},Le=`http://${N}:${H}/${De.replace(/^\/+/,"")}`,$=R.status==="running";return<Te style={o.scrollArea}contentContainerStyle={o.scrollContent}showsVerticalScrollIndicator={!1}>
4
4
 
5
5
  <T style={o.heroCard}>
6
6
  <T style={o.heroHeader}>
@@ -64,7 +64,7 @@ import{useState as M,useEffect as _,useMemo as Le,useCallback as ie,useRef as X}
64
64
 
65
65
  <T style={o.qrCenteredWrapper}>
66
66
  <T style={o.qrInnerFrame}>
67
- <$e value={re}size={235}color={e.primaryBlack}backgroundColor={e.white}/>
67
+ <$e value={Le}size={235}color={e.primaryBlack}backgroundColor={e.white}/>
68
68
  </T>
69
69
  </T>
70
70
  </T>
@@ -84,7 +84,7 @@ import{useState as M,useEffect as _,useMemo as Le,useCallback as ie,useRef as X}
84
84
 
85
85
 
86
86
  <T style={o.subTabStrip}>
87
- <G disabled={$}activeOpacity={.7}onPress={()=>{L("light"),oe("assembleRelease")}}style={[o.subTabItem,F==="assembleRelease"&&o.subTabItemActive]}>
87
+ <G disabled={$}activeOpacity={.7}onPress={()=>{P("light"),oe("assembleRelease")}}style={[o.subTabItem,F==="assembleRelease"&&o.subTabItemActive]}>
88
88
  <T style={{flexDirection:"row",alignItems:"center",gap:5}}>
89
89
  <Re size={12}color={F==="assembleRelease"?e.white:e.grayText}/>
90
90
  <C style={[o.subTabText,F==="assembleRelease"&&o.subTabTextActive]}>
@@ -93,7 +93,7 @@ import{useState as M,useEffect as _,useMemo as Le,useCallback as ie,useRef as X}
93
93
  </T>
94
94
  </G>
95
95
 
96
- <G disabled={$}activeOpacity={.7}onPress={()=>{L("light"),oe("assembleDebug")}}style={[o.subTabItem,F==="assembleDebug"&&o.subTabItemActive]}>
96
+ <G disabled={$}activeOpacity={.7}onPress={()=>{P("light"),oe("assembleDebug")}}style={[o.subTabItem,F==="assembleDebug"&&o.subTabItemActive]}>
97
97
  <T style={{flexDirection:"row",alignItems:"center",gap:5}}>
98
98
  <_e size={12}color={F==="assembleDebug"?e.white:e.grayText}/>
99
99
  <C style={[o.subTabText,F==="assembleDebug"&&o.subTabTextActive]}>
@@ -104,9 +104,9 @@ import{useState as M,useEffect as _,useMemo as Le,useCallback as ie,useRef as X}
104
104
  </T>
105
105
 
106
106
 
107
- <G disabled={$}activeOpacity={.7}onPress={()=>{L("light"),ve(!W)}}style={o.cleanRow}>
108
- <T style={[o.checkboxBox,W&&o.checkboxBoxActive]}>
109
- {W&&<Be size={11}color={e.white}/>}
107
+ <G disabled={$}activeOpacity={.7}onPress={()=>{P("light"),ve(!L)}}style={o.cleanRow}>
108
+ <T style={[o.checkboxBox,L&&o.checkboxBoxActive]}>
109
+ {L&&<Be size={11}color={e.white}/>}
110
110
  </T>
111
111
  <C style={o.cleanLabel}>
112
112
  Clean build cache <C style={o.cleanCode}>(./gradlew clean)</C>
@@ -181,7 +181,7 @@ import{useState as M,useEffect as _,useMemo as Le,useCallback as ie,useRef as X}
181
181
  <T style={o.ctaContentRow}>
182
182
  <Ee size={14}color={e.white}/>
183
183
  <C style={o.generateBtnText}>
184
- {W?"Clean & Generate Build":"Generate Build"}
184
+ {L?"Clean & Generate Build":"Generate Build"}
185
185
  </C>
186
186
  </T>
187
187
  </Se>}
@@ -194,4 +194,4 @@ import{useState as M,useEffect as _,useMemo as Le,useCallback as ie,useRef as X}
194
194
  Ensure both Android devices are connected to the same Wi-Fi network.
195
195
  </C>
196
196
  </T>
197
- </Te>};const o=We.create({scrollArea:{flex:1,backgroundColor:e.contentBg},scrollContent:{padding:12,gap:12,paddingBottom:100},heroCard:{backgroundColor:e.primaryLight,borderRadius:14,borderWidth:1,borderColor:e.grayBorderSecondary,padding:14,shadowColor:e.black,shadowOpacity:.04,shadowRadius:4,shadowOffset:{width:0,height:2},elevation:1,gap:12},heroHeader:{flexDirection:"row",alignItems:"center",gap:10},heroIconWrap:{width:38,height:38,borderRadius:10,backgroundColor:e.purple,alignItems:"center",justifyContent:"center",shadowColor:e.purple,shadowOpacity:.25,shadowRadius:4,shadowOffset:{width:0,height:2},elevation:2},heroTitle:{fontFamily:B.interBold,fontSize:15,color:e.primaryBlack,letterSpacing:-.2},heroSubtitle:{fontFamily:B.interRegular,fontSize:11.5,color:e.grayText,marginTop:1},heroBadge:{flexDirection:"row",alignItems:"center",gap:4,backgroundColor:`${e.emerald500}18`,paddingHorizontal:7,paddingVertical:3,borderRadius:6},pulseDot:{width:6,height:6,borderRadius:3,backgroundColor:e.emerald500},heroBadgeText:{fontFamily:B.interBold,fontSize:9.5,color:e.emerald500},heroMetricsStrip:{flexDirection:"row",alignItems:"center",backgroundColor:e.grayBackground,borderRadius:10,paddingVertical:8,paddingHorizontal:10},heroMetricItem:{flex:1,alignItems:"center",paddingHorizontal:2,minWidth:0},heroMetricLabel:{fontFamily:B.interBold,fontSize:8.5,color:e.grayTextWeak,letterSpacing:.4},heroMetricValue:{fontFamily:B.interBold,fontSize:11,color:e.primaryBlack,marginTop:2},heroMetricDivider:{width:1,height:20,backgroundColor:e.dividerColor},sectionCard:{backgroundColor:e.primaryLight,borderRadius:14,borderWidth:1,borderColor:e.grayBorderSecondary,padding:14,shadowColor:e.black,shadowOpacity:.03,shadowRadius:3,shadowOffset:{width:0,height:1},elevation:1,gap:12},sectionHeaderRow:{flexDirection:"row",alignItems:"center",justifyContent:"space-between"},sectionTitle:{fontFamily:B.interBold,fontSize:10.5,color:e.grayTextWeak,letterSpacing:.8,textTransform:"uppercase"},refreshBtn:{flexDirection:"row",alignItems:"center",gap:4,paddingHorizontal:7,paddingVertical:3,borderRadius:6,backgroundColor:`${e.purple}12`},refreshBtnText:{fontFamily:B.interBold,fontSize:10,color:e.purple},qrCenteredWrapper:{alignItems:"center",justifyContent:"center",backgroundColor:e.grayBackground,padding:12,borderRadius:12,borderWidth:1,borderColor:e.grayBorderSecondary},qrInnerFrame:{backgroundColor:e.white,padding:6,borderRadius:8},urlBox:{flexDirection:"row",alignItems:"center",backgroundColor:e.grayBackground,borderRadius:10,paddingLeft:10,paddingRight:6,paddingVertical:6,borderWidth:1,borderColor:e.grayBorderSecondary,gap:8},urlText:{flex:1,fontFamily:B.interMedium,fontSize:11.5,color:e.skyBlue},actionsRow:{flexDirection:"row",gap:10},actionBtnSecondary:{flex:1,flexDirection:"row",alignItems:"center",justifyContent:"center",gap:6,paddingVertical:9,borderRadius:10,borderWidth:1,borderColor:e.grayBorderSecondary,backgroundColor:e.grayBackground},actionBtnSecondaryText:{fontFamily:B.interBold,fontSize:12,color:e.grayTextStrong},actionBtnPrimary:{flex:1,flexDirection:"row",alignItems:"center",justifyContent:"center",gap:6,paddingVertical:9,borderRadius:10,backgroundColor:e.purple,shadowColor:e.purple,shadowOpacity:.25,shadowRadius:4,shadowOffset:{width:0,height:2},elevation:2},actionBtnPrimaryText:{fontFamily:B.interBold,fontSize:12,color:e.white},completedBadge:{flexDirection:"row",alignItems:"center",gap:3,backgroundColor:`${e.emerald500}18`,paddingHorizontal:6,paddingVertical:2,borderRadius:5},completedBadgeText:{fontFamily:B.interBold,fontSize:9.5,color:e.emerald500},subTabStrip:{flexDirection:"row",backgroundColor:e.grayBackground,borderRadius:8,padding:2,borderWidth:1,borderColor:e.grayBorderSecondary},subTabItem:{flex:1,paddingVertical:7,borderRadius:6,alignItems:"center",justifyContent:"center"},subTabItemActive:{backgroundColor:e.purple,shadowColor:e.purple,shadowOpacity:.2,shadowRadius:3,shadowOffset:{width:0,height:1},elevation:1},subTabText:{fontFamily:B.interMedium,fontSize:11,color:e.grayText},subTabTextActive:{fontFamily:B.interBold,color:e.white},cleanRow:{flexDirection:"row",alignItems:"center",gap:8,paddingVertical:2},checkboxBox:{width:18,height:18,borderRadius:4,borderWidth:1.5,borderColor:e.grayBorderSecondary,backgroundColor:e.grayBackground,alignItems:"center",justifyContent:"center"},checkboxBoxActive:{backgroundColor:e.purple,borderColor:e.purple},cleanLabel:{fontFamily:B.interMedium,fontSize:11.5,color:e.grayTextStrong},cleanCode:{fontFamily:B.interRegular,color:e.grayTextWeak,fontSize:10.5},progressContainer:{backgroundColor:e.grayBackground,borderRadius:10,padding:10,gap:6,borderWidth:1,borderColor:e.grayBorderSecondary},progressTopRow:{flexDirection:"row",alignItems:"center",justifyContent:"space-between"},progressTaskGroup:{flexDirection:"row",alignItems:"center",gap:6,flex:1,paddingRight:8},progressTaskText:{fontFamily:B.interMedium,fontSize:11,color:e.primaryBlack,flex:1},progressPercentageText:{fontFamily:B.interBold,fontSize:11.5,color:e.purple},progressBarTrack:{width:"100%",height:6,borderRadius:3,backgroundColor:e.grayBorderSecondary,overflow:"hidden"},progressBarFill:{height:"100%",backgroundColor:e.purple,borderRadius:3},errorContainer:{flexDirection:"row",alignItems:"center",gap:6,backgroundColor:`${e.errorColor}12`,padding:8,borderRadius:8,borderWidth:1,borderColor:`${e.errorColor}25`},errorText:{fontFamily:B.interRegular,fontSize:11,color:e.errorColor,flex:1},consoleContainer:{backgroundColor:e.slate900,borderRadius:10,borderWidth:1,borderColor:e.slate800,overflow:"hidden",marginTop:4},consoleHeaderRow:{flexDirection:"row",alignItems:"center",justifyContent:"space-between",backgroundColor:e.slate800,paddingHorizontal:10,paddingVertical:6},consoleHeaderTitle:{fontFamily:B.interBold,fontSize:10,color:e.sky400,letterSpacing:.5},consoleToggleBtn:{paddingHorizontal:6,paddingVertical:2,borderRadius:4,backgroundColor:"rgba(255,255,255,0.1)"},consoleToggleText:{fontFamily:B.interMedium,fontSize:9.5,color:e.slate400},consoleLogBox:{maxHeight:140,paddingHorizontal:10,paddingVertical:8},consoleLogContent:{gap:3},consoleLogLine:{fontFamily:B.interRegular,fontSize:10,lineHeight:14},consoleLogPlaceholder:{fontFamily:B.interRegular,fontSize:10,color:e.slate500,fontStyle:"italic"},generateBtn:{backgroundColor:e.purple,borderRadius:10,paddingVertical:10,alignItems:"center",justifyContent:"center",shadowColor:e.purple,shadowOpacity:.25,shadowRadius:4,shadowOffset:{width:0,height:2},elevation:2},generateBtnDisabled:{opacity:.7},buildingActionsRow:{flexDirection:"row",alignItems:"center",gap:10},buildingStatusPill:{flex:1,flexDirection:"row",alignItems:"center",justifyContent:"center",gap:8,backgroundColor:`${e.purple}14`,borderRadius:10,paddingVertical:10,borderWidth:1,borderColor:`${e.purple}30`},buildingStatusPillText:{fontFamily:B.interBold,fontSize:12,color:e.purple},stopBtn:{flexDirection:"row",alignItems:"center",justifyContent:"center",gap:6,backgroundColor:e.errorColor,borderRadius:10,paddingHorizontal:16,paddingVertical:10,shadowColor:e.errorColor,shadowOpacity:.25,shadowRadius:4,shadowOffset:{width:0,height:2},elevation:2},stopBtnText:{fontFamily:B.interBold,fontSize:12,color:e.white},ctaContentRow:{flexDirection:"row",alignItems:"center",gap:6},generateBtnText:{fontFamily:B.interBold,fontSize:12.5,color:e.white},footerNoteRow:{flexDirection:"row",alignItems:"center",gap:6,paddingHorizontal:8},footerNoteText:{fontFamily:B.interRegular,fontSize:11,color:e.grayTextWeak,textAlign:"center",flex:1}});export default DebuggingTab;
197
+ </Te>};const o=Pe.create({scrollArea:{flex:1,backgroundColor:e.contentBg},scrollContent:{padding:12,gap:12,paddingBottom:100},heroCard:{backgroundColor:e.primaryLight,borderRadius:14,borderWidth:1,borderColor:e.grayBorderSecondary,padding:14,shadowColor:e.black,shadowOpacity:.04,shadowRadius:4,shadowOffset:{width:0,height:2},elevation:1,gap:12},heroHeader:{flexDirection:"row",alignItems:"center",gap:10},heroIconWrap:{width:38,height:38,borderRadius:10,backgroundColor:e.purple,alignItems:"center",justifyContent:"center",shadowColor:e.purple,shadowOpacity:.25,shadowRadius:4,shadowOffset:{width:0,height:2},elevation:2},heroTitle:{fontFamily:B.interBold,fontSize:15,color:e.primaryBlack,letterSpacing:-.2},heroSubtitle:{fontFamily:B.interRegular,fontSize:11.5,color:e.grayText,marginTop:1},heroBadge:{flexDirection:"row",alignItems:"center",gap:4,backgroundColor:`${e.emerald500}18`,paddingHorizontal:7,paddingVertical:3,borderRadius:6},pulseDot:{width:6,height:6,borderRadius:3,backgroundColor:e.emerald500},heroBadgeText:{fontFamily:B.interBold,fontSize:9.5,color:e.emerald500},heroMetricsStrip:{flexDirection:"row",alignItems:"center",backgroundColor:e.grayBackground,borderRadius:10,paddingVertical:8,paddingHorizontal:10},heroMetricItem:{flex:1,alignItems:"center",paddingHorizontal:2,minWidth:0},heroMetricLabel:{fontFamily:B.interBold,fontSize:8.5,color:e.grayTextWeak,letterSpacing:.4},heroMetricValue:{fontFamily:B.interBold,fontSize:11,color:e.primaryBlack,marginTop:2},heroMetricDivider:{width:1,height:20,backgroundColor:e.dividerColor},sectionCard:{backgroundColor:e.primaryLight,borderRadius:14,borderWidth:1,borderColor:e.grayBorderSecondary,padding:14,shadowColor:e.black,shadowOpacity:.03,shadowRadius:3,shadowOffset:{width:0,height:1},elevation:1,gap:12},sectionHeaderRow:{flexDirection:"row",alignItems:"center",justifyContent:"space-between"},sectionTitle:{fontFamily:B.interBold,fontSize:10.5,color:e.grayTextWeak,letterSpacing:.8,textTransform:"uppercase"},refreshBtn:{flexDirection:"row",alignItems:"center",gap:4,paddingHorizontal:7,paddingVertical:3,borderRadius:6,backgroundColor:`${e.purple}12`},refreshBtnText:{fontFamily:B.interBold,fontSize:10,color:e.purple},qrCenteredWrapper:{alignItems:"center",justifyContent:"center",backgroundColor:e.grayBackground,padding:12,borderRadius:12,borderWidth:1,borderColor:e.grayBorderSecondary},qrInnerFrame:{backgroundColor:e.white,padding:6,borderRadius:8},urlBox:{flexDirection:"row",alignItems:"center",backgroundColor:e.grayBackground,borderRadius:10,paddingLeft:10,paddingRight:6,paddingVertical:6,borderWidth:1,borderColor:e.grayBorderSecondary,gap:8},urlText:{flex:1,fontFamily:B.interMedium,fontSize:11.5,color:e.skyBlue},actionsRow:{flexDirection:"row",gap:10},actionBtnSecondary:{flex:1,flexDirection:"row",alignItems:"center",justifyContent:"center",gap:6,paddingVertical:9,borderRadius:10,borderWidth:1,borderColor:e.grayBorderSecondary,backgroundColor:e.grayBackground},actionBtnSecondaryText:{fontFamily:B.interBold,fontSize:12,color:e.grayTextStrong},actionBtnPrimary:{flex:1,flexDirection:"row",alignItems:"center",justifyContent:"center",gap:6,paddingVertical:9,borderRadius:10,backgroundColor:e.purple,shadowColor:e.purple,shadowOpacity:.25,shadowRadius:4,shadowOffset:{width:0,height:2},elevation:2},actionBtnPrimaryText:{fontFamily:B.interBold,fontSize:12,color:e.white},completedBadge:{flexDirection:"row",alignItems:"center",gap:3,backgroundColor:`${e.emerald500}18`,paddingHorizontal:6,paddingVertical:2,borderRadius:5},completedBadgeText:{fontFamily:B.interBold,fontSize:9.5,color:e.emerald500},subTabStrip:{flexDirection:"row",backgroundColor:e.grayBackground,borderRadius:8,padding:2,borderWidth:1,borderColor:e.grayBorderSecondary},subTabItem:{flex:1,paddingVertical:7,borderRadius:6,alignItems:"center",justifyContent:"center"},subTabItemActive:{backgroundColor:e.purple,shadowColor:e.purple,shadowOpacity:.2,shadowRadius:3,shadowOffset:{width:0,height:1},elevation:1},subTabText:{fontFamily:B.interMedium,fontSize:11,color:e.grayText},subTabTextActive:{fontFamily:B.interBold,color:e.white},cleanRow:{flexDirection:"row",alignItems:"center",gap:8,paddingVertical:2},checkboxBox:{width:18,height:18,borderRadius:4,borderWidth:1.5,borderColor:e.grayBorderSecondary,backgroundColor:e.grayBackground,alignItems:"center",justifyContent:"center"},checkboxBoxActive:{backgroundColor:e.purple,borderColor:e.purple},cleanLabel:{fontFamily:B.interMedium,fontSize:11.5,color:e.grayTextStrong},cleanCode:{fontFamily:B.interRegular,color:e.grayTextWeak,fontSize:10.5},progressContainer:{backgroundColor:e.grayBackground,borderRadius:10,padding:10,gap:6,borderWidth:1,borderColor:e.grayBorderSecondary},progressTopRow:{flexDirection:"row",alignItems:"center",justifyContent:"space-between"},progressTaskGroup:{flexDirection:"row",alignItems:"center",gap:6,flex:1,paddingRight:8},progressTaskText:{fontFamily:B.interMedium,fontSize:11,color:e.primaryBlack,flex:1},progressPercentageText:{fontFamily:B.interBold,fontSize:11.5,color:e.purple},progressBarTrack:{width:"100%",height:6,borderRadius:3,backgroundColor:e.grayBorderSecondary,overflow:"hidden"},progressBarFill:{height:"100%",backgroundColor:e.purple,borderRadius:3},errorContainer:{flexDirection:"row",alignItems:"center",gap:6,backgroundColor:`${e.errorColor}12`,padding:8,borderRadius:8,borderWidth:1,borderColor:`${e.errorColor}25`},errorText:{fontFamily:B.interRegular,fontSize:11,color:e.errorColor,flex:1},consoleContainer:{backgroundColor:e.slate900,borderRadius:10,borderWidth:1,borderColor:e.slate800,overflow:"hidden",marginTop:4},consoleHeaderRow:{flexDirection:"row",alignItems:"center",justifyContent:"space-between",backgroundColor:e.slate800,paddingHorizontal:10,paddingVertical:6},consoleHeaderTitle:{fontFamily:B.interBold,fontSize:10,color:e.sky400,letterSpacing:.5},consoleToggleBtn:{paddingHorizontal:6,paddingVertical:2,borderRadius:4,backgroundColor:"rgba(255,255,255,0.1)"},consoleToggleText:{fontFamily:B.interMedium,fontSize:9.5,color:e.slate400},consoleLogBox:{maxHeight:140,paddingHorizontal:10,paddingVertical:8},consoleLogContent:{gap:3},consoleLogLine:{fontFamily:B.interRegular,fontSize:10,lineHeight:14},consoleLogPlaceholder:{fontFamily:B.interRegular,fontSize:10,color:e.slate500,fontStyle:"italic"},generateBtn:{backgroundColor:e.purple,borderRadius:10,paddingVertical:10,alignItems:"center",justifyContent:"center",shadowColor:e.purple,shadowOpacity:.25,shadowRadius:4,shadowOffset:{width:0,height:2},elevation:2},generateBtnDisabled:{opacity:.7},buildingActionsRow:{flexDirection:"row",alignItems:"center",gap:10},buildingStatusPill:{flex:1,flexDirection:"row",alignItems:"center",justifyContent:"center",gap:8,backgroundColor:`${e.purple}14`,borderRadius:10,paddingVertical:10,borderWidth:1,borderColor:`${e.purple}30`},buildingStatusPillText:{fontFamily:B.interBold,fontSize:12,color:e.purple},stopBtn:{flexDirection:"row",alignItems:"center",justifyContent:"center",gap:6,backgroundColor:e.errorColor,borderRadius:10,paddingHorizontal:16,paddingVertical:10,shadowColor:e.errorColor,shadowOpacity:.25,shadowRadius:4,shadowOffset:{width:0,height:2},elevation:2},stopBtnText:{fontFamily:B.interBold,fontSize:12,color:e.white},ctaContentRow:{flexDirection:"row",alignItems:"center",gap:6},generateBtnText:{fontFamily:B.interBold,fontSize:12.5,color:e.white},footerNoteRow:{flexDirection:"row",alignItems:"center",gap:6,paddingHorizontal:8},footerNoteText:{fontFamily:B.interRegular,fontSize:11,color:e.grayTextWeak,textAlign:"center",flex:1}});export default DebuggingTab;