react-native-inapp-inspector 2.3.15 → 2.3.17

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 (381) hide show
  1. package/README.md +1 -0
  2. package/android/src/main/java/com/inappinspector/NetworkInspectorModule.kt +438 -7
  3. package/bin/cli.js +0 -0
  4. package/dist/commonjs/capture.d.ts +26 -0
  5. package/dist/commonjs/capture.js +32 -0
  6. package/dist/commonjs/components/AnalyticsEventCard.js +11 -11
  7. package/dist/commonjs/components/AnimatedEntrance.js +6 -70
  8. package/dist/commonjs/components/DomainHeader.js +3 -48
  9. package/dist/commonjs/components/EmptyState.js +2 -2
  10. package/dist/commonjs/components/HeadersSection.js +14 -34
  11. package/dist/commonjs/components/Inspector/AnalyticsTab.js +1 -24
  12. package/dist/commonjs/components/Inspector/ConsoleTab.js +1 -23
  13. package/dist/commonjs/components/Inspector/CrashTab.js +4 -25
  14. package/dist/commonjs/components/Inspector/DebuggingTab.js +2 -2
  15. package/dist/commonjs/components/Inspector/FeedbackModal.d.ts +7 -0
  16. package/dist/commonjs/components/Inspector/FeedbackModal.js +552 -0
  17. package/dist/commonjs/components/Inspector/InspectorHeader.js +675 -285
  18. package/dist/commonjs/components/Inspector/MainScreen.js +66 -69
  19. package/dist/commonjs/components/Inspector/MediaGalleryTab.d.ts +2 -0
  20. package/dist/commonjs/components/Inspector/MediaGalleryTab.js +307 -0
  21. package/dist/commonjs/components/Inspector/MediaPreviewModal.d.ts +11 -0
  22. package/dist/commonjs/components/Inspector/MediaPreviewModal.js +393 -0
  23. package/dist/commonjs/components/Inspector/NetworkTab.js +196 -206
  24. package/dist/commonjs/components/Inspector/NpmStarPrompt.d.ts +3 -0
  25. package/dist/commonjs/components/Inspector/NpmStarPrompt.js +494 -0
  26. package/dist/commonjs/components/Inspector/NpmUpdateToast.js +4 -9
  27. package/dist/commonjs/components/Inspector/PerformanceTab.js +8 -1
  28. package/dist/commonjs/components/Inspector/ReduxTab.js +4 -24
  29. package/dist/commonjs/components/Inspector/SettingsPanel.js +1280 -173
  30. package/dist/commonjs/components/Inspector/SkeletonPlaceholder.js +2 -2
  31. package/dist/commonjs/components/Inspector/StorageTab.js +3 -26
  32. package/dist/commonjs/components/Inspector/TabBar.js +55 -25
  33. package/dist/commonjs/components/Inspector/UpdateAvailableModal.js +5 -10
  34. package/dist/commonjs/components/JsonViewer.js +43 -20
  35. package/dist/commonjs/components/LogCard.js +5 -5
  36. package/dist/commonjs/components/MetaAccordion.js +78 -80
  37. package/dist/commonjs/components/NetworkIcons.d.ts +13 -0
  38. package/dist/commonjs/components/NetworkIcons.js +83 -2
  39. package/dist/commonjs/components/SectionHeader.js +3 -48
  40. package/dist/commonjs/components/SkeletonPlaceholder.js +2 -2
  41. package/dist/commonjs/components/SourcePageCard.js +43 -45
  42. package/dist/commonjs/components/Toast.js +4 -4
  43. package/dist/commonjs/components/TouchableScale.js +9 -65
  44. package/dist/commonjs/components/TreeNode.js +2 -14
  45. package/dist/commonjs/constants/telemetryConfig.d.ts +3 -3
  46. package/dist/commonjs/constants/telemetryConfig.js +3 -3
  47. package/dist/commonjs/constants/version.d.ts +1 -1
  48. package/dist/commonjs/constants/version.js +1 -1
  49. package/dist/commonjs/customHooks/useAccordion.d.ts +3 -8
  50. package/dist/commonjs/customHooks/useAccordion.js +6 -36
  51. package/dist/commonjs/helpers/index.d.ts +3 -1
  52. package/dist/commonjs/helpers/index.js +11 -1
  53. package/dist/commonjs/helpers/remoteConfig.d.ts +4 -0
  54. package/dist/commonjs/helpers/remoteConfig.js +165 -0
  55. package/dist/commonjs/helpers/searchQueryParser.js +2 -0
  56. package/dist/commonjs/helpers/telemetry.d.ts +5 -0
  57. package/dist/commonjs/helpers/telemetry.js +339 -8
  58. package/dist/commonjs/i18n/locales/en.json +66 -2
  59. package/dist/commonjs/index.d.ts +2 -0
  60. package/dist/commonjs/index.js +70 -23
  61. package/dist/commonjs/native/NativeInspector.d.ts +60 -0
  62. package/dist/commonjs/native/NativeInspector.js +109 -2
  63. package/dist/commonjs/native/NativeNetworkInspector.d.ts +8 -0
  64. package/dist/commonjs/styles/AppColors.d.ts +36 -0
  65. package/dist/commonjs/styles/AppColors.js +36 -0
  66. package/dist/commonjs/styles/AppFonts.d.ts +2 -0
  67. package/dist/commonjs/styles/AppFonts.js +1 -0
  68. package/dist/commonjs/styles/index.d.ts +25 -1
  69. package/dist/commonjs/styles/index.js +22 -1
  70. package/dist/commonjs/types/enums.d.ts +2 -0
  71. package/dist/commonjs/types/enums.js +2 -0
  72. package/dist/commonjs/types/index.d.ts +2 -2
  73. package/dist/commonjs/types/interfaces.d.ts +12 -0
  74. package/dist/esm/capture.d.ts +26 -0
  75. package/dist/esm/capture.js +29 -0
  76. package/dist/esm/components/AnalyticsEventCard.js +11 -11
  77. package/dist/esm/components/AnimatedEntrance.js +4 -38
  78. package/dist/esm/components/DomainHeader.js +4 -16
  79. package/dist/esm/components/EmptyState.js +2 -2
  80. package/dist/esm/components/HeadersSection.js +16 -36
  81. package/dist/esm/components/Inspector/AnalyticsTab.js +3 -26
  82. package/dist/esm/components/Inspector/ConsoleTab.js +3 -25
  83. package/dist/esm/components/Inspector/CrashTab.js +6 -27
  84. package/dist/esm/components/Inspector/DebuggingTab.js +3 -3
  85. package/dist/esm/components/Inspector/FeedbackModal.d.ts +7 -0
  86. package/dist/esm/components/Inspector/FeedbackModal.js +515 -0
  87. package/dist/esm/components/Inspector/InspectorHeader.js +678 -288
  88. package/dist/esm/components/Inspector/MainScreen.js +67 -70
  89. package/dist/esm/components/Inspector/MediaGalleryTab.d.ts +2 -0
  90. package/dist/esm/components/Inspector/MediaGalleryTab.js +267 -0
  91. package/dist/esm/components/Inspector/MediaPreviewModal.d.ts +11 -0
  92. package/dist/esm/components/Inspector/MediaPreviewModal.js +353 -0
  93. package/dist/esm/components/Inspector/NetworkTab.js +199 -209
  94. package/dist/esm/components/Inspector/NpmStarPrompt.d.ts +3 -0
  95. package/dist/esm/components/Inspector/NpmStarPrompt.js +454 -0
  96. package/dist/esm/components/Inspector/NpmUpdateToast.js +5 -10
  97. package/dist/esm/components/Inspector/PerformanceTab.js +8 -1
  98. package/dist/esm/components/Inspector/ReduxTab.js +6 -26
  99. package/dist/esm/components/Inspector/SettingsPanel.js +1283 -176
  100. package/dist/esm/components/Inspector/SkeletonPlaceholder.js +2 -2
  101. package/dist/esm/components/Inspector/StorageTab.js +3 -26
  102. package/dist/esm/components/Inspector/TabBar.js +56 -26
  103. package/dist/esm/components/Inspector/UpdateAvailableModal.js +6 -11
  104. package/dist/esm/components/JsonViewer.js +43 -20
  105. package/dist/esm/components/LogCard.js +5 -5
  106. package/dist/esm/components/MetaAccordion.js +79 -81
  107. package/dist/esm/components/NetworkIcons.d.ts +13 -0
  108. package/dist/esm/components/NetworkIcons.js +68 -0
  109. package/dist/esm/components/SectionHeader.js +4 -16
  110. package/dist/esm/components/SkeletonPlaceholder.js +2 -2
  111. package/dist/esm/components/SourcePageCard.js +44 -46
  112. package/dist/esm/components/Toast.js +4 -4
  113. package/dist/esm/components/TouchableScale.js +7 -33
  114. package/dist/esm/components/TreeNode.js +4 -16
  115. package/dist/esm/constants/telemetryConfig.d.ts +3 -3
  116. package/dist/esm/constants/telemetryConfig.js +3 -3
  117. package/dist/esm/constants/version.d.ts +1 -1
  118. package/dist/esm/constants/version.js +1 -1
  119. package/dist/esm/customHooks/useAccordion.d.ts +3 -8
  120. package/dist/esm/customHooks/useAccordion.js +7 -37
  121. package/dist/esm/helpers/index.d.ts +3 -1
  122. package/dist/esm/helpers/index.js +9 -0
  123. package/dist/esm/helpers/remoteConfig.d.ts +4 -0
  124. package/dist/esm/helpers/remoteConfig.js +160 -0
  125. package/dist/esm/helpers/searchQueryParser.js +2 -0
  126. package/dist/esm/helpers/telemetry.d.ts +5 -0
  127. package/dist/esm/helpers/telemetry.js +332 -9
  128. package/dist/esm/i18n/locales/en.json +66 -2
  129. package/dist/esm/index.d.ts +2 -0
  130. package/dist/esm/index.js +66 -23
  131. package/dist/esm/native/NativeInspector.d.ts +60 -0
  132. package/dist/esm/native/NativeInspector.js +100 -1
  133. package/dist/esm/native/NativeNetworkInspector.d.ts +8 -0
  134. package/dist/esm/styles/AppColors.d.ts +36 -0
  135. package/dist/esm/styles/AppColors.js +36 -0
  136. package/dist/esm/styles/AppFonts.d.ts +2 -0
  137. package/dist/esm/styles/AppFonts.js +1 -0
  138. package/dist/esm/styles/index.d.ts +25 -1
  139. package/dist/esm/styles/index.js +22 -1
  140. package/dist/esm/types/enums.d.ts +2 -0
  141. package/dist/esm/types/enums.js +2 -0
  142. package/dist/esm/types/index.d.ts +2 -2
  143. package/dist/esm/types/interfaces.d.ts +12 -0
  144. package/ios/NetworkInspectorModule.h +1 -0
  145. package/ios/NetworkInspectorModule.mm +736 -7
  146. package/package.json +10 -2
  147. package/react-native-inapp-inspector.podspec +1 -0
  148. package/src/capture.ts +101 -0
  149. package/src/components/AnalyticsEventCard.tsx +15 -13
  150. package/src/components/AnimatedEntrance.tsx +3 -47
  151. package/src/components/DomainHeader.tsx +4 -17
  152. package/src/components/EmptyState.tsx +2 -2
  153. package/src/components/HeadersSection.tsx +31 -56
  154. package/src/components/Inspector/AnalyticsTab.tsx +2 -25
  155. package/src/components/Inspector/ConsoleTab.tsx +2 -24
  156. package/src/components/Inspector/CrashTab.tsx +4 -25
  157. package/src/components/Inspector/DebuggingTab.tsx +2 -2
  158. package/src/components/Inspector/FeedbackModal.tsx +626 -0
  159. package/src/components/Inspector/InspectorHeader.tsx +1230 -728
  160. package/src/components/Inspector/MainScreen.tsx +97 -82
  161. package/src/components/Inspector/MediaGalleryTab.tsx +355 -0
  162. package/src/components/Inspector/MediaPreviewModal.tsx +435 -0
  163. package/src/components/Inspector/NetworkTab.tsx +83 -93
  164. package/src/components/Inspector/NpmStarPrompt.tsx +532 -0
  165. package/src/components/Inspector/NpmUpdateToast.tsx +4 -9
  166. package/src/components/Inspector/PerformanceTab.tsx +8 -1
  167. package/src/components/Inspector/ReduxTab.tsx +5 -25
  168. package/src/components/Inspector/SettingsPanel.tsx +1493 -225
  169. package/src/components/Inspector/SkeletonPlaceholder.tsx +2 -2
  170. package/src/components/Inspector/StorageTab.tsx +3 -26
  171. package/src/components/Inspector/TabBar.tsx +63 -32
  172. package/src/components/Inspector/UpdateAvailableModal.tsx +6 -10
  173. package/src/components/JsonViewer.tsx +101 -60
  174. package/src/components/LogCard.tsx +10 -8
  175. package/src/components/MetaAccordion.tsx +6 -6
  176. package/src/components/NetworkIcons.tsx +242 -0
  177. package/src/components/SectionHeader.tsx +4 -16
  178. package/src/components/SkeletonPlaceholder.tsx +2 -2
  179. package/src/components/SourcePageCard.tsx +57 -55
  180. package/src/components/Toast.tsx +4 -4
  181. package/src/components/TouchableScale.tsx +8 -38
  182. package/src/components/TreeNode.tsx +5 -20
  183. package/src/constants/telemetryConfig.ts +3 -5
  184. package/src/constants/version.ts +1 -1
  185. package/src/customHooks/useAccordion.tsx +10 -43
  186. package/src/helpers/index.ts +11 -1
  187. package/src/helpers/remoteConfig.ts +212 -0
  188. package/src/helpers/searchQueryParser.ts +3 -0
  189. package/src/helpers/telemetry.ts +381 -10
  190. package/src/i18n/locales/en.json +69 -2
  191. package/src/index.tsx +93 -23
  192. package/src/native/NativeInspector.ts +186 -1
  193. package/src/native/NativeNetworkInspector.ts +9 -0
  194. package/src/styles/AppColors.ts +38 -0
  195. package/src/styles/AppFonts.ts +2 -0
  196. package/src/styles/index.ts +23 -2
  197. package/src/types/enums.ts +4 -0
  198. package/src/types/index.ts +2 -2
  199. package/src/types/interfaces.ts +12 -0
  200. package/android/.gradle/8.9/checksums/checksums.lock +0 -0
  201. package/android/.gradle/8.9/checksums/md5-checksums.bin +0 -0
  202. package/android/.gradle/8.9/checksums/sha1-checksums.bin +0 -0
  203. package/android/.gradle/8.9/dependencies-accessors/gc.properties +0 -0
  204. package/android/.gradle/8.9/executionHistory/executionHistory.lock +0 -0
  205. package/android/.gradle/8.9/fileChanges/last-build.bin +0 -0
  206. package/android/.gradle/8.9/fileHashes/fileHashes.lock +0 -0
  207. package/android/.gradle/8.9/gc.properties +0 -0
  208. package/android/.gradle/9.2.0/checksums/checksums.lock +0 -0
  209. package/android/.gradle/9.2.0/fileChanges/last-build.bin +0 -0
  210. package/android/.gradle/9.2.0/fileHashes/fileHashes.bin +0 -0
  211. package/android/.gradle/9.2.0/fileHashes/fileHashes.lock +0 -0
  212. package/android/.gradle/9.2.0/gc.properties +0 -0
  213. package/android/.gradle/buildOutputCleanup/buildOutputCleanup.lock +0 -0
  214. package/android/.gradle/buildOutputCleanup/cache.properties +0 -2
  215. package/android/.gradle/vcs-1/gc.properties +0 -0
  216. package/android/build/.transforms/6683d6eeaa3e1dfa689c3385111a0386/results.bin +0 -1
  217. package/android/build/.transforms/6683d6eeaa3e1dfa689c3385111a0386/transformed/classes/classes_dex/classes.dex +0 -0
  218. package/android/build/.transforms/9d2a3e5e0f0ea07cafb0c0bf290630ee/results.bin +0 -1
  219. package/android/build/.transforms/9d2a3e5e0f0ea07cafb0c0bf290630ee/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/inappinspector/BuildConfig.dex +0 -0
  220. package/android/build/.transforms/9d2a3e5e0f0ea07cafb0c0bf290630ee/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/inappinspector/InAppInspectorFloatingView$iconView$1.dex +0 -0
  221. package/android/build/.transforms/9d2a3e5e0f0ea07cafb0c0bf290630ee/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/inappinspector/InAppInspectorFloatingView.dex +0 -0
  222. package/android/build/.transforms/9d2a3e5e0f0ea07cafb0c0bf290630ee/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/inappinspector/NativeNetworkInspectorSpec.dex +0 -0
  223. package/android/build/.transforms/9d2a3e5e0f0ea07cafb0c0bf290630ee/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/inappinspector/NetworkInspectorModule$Companion.dex +0 -0
  224. package/android/build/.transforms/9d2a3e5e0f0ea07cafb0c0bf290630ee/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/inappinspector/NetworkInspectorModule$frameCallback$1.dex +0 -0
  225. package/android/build/.transforms/9d2a3e5e0f0ea07cafb0c0bf290630ee/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/inappinspector/NetworkInspectorModule$shakeListener$1.dex +0 -0
  226. package/android/build/.transforms/9d2a3e5e0f0ea07cafb0c0bf290630ee/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/inappinspector/NetworkInspectorModule.dex +0 -0
  227. package/android/build/.transforms/9d2a3e5e0f0ea07cafb0c0bf290630ee/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/inappinspector/NetworkInspectorPackage.dex +0 -0
  228. package/android/build/.transforms/9d2a3e5e0f0ea07cafb0c0bf290630ee/transformed/bundleLibRuntimeToDirDebug/desugar_graph.bin +0 -0
  229. package/android/build/generated/source/buildConfig/debug/com/inappinspector/BuildConfig.java +0 -10
  230. package/android/build/generated/source/codegen/java/com/inappinspector/NativeNetworkInspectorSpec.java +0 -104
  231. package/android/build/generated/source/codegen/jni/CMakeLists.txt +0 -28
  232. package/android/build/generated/source/codegen/jni/RNInAppInspectorSpec-generated.cpp +0 -128
  233. package/android/build/generated/source/codegen/jni/RNInAppInspectorSpec.h +0 -31
  234. package/android/build/generated/source/codegen/jni/react/renderer/components/RNInAppInspectorSpec/ComponentDescriptors.cpp +0 -22
  235. package/android/build/generated/source/codegen/jni/react/renderer/components/RNInAppInspectorSpec/ComponentDescriptors.h +0 -24
  236. package/android/build/generated/source/codegen/jni/react/renderer/components/RNInAppInspectorSpec/EventEmitters.cpp +0 -16
  237. package/android/build/generated/source/codegen/jni/react/renderer/components/RNInAppInspectorSpec/EventEmitters.h +0 -17
  238. package/android/build/generated/source/codegen/jni/react/renderer/components/RNInAppInspectorSpec/Props.cpp +0 -19
  239. package/android/build/generated/source/codegen/jni/react/renderer/components/RNInAppInspectorSpec/Props.h +0 -18
  240. package/android/build/generated/source/codegen/jni/react/renderer/components/RNInAppInspectorSpec/RNInAppInspectorSpecJSI.h +0 -177
  241. package/android/build/generated/source/codegen/jni/react/renderer/components/RNInAppInspectorSpec/ShadowNodes.cpp +0 -17
  242. package/android/build/generated/source/codegen/jni/react/renderer/components/RNInAppInspectorSpec/ShadowNodes.h +0 -23
  243. package/android/build/generated/source/codegen/jni/react/renderer/components/RNInAppInspectorSpec/States.cpp +0 -16
  244. package/android/build/generated/source/codegen/jni/react/renderer/components/RNInAppInspectorSpec/States.h +0 -20
  245. package/android/build/generated/source/codegen/schema.json +0 -1
  246. package/android/build/intermediates/aapt_friendly_merged_manifests/debug/processDebugManifest/aapt/AndroidManifest.xml +0 -7
  247. package/android/build/intermediates/aapt_friendly_merged_manifests/debug/processDebugManifest/aapt/output-metadata.json +0 -18
  248. package/android/build/intermediates/aar_main_jar/debug/syncDebugLibJars/classes.jar +0 -0
  249. package/android/build/intermediates/aar_metadata/debug/writeDebugAarMetadata/aar-metadata.properties +0 -6
  250. package/android/build/intermediates/annotation_processor_list/debug/javaPreCompileDebug/annotationProcessors.json +0 -1
  251. package/android/build/intermediates/annotations_typedef_file/debug/extractDebugAnnotations/typedefs.txt +0 -0
  252. package/android/build/intermediates/compile_library_classes_jar/debug/bundleLibCompileToJarDebug/classes.jar +0 -0
  253. package/android/build/intermediates/compile_r_class_jar/debug/generateDebugRFile/R.jar +0 -0
  254. package/android/build/intermediates/compile_symbol_list/debug/generateDebugRFile/R.txt +0 -0
  255. package/android/build/intermediates/incremental/debug/packageDebugResources/compile-file-map.properties +0 -1
  256. package/android/build/intermediates/incremental/debug/packageDebugResources/merger.xml +0 -2
  257. package/android/build/intermediates/incremental/debug-mergeJavaRes/merge-state +0 -0
  258. package/android/build/intermediates/incremental/mergeDebugJniLibFolders/merger.xml +0 -2
  259. package/android/build/intermediates/incremental/mergeDebugShaders/merger.xml +0 -2
  260. package/android/build/intermediates/incremental/packageDebugAssets/merger.xml +0 -2
  261. package/android/build/intermediates/java_res/debug/processDebugJavaRes/out/META-INF/react-native-inapp-inspector_debug.kotlin_module +0 -0
  262. package/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/inappinspector/BuildConfig.class +0 -0
  263. package/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/inappinspector/NativeNetworkInspectorSpec.class +0 -0
  264. package/android/build/intermediates/local_only_symbol_list/debug/parseDebugLocalResources/R-def.txt +0 -2
  265. package/android/build/intermediates/manifest_merge_blame_file/debug/processDebugManifest/manifest-merger-blame-debug-report.txt +0 -7
  266. package/android/build/intermediates/merged_java_res/debug/mergeDebugJavaResource/feature-react-native-inapp-inspector.jar +0 -0
  267. package/android/build/intermediates/merged_manifest/debug/processDebugManifest/AndroidManifest.xml +0 -7
  268. package/android/build/intermediates/navigation_json/debug/extractDeepLinksDebug/navigation.json +0 -1
  269. package/android/build/intermediates/nested_resources_validation_report/debug/generateDebugResources/nestedResourcesValidationReport.txt +0 -1
  270. package/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/META-INF/react-native-inapp-inspector_debug.kotlin_module +0 -0
  271. package/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/com/inappinspector/BuildConfig.class +0 -0
  272. package/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/com/inappinspector/InAppInspectorFloatingView$iconView$1.class +0 -0
  273. package/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/com/inappinspector/InAppInspectorFloatingView.class +0 -0
  274. package/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/com/inappinspector/NativeNetworkInspectorSpec.class +0 -0
  275. package/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/com/inappinspector/NetworkInspectorModule$Companion.class +0 -0
  276. package/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/com/inappinspector/NetworkInspectorModule$frameCallback$1.class +0 -0
  277. package/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/com/inappinspector/NetworkInspectorModule$shakeListener$1.class +0 -0
  278. package/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/com/inappinspector/NetworkInspectorModule.class +0 -0
  279. package/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/com/inappinspector/NetworkInspectorPackage.class +0 -0
  280. package/android/build/intermediates/runtime_library_classes_jar/debug/bundleLibRuntimeToJarDebug/classes.jar +0 -0
  281. package/android/build/intermediates/symbol_list_with_package_name/debug/generateDebugRFile/package-aware-r.txt +0 -1
  282. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/inputs/source-to-output.tab +0 -0
  283. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/inputs/source-to-output.tab.keystream +0 -0
  284. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/inputs/source-to-output.tab.keystream.len +0 -0
  285. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/inputs/source-to-output.tab.len +0 -0
  286. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/inputs/source-to-output.tab.values.at +0 -0
  287. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/inputs/source-to-output.tab_i +0 -0
  288. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/inputs/source-to-output.tab_i.len +0 -0
  289. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/class-attributes.tab +0 -0
  290. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/class-attributes.tab.keystream +0 -0
  291. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/class-attributes.tab.keystream.len +0 -0
  292. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/class-attributes.tab.len +0 -0
  293. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/class-attributes.tab.values.at +0 -0
  294. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/class-attributes.tab_i +0 -0
  295. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/class-attributes.tab_i.len +0 -0
  296. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/class-fq-name-to-source.tab +0 -0
  297. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/class-fq-name-to-source.tab.keystream +0 -0
  298. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/class-fq-name-to-source.tab.keystream.len +0 -0
  299. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/class-fq-name-to-source.tab.len +0 -0
  300. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/class-fq-name-to-source.tab.values.at +0 -0
  301. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/class-fq-name-to-source.tab_i +0 -0
  302. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/class-fq-name-to-source.tab_i.len +0 -0
  303. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/constants.tab +0 -0
  304. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/constants.tab.keystream +0 -0
  305. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/constants.tab.keystream.len +0 -0
  306. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/constants.tab.len +0 -0
  307. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/constants.tab.values.at +0 -0
  308. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/constants.tab_i +0 -0
  309. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/constants.tab_i.len +0 -0
  310. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/internal-name-to-source.tab +0 -0
  311. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/internal-name-to-source.tab.keystream +0 -0
  312. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/internal-name-to-source.tab.keystream.len +0 -0
  313. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/internal-name-to-source.tab.len +0 -0
  314. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/internal-name-to-source.tab.values.at +0 -0
  315. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/internal-name-to-source.tab_i +0 -0
  316. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/internal-name-to-source.tab_i.len +0 -0
  317. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/proto.tab +0 -0
  318. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/proto.tab.keystream +0 -0
  319. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/proto.tab.keystream.len +0 -0
  320. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/proto.tab.len +0 -0
  321. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/proto.tab.values.at +0 -0
  322. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/proto.tab_i +0 -0
  323. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/proto.tab_i.len +0 -0
  324. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/source-to-classes.tab +0 -0
  325. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/source-to-classes.tab.keystream +0 -0
  326. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/source-to-classes.tab.keystream.len +0 -0
  327. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/source-to-classes.tab.len +0 -0
  328. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/source-to-classes.tab.values.at +0 -0
  329. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/source-to-classes.tab_i +0 -0
  330. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/source-to-classes.tab_i.len +0 -0
  331. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/subtypes.tab +0 -0
  332. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/subtypes.tab.keystream +0 -0
  333. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/subtypes.tab.keystream.len +0 -0
  334. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/subtypes.tab.len +0 -0
  335. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/subtypes.tab.values.at +0 -0
  336. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/subtypes.tab_i +0 -0
  337. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/subtypes.tab_i.len +0 -0
  338. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/supertypes.tab +0 -0
  339. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/supertypes.tab.keystream +0 -0
  340. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/supertypes.tab.keystream.len +0 -0
  341. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/supertypes.tab.len +0 -0
  342. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/supertypes.tab.values.at +0 -0
  343. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/supertypes.tab_i +0 -0
  344. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/supertypes.tab_i.len +0 -0
  345. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/counters.tab +0 -2
  346. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/file-to-id.tab +0 -0
  347. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/file-to-id.tab.keystream +0 -0
  348. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/file-to-id.tab.keystream.len +0 -0
  349. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/file-to-id.tab.len +0 -0
  350. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/file-to-id.tab.values.at +0 -0
  351. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/file-to-id.tab_i +0 -0
  352. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/file-to-id.tab_i.len +0 -0
  353. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/id-to-file.tab +0 -0
  354. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/id-to-file.tab.keystream +0 -0
  355. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/id-to-file.tab.keystream.len +0 -0
  356. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/id-to-file.tab.len +0 -0
  357. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/id-to-file.tab.values.at +0 -0
  358. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/id-to-file.tab_i +0 -0
  359. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/id-to-file.tab_i.len +0 -0
  360. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/lookups.tab +0 -0
  361. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/lookups.tab.keystream +0 -0
  362. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/lookups.tab.keystream.len +0 -0
  363. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/lookups.tab.len +0 -0
  364. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/lookups.tab.values.at +0 -0
  365. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/lookups.tab_i +0 -0
  366. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/lookups.tab_i.len +0 -0
  367. package/android/build/kotlin/compileDebugKotlin/cacheable/last-build.bin +0 -0
  368. package/android/build/kotlin/compileDebugKotlin/classpath-snapshot/shrunk-classpath-snapshot.bin +0 -0
  369. package/android/build/kotlin/compileDebugKotlin/local-state/build-history.bin +0 -0
  370. package/android/build/outputs/aar/react-native-inapp-inspector-debug.aar +0 -0
  371. package/android/build/outputs/logs/manifest-merger-debug-report.txt +0 -17
  372. package/android/build/reports/problems/problems-report.html +0 -659
  373. package/android/build/tmp/compileDebugJavaWithJavac/previous-compilation-data.bin +0 -0
  374. package/android/build/tmp/kotlin-classes/debug/META-INF/react-native-inapp-inspector_debug.kotlin_module +0 -0
  375. package/android/build/tmp/kotlin-classes/debug/com/inappinspector/InAppInspectorFloatingView$iconView$1.class +0 -0
  376. package/android/build/tmp/kotlin-classes/debug/com/inappinspector/InAppInspectorFloatingView.class +0 -0
  377. package/android/build/tmp/kotlin-classes/debug/com/inappinspector/NetworkInspectorModule$Companion.class +0 -0
  378. package/android/build/tmp/kotlin-classes/debug/com/inappinspector/NetworkInspectorModule$frameCallback$1.class +0 -0
  379. package/android/build/tmp/kotlin-classes/debug/com/inappinspector/NetworkInspectorModule$shakeListener$1.class +0 -0
  380. package/android/build/tmp/kotlin-classes/debug/com/inappinspector/NetworkInspectorModule.class +0 -0
  381. package/android/build/tmp/kotlin-classes/debug/com/inappinspector/NetworkInspectorPackage.class +0 -0
