react-native-bug-reporter 1.0.0

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 (152) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +217 -0
  3. package/android/build.gradle +49 -0
  4. package/android/src/main/AndroidManifest.xml +11 -0
  5. package/android/src/main/java/com/bugreporter/ScreenshotDetectorModule.kt +227 -0
  6. package/android/src/main/java/com/bugreporter/ScreenshotDetectorPackage.kt +20 -0
  7. package/ios/RNBugReporterScreenshot.m +11 -0
  8. package/ios/RNBugReporterScreenshot.swift +113 -0
  9. package/lib/commonjs/BugReporterProvider.js +139 -0
  10. package/lib/commonjs/BugReporterProvider.js.map +1 -0
  11. package/lib/commonjs/collectors/appInfo.js +21 -0
  12. package/lib/commonjs/collectors/appInfo.js.map +1 -0
  13. package/lib/commonjs/collectors/collectContext.js +45 -0
  14. package/lib/commonjs/collectors/collectContext.js.map +1 -0
  15. package/lib/commonjs/collectors/deviceInfo.js +41 -0
  16. package/lib/commonjs/collectors/deviceInfo.js.map +1 -0
  17. package/lib/commonjs/collectors/networkInfo.js +33 -0
  18. package/lib/commonjs/collectors/networkInfo.js.map +1 -0
  19. package/lib/commonjs/components/BugReportAdminScreen.js +225 -0
  20. package/lib/commonjs/components/BugReportAdminScreen.js.map +1 -0
  21. package/lib/commonjs/components/BugReportModal.js +341 -0
  22. package/lib/commonjs/components/BugReportModal.js.map +1 -0
  23. package/lib/commonjs/components/ScreenshotEditor.js +466 -0
  24. package/lib/commonjs/components/ScreenshotEditor.js.map +1 -0
  25. package/lib/commonjs/components/ScreenshotPreview.js +134 -0
  26. package/lib/commonjs/components/ScreenshotPreview.js.map +1 -0
  27. package/lib/commonjs/components/SeveritySelector.js +65 -0
  28. package/lib/commonjs/components/SeveritySelector.js.map +1 -0
  29. package/lib/commonjs/context/BugReporterContext.js +24 -0
  30. package/lib/commonjs/context/BugReporterContext.js.map +1 -0
  31. package/lib/commonjs/hooks/useScreenshotDetector.js +22 -0
  32. package/lib/commonjs/hooks/useScreenshotDetector.js.map +1 -0
  33. package/lib/commonjs/index.js +87 -0
  34. package/lib/commonjs/index.js.map +1 -0
  35. package/lib/commonjs/native/ScreenshotDetector.js +72 -0
  36. package/lib/commonjs/native/ScreenshotDetector.js.map +1 -0
  37. package/lib/commonjs/navigation/screenTracker.js +47 -0
  38. package/lib/commonjs/navigation/screenTracker.js.map +1 -0
  39. package/lib/commonjs/package.json +1 -0
  40. package/lib/commonjs/services/bugReportService.js +61 -0
  41. package/lib/commonjs/services/bugReportService.js.map +1 -0
  42. package/lib/commonjs/services/supabaseService.js +166 -0
  43. package/lib/commonjs/services/supabaseService.js.map +1 -0
  44. package/lib/commonjs/theme.js +28 -0
  45. package/lib/commonjs/theme.js.map +1 -0
  46. package/lib/commonjs/types.js +35 -0
  47. package/lib/commonjs/types.js.map +1 -0
  48. package/lib/commonjs/utils/logger.js +29 -0
  49. package/lib/commonjs/utils/logger.js.map +1 -0
  50. package/lib/module/BugReporterProvider.js +134 -0
  51. package/lib/module/BugReporterProvider.js.map +1 -0
  52. package/lib/module/collectors/appInfo.js +16 -0
  53. package/lib/module/collectors/appInfo.js.map +1 -0
  54. package/lib/module/collectors/collectContext.js +41 -0
  55. package/lib/module/collectors/collectContext.js.map +1 -0
  56. package/lib/module/collectors/deviceInfo.js +37 -0
  57. package/lib/module/collectors/deviceInfo.js.map +1 -0
  58. package/lib/module/collectors/networkInfo.js +29 -0
  59. package/lib/module/collectors/networkInfo.js.map +1 -0
  60. package/lib/module/components/BugReportAdminScreen.js +221 -0
  61. package/lib/module/components/BugReportAdminScreen.js.map +1 -0
  62. package/lib/module/components/BugReportModal.js +337 -0
  63. package/lib/module/components/BugReportModal.js.map +1 -0
  64. package/lib/module/components/ScreenshotEditor.js +461 -0
  65. package/lib/module/components/ScreenshotEditor.js.map +1 -0
  66. package/lib/module/components/ScreenshotPreview.js +130 -0
  67. package/lib/module/components/ScreenshotPreview.js.map +1 -0
  68. package/lib/module/components/SeveritySelector.js +61 -0
  69. package/lib/module/components/SeveritySelector.js.map +1 -0
  70. package/lib/module/context/BugReporterContext.js +19 -0
  71. package/lib/module/context/BugReporterContext.js.map +1 -0
  72. package/lib/module/hooks/useScreenshotDetector.js +18 -0
  73. package/lib/module/hooks/useScreenshotDetector.js.map +1 -0
  74. package/lib/module/index.js +32 -0
  75. package/lib/module/index.js.map +1 -0
  76. package/lib/module/native/ScreenshotDetector.js +68 -0
  77. package/lib/module/native/ScreenshotDetector.js.map +1 -0
  78. package/lib/module/navigation/screenTracker.js +41 -0
  79. package/lib/module/navigation/screenTracker.js.map +1 -0
  80. package/lib/module/services/bugReportService.js +57 -0
  81. package/lib/module/services/bugReportService.js.map +1 -0
  82. package/lib/module/services/supabaseService.js +159 -0
  83. package/lib/module/services/supabaseService.js.map +1 -0
  84. package/lib/module/theme.js +23 -0
  85. package/lib/module/theme.js.map +1 -0
  86. package/lib/module/types.js +31 -0
  87. package/lib/module/types.js.map +1 -0
  88. package/lib/module/utils/logger.js +25 -0
  89. package/lib/module/utils/logger.js.map +1 -0
  90. package/lib/typescript/src/BugReporterProvider.d.ts +18 -0
  91. package/lib/typescript/src/BugReporterProvider.d.ts.map +1 -0
  92. package/lib/typescript/src/collectors/appInfo.d.ts +6 -0
  93. package/lib/typescript/src/collectors/appInfo.d.ts.map +1 -0
  94. package/lib/typescript/src/collectors/collectContext.d.ts +7 -0
  95. package/lib/typescript/src/collectors/collectContext.d.ts.map +1 -0
  96. package/lib/typescript/src/collectors/deviceInfo.d.ts +7 -0
  97. package/lib/typescript/src/collectors/deviceInfo.d.ts.map +1 -0
  98. package/lib/typescript/src/collectors/networkInfo.d.ts +6 -0
  99. package/lib/typescript/src/collectors/networkInfo.d.ts.map +1 -0
  100. package/lib/typescript/src/components/BugReportAdminScreen.d.ts +11 -0
  101. package/lib/typescript/src/components/BugReportAdminScreen.d.ts.map +1 -0
  102. package/lib/typescript/src/components/BugReportModal.d.ts +20 -0
  103. package/lib/typescript/src/components/BugReportModal.d.ts.map +1 -0
  104. package/lib/typescript/src/components/ScreenshotEditor.d.ts +16 -0
  105. package/lib/typescript/src/components/ScreenshotEditor.d.ts.map +1 -0
  106. package/lib/typescript/src/components/ScreenshotPreview.d.ts +11 -0
  107. package/lib/typescript/src/components/ScreenshotPreview.d.ts.map +1 -0
  108. package/lib/typescript/src/components/SeveritySelector.d.ts +10 -0
  109. package/lib/typescript/src/components/SeveritySelector.d.ts.map +1 -0
  110. package/lib/typescript/src/context/BugReporterContext.d.ts +20 -0
  111. package/lib/typescript/src/context/BugReporterContext.d.ts.map +1 -0
  112. package/lib/typescript/src/hooks/useScreenshotDetector.d.ts +7 -0
  113. package/lib/typescript/src/hooks/useScreenshotDetector.d.ts.map +1 -0
  114. package/lib/typescript/src/index.d.ts +26 -0
  115. package/lib/typescript/src/index.d.ts.map +1 -0
  116. package/lib/typescript/src/native/ScreenshotDetector.d.ts +15 -0
  117. package/lib/typescript/src/native/ScreenshotDetector.d.ts.map +1 -0
  118. package/lib/typescript/src/navigation/screenTracker.d.ts +7 -0
  119. package/lib/typescript/src/navigation/screenTracker.d.ts.map +1 -0
  120. package/lib/typescript/src/services/bugReportService.d.ts +17 -0
  121. package/lib/typescript/src/services/bugReportService.d.ts.map +1 -0
  122. package/lib/typescript/src/services/supabaseService.d.ts +38 -0
  123. package/lib/typescript/src/services/supabaseService.d.ts.map +1 -0
  124. package/lib/typescript/src/theme.d.ts +7 -0
  125. package/lib/typescript/src/theme.d.ts.map +1 -0
  126. package/lib/typescript/src/types.d.ts +144 -0
  127. package/lib/typescript/src/types.d.ts.map +1 -0
  128. package/lib/typescript/src/utils/logger.d.ts +7 -0
  129. package/lib/typescript/src/utils/logger.d.ts.map +1 -0
  130. package/package.json +100 -0
  131. package/react-native-bug-reporter.podspec +22 -0
  132. package/react-native.config.js +18 -0
  133. package/src/BugReporterProvider.tsx +178 -0
  134. package/src/collectors/appInfo.ts +15 -0
  135. package/src/collectors/collectContext.ts +47 -0
  136. package/src/collectors/deviceInfo.ts +51 -0
  137. package/src/collectors/networkInfo.ts +31 -0
  138. package/src/components/BugReportAdminScreen.tsx +160 -0
  139. package/src/components/BugReportModal.tsx +315 -0
  140. package/src/components/ScreenshotEditor.tsx +410 -0
  141. package/src/components/ScreenshotPreview.tsx +98 -0
  142. package/src/components/SeveritySelector.tsx +59 -0
  143. package/src/context/BugReporterContext.ts +29 -0
  144. package/src/hooks/useScreenshotDetector.ts +20 -0
  145. package/src/index.ts +51 -0
  146. package/src/native/ScreenshotDetector.ts +87 -0
  147. package/src/navigation/screenTracker.ts +40 -0
  148. package/src/services/bugReportService.ts +81 -0
  149. package/src/services/supabaseService.ts +195 -0
  150. package/src/theme.ts +23 -0
  151. package/src/types.ts +156 -0
  152. package/src/utils/logger.ts +24 -0
