react-native-inapp-inspector 2.3.20 → 2.3.22

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 (61) hide show
  1. package/README.md +14 -14
  2. package/android/src/main/java/com/inappinspector/NetworkInspectorModule.kt +58 -1
  3. package/dist/commonjs/components/AppHeaderLogo.js +2 -2
  4. package/dist/commonjs/components/ConsoleLogCard.js +1 -1
  5. package/dist/commonjs/components/HighlightText.js +13 -13
  6. package/dist/commonjs/components/Inspector/AboutModal.js +143 -251
  7. package/dist/commonjs/components/Inspector/DebuggingTab.js +19 -13
  8. package/dist/commonjs/components/Inspector/InspectorHeader.js +54 -80
  9. package/dist/commonjs/components/Inspector/MainScreen.js +13 -23
  10. package/dist/commonjs/components/Inspector/MediaGalleryTab.js +4 -4
  11. package/dist/commonjs/components/Inspector/MediaPreviewModal.js +1 -1
  12. package/dist/commonjs/components/Inspector/NpmStarPrompt.js +1 -1
  13. package/dist/commonjs/components/Inspector/TabBar.js +7 -7
  14. package/dist/commonjs/components/Inspector/UpdateAvailableModal.js +23 -24
  15. package/dist/commonjs/components/LogCard.js +16 -16
  16. package/dist/commonjs/components/NetworkIcons.d.ts +10 -0
  17. package/dist/commonjs/components/NetworkIcons.js +46 -4
  18. package/dist/commonjs/components/QRCodeView.js +2 -2
  19. package/dist/commonjs/components/TreeNode.js +16 -16
  20. package/dist/commonjs/constants/version.d.ts +1 -1
  21. package/dist/commonjs/constants/version.js +1 -1
  22. package/dist/commonjs/customHooks/bundleAnalyzer.js +1 -1
  23. package/dist/commonjs/helpers/index.d.ts +1 -0
  24. package/dist/commonjs/helpers/index.js +2 -2
  25. package/dist/commonjs/index.js +1 -1
  26. package/dist/commonjs/native/NativeInspector.d.ts +1 -0
  27. package/dist/commonjs/native/NativeInspector.js +1 -1
  28. package/dist/commonjs/types/interfaces.d.ts +0 -2
  29. package/dist/esm/components/AppHeaderLogo.js +6 -6
  30. package/dist/esm/components/ConsoleLogCard.js +6 -6
  31. package/dist/esm/components/HighlightText.js +17 -17
  32. package/dist/esm/components/Inspector/AboutModal.js +205 -313
  33. package/dist/esm/components/Inspector/DebuggingTab.js +32 -26
  34. package/dist/esm/components/Inspector/InspectorHeader.js +96 -122
  35. package/dist/esm/components/Inspector/MainScreen.js +66 -76
  36. package/dist/esm/components/Inspector/MediaGalleryTab.js +19 -19
  37. package/dist/esm/components/Inspector/MediaPreviewModal.js +18 -18
  38. package/dist/esm/components/Inspector/NpmStarPrompt.js +1 -1
  39. package/dist/esm/components/Inspector/TabBar.js +21 -21
  40. package/dist/esm/components/Inspector/UpdateAvailableModal.js +65 -66
  41. package/dist/esm/components/LogCard.js +43 -43
  42. package/dist/esm/components/NetworkIcons.d.ts +10 -0
  43. package/dist/esm/components/NetworkIcons.js +191 -149
  44. package/dist/esm/components/QRCodeView.js +4 -4
  45. package/dist/esm/components/TreeNode.js +53 -53
  46. package/dist/esm/constants/version.d.ts +1 -1
  47. package/dist/esm/constants/version.js +1 -1
  48. package/dist/esm/customHooks/bundleAnalyzer.js +1 -1
  49. package/dist/esm/helpers/index.d.ts +1 -0
  50. package/dist/esm/helpers/index.js +4 -4
  51. package/dist/esm/index.js +7 -7
  52. package/dist/esm/native/NativeInspector.d.ts +1 -0
  53. package/dist/esm/native/NativeInspector.js +1 -1
  54. package/dist/esm/types/interfaces.d.ts +0 -2
  55. package/ios/NetworkInspectorModule.mm +39 -3
  56. package/package.json +1 -1
  57. package/src/native/NativeInspector.ts +18 -0
  58. package/dist/commonjs/components/Inspector/FeedbackModal.d.ts +0 -16
  59. package/dist/commonjs/components/Inspector/FeedbackModal.js +0 -198
  60. package/dist/esm/components/Inspector/FeedbackModal.d.ts +0 -16
  61. package/dist/esm/components/Inspector/FeedbackModal.js +0 -198
@@ -213,8 +213,6 @@ export interface InspectorContextValue {
213
213
  setShowHeaderInfo: React.Dispatch<React.SetStateAction<boolean>>;
214
214
  settingsPage: SettingsPage;
215
215
  setSettingsPage: React.Dispatch<React.SetStateAction<SettingsPage>>;
216
- isFeedbackOpen: boolean;
217
- setIsFeedbackOpen: React.Dispatch<React.SetStateAction<boolean>>;
218
216
  isAboutOpen: boolean;
219
217
  setIsAboutOpen: React.Dispatch<React.SetStateAction<boolean>>;
220
218
  updateAvailable: boolean;
@@ -1235,9 +1235,9 @@ RCT_EXPORT_METHOD(getNativeCachedPage:(NSString *)pageKey
1235
1235
  rgbColorSpace,
1236
1236
  (CGBitmapInfo)kCGBitmapByteOrder32Little | (CGBitmapInfo)kCGImageAlphaPremultipliedFirst);
1237
1237
  if (context) {
1238
- CGContextTranslateCTM(context, 0, size.height);
1239
- CGContextScaleCTM(context, 1.0, -1.0);
1240
- CGContextDrawImage(context, CGRectMake(0, 0, size.width, size.height), cgImage);
1238
+ UIGraphicsPushContext(context);
1239
+ [image drawInRect:CGRectMake(0, 0, size.width, size.height)];
1240
+ UIGraphicsPopContext();
1241
1241
  CGContextRelease(context);
1242
1242
  }
1243
1243
  CGColorSpaceRelease(rgbColorSpace);
@@ -1770,6 +1770,41 @@ RCT_EXPORT_METHOD(deleteCapturedMedia:(NSString *)uri
1770
1770
  });
1771
1771
  }
1772
1772
 
1773
+ RCT_EXPORT_METHOD(copyMediaToClipboard:(NSString *)filePath
1774
+ resolve:(RCTPromiseResolveBlock)resolve
1775
+ reject:(RCTPromiseRejectBlock)reject) {
1776
+ if (!filePath || filePath.length == 0) {
1777
+ resolve(@{@"success": @(NO), @"error": @"File path is empty"});
1778
+ return;
1779
+ }
1780
+ dispatch_async(dispatch_get_main_queue(), ^{
1781
+ @try {
1782
+ NSString *cleanPath = filePath;
1783
+ if ([cleanPath hasPrefix:@"file://"]) {
1784
+ cleanPath = [cleanPath substringFromIndex:7];
1785
+ }
1786
+ cleanPath = [cleanPath stringByRemovingPercentEncoding];
1787
+
1788
+ UIImage *img = [UIImage imageWithContentsOfFile:cleanPath];
1789
+ if (img) {
1790
+ [UIPasteboard generalPasteboard].image = img;
1791
+ resolve(@{@"success": @(YES), @"type": @"image"});
1792
+ } else {
1793
+ NSURL *fileURL = [NSURL fileURLWithPath:cleanPath];
1794
+ if (fileURL) {
1795
+ [UIPasteboard generalPasteboard].URL = fileURL;
1796
+ resolve(@{@"success": @(YES), @"type": @"url"});
1797
+ } else {
1798
+ [UIPasteboard generalPasteboard].string = filePath;
1799
+ resolve(@{@"success": @(YES), @"type": @"string"});
1800
+ }
1801
+ }
1802
+ } @catch (NSException *ex) {
1803
+ resolve(@{@"success": @(NO), @"error": ex.reason ?: @"Copy failed"});
1804
+ }
1805
+ });
1806
+ }
1807
+
1773
1808
  RCT_EXPORT_METHOD(clearAllCapturedMedia:(RCTPromiseResolveBlock)resolve
1774
1809
  reject:(RCTPromiseRejectBlock)reject) {
1775
1810
  dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
@@ -1786,6 +1821,7 @@ RCT_EXPORT_METHOD(clearAllCapturedMedia:(RCTPromiseResolveBlock)resolve
1786
1821
  });
1787
1822
  }
1788
1823
 
1824
+
1789
1825
  #ifdef RCT_NEW_ARCH_ENABLED
1790
1826
  - (std::shared_ptr<facebook::react::TurboModule>)getTurboModule:
1791
1827
  (const facebook::react::ObjCTurboModule::InitParams &)params
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "react-native-inapp-inspector",
3
- "version": "2.3.20",
3
+ "version": "2.3.22",
4
4
  "description": "The zero-config, all-in-one in-app debugger for React Native & Expo. Inspect Network (fetch/axios), Console logs, Stack Traces, Redux State, Firebase Analytics, and JS Bundle size directly on device.",
5
5
  "repository": {
6
6
  "type": "git",
@@ -642,3 +642,21 @@ export const clearAllCapturedMediaFiles = async (): Promise<boolean> => {
642
642
  return false;
643
643
  }
644
644
  };