@@ -1,5 +1,5 @@
1
1
  import React, { useCallback, useMemo, useRef, useState } from 'react';
2
- import { Alert, FlatList, ScrollView, StyleSheet, Text, TextInput, TouchableOpacity, View, } from 'react-native';
2
+ import { Alert, FlatList, Platform, ScrollView, StyleSheet, Text, TextInput, TouchableOpacity, View, } from 'react-native';
3
3
  import { useTranslation } from '../../i18n';
4
4
  import { useInspector } from './InspectorContext';
5
5
  import TouchableScale from '../TouchableScale';
@@ -7,12 +7,11 @@ import AnimatedEntrance from '../AnimatedEntrance';
7
7
  import EndOfListFooter from '../EndOfListFooter';
8
8
  import FeatureUnderDevNotice from './FeatureUnderDevNotice';
9
9
  import HighlightText from '../HighlightText';
10
- import styles from '../../styles';
11
10
  import { AppColors } from '../../styles/AppColors';
12
11
  import { AppFonts } from '../../styles/AppFonts';
13
12
  import { clearCrashRecords, } from '../../customHooks/crashHandler';
14
13
  import CrashFilterModal, { DEFAULT_CRASH_FILTERS, isCrashFiltersDefault, } from './CrashFilterModal';
15
- import { SearchIcon, ClearIcon, TrashIcon, TerminalIcon, LayersIcon, ClockIcon, ShieldAlertIcon, FlameIcon, JsIcon, HourglassIcon, SkullIcon, LayoutIcon, ChipIcon, AppleIcon, AndroidIcon, RepeatIcon, CodeBracketsIcon, FilterIcon, ChevronIcon, } from '../NetworkIcons';
14
+ import { SearchIcon, ClearIcon, TrashIcon, TerminalIcon, LayersIcon, ClockIcon, ShieldAlertIcon, FlameIcon, JsIcon, HourglassIcon, SkullIcon, LayoutIcon, ChipIcon, AppleIcon, AndroidIcon, RepeatIcon, CodeBracketsIcon, FilterIcon, } from '../NetworkIcons';
16
15
  const getRelativeTime = (timestamp) => {
17
16
  const now = Date.now();
18
17
  const diff = Math.max(0, now - timestamp);
@@ -153,7 +152,9 @@ const CrashTab = React.memo(() => {
153
152
  ? AppColors.darkOrange
154
153
  : AppColors.offerPurple;
155
154
  return (<AnimatedEntrance index={index} distance={8}>
156
- <TouchableScale onPress={() => setSelectedCrash(item)} style={[
155
+ <TouchableScale onPress={() => {
156
+ setSelectedCrash(item);
157
+ }} style={[
157
158
  localStyles.cardContainer,
158
159
  isFatal && localStyles.fatalCardBorder,
159
160
  ]}>
@@ -423,29 +424,7 @@ const CrashTab = React.memo(() => {
423
424
  </Text>
424
425
  </TouchableScale>)}
425
426
  </ScrollView>) : (<>
426
- <FlatList ref={listRef} data={filteredList} keyExtractor={item => item.id} renderItem={renderCard} initialNumToRender={12} maxToRenderPerBatch={8} windowSize={5} removeClippedSubviews={true} renderToHardwareTextureAndroid={true} contentContainerStyle={localStyles.listContent} showsVerticalScrollIndicator={false} ListFooterComponent={<EndOfListFooter />}/>
427
-
428
- <TouchableScale onPress={() => {
429
- try {
430
- listRef.current?.scrollToOffset({
431
- offset: 0,
432
- animated: true,
433
- });
434
- }
435
- catch {
436
- try {
437
- listRef.current?.scrollToIndex({
438
- index: 0,
439
- animated: true,
440
- });
441
- }
442
- catch { }
443
- }
444
- }} hitSlop={12} style={styles.scrollTopBtn}>
445
- <View style={{ transform: [{ rotate: '180deg' }] }}>
446
- <ChevronIcon color={AppColors.white} size={18}/>
447
- </View>
448
- </TouchableScale>
427
+ <FlatList ref={listRef} data={filteredList} keyExtractor={item => item.id} renderItem={renderCard} initialNumToRender={12} maxToRenderPerBatch={8} windowSize={5} removeClippedSubviews={Platform.OS === 'android'} renderToHardwareTextureAndroid={true} contentContainerStyle={localStyles.listContent} showsVerticalScrollIndicator={false} ListFooterComponent={<EndOfListFooter />}/>
449
428
  </>)}
450
429
 
451
430
 
@@ -1,5 +1,5 @@
1
1
  import React, { useState, useEffect, useMemo, useCallback, useRef } from 'react';
2
- import { View, Text, ScrollView, StyleSheet, NativeModules, Share, TouchableOpacity, ActivityIndicator, Animated, Platform, } from 'react-native';
2
+ import { View, Text, ScrollView, StyleSheet, NativeModules, Share, TouchableOpacity, ActivityIndicator, Animated, } from 'react-native';
3
3
  import { AppColors } from '../../styles/AppColors';
4
4
  import { AppFonts } from '../../styles/AppFonts';
5
5
  import QRCodeView from '../QRCodeView';
@@ -864,12 +864,12 @@ const styles = StyleSheet.create({
864
864
  gap: 3,
865
865
  },
866
866
  consoleLogLine: {
867
- fontFamily: Platform.OS === 'ios' ? 'Menlo' : 'monospace',
867
+ fontFamily: AppFonts.interRegular,
868
868
  fontSize: 10,
869
869
  lineHeight: 14,
870
870
  },
871
871
  consoleLogPlaceholder: {
872
- fontFamily: Platform.OS === 'ios' ? 'Menlo' : 'monospace',
872
+ fontFamily: AppFonts.interRegular,
873
873
  fontSize: 10,
874
874
  color: '#64748B',
875
875
  fontStyle: 'italic',
@@ -0,0 +1,7 @@
1
+ import React from 'react';
2
+ export interface FeedbackModalProps {
3
+ visible?: boolean;
4
+ onClose: () => void;
5
+ }
6
+ export declare const FeedbackModal: React.FC<FeedbackModalProps>;
7
+ export default FeedbackModal;
@@ -0,0 +1,515 @@
1
+ import React, { useState, useEffect } from 'react';
2
+ import { Alert, Dimensions, PixelRatio, Platform, Linking, ScrollView, StyleSheet, Text, TextInput, TouchableOpacity, View, } from 'react-native';
3
+ import { AppColors } from '../../styles/AppColors';
4
+ import { AppFonts } from '../../styles/AppFonts';
5
+ import { LIB_VERSION } from '../../constants/version';
6
+ import { getAppName, getBundleIdentifier, getAppVersionAndBuild, copyToClipboard, showToast, } from '../../helpers';
7
+ import { trackTelemetryEvent } from '../../helpers/telemetry';
8
+ import { HeadphonesIcon, SendIcon, StarIcon, CopyIcon, InfoCircleIcon, CheckIcon, } from '../NetworkIcons';
9
+ const DEVELOPER_EMAIL = 'vengatmacuser@gmail.com';
10
+ const CATEGORIES = [
11
+ { key: 'feedback', label: 'Feedback', icon: '💬' },
12
+ { key: 'bug', label: 'Bug Report', icon: '🐛' },
13
+ { key: 'feature', label: 'Feature Request', icon: '✨' },
14
+ { key: 'performance', label: 'Performance', icon: '⚡' },
15
+ { key: 'help', label: 'Support / Help', icon: '❓' },
16
+ ];
17
+ const RATING_LABELS = ['', 'Poor', 'Fair', 'Good', 'Very Good', 'Excellent!'];
18
+ export const FeedbackModal = ({ onClose }) => {
19
+ const [category, setCategory] = useState('feedback');
20
+ const [rating, setRating] = useState(5);
21
+ const [subject, setSubject] = useState('');
22
+ const [message, setMessage] = useState('');
23
+ const [showDiagnostics, setShowDiagnostics] = useState(false);
24
+ const [isSending, setIsSending] = useState(false);
25
+ const [copiedDraft, setCopiedDraft] = useState(false);
26
+ useEffect(() => {
27
+ trackTelemetryEvent('feedback_modal_opened', { category });
28
+ }, []);
29
+ const appName = getAppName() || 'React Native App';
30
+ const bundleId = getBundleIdentifier() || 'unknown';
31
+ const appVersion = getAppVersionAndBuild() || '1.0.0';
32
+ const { width, height } = Dimensions.get('window');
33
+ const getDiagnosticsText = () => {
34
+ return [
35
+ `• Package: react-native-inapp-inspector@${LIB_VERSION}`,
36
+ `• Platform: ${Platform.OS.toUpperCase()} (${Platform.Version})`,
37
+ `• App: ${appName} (${bundleId}) v${appVersion}`,
38
+ `• Screen: ${Math.round(width)} x ${Math.round(height)} (Scale ${PixelRatio.get()})`,
39
+ `• Timestamp: ${new Date().toISOString()}`,
40
+ ].join('\n');
41
+ };
42
+ const buildEmailDraft = () => {
43
+ const activeCat = CATEGORIES.find(c => c.key === category)?.label || category;
44
+ const emailSubject = `[In-App Inspector] [${activeCat}] ${subject.trim() || 'User Feedback'}`;
45
+ const bodyLines = [
46
+ `Category: ${activeCat}`,
47
+ `Rating: ${rating} / 5 (${RATING_LABELS[rating] || ''})`,
48
+ ...(subject.trim() ? [`Subject: ${subject.trim()}`] : []),
49
+ '',
50
+ 'Feedback / Message:',
51
+ message.trim() || '(No message provided)',
52
+ '',
53
+ '----------------------------------------',
54
+ 'System & Diagnostic Info:',
55
+ getDiagnosticsText(),
56
+ '----------------------------------------',
57
+ ];
58
+ return {
59
+ activeCat,
60
+ subject: emailSubject,
61
+ body: bodyLines.join('\n'),
62
+ };
63
+ };
64
+ const handleCopyDraft = () => {
65
+ const draft = buildEmailDraft();
66
+ const fullText = `To: ${DEVELOPER_EMAIL}\nSubject: ${draft.subject}\n\n${draft.body}`;
67
+ copyToClipboard(fullText, 'Email Draft & Diagnostics');
68
+ setCopiedDraft(true);
69
+ setTimeout(() => setCopiedDraft(false), 2000);
70
+ showToast('Feedback draft copied to clipboard');
71
+ };
72
+ const handleSendEmail = async () => {
73
+ if (isSending)
74
+ return;
75
+ setIsSending(true);
76
+ try {
77
+ const draft = buildEmailDraft();
78
+ const mailtoUrl = `mailto:${DEVELOPER_EMAIL}?subject=${encodeURIComponent(draft.subject)}&body=${encodeURIComponent(draft.body)}`;
79
+ trackTelemetryEvent('feedback_submitted', {
80
+ category,
81
+ rating,
82
+ has_subject: Boolean(subject.trim()),
83
+ has_message: Boolean(message.trim()),
84
+ });
85
+ let opened = false;
86
+ try {
87
+ const canOpen = await Linking.canOpenURL(mailtoUrl);
88
+ if (canOpen) {
89
+ await Linking.openURL(mailtoUrl);
90
+ opened = true;
91
+ }
92
+ else {
93
+ await Linking.openURL(mailtoUrl);
94
+ opened = true;
95
+ }
96
+ }
97
+ catch (err) {
98
+ opened = false;
99
+ }
100
+ if (opened) {
101
+ showToast('Opening mail client...');
102
+ onClose();
103
+ }
104
+ else {
105
+ const fullDraft = `To: ${DEVELOPER_EMAIL}\nSubject: ${draft.subject}\n\n${draft.body}`;
106
+ copyToClipboard(fullDraft, 'Feedback Draft');
107
+ Alert.alert('Email Client Not Available', `Your feedback and diagnostics have been copied to the clipboard!\n\nYou can paste and send directly to:\n${DEVELOPER_EMAIL}`, [
108
+ {
109
+ text: 'Copy Email Address',
110
+ onPress: () => {
111
+ copyToClipboard(DEVELOPER_EMAIL, 'Email Address');
112
+ showToast('Email address copied!');
113
+ },
114
+ },
115
+ {
116
+ text: 'Done',
117
+ style: 'default',
118
+ onPress: onClose,
119
+ },
120
+ ]);
121
+ }
122
+ }
123
+ catch (err) {
124
+ console.warn('[FeedbackModal] Error sending email:', err);
125
+ }
126
+ finally {
127
+ setIsSending(false);
128
+ }
129
+ };
130
+ return (<View style={styles.container}>
131
+
132
+ <View style={styles.bannerBar}>
133
+ <View style={styles.bannerIconBox}>
134
+ <HeadphonesIcon size={18} color={AppColors.purple}/>
135
+ </View>
136
+ <View style={{ flex: 1 }}>
137
+ <Text style={styles.bannerTitle}>Share your feedback or report an issue</Text>
138
+ <Text style={styles.bannerSub}>
139
+ Direct communication with the maintainers. Diagnostic info is auto-attached.
140
+ </Text>
141
+ </View>
142
+ </View>
143
+
144
+ <ScrollView style={styles.scrollContent} contentContainerStyle={styles.scrollInner} showsVerticalScrollIndicator={false} keyboardShouldPersistTaps="handled">
145
+
146
+ <Text style={styles.sectionLabel}>WHAT CAN WE HELP WITH?</Text>
147
+ <View style={styles.categoryGrid}>
148
+ {CATEGORIES.map(cat => {
149
+ const isSelected = category === cat.key;
150
+ return (<TouchableOpacity key={cat.key} activeOpacity={0.7} onPress={() => setCategory(cat.key)} style={[
151
+ styles.categoryChip,
152
+ isSelected && styles.categoryChipSelected,
153
+ ]}>
154
+ <Text style={styles.categoryIcon}>{cat.icon}</Text>
155
+ <Text style={[
156
+ styles.categoryText,
157
+ isSelected && styles.categoryTextSelected,
158
+ ]}>
159
+ {cat.label}
160
+ </Text>
161
+ </TouchableOpacity>);
162
+ })}
163
+ </View>
164
+
165
+
166
+ <View style={styles.ratingCard}>
167
+ <View style={styles.ratingHeader}>
168
+ <Text style={styles.ratingTitle}>Rate your experience</Text>
169
+ {rating > 0 && (<Text style={styles.ratingBadge}>
170
+ {RATING_LABELS[rating]}
171
+ </Text>)}
172
+ </View>
173
+ <View style={styles.starsRow}>
174
+ {[1, 2, 3, 4, 5].map(star => {
175
+ const filled = star <= rating;
176
+ return (<TouchableOpacity key={star} activeOpacity={0.7} onPress={() => setRating(star)} style={styles.starTouch}>
177
+ <StarIcon size={26} color={filled ? '#FFB800' : AppColors.grayTextWeak}/>
178
+ </TouchableOpacity>);
179
+ })}
180
+ </View>
181
+ </View>
182
+
183
+
184
+ <Text style={styles.sectionLabel}>SUBJECT (OPTIONAL)</Text>
185
+ <View style={styles.inputWrapper}>
186
+ <TextInput style={styles.textInput} placeholder="Brief summary..." placeholderTextColor={AppColors.grayTextWeak} value={subject} onChangeText={setSubject} maxLength={80}/>
187
+ </View>
188
+
189
+
190
+ <Text style={styles.sectionLabel}>YOUR MESSAGE / DETAILS</Text>
191
+ <View style={[styles.inputWrapper, styles.textareaWrapper]}>
192
+ <TextInput style={[styles.textInput, styles.textarea]} placeholder="Describe your issue, feature request, or suggestion in detail..." placeholderTextColor={AppColors.grayTextWeak} value={message} onChangeText={setMessage} multiline numberOfLines={4} textAlignVertical="top"/>
193
+ </View>
194
+
195
+
196
+ <TouchableOpacity activeOpacity={0.8} onPress={() => setShowDiagnostics(!showDiagnostics)} style={styles.diagnosticsToggle}>
197
+ <View style={styles.diagnosticsHeader}>
198
+ <InfoCircleIcon size={14} color={AppColors.purple}/>
199
+ <Text style={styles.diagnosticsTitle}>
200
+ Diagnostics & System Details (Auto-attached)
201
+ </Text>
202
+ </View>
203
+ <Text style={styles.diagnosticsArrow}>
204
+ {showDiagnostics ? '▲' : '▼'}
205
+ </Text>
206
+ </TouchableOpacity>
207
+
208
+ {showDiagnostics && (<View style={styles.diagnosticsBox}>
209
+ <Text style={styles.diagnosticsText}>
210
+ {getDiagnosticsText()}
211
+ </Text>
212
+ </View>)}
213
+
214
+
215
+ <View style={styles.recipientBadge}>
216
+ <Text style={styles.recipientText}>
217
+ 📧 Emails to: <Text style={styles.recipientHighlight}>{DEVELOPER_EMAIL}</Text>
218
+ </Text>
219
+ </View>
220
+ </ScrollView>
221
+
222
+
223
+ <View style={styles.footer}>
224
+ <TouchableOpacity activeOpacity={0.7} onPress={handleCopyDraft} style={styles.copyDraftBtn}>
225
+ {copiedDraft ? (<CheckIcon size={14} color={AppColors.emerald500}/>) : (<CopyIcon size={14} color={AppColors.grayText}/>)}
226
+ <Text style={[
227
+ styles.copyDraftBtnText,
228
+ copiedDraft && { color: AppColors.emerald500 },
229
+ ]}>
230
+ {copiedDraft ? 'Copied!' : 'Copy Draft'}
231
+ </Text>
232
+ </TouchableOpacity>
233
+
234
+ <View style={styles.footerRight}>
235
+ <TouchableOpacity activeOpacity={0.7} onPress={onClose} style={styles.cancelBtn}>
236
+ <Text style={styles.cancelBtnText}>Cancel</Text>
237
+ </TouchableOpacity>
238
+
239
+ <TouchableOpacity activeOpacity={0.8} onPress={handleSendEmail} style={styles.submitBtn}>
240
+ <SendIcon size={16} color={AppColors.white}/>
241
+ <Text style={styles.submitBtnText}>
242
+ {isSending ? 'Sending...' : 'Send via Email'}
243
+ </Text>
244
+ </TouchableOpacity>
245
+ </View>
246
+ </View>
247
+ </View>);
248
+ };
249
+ const styles = StyleSheet.create({
250
+ container: {
251
+ flex: 1,
252
+ backgroundColor: AppColors.primaryLight,
253
+ },
254
+ bannerBar: {
255
+ flexDirection: 'row',
256
+ alignItems: 'center',
257
+ gap: 10,
258
+ backgroundColor: `${AppColors.purple}12`,
259
+ paddingHorizontal: 14,
260
+ paddingVertical: 10,
261
+ borderBottomWidth: 1,
262
+ borderBottomColor: `${AppColors.purple}20`,
263
+ },
264
+ bannerIconBox: {
265
+ width: 32,
266
+ height: 32,
267
+ borderRadius: 8,
268
+ backgroundColor: `${AppColors.purple}20`,
269
+ alignItems: 'center',
270
+ justifyContent: 'center',
271
+ },
272
+ bannerTitle: {
273
+ fontFamily: AppFonts.interSemiBold,
274
+ fontSize: 12.5,
275
+ color: AppColors.purple,
276
+ },
277
+ bannerSub: {
278
+ fontFamily: AppFonts.interRegular,
279
+ fontSize: 10.5,
280
+ color: AppColors.grayText,
281
+ marginTop: 1,
282
+ },
283
+ scrollContent: {
284
+ flex: 1,
285
+ },
286
+ scrollInner: {
287
+ paddingHorizontal: 16,
288
+ paddingTop: 12,
289
+ paddingBottom: 20,
290
+ },
291
+ sectionLabel: {
292
+ fontFamily: AppFonts.interSemiBold,
293
+ fontSize: 10.5,
294
+ color: AppColors.grayText,
295
+ letterSpacing: 0.8,
296
+ marginBottom: 8,
297
+ marginTop: 10,
298
+ },
299
+ categoryGrid: {
300
+ flexDirection: 'row',
301
+ flexWrap: 'wrap',
302
+ gap: 8,
303
+ paddingBottom: 4,
304
+ },
305
+ categoryChip: {
306
+ flexDirection: 'row',
307
+ alignItems: 'center',
308
+ gap: 6,
309
+ paddingVertical: 7,
310
+ paddingHorizontal: 12,
311
+ borderRadius: 8,
312
+ backgroundColor: AppColors.grayBackground,
313
+ borderWidth: 1,
314
+ borderColor: AppColors.dividerColor,
315
+ },
316
+ categoryChipSelected: {
317
+ backgroundColor: `${AppColors.purple}15`,
318
+ borderColor: AppColors.purple,
319
+ },
320
+ categoryIcon: {
321
+ fontSize: 13,
322
+ },
323
+ categoryText: {
324
+ fontFamily: AppFonts.interMedium,
325
+ fontSize: 12,
326
+ color: AppColors.grayText,
327
+ },
328
+ categoryTextSelected: {
329
+ color: AppColors.purple,
330
+ fontFamily: AppFonts.interSemiBold,
331
+ },
332
+ ratingCard: {
333
+ backgroundColor: AppColors.grayBackground,
334
+ borderRadius: 12,
335
+ padding: 12,
336
+ marginTop: 12,
337
+ borderWidth: 1,
338
+ borderColor: AppColors.dividerColor,
339
+ },
340
+ ratingHeader: {
341
+ flexDirection: 'row',
342
+ justifyContent: 'space-between',
343
+ alignItems: 'center',
344
+ marginBottom: 8,
345
+ },
346
+ ratingTitle: {
347
+ fontFamily: AppFonts.interSemiBold,
348
+ fontSize: 12.5,
349
+ color: AppColors.primaryBlack,
350
+ },
351
+ ratingBadge: {
352
+ fontFamily: AppFonts.interSemiBold,
353
+ fontSize: 11,
354
+ color: '#D97706',
355
+ backgroundColor: '#FEF3C7',
356
+ paddingHorizontal: 8,
357
+ paddingVertical: 2,
358
+ borderRadius: 6,
359
+ },
360
+ starsRow: {
361
+ flexDirection: 'row',
362
+ alignItems: 'center',
363
+ gap: 12,
364
+ paddingVertical: 4,
365
+ },
366
+ starTouch: {
367
+ padding: 2,
368
+ },
369
+ inputWrapper: {
370
+ backgroundColor: AppColors.grayBackground,
371
+ borderRadius: 10,
372
+ borderWidth: 1,
373
+ borderColor: AppColors.dividerColor,
374
+ paddingHorizontal: 12,
375
+ paddingVertical: 8,
376
+ },
377
+ textareaWrapper: {
378
+ minHeight: 88,
379
+ paddingVertical: 10,
380
+ },
381
+ textInput: {
382
+ fontFamily: AppFonts.interRegular,
383
+ fontSize: 13,
384
+ color: AppColors.primaryBlack,
385
+ padding: 0,
386
+ },
387
+ textarea: {
388
+ height: 72,
389
+ },
390
+ diagnosticsToggle: {
391
+ flexDirection: 'row',
392
+ alignItems: 'center',
393
+ justifyContent: 'space-between',
394
+ backgroundColor: `${AppColors.purple}10`,
395
+ borderRadius: 8,
396
+ paddingHorizontal: 12,
397
+ paddingVertical: 9,
398
+ marginTop: 14,
399
+ borderWidth: 1,
400
+ borderColor: `${AppColors.purple}25`,
401
+ },
402
+ diagnosticsHeader: {
403
+ flexDirection: 'row',
404
+ alignItems: 'center',
405
+ gap: 8,
406
+ flex: 1,
407
+ },
408
+ diagnosticsTitle: {
409
+ fontFamily: AppFonts.interMedium,
410
+ fontSize: 11.5,
411
+ color: AppColors.purple,
412
+ },
413
+ diagnosticsArrow: {
414
+ fontSize: 10,
415
+ color: AppColors.purple,
416
+ },
417
+ diagnosticsBox: {
418
+ backgroundColor: '#1E1B2E',
419
+ borderRadius: 8,
420
+ padding: 10,
421
+ marginTop: 6,
422
+ borderWidth: 1,
423
+ borderColor: AppColors.dividerColor,
424
+ },
425
+ diagnosticsText: {
426
+ fontFamily: AppFonts.interRegular,
427
+ fontSize: 11,
428
+ color: '#E2DFEB',
429
+ lineHeight: 17,
430
+ },
431
+ recipientBadge: {
432
+ marginTop: 12,
433
+ paddingVertical: 6,
434
+ paddingHorizontal: 10,
435
+ borderRadius: 6,
436
+ backgroundColor: AppColors.grayBackground,
437
+ borderWidth: 1,
438
+ borderColor: AppColors.dividerColor,
439
+ alignSelf: 'flex-start',
440
+ },
441
+ recipientText: {
442
+ fontFamily: AppFonts.interRegular,
443
+ fontSize: 11,
444
+ color: AppColors.grayText,
445
+ },
446
+ recipientHighlight: {
447
+ fontFamily: AppFonts.interSemiBold,
448
+ color: AppColors.purple,
449
+ },
450
+ footer: {
451
+ flexDirection: 'row',
452
+ alignItems: 'center',
453
+ justifyContent: 'space-between',
454
+ paddingHorizontal: 14,
455
+ paddingTop: 10,
456
+ paddingBottom: 14,
457
+ borderTopWidth: 1,
458
+ borderTopColor: AppColors.dividerColor,
459
+ backgroundColor: AppColors.primaryLight,
460
+ },
461
+ copyDraftBtn: {
462
+ flexDirection: 'row',
463
+ alignItems: 'center',
464
+ gap: 5,
465
+ paddingVertical: 8,
466
+ paddingHorizontal: 10,
467
+ borderRadius: 8,
468
+ backgroundColor: AppColors.grayBackground,
469
+ borderWidth: 1,
470
+ borderColor: AppColors.dividerColor,
471
+ },
472
+ copyDraftBtnText: {
473
+ fontFamily: AppFonts.interMedium,
474
+ fontSize: 11.5,
475
+ color: AppColors.grayText,
476
+ },
477
+ footerRight: {
478
+ flexDirection: 'row',
479
+ alignItems: 'center',
480
+ gap: 8,
481
+ },
482
+ cancelBtn: {
483
+ paddingVertical: 8,
484
+ paddingHorizontal: 14,
485
+ borderRadius: 8,
486
+ backgroundColor: AppColors.grayBackground,
487
+ borderWidth: 1,
488
+ borderColor: AppColors.dividerColor,
489
+ },
490
+ cancelBtnText: {
491
+ fontFamily: AppFonts.interMedium,
492
+ fontSize: 12.5,
493
+ color: AppColors.grayText,
494
+ },
495
+ submitBtn: {
496
+ flexDirection: 'row',
497
+ alignItems: 'center',
498
+ gap: 6,
499
+ backgroundColor: AppColors.purple,
500
+ paddingVertical: 8,
501
+ paddingHorizontal: 15,
502
+ borderRadius: 8,
503
+ shadowColor: AppColors.purple,
504
+ shadowOffset: { width: 0, height: 2 },
505
+ shadowOpacity: 0.35,
506
+ shadowRadius: 6,
507
+ elevation: 4,
508
+ },
509
+ submitBtnText: {
510
+ fontFamily: AppFonts.interSemiBold,
511
+ fontSize: 12.5,
512
+ color: AppColors.white,
513
+ },
514
+ });
515
+ export default FeedbackModal;