@@ -0,0 +1,35 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.SEVERITIES = void 0;
7
+ /**
8
+ * Core type definitions for the Universal Bug Reporter SDK.
9
+ */
10
+
11
+ const SEVERITIES = exports.SEVERITIES = ['low', 'medium', 'high', 'critical'];
12
+
13
+ /**
14
+ * Information about the signed-in user, supplied by the host app.
15
+ * Everything is optional so the SDK works in apps without auth.
16
+ */
17
+
18
+ /** Device metadata collected automatically at report time. */
19
+
20
+ /** Host application metadata collected automatically. */
21
+
22
+ /** Network connectivity snapshot. */
23
+
24
+ /** Everything the SDK auto-collects when a report is opened. */
25
+
26
+ /** User-entered fields from the report modal. */
27
+
28
+ /** The full bug report persisted on the backend. */
29
+
30
+ /** A screenshot captured / detected on device. */
31
+
32
+ /** Theme overrides for the modal UI. */
33
+
34
+ /** Configuration passed to BugReporterProvider. */
35
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["SEVERITIES","exports"],"sourceRoot":"../../src","sources":["types.ts"],"mappings":";;;;;;AAAA;AACA;AACA;;AAIO,MAAMA,UAAyB,GAAAC,OAAA,CAAAD,UAAA,GAAG,CAAC,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,UAAU,CAAC;;AAE9E;AACA;AACA;AACA;;AASA;;AAmBA;;AAUA;;AAUA;;AAWA;;AAOA;;AAYA;;AAYA;;AAUA","ignoreList":[]}
@@ -0,0 +1,29 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.logger = void 0;
7
+ /**
8
+ * Tiny namespaced logger that can be toggled via config.debug.
9
+ */
10
+ let enabled = false;
11
+ const PREFIX = '[BugReporter]';
12
+ const logger = exports.logger = {
13
+ setEnabled(value) {
14
+ enabled = value;
15
+ },
16
+ log(...args) {
17
+ if (enabled) {
18
+ console.log(PREFIX, ...args);
19
+ }
20
+ },
21
+ warn(...args) {
22
+ // Warnings always surface — they usually indicate a setup problem.
23
+ console.warn(PREFIX, ...args);
24
+ },
25
+ error(...args) {
26
+ console.error(PREFIX, ...args);
27
+ }
28
+ };
29
+ //# sourceMappingURL=logger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["enabled","PREFIX","logger","exports","setEnabled","value","log","args","console","warn","error"],"sourceRoot":"../../../src","sources":["utils/logger.ts"],"mappings":";;;;;;AAAA;AACA;AACA;AACA,IAAIA,OAAO,GAAG,KAAK;AAEnB,MAAMC,MAAM,GAAG,eAAe;AAEvB,MAAMC,MAAM,GAAAC,OAAA,CAAAD,MAAA,GAAG;EACpBE,UAAUA,CAACC,KAAc,EAAE;IACzBL,OAAO,GAAGK,KAAK;EACjB,CAAC;EACDC,GAAGA,CAAC,GAAGC,IAAe,EAAE;IACtB,IAAIP,OAAO,EAAE;MACXQ,OAAO,CAACF,GAAG,CAACL,MAAM,EAAE,GAAGM,IAAI,CAAC;IAC9B;EACF,CAAC;EACDE,IAAIA,CAAC,GAAGF,IAAe,EAAE;IACvB;IACAC,OAAO,CAACC,IAAI,CAACR,MAAM,EAAE,GAAGM,IAAI,CAAC;EAC/B,CAAC;EACDG,KAAKA,CAAC,GAAGH,IAAe,EAAE;IACxBC,OAAO,CAACE,KAAK,CAACT,MAAM,EAAE,GAAGM,IAAI,CAAC;EAChC;AACF,CAAC","ignoreList":[]}
@@ -0,0 +1,134 @@
1
+ "use strict";
2
+
3
+ import React, { useCallback, useEffect, useMemo, useRef, useState } from 'react';
4
+ import { BugReporterContext } from './context/BugReporterContext';
5
+ import { useScreenshotDetector } from './hooks/useScreenshotDetector';
6
+ import { collectContext } from './collectors/collectContext';
7
+ import { submitBugReport } from './services/bugReportService';
8
+ import { BugReportModal } from './components/BugReportModal';
9
+ import { ScreenshotEditor } from './components/ScreenshotEditor';
10
+ import { resolveTheme } from './theme';
11
+ import { logger } from './utils/logger';
12
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
13
+ /**
14
+ * Top-level SDK provider. Wrap your app in it once:
15
+ *
16
+ * <BugReporterProvider config={{ apiBaseUrl: '...' }}>
17
+ * <App />
18
+ * </BugReporterProvider>
19
+ *
20
+ * It listens for screenshots, collects context, and hosts the report modal.
21
+ */
22
+ export function BugReporterProvider({
23
+ config,
24
+ children
25
+ }) {
26
+ const [isOpen, setIsOpen] = useState(false);
27
+ const [screenshot, setScreenshot] = useState(null);
28
+ const [context, setContext] = useState(null);
29
+ const [submitState, setSubmitState] = useState('idle');
30
+ const [errorMessage, setErrorMessage] = useState(null);
31
+ const [editing, setEditing] = useState(false);
32
+ const theme = useMemo(() => resolveTheme(config.theme), [config.theme]);
33
+ const autoDetect = !config.disableAutoDetect;
34
+ useEffect(() => {
35
+ logger.setEnabled(!!config.debug);
36
+ }, [config.debug]);
37
+
38
+ // Keep a ref so the detector callback always sees the latest open state
39
+ // without re-subscribing on every render.
40
+ const isOpenRef = useRef(isOpen);
41
+ isOpenRef.current = isOpen;
42
+ const beginReport = useCallback(async shot => {
43
+ setScreenshot(shot);
44
+ setSubmitState('idle');
45
+ setErrorMessage(null);
46
+ setContext(null);
47
+ setIsOpen(true);
48
+ try {
49
+ const collected = await collectContext(config);
50
+ setContext(collected);
51
+ } catch (e) {
52
+ logger.warn('context collection failed', e);
53
+ }
54
+ }, [config]);
55
+ const handleScreenshot = useCallback(shot => {
56
+ // Ignore a new screenshot while a report is already open.
57
+ if (isOpenRef.current) return;
58
+ logger.log('screenshot detected', shot.uri);
59
+ beginReport(shot.uri ? shot : null);
60
+ }, [beginReport]);
61
+ useScreenshotDetector(autoDetect, handleScreenshot);
62
+ const openReporter = useCallback(shot => {
63
+ beginReport(shot ?? null);
64
+ }, [beginReport]);
65
+ const closeReporter = useCallback(() => {
66
+ if (submitState === 'uploading' || submitState === 'saving') return;
67
+ setIsOpen(false);
68
+ setScreenshot(null);
69
+ setContext(null);
70
+ setSubmitState('idle');
71
+ setErrorMessage(null);
72
+ }, [submitState]);
73
+ const handleSubmit = useCallback(async input => {
74
+ // Context is normally ready; collect on demand if it isn't.
75
+ let ctx = context;
76
+ if (!ctx) {
77
+ setSubmitState('collecting');
78
+ ctx = await collectContext(config);
79
+ setContext(ctx);
80
+ }
81
+ try {
82
+ await submitBugReport({
83
+ input,
84
+ context: ctx,
85
+ screenshot,
86
+ config,
87
+ onState: setSubmitState
88
+ });
89
+ // Briefly show success, then close.
90
+ setTimeout(() => {
91
+ setIsOpen(false);
92
+ setScreenshot(null);
93
+ setContext(null);
94
+ setSubmitState('idle');
95
+ }, 600);
96
+ } catch (e) {
97
+ setErrorMessage(e instanceof Error ? e.message : 'Failed to submit. Please try again.');
98
+ }
99
+ }, [config, context, screenshot]);
100
+ const value = useMemo(() => ({
101
+ isAutoDetectEnabled: autoDetect,
102
+ openReporter,
103
+ closeReporter,
104
+ isOpen
105
+ }), [autoDetect, openReporter, closeReporter, isOpen]);
106
+ return /*#__PURE__*/_jsxs(BugReporterContext.Provider, {
107
+ value: value,
108
+ children: [children, /*#__PURE__*/_jsx(BugReportModal, {
109
+ visible: isOpen,
110
+ screenshot: screenshot,
111
+ context: context,
112
+ showContext: config.showContextSummary !== false,
113
+ submitState: submitState,
114
+ errorMessage: errorMessage,
115
+ theme: theme,
116
+ onRemoveScreenshot: () => setScreenshot(null),
117
+ onRequestEdit: () => setEditing(true),
118
+ onSubmit: handleSubmit,
119
+ onClose: closeReporter
120
+ }), isOpen && editing && screenshot?.uri ? /*#__PURE__*/_jsx(ScreenshotEditor, {
121
+ screenshot: screenshot,
122
+ theme: theme,
123
+ onCancel: () => setEditing(false),
124
+ onSave: uri => {
125
+ setScreenshot(prev => ({
126
+ ...(prev ?? {}),
127
+ uri
128
+ }));
129
+ setEditing(false);
130
+ }
131
+ }) : null]
132
+ });
133
+ }
134
+ //# sourceMappingURL=BugReporterProvider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["React","useCallback","useEffect","useMemo","useRef","useState","BugReporterContext","useScreenshotDetector","collectContext","submitBugReport","BugReportModal","ScreenshotEditor","resolveTheme","logger","jsx","_jsx","jsxs","_jsxs","BugReporterProvider","config","children","isOpen","setIsOpen","screenshot","setScreenshot","context","setContext","submitState","setSubmitState","errorMessage","setErrorMessage","editing","setEditing","theme","autoDetect","disableAutoDetect","setEnabled","debug","isOpenRef","current","beginReport","shot","collected","e","warn","handleScreenshot","log","uri","openReporter","closeReporter","handleSubmit","input","ctx","onState","setTimeout","Error","message","value","isAutoDetectEnabled","Provider","visible","showContext","showContextSummary","onRemoveScreenshot","onRequestEdit","onSubmit","onClose","onCancel","onSave","prev"],"sourceRoot":"../../src","sources":["BugReporterProvider.tsx"],"mappings":";;AAAA,OAAOA,KAAK,IACVC,WAAW,EACXC,SAAS,EACTC,OAAO,EACPC,MAAM,EACNC,QAAQ,QACH,OAAO;AAQd,SAASC,kBAAkB,QAAQ,8BAA8B;AACjE,SAASC,qBAAqB,QAAQ,+BAA+B;AACrE,SAASC,cAAc,QAAQ,6BAA6B;AAC5D,SAASC,eAAe,QAAQ,6BAA6B;AAC7D,SAASC,cAAc,QAAQ,6BAA6B;AAC5D,SAASC,gBAAgB,QAAQ,+BAA+B;AAChE,SAASC,YAAY,QAAQ,SAAS;AACtC,SAASC,MAAM,QAAQ,gBAAgB;AAAC,SAAAC,GAAA,IAAAC,IAAA,EAAAC,IAAA,IAAAC,KAAA;AAOxC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,SAASC,mBAAmBA,CAAC;EAAEC,MAAM;EAAEC;AAAgB,CAAC,EAAE;EAC/D,MAAM,CAACC,MAAM,EAAEC,SAAS,CAAC,GAAGjB,QAAQ,CAAC,KAAK,CAAC;EAC3C,MAAM,CAACkB,UAAU,EAAEC,aAAa,CAAC,GAAGnB,QAAQ,CAAwB,IAAI,CAAC;EACzE,MAAM,CAACoB,OAAO,EAAEC,UAAU,CAAC,GAAGrB,QAAQ,CAA0B,IAAI,CAAC;EACrE,MAAM,CAACsB,WAAW,EAAEC,cAAc,CAAC,GAAGvB,QAAQ,CAAc,MAAM,CAAC;EACnE,MAAM,CAACwB,YAAY,EAAEC,eAAe,CAAC,GAAGzB,QAAQ,CAAgB,IAAI,CAAC;EACrE,MAAM,CAAC0B,OAAO,EAAEC,UAAU,CAAC,GAAG3B,QAAQ,CAAC,KAAK,CAAC;EAE7C,MAAM4B,KAAK,GAAG9B,OAAO,CAAC,MAAMS,YAAY,CAACO,MAAM,CAACc,KAAK,CAAC,EAAE,CAACd,MAAM,CAACc,KAAK,CAAC,CAAC;EACvE,MAAMC,UAAU,GAAG,CAACf,MAAM,CAACgB,iBAAiB;EAE5CjC,SAAS,CAAC,MAAM;IACdW,MAAM,CAACuB,UAAU,CAAC,CAAC,CAACjB,MAAM,CAACkB,KAAK,CAAC;EACnC,CAAC,EAAE,CAAClB,MAAM,CAACkB,KAAK,CAAC,CAAC;;EAElB;EACA;EACA,MAAMC,SAAS,GAAGlC,MAAM,CAACiB,MAAM,CAAC;EAChCiB,SAAS,CAACC,OAAO,GAAGlB,MAAM;EAE1B,MAAMmB,WAAW,GAAGvC,WAAW,CAC7B,MAAOwC,IAA2B,IAAK;IACrCjB,aAAa,CAACiB,IAAI,CAAC;IACnBb,cAAc,CAAC,MAAM,CAAC;IACtBE,eAAe,CAAC,IAAI,CAAC;IACrBJ,UAAU,CAAC,IAAI,CAAC;IAChBJ,SAAS,CAAC,IAAI,CAAC;IACf,IAAI;MACF,MAAMoB,SAAS,GAAG,MAAMlC,cAAc,CAACW,MAAM,CAAC;MAC9CO,UAAU,CAACgB,SAAS,CAAC;IACvB,CAAC,CAAC,OAAOC,CAAC,EAAE;MACV9B,MAAM,CAAC+B,IAAI,CAAC,2BAA2B,EAAED,CAAC,CAAC;IAC7C;EACF,CAAC,EACD,CAACxB,MAAM,CACT,CAAC;EAED,MAAM0B,gBAAgB,GAAG5C,WAAW,CACjCwC,IAAoB,IAAK;IACxB;IACA,IAAIH,SAAS,CAACC,OAAO,EAAE;IACvB1B,MAAM,CAACiC,GAAG,CAAC,qBAAqB,EAAEL,IAAI,CAACM,GAAG,CAAC;IAC3CP,WAAW,CAACC,IAAI,CAACM,GAAG,GAAGN,IAAI,GAAG,IAAI,CAAC;EACrC,CAAC,EACD,CAACD,WAAW,CACd,CAAC;EAEDjC,qBAAqB,CAAC2B,UAAU,EAAEW,gBAAgB,CAAC;EAEnD,MAAMG,YAAY,GAAG/C,WAAW,CAC7BwC,IAA4B,IAAK;IAChCD,WAAW,CAACC,IAAI,IAAI,IAAI,CAAC;EAC3B,CAAC,EACD,CAACD,WAAW,CACd,CAAC;EAED,MAAMS,aAAa,GAAGhD,WAAW,CAAC,MAAM;IACtC,IAAI0B,WAAW,KAAK,WAAW,IAAIA,WAAW,KAAK,QAAQ,EAAE;IAC7DL,SAAS,CAAC,KAAK,CAAC;IAChBE,aAAa,CAAC,IAAI,CAAC;IACnBE,UAAU,CAAC,IAAI,CAAC;IAChBE,cAAc,CAAC,MAAM,CAAC;IACtBE,eAAe,CAAC,IAAI,CAAC;EACvB,CAAC,EAAE,CAACH,WAAW,CAAC,CAAC;EAEjB,MAAMuB,YAAY,GAAGjD,WAAW,CAC9B,MAAOkD,KAAqB,IAAK;IAC/B;IACA,IAAIC,GAAG,GAAG3B,OAAO;IACjB,IAAI,CAAC2B,GAAG,EAAE;MACRxB,cAAc,CAAC,YAAY,CAAC;MAC5BwB,GAAG,GAAG,MAAM5C,cAAc,CAACW,MAAM,CAAC;MAClCO,UAAU,CAAC0B,GAAG,CAAC;IACjB;IAEA,IAAI;MACF,MAAM3C,eAAe,CAAC;QACpB0C,KAAK;QACL1B,OAAO,EAAE2B,GAAG;QACZ7B,UAAU;QACVJ,MAAM;QACNkC,OAAO,EAAEzB;MACX,CAAC,CAAC;MACF;MACA0B,UAAU,CAAC,MAAM;QACfhC,SAAS,CAAC,KAAK,CAAC;QAChBE,aAAa,CAAC,IAAI,CAAC;QACnBE,UAAU,CAAC,IAAI,CAAC;QAChBE,cAAc,CAAC,MAAM,CAAC;MACxB,CAAC,EAAE,GAAG,CAAC;IACT,CAAC,CAAC,OAAOe,CAAC,EAAE;MACVb,eAAe,CACba,CAAC,YAAYY,KAAK,GACdZ,CAAC,CAACa,OAAO,GACT,qCACN,CAAC;IACH;EACF,CAAC,EACD,CAACrC,MAAM,EAAEM,OAAO,EAAEF,UAAU,CAC9B,CAAC;EAED,MAAMkC,KAAK,GAAGtD,OAAO,CACnB,OAAO;IACLuD,mBAAmB,EAAExB,UAAU;IAC/Bc,YAAY;IACZC,aAAa;IACb5B;EACF,CAAC,CAAC,EACF,CAACa,UAAU,EAAEc,YAAY,EAAEC,aAAa,EAAE5B,MAAM,CAClD,CAAC;EAED,oBACEJ,KAAA,CAACX,kBAAkB,CAACqD,QAAQ;IAACF,KAAK,EAAEA,KAAM;IAAArC,QAAA,GACvCA,QAAQ,eACTL,IAAA,CAACL,cAAc;MACbkD,OAAO,EAAEvC,MAAO;MAChBE,UAAU,EAAEA,UAAW;MACvBE,OAAO,EAAEA,OAAQ;MACjBoC,WAAW,EAAE1C,MAAM,CAAC2C,kBAAkB,KAAK,KAAM;MACjDnC,WAAW,EAAEA,WAAY;MACzBE,YAAY,EAAEA,YAAa;MAC3BI,KAAK,EAAEA,KAAM;MACb8B,kBAAkB,EAAEA,CAAA,KAAMvC,aAAa,CAAC,IAAI,CAAE;MAC9CwC,aAAa,EAAEA,CAAA,KAAMhC,UAAU,CAAC,IAAI,CAAE;MACtCiC,QAAQ,EAAEf,YAAa;MACvBgB,OAAO,EAAEjB;IAAc,CACxB,CAAC,EACD5B,MAAM,IAAIU,OAAO,IAAIR,UAAU,EAAEwB,GAAG,gBACnChC,IAAA,CAACJ,gBAAgB;MACfY,UAAU,EAAEA,UAAW;MACvBU,KAAK,EAAEA,KAAM;MACbkC,QAAQ,EAAEA,CAAA,KAAMnC,UAAU,CAAC,KAAK,CAAE;MAClCoC,MAAM,EAAErB,GAAG,IAAI;QACbvB,aAAa,CAAC6C,IAAI,KAAK;UAAE,IAAIA,IAAI,IAAI,CAAC,CAAC,CAAC;UAAEtB;QAAI,CAAC,CAAC,CAAC;QACjDf,UAAU,CAAC,KAAK,CAAC;MACnB;IAAE,CACH,CAAC,GACA,IAAI;EAAA,CACmB,CAAC;AAElC","ignoreList":[]}
@@ -0,0 +1,16 @@
1
+ "use strict";
2
+
3
+ import DeviceInfoModule from 'react-native-device-info';
4
+ /**
5
+ * Collects host-application metadata (name, bundle id, version, build).
6
+ */
7
+ export function collectAppInfo(environment) {
8
+ return {
9
+ appName: DeviceInfoModule.getApplicationName(),
10
+ bundleId: DeviceInfoModule.getBundleId(),
11
+ version: DeviceInfoModule.getVersion(),
12
+ buildNumber: DeviceInfoModule.getBuildNumber(),
13
+ environment
14
+ };
15
+ }
16
+ //# sourceMappingURL=appInfo.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["DeviceInfoModule","collectAppInfo","environment","appName","getApplicationName","bundleId","getBundleId","version","getVersion","buildNumber","getBuildNumber"],"sourceRoot":"../../../src","sources":["collectors/appInfo.ts"],"mappings":";;AAAA,OAAOA,gBAAgB,MAAM,0BAA0B;AAGvD;AACA;AACA;AACA,OAAO,SAASC,cAAcA,CAACC,WAAoB,EAAW;EAC5D,OAAO;IACLC,OAAO,EAAEH,gBAAgB,CAACI,kBAAkB,CAAC,CAAC;IAC9CC,QAAQ,EAAEL,gBAAgB,CAACM,WAAW,CAAC,CAAC;IACxCC,OAAO,EAAEP,gBAAgB,CAACQ,UAAU,CAAC,CAAC;IACtCC,WAAW,EAAET,gBAAgB,CAACU,cAAc,CAAC,CAAC;IAC9CR;EACF,CAAC;AACH","ignoreList":[]}
@@ -0,0 +1,41 @@
1
+ "use strict";
2
+
3
+ import { collectDeviceInfo } from './deviceInfo';
4
+ import { collectAppInfo } from './appInfo';
5
+ import { collectNetworkInfo } from './networkInfo';
6
+ import { logger } from '../utils/logger';
7
+ const EMPTY_USER = {};
8
+ async function resolveUser(config) {
9
+ if (!config.getUser) {
10
+ return EMPTY_USER;
11
+ }
12
+ try {
13
+ return (await config.getUser()) ?? EMPTY_USER;
14
+ } catch (e) {
15
+ logger.warn('getUser() failed', e);
16
+ return EMPTY_USER;
17
+ }
18
+ }
19
+
20
+ /**
21
+ * Gathers every piece of automatic context for a bug report in parallel:
22
+ * user, device, app, network, current screen, and timestamp.
23
+ */
24
+ export async function collectContext(config) {
25
+ const [user, device, network] = await Promise.all([resolveUser(config), collectDeviceInfo(), collectNetworkInfo()]);
26
+ let currentScreen = null;
27
+ try {
28
+ currentScreen = config.getCurrentScreen?.() ?? null;
29
+ } catch (e) {
30
+ logger.warn('getCurrentScreen() failed', e);
31
+ }
32
+ return {
33
+ user,
34
+ device,
35
+ app: collectAppInfo(config.environment),
36
+ network,
37
+ currentScreen,
38
+ timestamp: new Date().toISOString()
39
+ };
40
+ }
41
+ //# sourceMappingURL=collectContext.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["collectDeviceInfo","collectAppInfo","collectNetworkInfo","logger","EMPTY_USER","resolveUser","config","getUser","e","warn","collectContext","user","device","network","Promise","all","currentScreen","getCurrentScreen","app","environment","timestamp","Date","toISOString"],"sourceRoot":"../../../src","sources":["collectors/collectContext.ts"],"mappings":";;AACA,SAASA,iBAAiB,QAAQ,cAAc;AAChD,SAASC,cAAc,QAAQ,WAAW;AAC1C,SAASC,kBAAkB,QAAQ,eAAe;AAClD,SAASC,MAAM,QAAQ,iBAAiB;AAExC,MAAMC,UAAoB,GAAG,CAAC,CAAC;AAE/B,eAAeC,WAAWA,CAACC,MAAyB,EAAqB;EACvE,IAAI,CAACA,MAAM,CAACC,OAAO,EAAE;IACnB,OAAOH,UAAU;EACnB;EACA,IAAI;IACF,OAAO,CAAC,MAAME,MAAM,CAACC,OAAO,CAAC,CAAC,KAAKH,UAAU;EAC/C,CAAC,CAAC,OAAOI,CAAC,EAAE;IACVL,MAAM,CAACM,IAAI,CAAC,kBAAkB,EAAED,CAAC,CAAC;IAClC,OAAOJ,UAAU;EACnB;AACF;;AAEA;AACA;AACA;AACA;AACA,OAAO,eAAeM,cAAcA,CAACJ,MAAyB,EAA6B;EACzF,MAAM,CAACK,IAAI,EAAEC,MAAM,EAAEC,OAAO,CAAC,GAAG,MAAMC,OAAO,CAACC,GAAG,CAAC,CAChDV,WAAW,CAACC,MAAM,CAAC,EACnBN,iBAAiB,CAAC,CAAC,EACnBE,kBAAkB,CAAC,CAAC,CACrB,CAAC;EAEF,IAAIc,aAA4B,GAAG,IAAI;EACvC,IAAI;IACFA,aAAa,GAAGV,MAAM,CAACW,gBAAgB,GAAG,CAAC,IAAI,IAAI;EACrD,CAAC,CAAC,OAAOT,CAAC,EAAE;IACVL,MAAM,CAACM,IAAI,CAAC,2BAA2B,EAAED,CAAC,CAAC;EAC7C;EAEA,OAAO;IACLG,IAAI;IACJC,MAAM;IACNM,GAAG,EAAEjB,cAAc,CAACK,MAAM,CAACa,WAAW,CAAC;IACvCN,OAAO;IACPG,aAAa;IACbI,SAAS,EAAE,IAAIC,IAAI,CAAC,CAAC,CAACC,WAAW,CAAC;EACpC,CAAC;AACH","ignoreList":[]}
@@ -0,0 +1,37 @@
1
+ "use strict";
2
+
3
+ import DeviceInfoModule from 'react-native-device-info';
4
+ import { Platform } from 'react-native';
5
+ import { logger } from '../utils/logger';
6
+
7
+ /**
8
+ * Collects device metadata. Every field is wrapped defensively because the
9
+ * various getters can reject on some devices/emulators.
10
+ */
11
+ export async function collectDeviceInfo() {
12
+ const safe = async (fn, fallback) => {
13
+ try {
14
+ return await fn();
15
+ } catch (e) {
16
+ logger.warn('device info field failed', e);
17
+ return fallback;
18
+ }
19
+ };
20
+ const [uniqueId, totalMemory, usedMemory, batteryLevel, freeDisk, isEmulator] = await Promise.all([safe(() => DeviceInfoModule.getUniqueId(), 'unknown'), safe(() => DeviceInfoModule.getTotalMemory(), 0), safe(() => DeviceInfoModule.getUsedMemory(), 0), safe(() => DeviceInfoModule.getBatteryLevel(), -1), safe(() => DeviceInfoModule.getFreeDiskStorage(), 0), safe(() => DeviceInfoModule.isEmulator(), false)]);
21
+ return {
22
+ brand: DeviceInfoModule.getBrand(),
23
+ manufacturer: await safe(() => DeviceInfoModule.getManufacturer(), 'unknown'),
24
+ model: DeviceInfoModule.getModel(),
25
+ deviceId: DeviceInfoModule.getDeviceId(),
26
+ systemName: Platform.OS,
27
+ systemVersion: DeviceInfoModule.getSystemVersion(),
28
+ isTablet: DeviceInfoModule.isTablet(),
29
+ isEmulator,
30
+ uniqueId,
31
+ totalMemory,
32
+ usedMemory,
33
+ batteryLevel,
34
+ freeDisk
35
+ };
36
+ }
37
+ //# sourceMappingURL=deviceInfo.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["DeviceInfoModule","Platform","logger","collectDeviceInfo","safe","fn","fallback","e","warn","uniqueId","totalMemory","usedMemory","batteryLevel","freeDisk","isEmulator","Promise","all","getUniqueId","getTotalMemory","getUsedMemory","getBatteryLevel","getFreeDiskStorage","brand","getBrand","manufacturer","getManufacturer","model","getModel","deviceId","getDeviceId","systemName","OS","systemVersion","getSystemVersion","isTablet"],"sourceRoot":"../../../src","sources":["collectors/deviceInfo.ts"],"mappings":";;AAAA,OAAOA,gBAAgB,MAAM,0BAA0B;AACvD,SAASC,QAAQ,QAAQ,cAAc;AAEvC,SAASC,MAAM,QAAQ,iBAAiB;;AAExC;AACA;AACA;AACA;AACA,OAAO,eAAeC,iBAAiBA,CAAA,EAAwB;EAC7D,MAAMC,IAAI,GAAG,MAAAA,CAAUC,EAAwB,EAAEC,QAAW,KAAiB;IAC3E,IAAI;MACF,OAAO,MAAMD,EAAE,CAAC,CAAC;IACnB,CAAC,CAAC,OAAOE,CAAC,EAAE;MACVL,MAAM,CAACM,IAAI,CAAC,0BAA0B,EAAED,CAAC,CAAC;MAC1C,OAAOD,QAAQ;IACjB;EACF,CAAC;EAED,MAAM,CACJG,QAAQ,EACRC,WAAW,EACXC,UAAU,EACVC,YAAY,EACZC,QAAQ,EACRC,UAAU,CACX,GAAG,MAAMC,OAAO,CAACC,GAAG,CAAC,CACpBZ,IAAI,CAAC,MAAMJ,gBAAgB,CAACiB,WAAW,CAAC,CAAC,EAAE,SAAS,CAAC,EACrDb,IAAI,CAAC,MAAMJ,gBAAgB,CAACkB,cAAc,CAAC,CAAC,EAAE,CAAC,CAAC,EAChDd,IAAI,CAAC,MAAMJ,gBAAgB,CAACmB,aAAa,CAAC,CAAC,EAAE,CAAC,CAAC,EAC/Cf,IAAI,CAAC,MAAMJ,gBAAgB,CAACoB,eAAe,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAClDhB,IAAI,CAAC,MAAMJ,gBAAgB,CAACqB,kBAAkB,CAAC,CAAC,EAAE,CAAC,CAAC,EACpDjB,IAAI,CAAC,MAAMJ,gBAAgB,CAACc,UAAU,CAAC,CAAC,EAAE,KAAK,CAAC,CACjD,CAAC;EAEF,OAAO;IACLQ,KAAK,EAAEtB,gBAAgB,CAACuB,QAAQ,CAAC,CAAC;IAClCC,YAAY,EAAE,MAAMpB,IAAI,CAAC,MAAMJ,gBAAgB,CAACyB,eAAe,CAAC,CAAC,EAAE,SAAS,CAAC;IAC7EC,KAAK,EAAE1B,gBAAgB,CAAC2B,QAAQ,CAAC,CAAC;IAClCC,QAAQ,EAAE5B,gBAAgB,CAAC6B,WAAW,CAAC,CAAC;IACxCC,UAAU,EAAE7B,QAAQ,CAAC8B,EAAE;IACvBC,aAAa,EAAEhC,gBAAgB,CAACiC,gBAAgB,CAAC,CAAC;IAClDC,QAAQ,EAAElC,gBAAgB,CAACkC,QAAQ,CAAC,CAAC;IACrCpB,UAAU;IACVL,QAAQ;IACRC,WAAW;IACXC,UAAU;IACVC,YAAY;IACZC;EACF,CAAC;AACH","ignoreList":[]}
@@ -0,0 +1,29 @@
1
+ "use strict";
2
+
3
+ import NetInfo from '@react-native-community/netinfo';
4
+ import { logger } from '../utils/logger';
5
+
6
+ /**
7
+ * Snapshots current network connectivity.
8
+ */
9
+ export async function collectNetworkInfo() {
10
+ try {
11
+ const state = await NetInfo.fetch();
12
+ const cellularGeneration = state.type === 'cellular' && state.details ? state.details.cellularGeneration ?? null : null;
13
+ return {
14
+ isConnected: state.isConnected,
15
+ isInternetReachable: state.isInternetReachable,
16
+ type: state.type,
17
+ cellularGeneration
18
+ };
19
+ } catch (e) {
20
+ logger.warn('network info failed', e);
21
+ return {
22
+ isConnected: null,
23
+ isInternetReachable: null,
24
+ type: 'unknown',
25
+ cellularGeneration: null
26
+ };
27
+ }
28
+ }
29
+ //# sourceMappingURL=networkInfo.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["NetInfo","logger","collectNetworkInfo","state","fetch","cellularGeneration","type","details","isConnected","isInternetReachable","e","warn"],"sourceRoot":"../../../src","sources":["collectors/networkInfo.ts"],"mappings":";;AAAA,OAAOA,OAAO,MAAM,iCAAiC;AAErD,SAASC,MAAM,QAAQ,iBAAiB;;AAExC;AACA;AACA;AACA,OAAO,eAAeC,kBAAkBA,CAAA,EAAyB;EAC/D,IAAI;IACF,MAAMC,KAAK,GAAG,MAAMH,OAAO,CAACI,KAAK,CAAC,CAAC;IACnC,MAAMC,kBAAkB,GACtBF,KAAK,CAACG,IAAI,KAAK,UAAU,IAAIH,KAAK,CAACI,OAAO,GACrCJ,KAAK,CAACI,OAAO,CAA4CF,kBAAkB,IAAI,IAAI,GACpF,IAAI;IAEV,OAAO;MACLG,WAAW,EAAEL,KAAK,CAACK,WAAW;MAC9BC,mBAAmB,EAAEN,KAAK,CAACM,mBAAmB;MAC9CH,IAAI,EAAEH,KAAK,CAACG,IAAI;MAChBD;IACF,CAAC;EACH,CAAC,CAAC,OAAOK,CAAC,EAAE;IACVT,MAAM,CAACU,IAAI,CAAC,qBAAqB,EAAED,CAAC,CAAC;IACrC,OAAO;MACLF,WAAW,EAAE,IAAI;MACjBC,mBAAmB,EAAE,IAAI;MACzBH,IAAI,EAAE,SAAS;MACfD,kBAAkB,EAAE;IACtB,CAAC;EACH;AACF","ignoreList":[]}
@@ -0,0 +1,221 @@
1
+ "use strict";
2
+
3
+ import { useCallback, useEffect, useState } from 'react';
4
+ import { ActivityIndicator, FlatList, Image, StyleSheet, Text, TouchableOpacity, View } from 'react-native';
5
+ import { subscribeToReports, updateReportStatus, targetFromConfig } from '../services/supabaseService';
6
+ import { SEVERITY_COLORS, resolveTheme } from '../theme';
7
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
8
+ const STATUS_FLOW = ['open', 'in_progress', 'resolved', 'closed'];
9
+
10
+ /**
11
+ * In-app admin viewer. Live-subscribes to the Supabase reports table with
12
+ * screenshot thumbnails and a tap-to-cycle status control.
13
+ */
14
+ export function BugReportAdminScreen({
15
+ config
16
+ }) {
17
+ const theme = resolveTheme(config.theme);
18
+ const target = targetFromConfig(config);
19
+ const targetKey = `${target.supabaseUrl}:${target.tableName}`;
20
+ const [reports, setReports] = useState([]);
21
+ const [loading, setLoading] = useState(true);
22
+ const [error, setError] = useState(null);
23
+ useEffect(() => {
24
+ const unsub = subscribeToReports(target, data => {
25
+ setReports(data);
26
+ setLoading(false);
27
+ }, err => {
28
+ setError(err.message);
29
+ setLoading(false);
30
+ });
31
+ return unsub;
32
+ // eslint-disable-next-line react-hooks/exhaustive-deps
33
+ }, [targetKey]);
34
+ const cycleStatus = useCallback(async report => {
35
+ const next = STATUS_FLOW[(STATUS_FLOW.indexOf(report.status) + 1) % STATUS_FLOW.length];
36
+ try {
37
+ await updateReportStatus(target, report.id, next);
38
+ } catch {
39
+ // Live subscription re-syncs on the next change.
40
+ }
41
+ },
42
+ // eslint-disable-next-line react-hooks/exhaustive-deps
43
+ [targetKey]);
44
+ if (loading) {
45
+ return /*#__PURE__*/_jsx(View, {
46
+ style: [styles.center, {
47
+ backgroundColor: theme.backgroundColor
48
+ }],
49
+ children: /*#__PURE__*/_jsx(ActivityIndicator, {
50
+ color: theme.primaryColor
51
+ })
52
+ });
53
+ }
54
+ return /*#__PURE__*/_jsx(FlatList, {
55
+ style: {
56
+ backgroundColor: theme.backgroundColor
57
+ },
58
+ contentContainerStyle: styles.list,
59
+ data: reports,
60
+ keyExtractor: item => item.id || item.createdAt,
61
+ ListHeaderComponent: /*#__PURE__*/_jsxs(Text, {
62
+ style: [styles.title, {
63
+ color: theme.textColor
64
+ }],
65
+ children: ["Bug Reports (", reports.length, ")"]
66
+ }),
67
+ ListEmptyComponent: /*#__PURE__*/_jsx(Text, {
68
+ style: [styles.empty, {
69
+ color: theme.mutedColor
70
+ }],
71
+ children: error ? error : 'No bug reports yet.'
72
+ }),
73
+ renderItem: ({
74
+ item
75
+ }) => /*#__PURE__*/_jsxs(View, {
76
+ style: [styles.card, {
77
+ borderColor: theme.borderColor
78
+ }],
79
+ children: [item.screenshotUrl ? /*#__PURE__*/_jsx(Image, {
80
+ source: {
81
+ uri: item.screenshotUrl
82
+ },
83
+ style: styles.shot,
84
+ resizeMode: "cover"
85
+ }) : /*#__PURE__*/_jsx(View, {
86
+ style: [styles.shot, styles.noShot, {
87
+ borderColor: theme.borderColor
88
+ }],
89
+ children: /*#__PURE__*/_jsx(Text, {
90
+ style: {
91
+ color: theme.mutedColor,
92
+ fontSize: 10
93
+ },
94
+ children: "No image"
95
+ })
96
+ }), /*#__PURE__*/_jsxs(View, {
97
+ style: styles.cardBody,
98
+ children: [/*#__PURE__*/_jsxs(View, {
99
+ style: styles.cardHeader,
100
+ children: [/*#__PURE__*/_jsx(View, {
101
+ style: [styles.sevPill, {
102
+ backgroundColor: SEVERITY_COLORS[item.severity] || theme.mutedColor
103
+ }],
104
+ children: /*#__PURE__*/_jsx(Text, {
105
+ style: styles.sevText,
106
+ children: item.severity
107
+ })
108
+ }), /*#__PURE__*/_jsx(TouchableOpacity, {
109
+ onPress: () => cycleStatus(item),
110
+ style: styles.statusBtn,
111
+ children: /*#__PURE__*/_jsx(Text, {
112
+ style: [styles.statusText, {
113
+ color: theme.primaryColor
114
+ }],
115
+ children: item.status
116
+ })
117
+ })]
118
+ }), /*#__PURE__*/_jsx(Text, {
119
+ style: [styles.cardTitle, {
120
+ color: theme.textColor
121
+ }],
122
+ numberOfLines: 1,
123
+ children: item.title
124
+ }), /*#__PURE__*/_jsx(Text, {
125
+ style: [styles.cardDesc, {
126
+ color: theme.mutedColor
127
+ }],
128
+ numberOfLines: 2,
129
+ children: item.description
130
+ }), /*#__PURE__*/_jsxs(Text, {
131
+ style: [styles.cardMeta, {
132
+ color: theme.mutedColor
133
+ }],
134
+ numberOfLines: 1,
135
+ children: [item.context?.currentScreen || '—', " \xB7", ' ', item.context?.device?.brand, " ", item.context?.device?.model, " \xB7", ' ', item.context?.user?.name || 'Anonymous']
136
+ })]
137
+ })]
138
+ })
139
+ });
140
+ }
141
+ const styles = StyleSheet.create({
142
+ center: {
143
+ flex: 1,
144
+ alignItems: 'center',
145
+ justifyContent: 'center'
146
+ },
147
+ list: {
148
+ padding: 16
149
+ },
150
+ title: {
151
+ fontSize: 22,
152
+ fontWeight: '700',
153
+ marginBottom: 16
154
+ },
155
+ empty: {
156
+ textAlign: 'center',
157
+ marginTop: 60
158
+ },
159
+ card: {
160
+ flexDirection: 'row',
161
+ borderWidth: 1,
162
+ borderRadius: 12,
163
+ padding: 10,
164
+ marginBottom: 12,
165
+ gap: 12
166
+ },
167
+ shot: {
168
+ width: 70,
169
+ height: 120,
170
+ borderRadius: 8,
171
+ backgroundColor: '#0b0c10'
172
+ },
173
+ noShot: {
174
+ borderWidth: 1,
175
+ borderStyle: 'dashed',
176
+ alignItems: 'center',
177
+ justifyContent: 'center'
178
+ },
179
+ cardBody: {
180
+ flex: 1
181
+ },
182
+ cardHeader: {
183
+ flexDirection: 'row',
184
+ justifyContent: 'space-between',
185
+ alignItems: 'center'
186
+ },
187
+ sevPill: {
188
+ paddingHorizontal: 8,
189
+ paddingVertical: 3,
190
+ borderRadius: 999
191
+ },
192
+ sevText: {
193
+ color: '#fff',
194
+ fontSize: 10,
195
+ fontWeight: '700',
196
+ textTransform: 'uppercase'
197
+ },
198
+ statusBtn: {
199
+ paddingVertical: 2,
200
+ paddingHorizontal: 4
201
+ },
202
+ statusText: {
203
+ fontSize: 12,
204
+ fontWeight: '600',
205
+ textTransform: 'capitalize'
206
+ },
207
+ cardTitle: {
208
+ fontSize: 15,
209
+ fontWeight: '600',
210
+ marginTop: 6
211
+ },
212
+ cardDesc: {
213
+ fontSize: 13,
214
+ marginTop: 2
215
+ },
216
+ cardMeta: {
217
+ fontSize: 11,
218
+ marginTop: 6
219
+ }
220
+ });
221
+ //# sourceMappingURL=BugReportAdminScreen.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["useCallback","useEffect","useState","ActivityIndicator","FlatList","Image","StyleSheet","Text","TouchableOpacity","View","subscribeToReports","updateReportStatus","targetFromConfig","SEVERITY_COLORS","resolveTheme","jsx","_jsx","jsxs","_jsxs","STATUS_FLOW","BugReportAdminScreen","config","theme","target","targetKey","supabaseUrl","tableName","reports","setReports","loading","setLoading","error","setError","unsub","data","err","message","cycleStatus","report","next","indexOf","status","length","id","style","styles","center","backgroundColor","children","color","primaryColor","contentContainerStyle","list","keyExtractor","item","createdAt","ListHeaderComponent","title","textColor","ListEmptyComponent","empty","mutedColor","renderItem","card","borderColor","screenshotUrl","source","uri","shot","resizeMode","noShot","fontSize","cardBody","cardHeader","sevPill","severity","sevText","onPress","statusBtn","statusText","cardTitle","numberOfLines","cardDesc","description","cardMeta","context","currentScreen","device","brand","model","user","name","create","flex","alignItems","justifyContent","padding","fontWeight","marginBottom","textAlign","marginTop","flexDirection","borderWidth","borderRadius","gap","width","height","borderStyle","paddingHorizontal","paddingVertical","textTransform"],"sourceRoot":"../../../src","sources":["components/BugReportAdminScreen.tsx"],"mappings":"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","ignoreList":[]}