645
+
646
+ /**
647
+ * Copies a media file (image/video) to the system clipboard as media data if supported.
648
+ */
649
+ export const copyMediaToClipboard = async (filePath: string): Promise<boolean> => {
650
+ if (!filePath) return false;
651
+ if (!NativeModule || !NativeModule.copyMediaToClipboard) {
652
+ return false;
653
+ }
654
+ try {
655
+ const result = await NativeModule.copyMediaToClipboard(filePath);
656
+ return Boolean(result?.success);
657
+ } catch {
658
+ return false;
659
+ }
660
+ };
661
+
662
+
@@ -1,16 +0,0 @@
1
- import React from 'react';
2
- export interface FeedbackModalProps {
3
- visible?: boolean;
4
- onClose: () => void;
5
- }
6
- export interface InspectorModuleItem {
7
- id: string;
8
- name: string;
9
- category: string;
10
- icon: string;
11
- description: string;
12
- color: string;
13
- quickChips: string[];
14
- }
15
- export declare const FeedbackModal: React.FC<FeedbackModalProps>;
16
- export default FeedbackModal;
@@ -1,198 +0,0 @@
1
- "use strict";var __createBinding=this&&this.__createBinding||(Object.create?(function(r,o,l,n){n===void 0&&(n=l);var i=Object.getOwnPropertyDescriptor(o,l);(!i||("get"in i?!o.__esModule:i.writable||i.configurable))&&(i={enumerable:!0,get:function(){return o[l]}}),Object.defineProperty(r,n,i)}):(function(r,o,l,n){n===void 0&&(n=l),r[n]=o[l]})),__setModuleDefault=this&&this.__setModuleDefault||(Object.create?(function(r,o){Object.defineProperty(r,"default",{enumerable:!0,value:o})}):function(r,o){r.default=o}),__importStar=this&&this.__importStar||(function(){var r=function(o){return r=Object.getOwnPropertyNames||function(l){var n=[];for(var i in l)Object.prototype.hasOwnProperty.call(l,i)&&(n[n.length]=i);return n},r(o)};return function(o){if(o&&o.__esModule)return o;var l={};if(o!=null)for(var n=r(o),i=0;i<n.length;i++)n[i]!=="default"&&__createBinding(l,o,n[i]);return __setModuleDefault(l,o),l}})(),__importDefault=this&&this.__importDefault||function(r){return r&&r.__esModule?r:{default:r}};Object.defineProperty(exports,"__esModule",{value:!0}),exports.FeedbackModal=void 0;const react_1=__importStar(require("react")),react_native_1=require("react-native"),react_native_svg_1=__importStar(require("react-native-svg")),AppColors_1=require("../../styles/AppColors"),AppFonts_1=require("../../styles/AppFonts"),TouchableScale_1=__importDefault(require("../TouchableScale")),version_1=require("../../constants/version"),helpers_1=require("../../helpers"),telemetry_1=require("../../helpers/telemetry"),NativeInspector_1=require("../../native/NativeInspector"),NetworkIcons_1=require("../NetworkIcons"),DEVELOPER_EMAIL="vengatmacuser@gmail.com",GITHUB_REPO_URL="https://github.com/vengatmacuser/react-native-inapp-inspector",INSPECTOR_MODULES=[{id:"apis",name:"Network (APIs)",category:"Core Inspector",icon:"\u{1F310}",description:"HTTP/HTTPS requests, WebSocket, status codes & latency",color:"#6366F1",quickChips:["cURL / HAR Export","Requests failing / missing","GraphQL query filter","Response format issue","SSL pinning / certs","Slow API response alerts"]},{id:"logs",name:"Console Logs",category:"Core Inspector",icon:"\u{1F4DD}",description:"console.log, warn, error, trace & regex search",color:"#8B5CF6",quickChips:["Log regex search / filter","Stack trace symbolication","Error group collapse","Custom tag / color highlight","High log spam performance"]},{id:"redux",name:"Redux Inspector",category:"State Management",icon:"\u269B\uFE0F",description:"Redux store slices, action dispatch history & state diff",color:"#7C3AED",quickChips:["Action time-travel / replay","State slice search & diff","Auto action logger","Persistence / rehydration","Large state tree lag"]},{id:"analytics",name:"Analytics Logger",category:"Telemetry",icon:"\u{1F4CA}",description:"Firebase analytics & custom telemetry event tracking",color:"#F59E0B",quickChips:["Firebase auto-interceptor","Custom event param view","Event export to CSV / JSON","Filter by event name"]},{id:"crash",name:"Crash Protection",category:"Diagnostics",icon:"\u{1F4A5}",description:"Unhandled exceptions, fatal crash captures & stack trace",color:"#EF4444",quickChips:["Auto screenshot on crash","Native crash reporting","Symbolicated stack trace","Error boundary recovery"]},{id:"performance",name:"Performance Tracker",category:"Diagnostics",icon:"\u26A1",description:"FPS monitor, memory footprint, CPU & render timing",color:"#10B981",quickChips:["FPS drop alerts","Memory leak detection","Slow component render timings","Screen transition metrics"]},{id:"bundle",name:"Bundle Analyzer",category:"Optimization",icon:"\u{1F4E6}",description:"Hermes JS bundle visualizer & package asset weight",color:"#3B82F6",quickChips:["Package tree visualizer","Duplicate dependency warning","Asset size breakdown","Sourcemap integration"]},{id:"storage",name:"Storage Explorer",category:"Storage",icon:"\u{1F4BE}",description:"AsyncStorage, MMKV & local key-value store viewer",color:"#06B6D4",quickChips:["AsyncStorage live edit","MMKV encrypted keys","Clear storage cache","Key search & filter"]},{id:"capture",name:"Screen Capture",category:"Media",icon:"\u{1F4F8}",description:"High-res screenshots, video & animated GIF recording",color:"#EC4899",quickChips:["GIF conversion resolution","Audio recording option","Auto-hide inspector in shots","Instant media preview"]},{id:"launcher",name:"FAB Launcher & UI",category:"Interface",icon:"\u{1F680}",description:"Floating trigger, gestures, dark mode & modal themes",color:"#D946EF",quickChips:["Draggable FAB positioning","Custom dark / light theme","Font scaling & line heights","Custom app header logo"]},{id:"general",name:"Entire Inspector / General",category:"General",icon:"\u2728",description:"General feedback, documentation, new ideas & support",color:"#64748B",quickChips:["Love this tool! \u{1F680}","Super easy integration \u{1F6E0}\uFE0F","Documentation clarification \u{1F4D6}","Feature roadmap suggestion \u{1F5FA}\uFE0F"]}],CATEGORIES=[{key:"feedback",label:"Feedback",icon:"\u{1F4AC}",color:"#8B5CF6",bgColor:"#8B5CF618"},{key:"bug",label:"Bug Report",icon:"\u{1F41B}",color:"#EF4444",bgColor:"#EF444418"},{key:"feature",label:"Feature Request",icon:"\u2728",color:"#F59E0B",bgColor:"#F59E0B18"},{key:"performance",label:"Performance",icon:"\u26A1",color:"#10B981",bgColor:"#10B98118"},{key:"help",label:"Support / Help",icon:"\u2753",color:"#3B82F6",bgColor:"#3B82F618"}],MOODS=[{value:1,emoji:"\u{1F621}",label:"Frustrated",color:"#EF4444"},{value:2,emoji:"\u{1F610}",label:"Okay",color:"#F59E0B"},{value:3,emoji:"\u{1F642}",label:"Good",color:"#10B981"},{value:4,emoji:"\u{1F929}",label:"Great",color:"#8B5CF6"},{value:5,emoji:"\u{1F680}",label:"Loving it!",color:"#EC4899"}],GitHubIcon=({size:r=14,color:o=AppColors_1.AppColors.white})=><react_native_svg_1.default width={r}height={r}viewBox="0 0 24 24"fill={o}>
2
- <react_native_svg_1.Path d="M12 0C5.37 0 0 5.37 0 12c0 5.31 3.435 9.795 8.205 11.385.6.105.825-.255.825-.57 0-.285-.015-1.23-.015-2.235-3.015.555-3.795-.735-4.035-1.41-.135-.345-.72-1.41-1.23-1.695-.42-.225-1.02-.78-.015-.795.945-.015 1.62.87 1.845 1.23 1.08 1.815 2.805 1.305 3.495.99.105-.78.42-1.305.765-1.605-2.67-.3-5.46-1.335-5.46-5.925 0-1.305.465-2.385 1.23-3.225-.12-.3-.54-1.53.12-3.18 0 0 1.005-.315 3.3 1.23.96-.27 1.98-.405 3-.405s2.04.135 3 .405c2.295-1.56 3.3-1.23 3.3-1.23.66 1.65.24 2.88.12 3.18.765.84 1.23 1.905 1.23 3.225 0 4.605-2.805 5.625-5.475 5.925.435.375.81 1.095.81 2.22 0 1.605-.015 2.895-.015 3.3 0 .315.225.69.825.57A12.02 12.02 0 0024 12c0-6.63-5.37-12-12-12z"/>
3
- </react_native_svg_1.default>,FeedbackModal=({onClose:r})=>{const[o,l]=(0,react_1.useState)("apis"),[n,i]=(0,react_1.useState)(!1),[g,C]=(0,react_1.useState)(""),[u,I]=(0,react_1.useState)("feedback"),[s,h]=(0,react_1.useState)([]),[m,F]=(0,react_1.useState)(5),[y,V]=(0,react_1.useState)(""),[f,R]=(0,react_1.useState)(!1),[_,x]=(0,react_1.useState)(!1),[b,w]=(0,react_1.useState)(!1);(0,react_1.useEffect)(()=>{(0,telemetry_1.trackTelemetryEvent)("feedback_modal_opened",{category:u,module:o})},[]);const a=(0,react_1.useMemo)(()=>INSPECTOR_MODULES.find(e=>e.id===o)||INSPECTOR_MODULES[0],[o]),S=(0,react_1.useMemo)(()=>{const e=g.trim().toLowerCase();return e?INSPECTOR_MODULES.filter(t=>t.name.toLowerCase().includes(e)||t.category.toLowerCase().includes(e)||t.description.toLowerCase().includes(e)):INSPECTOR_MODULES},[g]),v=(0,react_1.useMemo)(()=>CATEGORIES.find(e=>e.key===u)||CATEGORIES[0],[u]),P=(0,react_1.useMemo)(()=>a.quickChips,[a]),k=(0,helpers_1.getAppName)()||"React Native App",O=(0,helpers_1.getBundleIdentifier)()||"unknown",A=(0,helpers_1.getAppVersionAndBuild)()?.formatted||"1.0.0",{width:D,height:z}=react_native_1.Dimensions.get("window"),B=()=>[`\u2022 Module Context: ${a.name} (${a.category})`,`\u2022 Package: react-native-inapp-inspector@${version_1.LIB_VERSION}`,`\u2022 Platform: ${react_native_1.Platform.OS.toUpperCase()} (${react_native_1.Platform.Version})`,`\u2022 App: ${k} (${O}) v${A}`,`\u2022 Screen: ${Math.round(D)} x ${Math.round(z)} (Scale ${react_native_1.PixelRatio.get()})`,`\u2022 Timestamp: ${new Date().toISOString()}`].join(`
4
- `),H=e=>{(0,NativeInspector_1.triggerNativeHaptic)("light"),h(t=>t.includes(e)?t.filter(c=>c!==e):[...t,e])},E=e=>{(0,NativeInspector_1.triggerNativeHaptic)("medium"),l(e.id),i(!1),C(""),h([])},L=e=>{(0,NativeInspector_1.triggerNativeHaptic)("medium"),I(e)},T=()=>{const e=MOODS.find(p=>p.value===m)||MOODS[4],t=s.length>0?s.join(", "):"General thoughts",c=`[In-App Inspector] [${a.name}] [${v.label}] ${t.slice(0,50)}`,d=[`\u{1F4E6} Module: ${a.name} (${a.category})`,`\u{1F3AF} Type: ${v.label}`,`\u{1F31F} Mood / Experience: ${e.emoji} ${e.label} (${m}/5)`,...s.length>0?["","\u{1F4CC} Key Highlights / Items:",...s.map(p=>` \u2022 ${p}`)]:[],...y.trim()?["","\u{1F4DD} Additional Notes:",y.trim()]:[],"","----------------------------------------","\u26A1 System & Diagnostic Info (Auto-attached):",B(),"----------------------------------------"];return{subject:c,body:d.join(`
5
- `),activeMood:e}},$=()=>{(0,NativeInspector_1.triggerNativeHaptic)("success");const{subject:e,body:t}=T(),c=`To: ${DEVELOPER_EMAIL}
6
- Subject: ${e}
7
-
8
- ${t}`;(0,helpers_1.copyToClipboard)(c,"Feedback Draft & Diagnostics"),w(!0),setTimeout(()=>w(!1),2e3),(0,helpers_1.showToast)("Feedback draft & diagnostics copied to clipboard")},M=async()=>{(0,NativeInspector_1.triggerNativeHaptic)("medium");try{const{subject:e,body:t}=T(),c=encodeURIComponent(e),d=encodeURIComponent(t),p=`${GITHUB_REPO_URL}/issues/new?title=${c}&body=${d}`;await react_native_1.Linking.openURL(p),(0,telemetry_1.trackTelemetryEvent)("feedback_github_opened",{category:u,module:o,mood:m})}catch{(0,helpers_1.showToast)("Could not open GitHub browser")}},j=async()=>{if(!_){x(!0),(0,NativeInspector_1.triggerNativeHaptic)("medium");try{const{subject:e,body:t}=T(),c=`mailto:${DEVELOPER_EMAIL}?subject=${encodeURIComponent(e)}&body=${encodeURIComponent(t)}`;(0,telemetry_1.trackTelemetryEvent)("feedback_submitted",{category:u,module:o,mood:m,chips_count:s.length,has_custom_note:!!y.trim()});let d=!1;try{await react_native_1.Linking.openURL(c),d=!0}catch{d=!1}if(d)(0,helpers_1.showToast)("Opening mail client..."),r();else{const p=`To: ${DEVELOPER_EMAIL}
9
- Subject: ${e}
10
-
11
- ${t}`;(0,helpers_1.copyToClipboard)(p,"Feedback Draft"),react_native_1.Alert.alert("Email Client Not Available",`Your feedback and diagnostics have been copied to clipboard!
12
-
13
- You can paste and send directly to:
14
- ${DEVELOPER_EMAIL}`,[{text:"Copy Email Address",onPress:()=>{(0,helpers_1.copyToClipboard)(DEVELOPER_EMAIL,"Email Address"),(0,helpers_1.showToast)("Email address copied!")}},{text:"Done",style:"default",onPress:r}])}}catch(e){console.warn("[FeedbackModal] Error sending email:",e)}finally{x(!1)}}};return<react_native_1.View style={styles.container}>
15
- <react_native_1.ScrollView style={styles.scrollContent}contentContainerStyle={styles.scrollInner}showsVerticalScrollIndicator={!1}keyboardShouldPersistTaps="handled">
16
-
17
- <react_native_1.Text style={styles.sectionLabel}>1. TARGET MODULE</react_native_1.Text>
18
-
19
- <TouchableScale_1.default onPress={()=>{(0,NativeInspector_1.triggerNativeHaptic)("light"),i(!0)}}style={styles.moduleTriggerCard}>
20
- <react_native_1.View style={styles.moduleTriggerLeft}>
21
- <react_native_1.View style={[styles.moduleIconBox,{backgroundColor:`${a.color}1C`}]}>
22
- <react_native_1.Text style={styles.moduleIconText}>{a.icon}</react_native_1.Text>
23
- </react_native_1.View>
24
- <react_native_1.View style={{flex:1,minWidth:0}}>
25
- <react_native_1.View style={styles.moduleNameRow}>
26
- <react_native_1.Text style={styles.moduleNameText}>{a.name}</react_native_1.Text>
27
- <react_native_1.View style={[styles.moduleCategoryBadge,{backgroundColor:`${a.color}18`}]}>
28
- <react_native_1.Text style={[styles.moduleCategoryBadgeText,{color:a.color}]}>
29
- {a.category}
30
- </react_native_1.Text>
31
- </react_native_1.View>
32
- </react_native_1.View>
33
- <react_native_1.Text style={styles.moduleDescText}numberOfLines={1}>
34
- {a.description}
35
- </react_native_1.Text>
36
- </react_native_1.View>
37
- </react_native_1.View>
38
-
39
- <react_native_1.View style={styles.changeBadge}>
40
- <react_native_1.Text style={styles.changeBadgeText}>Change</react_native_1.Text>
41
- <NetworkIcons_1.ChevronDownIcon size={11}color={AppColors_1.AppColors.purple}/>
42
- </react_native_1.View>
43
- </TouchableScale_1.default>
44
-
45
-
46
- <react_native_1.View style={styles.sectionHeaderRow}>
47
- <react_native_1.Text style={styles.sectionLabel}>
48
- 2. QUICK PRESETS FOR {a.name.toUpperCase()}
49
- </react_native_1.Text>
50
- {s.length>0&&<react_native_1.TouchableOpacity onPress={()=>h([])}>
51
- <react_native_1.Text style={styles.clearChipsText}>Clear</react_native_1.Text>
52
- </react_native_1.TouchableOpacity>}
53
- </react_native_1.View>
54
-
55
- <react_native_1.View style={styles.chipsContainer}>
56
- {P.map(e=>{const t=s.includes(e);return<TouchableScale_1.default key={e}onPress={()=>H(e)}style={[styles.presetChip,t&&[styles.presetChipSelected,{borderColor:a.color,backgroundColor:`${a.color}18`}]]}>
57
- <react_native_1.Text style={[styles.presetChipCheck,t&&{color:a.color}]}>
58
- {t?"\u2713":"+"}
59
- </react_native_1.Text>
60
- <react_native_1.Text style={[styles.presetChipText,t&&[styles.presetChipTextSelected,{color:a.color}]]}>
61
- {e}
62
- </react_native_1.Text>
63
- </TouchableScale_1.default>})}
64
- </react_native_1.View>
65
-
66
-
67
- <react_native_1.Text style={styles.sectionLabel}>3. SELECT TOPIC</react_native_1.Text>
68
- <react_native_1.View style={styles.categoryGrid}>
69
- {CATEGORIES.map(e=>{const t=u===e.key;return<TouchableScale_1.default key={e.key}onPress={()=>L(e.key)}style={[styles.categoryChip,t&&{backgroundColor:e.bgColor,borderColor:e.color}]}>
70
- <react_native_1.Text style={styles.categoryIcon}>{e.icon}</react_native_1.Text>
71
- <react_native_1.Text style={[styles.categoryText,t&&{color:e.color,fontFamily:AppFonts_1.AppFonts.interBold}]}>
72
- {e.label}
73
- </react_native_1.Text>
74
- </TouchableScale_1.default>})}
75
- </react_native_1.View>
76
-
77
-
78
- <react_native_1.Text style={styles.sectionLabel}>4. HOW IS YOUR EXPERIENCE?</react_native_1.Text>
79
- <react_native_1.View style={styles.moodCard}>
80
- <react_native_1.View style={styles.moodRow}>
81
- {MOODS.map(e=>{const t=m===e.value;return<TouchableScale_1.default key={e.value}onPress={()=>{(0,NativeInspector_1.triggerNativeHaptic)("light"),F(e.value)}}style={[styles.moodButton,t&&[styles.moodButtonSelected,{borderColor:e.color,backgroundColor:`${e.color}15`}]]}>
82
- <react_native_1.Text style={styles.moodEmoji}>{e.emoji}</react_native_1.Text>
83
- <react_native_1.Text style={[styles.moodLabel,t&&{color:e.color,fontFamily:AppFonts_1.AppFonts.interBold}]}>
84
- {e.label}
85
- </react_native_1.Text>
86
- </TouchableScale_1.default>})}
87
- </react_native_1.View>
88
- </react_native_1.View>
89
-
90
-
91
- <react_native_1.Text style={styles.sectionLabel}>5. ADDITIONAL DETAILS (OPTIONAL)</react_native_1.Text>
92
- <react_native_1.View style={styles.inputWrapper}>
93
- <react_native_1.TextInput style={styles.textInput}placeholder="Type any extra thoughts, steps to reproduce, or notes here..."placeholderTextColor={AppColors_1.AppColors.grayTextWeak}value={y}onChangeText={V}multiline numberOfLines={3}textAlignVertical="top"/>
94
- </react_native_1.View>
95
-
96
-
97
- <react_native_1.TouchableOpacity activeOpacity={.8}onPress={()=>{(0,NativeInspector_1.triggerNativeHaptic)("light"),R(!f)}}style={styles.diagnosticsPill}>
98
- <react_native_1.View style={styles.diagnosticsLeft}>
99
- <NetworkIcons_1.InfoCircleIcon size={14}color={AppColors_1.AppColors.purple}/>
100
- <react_native_1.Text style={styles.diagnosticsPillTitle}numberOfLines={1}>
101
- {react_native_1.Platform.OS.toUpperCase()} {react_native_1.Platform.Version} • {k} v{A} (Auto-attached)
102
- </react_native_1.Text>
103
- </react_native_1.View>
104
- <react_native_1.Text style={styles.diagnosticsArrow}>
105
- {f?"\u25B2 Less":"\u25BC Details"}
106
- </react_native_1.Text>
107
- </react_native_1.TouchableOpacity>
108
-
109
- {f&&<react_native_1.View style={styles.diagnosticsBox}>
110
- <react_native_1.Text style={styles.diagnosticsText}>{B()}</react_native_1.Text>
111
- </react_native_1.View>}
112
- </react_native_1.ScrollView>
113
-
114
-
115
- <react_native_1.View style={styles.footer}>
116
- <react_native_1.View style={styles.footerLeft}>
117
- <TouchableScale_1.default onPress={$}style={styles.actionPillBtn}>
118
- {b?<NetworkIcons_1.CheckIcon size={14}color={AppColors_1.AppColors.emerald500}/>:<NetworkIcons_1.CopyIcon size={14}color={AppColors_1.AppColors.grayTextStrong}/>}
119
- <react_native_1.Text style={[styles.actionPillText,b&&{color:AppColors_1.AppColors.emerald500}]}>
120
- {b?"Copied!":"Copy"}
121
- </react_native_1.Text>
122
- </TouchableScale_1.default>
123
-
124
- <TouchableScale_1.default onPress={M}style={[styles.actionPillBtn,styles.githubPillBtn]}>
125
- <GitHubIcon size={13}color={AppColors_1.AppColors.primaryBlack}/>
126
- <react_native_1.Text style={styles.actionPillText}>GitHub</react_native_1.Text>
127
- </TouchableScale_1.default>
128
- </react_native_1.View>
129
-
130
- <TouchableScale_1.default onPress={j}style={styles.primarySubmitBtn}>
131
- <NetworkIcons_1.SendIcon size={15}color={AppColors_1.AppColors.white}/>
132
- <react_native_1.Text style={styles.primarySubmitBtnText}>
133
- {_?"Sending...":"Send Feedback"}
134
- </react_native_1.Text>
135
- </TouchableScale_1.default>
136
- </react_native_1.View>
137
-
138
-
139
- <react_native_1.Modal visible={n}transparent={!0}animationType="fade"onRequestClose={()=>i(!1)}>
140
- <react_native_1.View style={styles.modalOverlay}>
141
- <react_native_1.TouchableOpacity style={styles.modalBackdrop}activeOpacity={1}onPress={()=>i(!1)}/>
142
- <react_native_1.View style={styles.pickerModalContainer}>
143
-
144
- <react_native_1.View style={styles.pickerHeader}>
145
- <react_native_1.View style={{flex:1}}>
146
- <react_native_1.Text style={styles.pickerHeaderTitle}>Select Target Module</react_native_1.Text>
147
- <react_native_1.Text style={styles.pickerHeaderSub}>
148
- Choose which inspector feature you want to report on
149
- </react_native_1.Text>
150
- </react_native_1.View>
151
- <react_native_1.TouchableOpacity onPress={()=>i(!1)}hitSlop={12}style={styles.pickerCloseBtn}>
152
- <NetworkIcons_1.CloseWhite size={12}/>
153
- </react_native_1.TouchableOpacity>
154
- </react_native_1.View>
155
-
156
-
157
- <react_native_1.View style={styles.pickerSearchWrapper}>
158
- <NetworkIcons_1.SearchIcon size={14}color={AppColors_1.AppColors.purple}/>
159
- <react_native_1.TextInput style={styles.pickerSearchInput}placeholder="Search all 11 modules..."placeholderTextColor={AppColors_1.AppColors.grayTextWeak}value={g}onChangeText={C}autoFocus={!1}/>
160
- {g.length>0&&<react_native_1.TouchableOpacity onPress={()=>C("")}hitSlop={10}>
161
- <react_native_1.Text style={styles.pickerClearSearchText}>✕</react_native_1.Text>
162
- </react_native_1.TouchableOpacity>}
163
- </react_native_1.View>
164
-
165
-
166
- <react_native_1.ScrollView style={styles.pickerListScroll}contentContainerStyle={{paddingBottom:20}}showsVerticalScrollIndicator={!1}keyboardShouldPersistTaps="handled">
167
- {S.length===0?<react_native_1.View style={styles.emptySearchWrap}>
168
- <react_native_1.Text style={styles.emptySearchText}>
169
- No modules match "{g}"
170
- </react_native_1.Text>
171
- </react_native_1.View>:S.map(e=>{const t=e.id===o;return<TouchableScale_1.default key={e.id}onPress={()=>E(e)}style={[styles.pickerItemCard,t&&[styles.pickerItemCardSelected,{borderColor:e.color,backgroundColor:`${e.color}0E`}]]}>
172
- <react_native_1.View style={[styles.pickerItemIconBox,{backgroundColor:`${e.color}1C`}]}>
173
- <react_native_1.Text style={styles.moduleIconText}>{e.icon}</react_native_1.Text>
174
- </react_native_1.View>
175
- <react_native_1.View style={{flex:1,minWidth:0}}>
176
- <react_native_1.View style={styles.pickerItemTitleRow}>
177
- <react_native_1.Text style={[styles.pickerItemTitle,t&&{color:e.color,fontFamily:AppFonts_1.AppFonts.interBold}]}>
178
- {e.name}
179
- </react_native_1.Text>
180
- <react_native_1.View style={[styles.moduleCategoryBadge,{backgroundColor:`${e.color}18`}]}>
181
- <react_native_1.Text style={[styles.moduleCategoryBadgeText,{color:e.color}]}>
182
- {e.category}
183
- </react_native_1.Text>
184
- </react_native_1.View>
185
- </react_native_1.View>
186
- <react_native_1.Text style={styles.pickerItemDesc}numberOfLines={2}>
187
- {e.description}
188
- </react_native_1.Text>
189
- </react_native_1.View>
190
- {t&&<react_native_1.View style={[styles.pickerItemCheck,{backgroundColor:`${e.color}25`}]}>
191
- <NetworkIcons_1.CheckIcon size={12}color={e.color}/>
192
- </react_native_1.View>}
193
- </TouchableScale_1.default>})}
194
- </react_native_1.ScrollView>
195
- </react_native_1.View>
196
- </react_native_1.View>
197
- </react_native_1.Modal>
198
- </react_native_1.View>};exports.FeedbackModal=FeedbackModal;const styles=react_native_1.StyleSheet.create({container:{flex:1,backgroundColor:AppColors_1.AppColors.primaryLight},bannerBar:{flexDirection:"row",alignItems:"center",gap:12,backgroundColor:`${AppColors_1.AppColors.purple}10`,paddingHorizontal:16,paddingVertical:12,borderBottomWidth:1,borderBottomColor:`${AppColors_1.AppColors.purple}20`},bannerIconBox:{width:36,height:36,borderRadius:10,backgroundColor:`${AppColors_1.AppColors.purple}20`,alignItems:"center",justifyContent:"center"},bannerTitleRow:{flexDirection:"row",alignItems:"center",gap:8},bannerTitle:{fontFamily:AppFonts_1.AppFonts.interBold,fontSize:13.5,lineHeight:18,color:AppColors_1.AppColors.purple},livePill:{flexDirection:"row",alignItems:"center",gap:4,backgroundColor:`${AppColors_1.AppColors.liveGreen}20`,paddingHorizontal:6,paddingVertical:1.5,borderRadius:10,borderWidth:1,borderColor:`${AppColors_1.AppColors.liveGreen}40`},liveDot:{width:5,height:5,borderRadius:2.5,backgroundColor:AppColors_1.AppColors.liveGreen},liveText:{fontFamily:AppFonts_1.AppFonts.interBold,fontSize:8.5,color:AppColors_1.AppColors.liveGreen},bannerSub:{fontFamily:AppFonts_1.AppFonts.interRegular,fontSize:11,lineHeight:15,color:AppColors_1.AppColors.grayText,marginTop:2},scrollContent:{flex:1},scrollInner:{paddingHorizontal:16,paddingTop:14,paddingBottom:24},sectionLabel:{fontFamily:AppFonts_1.AppFonts.interBold,fontSize:10.5,color:AppColors_1.AppColors.grayTextStrong,letterSpacing:.6,marginBottom:8},sectionHeaderRow:{flexDirection:"row",justifyContent:"space-between",alignItems:"center",marginTop:14,marginBottom:8},clearChipsText:{fontFamily:AppFonts_1.AppFonts.interSemiBold,fontSize:11,color:AppColors_1.AppColors.purple},moduleTriggerCard:{flexDirection:"row",alignItems:"center",justifyContent:"space-between",backgroundColor:AppColors_1.AppColors.grayBackground,borderRadius:12,borderWidth:1.5,borderColor:AppColors_1.AppColors.dividerColor,paddingHorizontal:12,paddingVertical:10,marginBottom:8,shadowColor:AppColors_1.AppColors.black,shadowOffset:{width:0,height:1},shadowOpacity:.04,shadowRadius:3,elevation:1},moduleTriggerLeft:{flexDirection:"row",alignItems:"center",gap:10,flex:1,marginRight:8},moduleIconBox:{width:38,height:38,borderRadius:10,alignItems:"center",justifyContent:"center"},moduleIconText:{fontSize:18},moduleNameRow:{flexDirection:"row",alignItems:"center",gap:6},moduleNameText:{fontFamily:AppFonts_1.AppFonts.interBold,fontSize:13,color:AppColors_1.AppColors.primaryBlack},moduleCategoryBadge:{paddingHorizontal:6,paddingVertical:1.5,borderRadius:6},moduleCategoryBadgeText:{fontFamily:AppFonts_1.AppFonts.interSemiBold,fontSize:9,letterSpacing:.2},moduleDescText:{fontFamily:AppFonts_1.AppFonts.interRegular,fontSize:10.5,color:AppColors_1.AppColors.grayTextWeak,marginTop:2},changeBadge:{flexDirection:"row",alignItems:"center",gap:3,backgroundColor:`${AppColors_1.AppColors.purple}14`,paddingHorizontal:8,paddingVertical:4.5,borderRadius:8,borderWidth:1,borderColor:`${AppColors_1.AppColors.purple}30`},changeBadgeText:{fontFamily:AppFonts_1.AppFonts.interSemiBold,fontSize:10.5,color:AppColors_1.AppColors.purple},chipsContainer:{flexDirection:"row",flexWrap:"wrap",gap:7,marginBottom:14},presetChip:{flexDirection:"row",alignItems:"center",gap:5,paddingVertical:6.5,paddingHorizontal:11,borderRadius:8,backgroundColor:AppColors_1.AppColors.grayBackground,borderWidth:1.2,borderColor:AppColors_1.AppColors.dividerColor},presetChipSelected:{shadowColor:AppColors_1.AppColors.black,shadowOffset:{width:0,height:1},shadowOpacity:.05,shadowRadius:2,elevation:1},presetChipCheck:{fontFamily:AppFonts_1.AppFonts.interBold,fontSize:11,color:AppColors_1.AppColors.grayTextWeak},presetChipText:{fontFamily:AppFonts_1.AppFonts.interMedium,fontSize:11.5,lineHeight:15,color:AppColors_1.AppColors.primaryBlack},presetChipTextSelected:{fontFamily:AppFonts_1.AppFonts.interSemiBold},categoryGrid:{flexDirection:"row",flexWrap:"wrap",gap:8,marginBottom:14},categoryChip:{flexDirection:"row",alignItems:"center",gap:6,paddingVertical:7,paddingHorizontal:12,borderRadius:10,backgroundColor:AppColors_1.AppColors.grayBackground,borderWidth:1.5,borderColor:AppColors_1.AppColors.dividerColor},categoryIcon:{fontSize:13},categoryText:{fontFamily:AppFonts_1.AppFonts.interMedium,fontSize:12,lineHeight:16,color:AppColors_1.AppColors.grayText},moodCard:{backgroundColor:AppColors_1.AppColors.grayBackground,borderRadius:12,padding:8,marginBottom:14,borderWidth:1,borderColor:AppColors_1.AppColors.dividerColor},moodRow:{flexDirection:"row",alignItems:"center",justifyContent:"space-between",gap:4},moodButton:{flex:1,alignItems:"center",justifyContent:"center",paddingVertical:8,paddingHorizontal:2,borderRadius:8,borderWidth:1.5,borderColor:"transparent"},moodButtonSelected:{shadowColor:AppColors_1.AppColors.black,shadowOffset:{width:0,height:1},shadowOpacity:.06,shadowRadius:2,elevation:1},moodEmoji:{fontSize:22,marginBottom:4},moodLabel:{fontFamily:AppFonts_1.AppFonts.interMedium,fontSize:9.5,color:AppColors_1.AppColors.grayText,textAlign:"center"},inputWrapper:{backgroundColor:AppColors_1.AppColors.grayBackground,borderRadius:10,borderWidth:1,borderColor:AppColors_1.AppColors.dividerColor,paddingHorizontal:12,paddingVertical:8,minHeight:70,marginBottom:12},textInput:{fontFamily:AppFonts_1.AppFonts.interRegular,fontSize:12.5,lineHeight:18,color:AppColors_1.AppColors.primaryBlack,padding:0,minHeight:54},diagnosticsPill:{flexDirection:"row",alignItems:"center",justifyContent:"space-between",backgroundColor:`${AppColors_1.AppColors.purple}0C`,borderRadius:8,paddingHorizontal:12,paddingVertical:8,borderWidth:1,borderColor:`${AppColors_1.AppColors.purple}20`},diagnosticsLeft:{flexDirection:"row",alignItems:"center",gap:7,flex:1,marginRight:6},diagnosticsPillTitle:{fontFamily:AppFonts_1.AppFonts.interMedium,fontSize:11,color:AppColors_1.AppColors.purple,flexShrink:1},diagnosticsArrow:{fontFamily:AppFonts_1.AppFonts.interSemiBold,fontSize:10.5,color:AppColors_1.AppColors.purple},diagnosticsBox:{backgroundColor:"#1E1B2E",borderRadius:8,padding:10,marginTop:6,borderWidth:1,borderColor:AppColors_1.AppColors.dividerColor},diagnosticsText:{fontFamily:AppFonts_1.AppFonts.interRegular,fontSize:11,color:"#E2DFEB",lineHeight:17},footer:{flexDirection:"row",alignItems:"center",justifyContent:"space-between",paddingHorizontal:16,paddingTop:10,paddingBottom:react_native_1.Platform.OS==="ios"?34:14,borderTopWidth:1,borderTopColor:AppColors_1.AppColors.dividerColor,backgroundColor:AppColors_1.AppColors.primaryLight,gap:10},footerLeft:{flexDirection:"row",alignItems:"center",gap:8},actionPillBtn:{flexDirection:"row",alignItems:"center",gap:5,paddingVertical:8,paddingHorizontal:11,borderRadius:8,backgroundColor:AppColors_1.AppColors.grayBackground,borderWidth:1,borderColor:AppColors_1.AppColors.dividerColor},githubPillBtn:{backgroundColor:`${AppColors_1.AppColors.black}08`},actionPillText:{fontFamily:AppFonts_1.AppFonts.interSemiBold,fontSize:11.5,color:AppColors_1.AppColors.grayTextStrong},primarySubmitBtn:{flex:1,flexDirection:"row",alignItems:"center",justifyContent:"center",gap:6,backgroundColor:AppColors_1.AppColors.purple,paddingVertical:9,paddingHorizontal:14,borderRadius:8,shadowColor:AppColors_1.AppColors.purple,shadowOffset:{width:0,height:2},shadowOpacity:.35,shadowRadius:6,elevation:4},primarySubmitBtnText:{fontFamily:AppFonts_1.AppFonts.interBold,fontSize:12.5,color:AppColors_1.AppColors.white},modalOverlay:{flex:1,justifyContent:"flex-end",backgroundColor:"rgba(0, 0, 0, 0.55)"},modalBackdrop:{...react_native_1.StyleSheet.absoluteFillObject},pickerModalContainer:{backgroundColor:AppColors_1.AppColors.primaryLight,borderTopLeftRadius:20,borderTopRightRadius:20,maxHeight:"82%",paddingHorizontal:16,paddingTop:16,paddingBottom:react_native_1.Platform.OS==="ios"?34:16,shadowColor:AppColors_1.AppColors.black,shadowOffset:{width:0,height:-4},shadowOpacity:.15,shadowRadius:10,elevation:20},pickerHeader:{flexDirection:"row",alignItems:"center",justifyContent:"space-between",marginBottom:12},pickerHeaderTitle:{fontFamily:AppFonts_1.AppFonts.interBold,fontSize:15,color:AppColors_1.AppColors.primaryBlack},pickerHeaderSub:{fontFamily:AppFonts_1.AppFonts.interRegular,fontSize:11,color:AppColors_1.AppColors.grayText,marginTop:1},pickerCloseBtn:{width:28,height:28,borderRadius:14,backgroundColor:`${AppColors_1.AppColors.black}15`,alignItems:"center",justifyContent:"center"},pickerSearchWrapper:{flexDirection:"row",alignItems:"center",backgroundColor:AppColors_1.AppColors.grayBackground,borderRadius:10,borderWidth:1,borderColor:AppColors_1.AppColors.dividerColor,paddingHorizontal:10,paddingVertical:8,gap:8,marginBottom:12},pickerSearchInput:{flex:1,fontFamily:AppFonts_1.AppFonts.interRegular,fontSize:13,color:AppColors_1.AppColors.primaryBlack,padding:0},pickerClearSearchText:{fontFamily:AppFonts_1.AppFonts.interBold,fontSize:12,color:AppColors_1.AppColors.grayTextWeak,paddingHorizontal:4},pickerListScroll:{maxHeight:380},emptySearchWrap:{paddingVertical:24,alignItems:"center",justifyContent:"center"},emptySearchText:{fontFamily:AppFonts_1.AppFonts.interMedium,fontSize:12,color:AppColors_1.AppColors.grayTextWeak},pickerItemCard:{flexDirection:"row",alignItems:"center",gap:12,padding:10,borderRadius:10,backgroundColor:AppColors_1.AppColors.grayBackground,borderWidth:1.5,borderColor:AppColors_1.AppColors.dividerColor,marginBottom:8},pickerItemCardSelected:{shadowColor:AppColors_1.AppColors.black,shadowOffset:{width:0,height:2},shadowOpacity:.05,shadowRadius:3,elevation:2},pickerItemIconBox:{width:36,height:36,borderRadius:9,alignItems:"center",justifyContent:"center"},pickerItemTitleRow:{flexDirection:"row",alignItems:"center",justifyContent:"space-between",marginBottom:2},pickerItemTitle:{fontFamily:AppFonts_1.AppFonts.interSemiBold,fontSize:12.5,color:AppColors_1.AppColors.primaryBlack},pickerItemDesc:{fontFamily:AppFonts_1.AppFonts.interRegular,fontSize:10.5,lineHeight:14,color:AppColors_1.AppColors.grayTextWeak},pickerItemCheck:{width:22,height:22,borderRadius:11,alignItems:"center",justifyContent:"center"}});exports.default=exports.FeedbackModal;
@@ -1,16 +0,0 @@
1
- import React from 'react';
2
- export interface FeedbackModalProps {
3
- visible?: boolean;
4
- onClose: () => void;
5
- }
6
- export interface InspectorModuleItem {
7
- id: string;
8
- name: string;
9
- category: string;
10
- icon: string;
11
- description: string;
12
- color: string;
13
- quickChips: string[];
14
- }
15
- export declare const FeedbackModal: React.FC<FeedbackModalProps>;
16
- export default FeedbackModal;
@@ -1,198 +0,0 @@
1
- import{useState as x,useEffect as Ae,useMemo as M}from"react";import{Alert as Me,Dimensions as je,PixelRatio as We,Platform as V,Linking as ne,Modal as Ge,ScrollView as Ce,StyleSheet as ke,Text as C,TextInput as Se,TouchableOpacity as O,View as S}from"react-native";import Ne,{Path as Ue}from"react-native-svg";import{AppColors as o}from"../../styles/AppColors";import{AppFonts as k}from"../../styles/AppFonts";import R from"../TouchableScale";import{LIB_VERSION as qe}from"../../constants/version";import{getAppName as _e,getBundleIdentifier as Ke,getAppVersionAndBuild as Qe,copyToClipboard as K,showToast as j}from"../../helpers";import{trackTelemetryEvent as Q}from"../../helpers/telemetry";import{triggerNativeHaptic as B}from"../../native/NativeInspector";import{SendIcon as Ye,CopyIcon as Je,InfoCircleIcon as Xe,CheckIcon as Te,SearchIcon as Ze,ChevronDownIcon as Co,CloseWhite as So}from"../NetworkIcons";const H="vengatmacuser@gmail.com",To="https://github.com/vengatmacuser/react-native-inapp-inspector",W=[{id:"apis",name:"Network (APIs)",category:"Core Inspector",icon:"\u{1F310}",description:"HTTP/HTTPS requests, WebSocket, status codes & latency",color:"#6366F1",quickChips:["cURL / HAR Export","Requests failing / missing","GraphQL query filter","Response format issue","SSL pinning / certs","Slow API response alerts"]},{id:"logs",name:"Console Logs",category:"Core Inspector",icon:"\u{1F4DD}",description:"console.log, warn, error, trace & regex search",color:"#8B5CF6",quickChips:["Log regex search / filter","Stack trace symbolication","Error group collapse","Custom tag / color highlight","High log spam performance"]},{id:"redux",name:"Redux Inspector",category:"State Management",icon:"\u269B\uFE0F",description:"Redux store slices, action dispatch history & state diff",color:"#7C3AED",quickChips:["Action time-travel / replay","State slice search & diff","Auto action logger","Persistence / rehydration","Large state tree lag"]},{id:"analytics",name:"Analytics Logger",category:"Telemetry",icon:"\u{1F4CA}",description:"Firebase analytics & custom telemetry event tracking",color:"#F59E0B",quickChips:["Firebase auto-interceptor","Custom event param view","Event export to CSV / JSON","Filter by event name"]},{id:"crash",name:"Crash Protection",category:"Diagnostics",icon:"\u{1F4A5}",description:"Unhandled exceptions, fatal crash captures & stack trace",color:"#EF4444",quickChips:["Auto screenshot on crash","Native crash reporting","Symbolicated stack trace","Error boundary recovery"]},{id:"performance",name:"Performance Tracker",category:"Diagnostics",icon:"\u26A1",description:"FPS monitor, memory footprint, CPU & render timing",color:"#10B981",quickChips:["FPS drop alerts","Memory leak detection","Slow component render timings","Screen transition metrics"]},{id:"bundle",name:"Bundle Analyzer",category:"Optimization",icon:"\u{1F4E6}",description:"Hermes JS bundle visualizer & package asset weight",color:"#3B82F6",quickChips:["Package tree visualizer","Duplicate dependency warning","Asset size breakdown","Sourcemap integration"]},{id:"storage",name:"Storage Explorer",category:"Storage",icon:"\u{1F4BE}",description:"AsyncStorage, MMKV & local key-value store viewer",color:"#06B6D4",quickChips:["AsyncStorage live edit","MMKV encrypted keys","Clear storage cache","Key search & filter"]},{id:"capture",name:"Screen Capture",category:"Media",icon:"\u{1F4F8}",description:"High-res screenshots, video & animated GIF recording",color:"#EC4899",quickChips:["GIF conversion resolution","Audio recording option","Auto-hide inspector in shots","Instant media preview"]},{id:"launcher",name:"FAB Launcher & UI",category:"Interface",icon:"\u{1F680}",description:"Floating trigger, gestures, dark mode & modal themes",color:"#D946EF",quickChips:["Draggable FAB positioning","Custom dark / light theme","Font scaling & line heights","Custom app header logo"]},{id:"general",name:"Entire Inspector / General",category:"General",icon:"\u2728",description:"General feedback, documentation, new ideas & support",color:"#64748B",quickChips:["Love this tool! \u{1F680}","Super easy integration \u{1F6E0}\uFE0F","Documentation clarification \u{1F4D6}","Feature roadmap suggestion \u{1F5FA}\uFE0F"]}],Y=[{key:"feedback",label:"Feedback",icon:"\u{1F4AC}",color:"#8B5CF6",bgColor:"#8B5CF618"},{key:"bug",label:"Bug Report",icon:"\u{1F41B}",color:"#EF4444",bgColor:"#EF444418"},{key:"feature",label:"Feature Request",icon:"\u2728",color:"#F59E0B",bgColor:"#F59E0B18"},{key:"performance",label:"Performance",icon:"\u26A1",color:"#10B981",bgColor:"#10B98118"},{key:"help",label:"Support / Help",icon:"\u2753",color:"#3B82F6",bgColor:"#3B82F618"}],J=[{value:1,emoji:"\u{1F621}",label:"Frustrated",color:"#EF4444"},{value:2,emoji:"\u{1F610}",label:"Okay",color:"#F59E0B"},{value:3,emoji:"\u{1F642}",label:"Good",color:"#10B981"},{value:4,emoji:"\u{1F929}",label:"Great",color:"#8B5CF6"},{value:5,emoji:"\u{1F680}",label:"Loving it!",color:"#EC4899"}],Bo=({size:P=14,color:I=o.white})=><Ne width={P}height={P}viewBox="0 0 24 24"fill={I}>
2
- <Ue d="M12 0C5.37 0 0 5.37 0 12c0 5.31 3.435 9.795 8.205 11.385.6.105.825-.255.825-.57 0-.285-.015-1.23-.015-2.235-3.015.555-3.795-.735-4.035-1.41-.135-.345-.72-1.41-1.23-1.695-.42-.225-1.02-.78-.015-.795.945-.015 1.62.87 1.845 1.23 1.08 1.815 2.805 1.305 3.495.99.105-.78.42-1.305.765-1.605-2.67-.3-5.46-1.335-5.46-5.925 0-1.305.465-2.385 1.23-3.225-.12-.3-.54-1.53.12-3.18 0 0 1.005-.315 3.3 1.23.96-.27 1.98-.405 3-.405s2.04.135 3 .405c2.295-1.56 3.3-1.23 3.3-1.23.66 1.65.24 2.88.12 3.18.765.84 1.23 1.905 1.23 3.225 0 4.605-2.805 5.625-5.475 5.925.435.375.81 1.095.81 2.22 0 1.605-.015 2.895-.015 3.3 0 .315.225.69.825.57A12.02 12.02 0 0024 12c0-6.63-5.37-12-12-12z"/>
3
- </Ne>;export const FeedbackModal=({onClose:P})=>{const[I,xe]=x("apis"),[we,E]=x(!1),[L,G]=x(""),[D,Be]=x("feedback"),[F,N]=x([]),[$,Ie]=x(5),[A,Re]=x(""),[U,Fe]=x(!1),[X,Z]=x(!1),[q,ee]=x(!1);Ae(()=>{Q("feedback_modal_opened",{category:D,module:I})},[]);const T=M(()=>W.find(t=>t.id===I)||W[0],[I]),oe=M(()=>{const t=L.trim().toLowerCase();return t?W.filter(r=>r.name.toLowerCase().includes(t)||r.category.toLowerCase().includes(t)||r.description.toLowerCase().includes(t)):W},[L]),te=M(()=>Y.find(t=>t.key===D)||Y[0],[D]),ve=M(()=>T.quickChips,[T]),re=_e()||"React Native App",ze=Ke()||"unknown",ie=Qe()?.formatted||"1.0.0",{width:De,height:Ve}=je.get("window"),ae=()=>[`\u2022 Module Context: ${T.name} (${T.category})`,`\u2022 Package: react-native-inapp-inspector@${qe}`,`\u2022 Platform: ${V.OS.toUpperCase()} (${V.Version})`,`\u2022 App: ${re} (${ze}) v${ie}`,`\u2022 Screen: ${Math.round(De)} x ${Math.round(Ve)} (Scale ${We.get()})`,`\u2022 Timestamp: ${new Date().toISOString()}`].join(`
4
- `),Pe=t=>{B("light"),N(r=>r.includes(t)?r.filter(w=>w!==t):[...r,t])},Ee=t=>{B("medium"),xe(t.id),E(!1),G(""),N([])},Le=t=>{B("medium"),Be(t)},_=()=>{const t=J.find(z=>z.value===$)||J[4],r=F.length>0?F.join(", "):"General thoughts",w=`[In-App Inspector] [${T.name}] [${te.label}] ${r.slice(0,50)}`,v=[`\u{1F4E6} Module: ${T.name} (${T.category})`,`\u{1F3AF} Type: ${te.label}`,`\u{1F31F} Mood / Experience: ${t.emoji} ${t.label} (${$}/5)`,...F.length>0?["","\u{1F4CC} Key Highlights / Items:",...F.map(z=>` \u2022 ${z}`)]:[],...A.trim()?["","\u{1F4DD} Additional Notes:",A.trim()]:[],"","----------------------------------------","\u26A1 System & Diagnostic Info (Auto-attached):",ae(),"----------------------------------------"];return{subject:w,body:v.join(`
5
- `),activeMood:t}},$e=()=>{B("success");const{subject:t,body:r}=_(),w=`To: ${H}
6
- Subject: ${t}
7
-
8
- ${r}`;K(w,"Feedback Draft & Diagnostics"),ee(!0),setTimeout(()=>ee(!1),2e3),j("Feedback draft & diagnostics copied to clipboard")},Oe=async()=>{B("medium");try{const{subject:t,body:r}=_(),w=encodeURIComponent(t),v=encodeURIComponent(r),z=`${To}/issues/new?title=${w}&body=${v}`;await ne.openURL(z),Q("feedback_github_opened",{category:D,module:I,mood:$})}catch{j("Could not open GitHub browser")}},He=async()=>{if(!X){Z(!0),B("medium");try{const{subject:t,body:r}=_(),w=`mailto:${H}?subject=${encodeURIComponent(t)}&body=${encodeURIComponent(r)}`;Q("feedback_submitted",{category:D,module:I,mood:$,chips_count:F.length,has_custom_note:!!A.trim()});let v=!1;try{await ne.openURL(w),v=!0}catch{v=!1}if(v)j("Opening mail client..."),P();else{const z=`To: ${H}
9
- Subject: ${t}
10
-
11
- ${r}`;K(z,"Feedback Draft"),Me.alert("Email Client Not Available",`Your feedback and diagnostics have been copied to clipboard!
12
-
13
- You can paste and send directly to:
14
- ${H}`,[{text:"Copy Email Address",onPress:()=>{K(H,"Email Address"),j("Email address copied!")}},{text:"Done",style:"default",onPress:P}])}}catch(t){console.warn("[FeedbackModal] Error sending email:",t)}finally{Z(!1)}}};return<S style={e.container}>
15
- <Ce style={e.scrollContent}contentContainerStyle={e.scrollInner}showsVerticalScrollIndicator={!1}keyboardShouldPersistTaps="handled">
16
-
17
- <C style={e.sectionLabel}>1. TARGET MODULE</C>
18
-
19
- <R onPress={()=>{B("light"),E(!0)}}style={e.moduleTriggerCard}>
20
- <S style={e.moduleTriggerLeft}>
21
- <S style={[e.moduleIconBox,{backgroundColor:`${T.color}1C`}]}>
22
- <C style={e.moduleIconText}>{T.icon}</C>
23
- </S>
24
- <S style={{flex:1,minWidth:0}}>
25
- <S style={e.moduleNameRow}>
26
- <C style={e.moduleNameText}>{T.name}</C>
27
- <S style={[e.moduleCategoryBadge,{backgroundColor:`${T.color}18`}]}>
28
- <C style={[e.moduleCategoryBadgeText,{color:T.color}]}>
29
- {T.category}
30
- </C>
31
- </S>
32
- </S>
33
- <C style={e.moduleDescText}numberOfLines={1}>
34
- {T.description}
35
- </C>
36
- </S>
37
- </S>
38
-
39
- <S style={e.changeBadge}>
40
- <C style={e.changeBadgeText}>Change</C>
41
- <Co size={11}color={o.purple}/>
42
- </S>
43
- </R>
44
-
45
-
46
- <S style={e.sectionHeaderRow}>
47
- <C style={e.sectionLabel}>
48
- 2. QUICK PRESETS FOR {T.name.toUpperCase()}
49
- </C>
50
- {F.length>0&&<O onPress={()=>N([])}>
51
- <C style={e.clearChipsText}>Clear</C>
52
- </O>}
53
- </S>
54
-
55
- <S style={e.chipsContainer}>
56
- {ve.map(t=>{const r=F.includes(t);return<R key={t}onPress={()=>Pe(t)}style={[e.presetChip,r&&[e.presetChipSelected,{borderColor:T.color,backgroundColor:`${T.color}18`}]]}>
57
- <C style={[e.presetChipCheck,r&&{color:T.color}]}>
58
- {r?"\u2713":"+"}
59
- </C>
60
- <C style={[e.presetChipText,r&&[e.presetChipTextSelected,{color:T.color}]]}>
61
- {t}
62
- </C>
63
- </R>})}
64
- </S>
65
-
66
-
67
- <C style={e.sectionLabel}>3. SELECT TOPIC</C>
68
- <S style={e.categoryGrid}>
69
- {Y.map(t=>{const r=D===t.key;return<R key={t.key}onPress={()=>Le(t.key)}style={[e.categoryChip,r&&{backgroundColor:t.bgColor,borderColor:t.color}]}>
70
- <C style={e.categoryIcon}>{t.icon}</C>
71
- <C style={[e.categoryText,r&&{color:t.color,fontFamily:k.interBold}]}>
72
- {t.label}
73
- </C>
74
- </R>})}
75
- </S>
76
-
77
-
78
- <C style={e.sectionLabel}>4. HOW IS YOUR EXPERIENCE?</C>
79
- <S style={e.moodCard}>
80
- <S style={e.moodRow}>
81
- {J.map(t=>{const r=$===t.value;return<R key={t.value}onPress={()=>{B("light"),Ie(t.value)}}style={[e.moodButton,r&&[e.moodButtonSelected,{borderColor:t.color,backgroundColor:`${t.color}15`}]]}>
82
- <C style={e.moodEmoji}>{t.emoji}</C>
83
- <C style={[e.moodLabel,r&&{color:t.color,fontFamily:k.interBold}]}>
84
- {t.label}
85
- </C>
86
- </R>})}
87
- </S>
88
- </S>
89
-
90
-
91
- <C style={e.sectionLabel}>5. ADDITIONAL DETAILS (OPTIONAL)</C>
92
- <S style={e.inputWrapper}>
93
- <Se style={e.textInput}placeholder="Type any extra thoughts, steps to reproduce, or notes here..."placeholderTextColor={o.grayTextWeak}value={A}onChangeText={Re}multiline numberOfLines={3}textAlignVertical="top"/>
94
- </S>
95
-
96
-
97
- <O activeOpacity={.8}onPress={()=>{B("light"),Fe(!U)}}style={e.diagnosticsPill}>
98
- <S style={e.diagnosticsLeft}>
99
- <Xe size={14}color={o.purple}/>
100
- <C style={e.diagnosticsPillTitle}numberOfLines={1}>
101
- {V.OS.toUpperCase()} {V.Version} • {re} v{ie} (Auto-attached)
102
- </C>
103
- </S>
104
- <C style={e.diagnosticsArrow}>
105
- {U?"\u25B2 Less":"\u25BC Details"}
106
- </C>
107
- </O>
108
-
109
- {U&&<S style={e.diagnosticsBox}>
110
- <C style={e.diagnosticsText}>{ae()}</C>
111
- </S>}
112
- </Ce>
113
-
114
-
115
- <S style={e.footer}>
116
- <S style={e.footerLeft}>
117
- <R onPress={$e}style={e.actionPillBtn}>
118
- {q?<Te size={14}color={o.emerald500}/>:<Je size={14}color={o.grayTextStrong}/>}
119
- <C style={[e.actionPillText,q&&{color:o.emerald500}]}>
120
- {q?"Copied!":"Copy"}
121
- </C>
122
- </R>
123
-
124
- <R onPress={Oe}style={[e.actionPillBtn,e.githubPillBtn]}>
125
- <Bo size={13}color={o.primaryBlack}/>
126
- <C style={e.actionPillText}>GitHub</C>
127
- </R>
128
- </S>
129
-
130
- <R onPress={He}style={e.primarySubmitBtn}>
131
- <Ye size={15}color={o.white}/>
132
- <C style={e.primarySubmitBtnText}>
133
- {X?"Sending...":"Send Feedback"}
134
- </C>
135
- </R>
136
- </S>
137
-
138
-
139
- <Ge visible={we}transparent={!0}animationType="fade"onRequestClose={()=>E(!1)}>
140
- <S style={e.modalOverlay}>
141
- <O style={e.modalBackdrop}activeOpacity={1}onPress={()=>E(!1)}/>
142
- <S style={e.pickerModalContainer}>
143
-
144
- <S style={e.pickerHeader}>
145
- <S style={{flex:1}}>
146
- <C style={e.pickerHeaderTitle}>Select Target Module</C>
147
- <C style={e.pickerHeaderSub}>
148
- Choose which inspector feature you want to report on
149
- </C>
150
- </S>
151
- <O onPress={()=>E(!1)}hitSlop={12}style={e.pickerCloseBtn}>
152
- <So size={12}/>
153
- </O>
154
- </S>
155
-
156
-
157
- <S style={e.pickerSearchWrapper}>
158
- <Ze size={14}color={o.purple}/>
159
- <Se style={e.pickerSearchInput}placeholder="Search all 11 modules..."placeholderTextColor={o.grayTextWeak}value={L}onChangeText={G}autoFocus={!1}/>
160
- {L.length>0&&<O onPress={()=>G("")}hitSlop={10}>
161
- <C style={e.pickerClearSearchText}>✕</C>
162
- </O>}
163
- </S>
164
-
165
-
166
- <Ce style={e.pickerListScroll}contentContainerStyle={{paddingBottom:20}}showsVerticalScrollIndicator={!1}keyboardShouldPersistTaps="handled">
167
- {oe.length===0?<S style={e.emptySearchWrap}>
168
- <C style={e.emptySearchText}>
169
- No modules match "{L}"
170
- </C>
171
- </S>:oe.map(t=>{const r=t.id===I;return<R key={t.id}onPress={()=>Ee(t)}style={[e.pickerItemCard,r&&[e.pickerItemCardSelected,{borderColor:t.color,backgroundColor:`${t.color}0E`}]]}>
172
- <S style={[e.pickerItemIconBox,{backgroundColor:`${t.color}1C`}]}>
173
- <C style={e.moduleIconText}>{t.icon}</C>
174
- </S>
175
- <S style={{flex:1,minWidth:0}}>
176
- <S style={e.pickerItemTitleRow}>
177
- <C style={[e.pickerItemTitle,r&&{color:t.color,fontFamily:k.interBold}]}>
178
- {t.name}
179
- </C>
180
- <S style={[e.moduleCategoryBadge,{backgroundColor:`${t.color}18`}]}>
181
- <C style={[e.moduleCategoryBadgeText,{color:t.color}]}>
182
- {t.category}
183
- </C>
184
- </S>
185
- </S>
186
- <C style={e.pickerItemDesc}numberOfLines={2}>
187
- {t.description}
188
- </C>
189
- </S>
190
- {r&&<S style={[e.pickerItemCheck,{backgroundColor:`${t.color}25`}]}>
191
- <Te size={12}color={t.color}/>
192
- </S>}
193
- </R>})}
194
- </Ce>
195
- </S>
196
- </S>
197
- </Ge>
198
- </S>};const e=ke.create({container:{flex:1,backgroundColor:o.primaryLight},bannerBar:{flexDirection:"row",alignItems:"center",gap:12,backgroundColor:`${o.purple}10`,paddingHorizontal:16,paddingVertical:12,borderBottomWidth:1,borderBottomColor:`${o.purple}20`},bannerIconBox:{width:36,height:36,borderRadius:10,backgroundColor:`${o.purple}20`,alignItems:"center",justifyContent:"center"},bannerTitleRow:{flexDirection:"row",alignItems:"center",gap:8},bannerTitle:{fontFamily:k.interBold,fontSize:13.5,lineHeight:18,color:o.purple},livePill:{flexDirection:"row",alignItems:"center",gap:4,backgroundColor:`${o.liveGreen}20`,paddingHorizontal:6,paddingVertical:1.5,borderRadius:10,borderWidth:1,borderColor:`${o.liveGreen}40`},liveDot:{width:5,height:5,borderRadius:2.5,backgroundColor:o.liveGreen},liveText:{fontFamily:k.interBold,fontSize:8.5,color:o.liveGreen},bannerSub:{fontFamily:k.interRegular,fontSize:11,lineHeight:15,color:o.grayText,marginTop:2},scrollContent:{flex:1},scrollInner:{paddingHorizontal:16,paddingTop:14,paddingBottom:24},sectionLabel:{fontFamily:k.interBold,fontSize:10.5,color:o.grayTextStrong,letterSpacing:.6,marginBottom:8},sectionHeaderRow:{flexDirection:"row",justifyContent:"space-between",alignItems:"center",marginTop:14,marginBottom:8},clearChipsText:{fontFamily:k.interSemiBold,fontSize:11,color:o.purple},moduleTriggerCard:{flexDirection:"row",alignItems:"center",justifyContent:"space-between",backgroundColor:o.grayBackground,borderRadius:12,borderWidth:1.5,borderColor:o.dividerColor,paddingHorizontal:12,paddingVertical:10,marginBottom:8,shadowColor:o.black,shadowOffset:{width:0,height:1},shadowOpacity:.04,shadowRadius:3,elevation:1},moduleTriggerLeft:{flexDirection:"row",alignItems:"center",gap:10,flex:1,marginRight:8},moduleIconBox:{width:38,height:38,borderRadius:10,alignItems:"center",justifyContent:"center"},moduleIconText:{fontSize:18},moduleNameRow:{flexDirection:"row",alignItems:"center",gap:6},moduleNameText:{fontFamily:k.interBold,fontSize:13,color:o.primaryBlack},moduleCategoryBadge:{paddingHorizontal:6,paddingVertical:1.5,borderRadius:6},moduleCategoryBadgeText:{fontFamily:k.interSemiBold,fontSize:9,letterSpacing:.2},moduleDescText:{fontFamily:k.interRegular,fontSize:10.5,color:o.grayTextWeak,marginTop:2},changeBadge:{flexDirection:"row",alignItems:"center",gap:3,backgroundColor:`${o.purple}14`,paddingHorizontal:8,paddingVertical:4.5,borderRadius:8,borderWidth:1,borderColor:`${o.purple}30`},changeBadgeText:{fontFamily:k.interSemiBold,fontSize:10.5,color:o.purple},chipsContainer:{flexDirection:"row",flexWrap:"wrap",gap:7,marginBottom:14},presetChip:{flexDirection:"row",alignItems:"center",gap:5,paddingVertical:6.5,paddingHorizontal:11,borderRadius:8,backgroundColor:o.grayBackground,borderWidth:1.2,borderColor:o.dividerColor},presetChipSelected:{shadowColor:o.black,shadowOffset:{width:0,height:1},shadowOpacity:.05,shadowRadius:2,elevation:1},presetChipCheck:{fontFamily:k.interBold,fontSize:11,color:o.grayTextWeak},presetChipText:{fontFamily:k.interMedium,fontSize:11.5,lineHeight:15,color:o.primaryBlack},presetChipTextSelected:{fontFamily:k.interSemiBold},categoryGrid:{flexDirection:"row",flexWrap:"wrap",gap:8,marginBottom:14},categoryChip:{flexDirection:"row",alignItems:"center",gap:6,paddingVertical:7,paddingHorizontal:12,borderRadius:10,backgroundColor:o.grayBackground,borderWidth:1.5,borderColor:o.dividerColor},categoryIcon:{fontSize:13},categoryText:{fontFamily:k.interMedium,fontSize:12,lineHeight:16,color:o.grayText},moodCard:{backgroundColor:o.grayBackground,borderRadius:12,padding:8,marginBottom:14,borderWidth:1,borderColor:o.dividerColor},moodRow:{flexDirection:"row",alignItems:"center",justifyContent:"space-between",gap:4},moodButton:{flex:1,alignItems:"center",justifyContent:"center",paddingVertical:8,paddingHorizontal:2,borderRadius:8,borderWidth:1.5,borderColor:"transparent"},moodButtonSelected:{shadowColor:o.black,shadowOffset:{width:0,height:1},shadowOpacity:.06,shadowRadius:2,elevation:1},moodEmoji:{fontSize:22,marginBottom:4},moodLabel:{fontFamily:k.interMedium,fontSize:9.5,color:o.grayText,textAlign:"center"},inputWrapper:{backgroundColor:o.grayBackground,borderRadius:10,borderWidth:1,borderColor:o.dividerColor,paddingHorizontal:12,paddingVertical:8,minHeight:70,marginBottom:12},textInput:{fontFamily:k.interRegular,fontSize:12.5,lineHeight:18,color:o.primaryBlack,padding:0,minHeight:54},diagnosticsPill:{flexDirection:"row",alignItems:"center",justifyContent:"space-between",backgroundColor:`${o.purple}0C`,borderRadius:8,paddingHorizontal:12,paddingVertical:8,borderWidth:1,borderColor:`${o.purple}20`},diagnosticsLeft:{flexDirection:"row",alignItems:"center",gap:7,flex:1,marginRight:6},diagnosticsPillTitle:{fontFamily:k.interMedium,fontSize:11,color:o.purple,flexShrink:1},diagnosticsArrow:{fontFamily:k.interSemiBold,fontSize:10.5,color:o.purple},diagnosticsBox:{backgroundColor:"#1E1B2E",borderRadius:8,padding:10,marginTop:6,borderWidth:1,borderColor:o.dividerColor},diagnosticsText:{fontFamily:k.interRegular,fontSize:11,color:"#E2DFEB",lineHeight:17},footer:{flexDirection:"row",alignItems:"center",justifyContent:"space-between",paddingHorizontal:16,paddingTop:10,paddingBottom:V.OS==="ios"?34:14,borderTopWidth:1,borderTopColor:o.dividerColor,backgroundColor:o.primaryLight,gap:10},footerLeft:{flexDirection:"row",alignItems:"center",gap:8},actionPillBtn:{flexDirection:"row",alignItems:"center",gap:5,paddingVertical:8,paddingHorizontal:11,borderRadius:8,backgroundColor:o.grayBackground,borderWidth:1,borderColor:o.dividerColor},githubPillBtn:{backgroundColor:`${o.black}08`},actionPillText:{fontFamily:k.interSemiBold,fontSize:11.5,color:o.grayTextStrong},primarySubmitBtn:{flex:1,flexDirection:"row",alignItems:"center",justifyContent:"center",gap:6,backgroundColor:o.purple,paddingVertical:9,paddingHorizontal:14,borderRadius:8,shadowColor:o.purple,shadowOffset:{width:0,height:2},shadowOpacity:.35,shadowRadius:6,elevation:4},primarySubmitBtnText:{fontFamily:k.interBold,fontSize:12.5,color:o.white},modalOverlay:{flex:1,justifyContent:"flex-end",backgroundColor:"rgba(0, 0, 0, 0.55)"},modalBackdrop:{...ke.absoluteFillObject},pickerModalContainer:{backgroundColor:o.primaryLight,borderTopLeftRadius:20,borderTopRightRadius:20,maxHeight:"82%",paddingHorizontal:16,paddingTop:16,paddingBottom:V.OS==="ios"?34:16,shadowColor:o.black,shadowOffset:{width:0,height:-4},shadowOpacity:.15,shadowRadius:10,elevation:20},pickerHeader:{flexDirection:"row",alignItems:"center",justifyContent:"space-between",marginBottom:12},pickerHeaderTitle:{fontFamily:k.interBold,fontSize:15,color:o.primaryBlack},pickerHeaderSub:{fontFamily:k.interRegular,fontSize:11,color:o.grayText,marginTop:1},pickerCloseBtn:{width:28,height:28,borderRadius:14,backgroundColor:`${o.black}15`,alignItems:"center",justifyContent:"center"},pickerSearchWrapper:{flexDirection:"row",alignItems:"center",backgroundColor:o.grayBackground,borderRadius:10,borderWidth:1,borderColor:o.dividerColor,paddingHorizontal:10,paddingVertical:8,gap:8,marginBottom:12},pickerSearchInput:{flex:1,fontFamily:k.interRegular,fontSize:13,color:o.primaryBlack,padding:0},pickerClearSearchText:{fontFamily:k.interBold,fontSize:12,color:o.grayTextWeak,paddingHorizontal:4},pickerListScroll:{maxHeight:380},emptySearchWrap:{paddingVertical:24,alignItems:"center",justifyContent:"center"},emptySearchText:{fontFamily:k.interMedium,fontSize:12,color:o.grayTextWeak},pickerItemCard:{flexDirection:"row",alignItems:"center",gap:12,padding:10,borderRadius:10,backgroundColor:o.grayBackground,borderWidth:1.5,borderColor:o.dividerColor,marginBottom:8},pickerItemCardSelected:{shadowColor:o.black,shadowOffset:{width:0,height:2},shadowOpacity:.05,shadowRadius:3,elevation:2},pickerItemIconBox:{width:36,height:36,borderRadius:9,alignItems:"center",justifyContent:"center"},pickerItemTitleRow:{flexDirection:"row",alignItems:"center",justifyContent:"space-between",marginBottom:2},pickerItemTitle:{fontFamily:k.interSemiBold,fontSize:12.5,color:o.primaryBlack},pickerItemDesc:{fontFamily:k.interRegular,fontSize:10.5,lineHeight:14,color:o.grayTextWeak},pickerItemCheck:{width:22,height:22,borderRadius:11,alignItems:"center",justifyContent:"center"}});export default FeedbackModal;