rn-backstage 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 (102) hide show
  1. package/README.md +80 -0
  2. package/lib/commonjs/Backstage.js +130 -0
  3. package/lib/commonjs/Backstage.js.map +1 -0
  4. package/lib/commonjs/components/BackstagePanel.js +192 -0
  5. package/lib/commonjs/components/BackstagePanel.js.map +1 -0
  6. package/lib/commonjs/components/FloatingPill.js +147 -0
  7. package/lib/commonjs/components/FloatingPill.js.map +1 -0
  8. package/lib/commonjs/components/InfoTab.js +260 -0
  9. package/lib/commonjs/components/InfoTab.js.map +1 -0
  10. package/lib/commonjs/components/JsonTreeView.js +245 -0
  11. package/lib/commonjs/components/JsonTreeView.js.map +1 -0
  12. package/lib/commonjs/components/LogItem.js +191 -0
  13. package/lib/commonjs/components/LogItem.js.map +1 -0
  14. package/lib/commonjs/components/LogsTab.js +235 -0
  15. package/lib/commonjs/components/LogsTab.js.map +1 -0
  16. package/lib/commonjs/components/TabBar.js +132 -0
  17. package/lib/commonjs/components/TabBar.js.map +1 -0
  18. package/lib/commonjs/constants.js +89 -0
  19. package/lib/commonjs/constants.js.map +1 -0
  20. package/lib/commonjs/index.js +20 -0
  21. package/lib/commonjs/index.js.map +1 -0
  22. package/lib/commonjs/log-interceptor.js +114 -0
  23. package/lib/commonjs/log-interceptor.js.map +1 -0
  24. package/lib/commonjs/package.json +1 -0
  25. package/lib/commonjs/types.js +21 -0
  26. package/lib/commonjs/types.js.map +1 -0
  27. package/lib/commonjs/utils/formatTimestamp.js +26 -0
  28. package/lib/commonjs/utils/formatTimestamp.js.map +1 -0
  29. package/lib/commonjs/utils/stringify.js +78 -0
  30. package/lib/commonjs/utils/stringify.js.map +1 -0
  31. package/lib/module/Backstage.js +125 -0
  32. package/lib/module/Backstage.js.map +1 -0
  33. package/lib/module/components/BackstagePanel.js +187 -0
  34. package/lib/module/components/BackstagePanel.js.map +1 -0
  35. package/lib/module/components/FloatingPill.js +142 -0
  36. package/lib/module/components/FloatingPill.js.map +1 -0
  37. package/lib/module/components/InfoTab.js +255 -0
  38. package/lib/module/components/InfoTab.js.map +1 -0
  39. package/lib/module/components/JsonTreeView.js +241 -0
  40. package/lib/module/components/JsonTreeView.js.map +1 -0
  41. package/lib/module/components/LogItem.js +186 -0
  42. package/lib/module/components/LogItem.js.map +1 -0
  43. package/lib/module/components/LogsTab.js +230 -0
  44. package/lib/module/components/LogsTab.js.map +1 -0
  45. package/lib/module/components/TabBar.js +127 -0
  46. package/lib/module/components/TabBar.js.map +1 -0
  47. package/lib/module/constants.js +85 -0
  48. package/lib/module/constants.js.map +1 -0
  49. package/lib/module/index.js +5 -0
  50. package/lib/module/index.js.map +1 -0
  51. package/lib/module/log-interceptor.js +108 -0
  52. package/lib/module/log-interceptor.js.map +1 -0
  53. package/lib/module/package.json +1 -0
  54. package/lib/module/types.js +25 -0
  55. package/lib/module/types.js.map +1 -0
  56. package/lib/module/utils/formatTimestamp.js +22 -0
  57. package/lib/module/utils/formatTimestamp.js.map +1 -0
  58. package/lib/module/utils/stringify.js +73 -0
  59. package/lib/module/utils/stringify.js.map +1 -0
  60. package/lib/typescript/Backstage.d.ts +4 -0
  61. package/lib/typescript/Backstage.d.ts.map +1 -0
  62. package/lib/typescript/components/BackstagePanel.d.ts +21 -0
  63. package/lib/typescript/components/BackstagePanel.d.ts.map +1 -0
  64. package/lib/typescript/components/FloatingPill.d.ts +13 -0
  65. package/lib/typescript/components/FloatingPill.d.ts.map +1 -0
  66. package/lib/typescript/components/InfoTab.d.ts +16 -0
  67. package/lib/typescript/components/InfoTab.d.ts.map +1 -0
  68. package/lib/typescript/components/JsonTreeView.d.ts +10 -0
  69. package/lib/typescript/components/JsonTreeView.d.ts.map +1 -0
  70. package/lib/typescript/components/LogItem.d.ts +10 -0
  71. package/lib/typescript/components/LogItem.d.ts.map +1 -0
  72. package/lib/typescript/components/LogsTab.d.ts +11 -0
  73. package/lib/typescript/components/LogsTab.d.ts.map +1 -0
  74. package/lib/typescript/components/TabBar.d.ts +14 -0
  75. package/lib/typescript/components/TabBar.d.ts.map +1 -0
  76. package/lib/typescript/constants.d.ts +43 -0
  77. package/lib/typescript/constants.d.ts.map +1 -0
  78. package/lib/typescript/index.d.ts +4 -0
  79. package/lib/typescript/index.d.ts.map +1 -0
  80. package/lib/typescript/log-interceptor.d.ts +16 -0
  81. package/lib/typescript/log-interceptor.d.ts.map +1 -0
  82. package/lib/typescript/types.d.ts +110 -0
  83. package/lib/typescript/types.d.ts.map +1 -0
  84. package/lib/typescript/utils/formatTimestamp.d.ts +7 -0
  85. package/lib/typescript/utils/formatTimestamp.d.ts.map +1 -0
  86. package/lib/typescript/utils/stringify.d.ts +9 -0
  87. package/lib/typescript/utils/stringify.d.ts.map +1 -0
  88. package/package.json +91 -0
  89. package/src/Backstage.tsx +145 -0
  90. package/src/components/BackstagePanel.tsx +208 -0
  91. package/src/components/FloatingPill.tsx +150 -0
  92. package/src/components/InfoTab.tsx +264 -0
  93. package/src/components/JsonTreeView.tsx +259 -0
  94. package/src/components/LogItem.tsx +189 -0
  95. package/src/components/LogsTab.tsx +239 -0
  96. package/src/components/TabBar.tsx +150 -0
  97. package/src/constants.ts +82 -0
  98. package/src/index.ts +14 -0
  99. package/src/log-interceptor.ts +137 -0
  100. package/src/types.ts +147 -0
  101. package/src/utils/formatTimestamp.ts +22 -0
  102. package/src/utils/stringify.ts +90 -0
@@ -0,0 +1,241 @@
1
+ "use strict";
2
+
3
+ import React, { useCallback, useState } from 'react';
4
+ import { LayoutAnimation, Platform, StyleSheet, Text, TouchableOpacity, UIManager, View } from 'react-native';
5
+ import { DarkTheme, MonospaceFont } from '../constants';
6
+
7
+ // Enable LayoutAnimation on Android
8
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
9
+ if (Platform.OS === 'android' && UIManager.setLayoutAnimationEnabledExperimental) {
10
+ UIManager.setLayoutAnimationEnabledExperimental(true);
11
+ }
12
+
13
+ // ─── Types ───────────────────────────────────────────────────────────────────
14
+
15
+ // ─── Color Mapping ───────────────────────────────────────────────────────────
16
+
17
+ function getValueColor(value) {
18
+ if (value === null || value === undefined) return DarkTheme.textMuted;
19
+ if (typeof value === 'string') return '#98C379'; // green
20
+ if (typeof value === 'number') return '#61AFEF'; // cyan
21
+ if (typeof value === 'boolean') return '#C678DD'; // purple
22
+ return DarkTheme.text;
23
+ }
24
+ function getPreview(value) {
25
+ if (Array.isArray(value)) {
26
+ return `[ ${value.length} item${value.length !== 1 ? 's' : ''} ]`;
27
+ }
28
+ if (typeof value === 'object' && value !== null) {
29
+ const keys = Object.keys(value);
30
+ return `{ ${keys.length} key${keys.length !== 1 ? 's' : ''} }`;
31
+ }
32
+ return '';
33
+ }
34
+ function formatValue(value) {
35
+ if (value === null) return 'null';
36
+ if (value === undefined) return 'undefined';
37
+ if (typeof value === 'string') return `"${value}"`;
38
+ if (typeof value === 'boolean') return value ? 'true' : 'false';
39
+ if (typeof value === 'number') return String(value);
40
+ if (typeof value === 'function') return `[Function: ${value.name || 'anonymous'}]`;
41
+ if (typeof value === 'symbol') return value.toString();
42
+ return String(value);
43
+ }
44
+ function isExpandable(value) {
45
+ return typeof value === 'object' && value !== null || Array.isArray(value);
46
+ }
47
+
48
+ // ─── JsonNode Component ──────────────────────────────────────────────────────
49
+
50
+ const JsonNode = ({
51
+ keyName,
52
+ value,
53
+ depth,
54
+ maxDepth,
55
+ isLast,
56
+ hideKey = false
57
+ }) => {
58
+ const [expanded, setExpanded] = useState(depth < 1);
59
+ const expandable = isExpandable(value);
60
+ const reachedMaxDepth = depth >= maxDepth;
61
+ const toggleExpand = useCallback(() => {
62
+ LayoutAnimation.configureNext(LayoutAnimation.Presets.easeInEaseOut);
63
+ setExpanded(prev => !prev);
64
+ }, []);
65
+ const indent = depth * 16;
66
+
67
+ // Primitive value
68
+ if (!expandable || reachedMaxDepth) {
69
+ const displayValue = reachedMaxDepth && expandable ? getPreview(value) : formatValue(value);
70
+ return /*#__PURE__*/_jsxs(View, {
71
+ style: [styles.row, {
72
+ paddingLeft: indent
73
+ }],
74
+ children: [!hideKey && keyName !== null && /*#__PURE__*/_jsx(Text, {
75
+ style: styles.key,
76
+ children: `${keyName}: `
77
+ }), /*#__PURE__*/_jsx(Text, {
78
+ style: [styles.value, {
79
+ color: reachedMaxDepth ? DarkTheme.textMuted : getValueColor(value)
80
+ }],
81
+ numberOfLines: 3,
82
+ children: displayValue
83
+ }), !isLast && /*#__PURE__*/_jsx(Text, {
84
+ style: styles.comma,
85
+ children: ","
86
+ })]
87
+ });
88
+ }
89
+
90
+ // Expandable object/array
91
+ const entries = Array.isArray(value) ? value.map((v, i) => [String(i), v]) : Object.entries(value);
92
+ const bracketOpen = Array.isArray(value) ? '[' : '{';
93
+ const bracketClose = Array.isArray(value) ? ']' : '}';
94
+ return /*#__PURE__*/_jsxs(View, {
95
+ children: [/*#__PURE__*/_jsxs(TouchableOpacity, {
96
+ onPress: toggleExpand,
97
+ activeOpacity: 0.7,
98
+ style: [styles.row, {
99
+ paddingLeft: indent
100
+ }],
101
+ children: [/*#__PURE__*/_jsx(Text, {
102
+ style: styles.chevron,
103
+ children: expanded ? '▼' : '▶'
104
+ }), !hideKey && keyName !== null && /*#__PURE__*/_jsx(Text, {
105
+ style: styles.key,
106
+ children: `${keyName}: `
107
+ }), /*#__PURE__*/_jsx(Text, {
108
+ style: styles.bracket,
109
+ children: bracketOpen
110
+ }), !expanded && /*#__PURE__*/_jsxs(_Fragment, {
111
+ children: [/*#__PURE__*/_jsx(Text, {
112
+ style: styles.preview,
113
+ children: ` ${getPreview(value)} `
114
+ }), /*#__PURE__*/_jsx(Text, {
115
+ style: styles.bracket,
116
+ children: bracketClose
117
+ }), !isLast && /*#__PURE__*/_jsx(Text, {
118
+ style: styles.comma,
119
+ children: ","
120
+ })]
121
+ })]
122
+ }), expanded && /*#__PURE__*/_jsxs(_Fragment, {
123
+ children: [entries.map(([k, v], i) => /*#__PURE__*/_jsx(JsonNode, {
124
+ keyName: Array.isArray(value) ? String(i) : k,
125
+ value: v,
126
+ depth: depth + 1,
127
+ maxDepth: maxDepth,
128
+ isLast: i === entries.length - 1
129
+ }, `${k}_${i}`)), /*#__PURE__*/_jsxs(View, {
130
+ style: [styles.row, {
131
+ paddingLeft: indent
132
+ }],
133
+ children: [/*#__PURE__*/_jsx(Text, {
134
+ style: styles.bracket,
135
+ children: bracketClose
136
+ }), !isLast && /*#__PURE__*/_jsx(Text, {
137
+ style: styles.comma,
138
+ children: ","
139
+ })]
140
+ })]
141
+ })]
142
+ });
143
+ };
144
+
145
+ // ─── Main Component ──────────────────────────────────────────────────────────
146
+
147
+ export const JsonTreeView = ({
148
+ data,
149
+ hideRoot = false,
150
+ maxDepth = 10
151
+ }) => {
152
+ if (data === null || data === undefined) {
153
+ return /*#__PURE__*/_jsx(Text, {
154
+ style: [styles.value, {
155
+ color: DarkTheme.textMuted
156
+ }],
157
+ children: String(data)
158
+ });
159
+ }
160
+ if (!isExpandable(data)) {
161
+ return /*#__PURE__*/_jsx(Text, {
162
+ style: [styles.value, {
163
+ color: getValueColor(data)
164
+ }],
165
+ children: formatValue(data)
166
+ });
167
+ }
168
+ if (hideRoot) {
169
+ const entries = Array.isArray(data) ? data.map((v, i) => [String(i), v]) : Object.entries(data);
170
+ return /*#__PURE__*/_jsx(View, {
171
+ style: styles.container,
172
+ children: entries.map(([k, v], i) => /*#__PURE__*/_jsx(JsonNode, {
173
+ keyName: k,
174
+ value: v,
175
+ depth: 0,
176
+ maxDepth: maxDepth,
177
+ isLast: i === entries.length - 1
178
+ }, `${k}_${i}`))
179
+ });
180
+ }
181
+ return /*#__PURE__*/_jsx(View, {
182
+ style: styles.container,
183
+ children: /*#__PURE__*/_jsx(JsonNode, {
184
+ keyName: null,
185
+ value: data,
186
+ depth: 0,
187
+ maxDepth: maxDepth,
188
+ isLast: true,
189
+ hideKey: true
190
+ })
191
+ });
192
+ };
193
+
194
+ // ─── Styles ──────────────────────────────────────────────────────────────────
195
+
196
+ const styles = StyleSheet.create({
197
+ container: {
198
+ paddingVertical: 4
199
+ },
200
+ row: {
201
+ flexDirection: 'row',
202
+ alignItems: 'flex-start',
203
+ paddingVertical: 2,
204
+ flexWrap: 'wrap'
205
+ },
206
+ chevron: {
207
+ fontFamily: MonospaceFont,
208
+ fontSize: 10,
209
+ color: DarkTheme.textMuted,
210
+ marginRight: 6,
211
+ marginTop: 2,
212
+ width: 12
213
+ },
214
+ key: {
215
+ fontFamily: MonospaceFont,
216
+ fontSize: 13,
217
+ color: '#E06C75' // red-ish for keys
218
+ },
219
+ value: {
220
+ fontFamily: MonospaceFont,
221
+ fontSize: 13,
222
+ flexShrink: 1
223
+ },
224
+ bracket: {
225
+ fontFamily: MonospaceFont,
226
+ fontSize: 13,
227
+ color: DarkTheme.textSecondary
228
+ },
229
+ preview: {
230
+ fontFamily: MonospaceFont,
231
+ fontSize: 13,
232
+ color: DarkTheme.textMuted,
233
+ fontStyle: 'italic'
234
+ },
235
+ comma: {
236
+ fontFamily: MonospaceFont,
237
+ fontSize: 13,
238
+ color: DarkTheme.textMuted
239
+ }
240
+ });
241
+ //# sourceMappingURL=JsonTreeView.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["React","useCallback","useState","LayoutAnimation","Platform","StyleSheet","Text","TouchableOpacity","UIManager","View","DarkTheme","MonospaceFont","jsx","_jsx","jsxs","_jsxs","Fragment","_Fragment","OS","setLayoutAnimationEnabledExperimental","getValueColor","value","undefined","textMuted","text","getPreview","Array","isArray","length","keys","Object","formatValue","String","name","toString","isExpandable","JsonNode","keyName","depth","maxDepth","isLast","hideKey","expanded","setExpanded","expandable","reachedMaxDepth","toggleExpand","configureNext","Presets","easeInEaseOut","prev","indent","displayValue","style","styles","row","paddingLeft","children","key","color","numberOfLines","comma","entries","map","v","i","bracketOpen","bracketClose","onPress","activeOpacity","chevron","bracket","preview","k","JsonTreeView","data","hideRoot","container","create","paddingVertical","flexDirection","alignItems","flexWrap","fontFamily","fontSize","marginRight","marginTop","width","flexShrink","textSecondary","fontStyle"],"sourceRoot":"../../../src","sources":["components/JsonTreeView.tsx"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,186 @@
1
+ "use strict";
2
+
3
+ import React, { useCallback, useState } from 'react';
4
+ import { StyleSheet, Text, TouchableOpacity, View } from 'react-native';
5
+ import { DarkTheme, MonospaceFont } from '../constants';
6
+ import { LogLevel } from '../types';
7
+ import { formatTimestamp } from '../utils/formatTimestamp';
8
+ import { JsonTreeView } from './JsonTreeView';
9
+
10
+ // ─── Types ───────────────────────────────────────────────────────────────────
11
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
12
+ // ─── Badge Colors ────────────────────────────────────────────────────────────
13
+
14
+ function getBadgeConfig(level) {
15
+ switch (level) {
16
+ case LogLevel.error:
17
+ return {
18
+ label: 'ERROR',
19
+ color: DarkTheme.error,
20
+ bgColor: DarkTheme.errorDim,
21
+ rowBg: 'rgba(255, 77, 106, 0.06)'
22
+ };
23
+ case LogLevel.warn:
24
+ return {
25
+ label: 'WARN',
26
+ color: DarkTheme.warning,
27
+ bgColor: DarkTheme.warningDim,
28
+ rowBg: 'rgba(255, 178, 36, 0.06)'
29
+ };
30
+ case LogLevel.info:
31
+ return {
32
+ label: 'INFO',
33
+ color: DarkTheme.info,
34
+ bgColor: DarkTheme.infoDim,
35
+ rowBg: 'transparent'
36
+ };
37
+ case LogLevel.debug:
38
+ return {
39
+ label: 'DEBUG',
40
+ color: DarkTheme.debugColor,
41
+ bgColor: DarkTheme.debugDim,
42
+ rowBg: 'transparent'
43
+ };
44
+ default:
45
+ return {
46
+ label: 'LOG',
47
+ color: DarkTheme.textSecondary,
48
+ bgColor: 'rgba(160, 160, 176, 0.1)',
49
+ rowBg: 'transparent'
50
+ };
51
+ }
52
+ }
53
+
54
+ // ─── Component ───────────────────────────────────────────────────────────────
55
+
56
+ export const LogItem = /*#__PURE__*/React.memo(({
57
+ item,
58
+ onCopy,
59
+ styles: propStyles
60
+ }) => {
61
+ const [expanded, setExpanded] = useState(false);
62
+ const badge = getBadgeConfig(item.level);
63
+ const hasData = item.data !== undefined;
64
+ const toggleExpand = useCallback(() => {
65
+ setExpanded(prev => !prev);
66
+ }, []);
67
+ const handleCopy = useCallback(() => {
68
+ if (onCopy) {
69
+ const text = `[${badge.label}] ${formatTimestamp(item.timestamp)} ${item.message}`;
70
+ onCopy(text);
71
+ }
72
+ }, [item, badge.label, onCopy]);
73
+ return /*#__PURE__*/_jsxs(TouchableOpacity, {
74
+ style: [styles.container, {
75
+ backgroundColor: badge.rowBg
76
+ }],
77
+ onPress: hasData ? toggleExpand : undefined,
78
+ onLongPress: handleCopy,
79
+ activeOpacity: hasData ? 0.7 : 1,
80
+ children: [/*#__PURE__*/_jsxs(View, {
81
+ style: styles.headerRow,
82
+ children: [/*#__PURE__*/_jsx(View, {
83
+ style: [styles.badge, {
84
+ backgroundColor: badge.bgColor
85
+ }],
86
+ children: /*#__PURE__*/_jsx(Text, {
87
+ style: [styles.badgeText, {
88
+ color: badge.color
89
+ }],
90
+ children: badge.label
91
+ })
92
+ }), /*#__PURE__*/_jsx(Text, {
93
+ style: [styles.timestamp, propStyles?.logTimestampStyle],
94
+ children: formatTimestamp(item.timestamp)
95
+ }), onCopy && /*#__PURE__*/_jsx(TouchableOpacity, {
96
+ style: styles.copyButton,
97
+ onPress: handleCopy,
98
+ hitSlop: {
99
+ top: 8,
100
+ bottom: 8,
101
+ left: 8,
102
+ right: 8
103
+ },
104
+ children: /*#__PURE__*/_jsx(Text, {
105
+ style: styles.copyButtonText,
106
+ children: "\u29C9"
107
+ })
108
+ })]
109
+ }), /*#__PURE__*/_jsx(Text, {
110
+ style: [styles.message, propStyles?.logMessageStyle],
111
+ numberOfLines: expanded ? undefined : 3,
112
+ children: item.message
113
+ }), expanded && hasData && /*#__PURE__*/_jsx(View, {
114
+ style: styles.dataContainer,
115
+ children: /*#__PURE__*/_jsx(JsonTreeView, {
116
+ data: item.data,
117
+ hideRoot: true,
118
+ maxDepth: 5
119
+ })
120
+ }), hasData && !expanded && /*#__PURE__*/_jsx(Text, {
121
+ style: styles.expandHint,
122
+ children: "tap to expand \u25BE"
123
+ })]
124
+ });
125
+ });
126
+
127
+ // ─── Styles ──────────────────────────────────────────────────────────────────
128
+
129
+ const styles = StyleSheet.create({
130
+ container: {
131
+ paddingHorizontal: 14,
132
+ paddingVertical: 10,
133
+ borderBottomWidth: 1,
134
+ borderBottomColor: DarkTheme.border
135
+ },
136
+ headerRow: {
137
+ flexDirection: 'row',
138
+ alignItems: 'center',
139
+ marginBottom: 4
140
+ },
141
+ badge: {
142
+ borderRadius: 4,
143
+ paddingHorizontal: 6,
144
+ paddingVertical: 2,
145
+ marginRight: 8
146
+ },
147
+ badgeText: {
148
+ fontFamily: MonospaceFont,
149
+ fontSize: 10,
150
+ fontWeight: '800',
151
+ letterSpacing: 0.5
152
+ },
153
+ timestamp: {
154
+ fontFamily: MonospaceFont,
155
+ fontSize: 11,
156
+ color: DarkTheme.textMuted,
157
+ flex: 1
158
+ },
159
+ copyButton: {
160
+ padding: 4
161
+ },
162
+ copyButtonText: {
163
+ fontSize: 16,
164
+ color: DarkTheme.textMuted
165
+ },
166
+ message: {
167
+ fontFamily: MonospaceFont,
168
+ fontSize: 12,
169
+ color: DarkTheme.text,
170
+ lineHeight: 18
171
+ },
172
+ dataContainer: {
173
+ marginTop: 8,
174
+ paddingTop: 8,
175
+ borderTopWidth: 1,
176
+ borderTopColor: DarkTheme.border
177
+ },
178
+ expandHint: {
179
+ fontFamily: MonospaceFont,
180
+ fontSize: 10,
181
+ color: DarkTheme.textMuted,
182
+ marginTop: 4,
183
+ fontStyle: 'italic'
184
+ }
185
+ });
186
+ //# sourceMappingURL=LogItem.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["React","useCallback","useState","StyleSheet","Text","TouchableOpacity","View","DarkTheme","MonospaceFont","LogLevel","formatTimestamp","JsonTreeView","jsx","_jsx","jsxs","_jsxs","getBadgeConfig","level","error","label","color","bgColor","errorDim","rowBg","warn","warning","warningDim","info","infoDim","debug","debugColor","debugDim","textSecondary","LogItem","memo","item","onCopy","styles","propStyles","expanded","setExpanded","badge","hasData","data","undefined","toggleExpand","prev","handleCopy","text","timestamp","message","style","container","backgroundColor","onPress","onLongPress","activeOpacity","children","headerRow","badgeText","logTimestampStyle","copyButton","hitSlop","top","bottom","left","right","copyButtonText","logMessageStyle","numberOfLines","dataContainer","hideRoot","maxDepth","expandHint","create","paddingHorizontal","paddingVertical","borderBottomWidth","borderBottomColor","border","flexDirection","alignItems","marginBottom","borderRadius","marginRight","fontFamily","fontSize","fontWeight","letterSpacing","textMuted","flex","padding","lineHeight","marginTop","paddingTop","borderTopWidth","borderTopColor","fontStyle"],"sourceRoot":"../../../src","sources":["components/LogItem.tsx"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,230 @@
1
+ "use strict";
2
+
3
+ import React, { useCallback, useMemo, useState } from 'react';
4
+ import { FlatList, StyleSheet, Text, TextInput, TouchableOpacity, View } from 'react-native';
5
+ import { DarkTheme, MonospaceFont, TestIDs } from '../constants';
6
+ import { LogItem } from './LogItem';
7
+ import { formatTimestamp } from '../utils/formatTimestamp';
8
+
9
+ // ─── Types ───────────────────────────────────────────────────────────────────
10
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
11
+ // ─── Component ───────────────────────────────────────────────────────────────
12
+
13
+ export const LogsTab = ({
14
+ logs,
15
+ onRefresh,
16
+ onCopyLogs,
17
+ styles: propStyles
18
+ }) => {
19
+ const [searchText, setSearchText] = useState('');
20
+
21
+ // Filter logs based on search text
22
+ const filteredLogs = useMemo(() => {
23
+ if (!searchText.trim()) return logs;
24
+ const query = searchText.toLowerCase();
25
+ return logs.filter(log => {
26
+ return log.message.toLowerCase().includes(query) || log.level.toLowerCase().includes(query);
27
+ });
28
+ }, [logs, searchText]);
29
+
30
+ // Copy all visible logs to text
31
+ const handleCopyAll = useCallback(() => {
32
+ if (!onCopyLogs) return;
33
+ const text = filteredLogs.map(log => `[${log.level.toUpperCase()}] ${formatTimestamp(log.timestamp)} ${log.message}`).join('\n');
34
+ onCopyLogs(text);
35
+ }, [filteredLogs, onCopyLogs]);
36
+
37
+ // Copy individual log
38
+ const handleCopyItem = useCallback(text => {
39
+ if (onCopyLogs) {
40
+ onCopyLogs(text);
41
+ }
42
+ }, [onCopyLogs]);
43
+
44
+ // Render log item
45
+ const renderItem = useCallback(({
46
+ item
47
+ }) => /*#__PURE__*/_jsx(LogItem, {
48
+ item: item,
49
+ onCopy: onCopyLogs ? handleCopyItem : undefined,
50
+ styles: propStyles
51
+ }), [handleCopyItem, onCopyLogs, propStyles]);
52
+ const keyExtractor = useCallback(item => item.id, []);
53
+ return /*#__PURE__*/_jsxs(View, {
54
+ style: styles.container,
55
+ children: [/*#__PURE__*/_jsxs(View, {
56
+ style: styles.searchContainer,
57
+ children: [/*#__PURE__*/_jsxs(View, {
58
+ style: styles.searchInputWrapper,
59
+ children: [/*#__PURE__*/_jsx(Text, {
60
+ style: styles.searchIcon,
61
+ children: "\u2315"
62
+ }), /*#__PURE__*/_jsx(TextInput, {
63
+ testID: TestIDs.logsTab.searchInput,
64
+ style: styles.searchInput,
65
+ placeholder: "Filter logs...",
66
+ placeholderTextColor: DarkTheme.textMuted,
67
+ value: searchText,
68
+ onChangeText: setSearchText,
69
+ autoCapitalize: "none",
70
+ autoCorrect: false,
71
+ clearButtonMode: "while-editing",
72
+ returnKeyType: "search"
73
+ })]
74
+ }), onCopyLogs && /*#__PURE__*/_jsx(TouchableOpacity, {
75
+ testID: TestIDs.logsTab.copyButton,
76
+ style: styles.copyAllButton,
77
+ onPress: handleCopyAll,
78
+ activeOpacity: 0.7,
79
+ children: /*#__PURE__*/_jsx(Text, {
80
+ style: styles.copyAllText,
81
+ children: "Copy All"
82
+ })
83
+ })]
84
+ }), /*#__PURE__*/_jsxs(View, {
85
+ style: styles.countBar,
86
+ children: [/*#__PURE__*/_jsx(Text, {
87
+ style: styles.countText,
88
+ children: filteredLogs.length === logs.length ? `${logs.length} log${logs.length !== 1 ? 's' : ''}` : `${filteredLogs.length} of ${logs.length} logs`
89
+ }), /*#__PURE__*/_jsx(Text, {
90
+ style: styles.pullHint,
91
+ children: "\u2193 pull to refresh"
92
+ })]
93
+ }), /*#__PURE__*/_jsx(FlatList, {
94
+ testID: TestIDs.logsTab.list,
95
+ data: filteredLogs,
96
+ renderItem: renderItem,
97
+ keyExtractor: keyExtractor,
98
+ refreshing: false,
99
+ onRefresh: onRefresh,
100
+ style: styles.list,
101
+ contentContainerStyle: filteredLogs.length === 0 ? styles.emptyContainer : undefined,
102
+ ListEmptyComponent: /*#__PURE__*/_jsxs(View, {
103
+ style: styles.emptyState,
104
+ children: [/*#__PURE__*/_jsx(Text, {
105
+ style: styles.emptyIcon,
106
+ children: "\uD83D\uDCCB"
107
+ }), /*#__PURE__*/_jsx(Text, {
108
+ style: styles.emptyTitle,
109
+ children: "No logs yet"
110
+ }), /*#__PURE__*/_jsx(Text, {
111
+ style: styles.emptySubtitle,
112
+ children: "Console output will appear here"
113
+ })]
114
+ })
115
+ // Perf optimizations
116
+ ,
117
+ maxToRenderPerBatch: 20,
118
+ windowSize: 10,
119
+ initialNumToRender: 20,
120
+ removeClippedSubviews: true,
121
+ getItemLayout: undefined
122
+ })]
123
+ });
124
+ };
125
+
126
+ // ─── Styles ──────────────────────────────────────────────────────────────────
127
+
128
+ const styles = StyleSheet.create({
129
+ container: {
130
+ flex: 1
131
+ },
132
+ searchContainer: {
133
+ flexDirection: 'row',
134
+ alignItems: 'center',
135
+ paddingHorizontal: 14,
136
+ paddingVertical: 10,
137
+ gap: 10,
138
+ borderBottomWidth: 1,
139
+ borderBottomColor: DarkTheme.border
140
+ },
141
+ searchInputWrapper: {
142
+ flex: 1,
143
+ flexDirection: 'row',
144
+ alignItems: 'center',
145
+ backgroundColor: DarkTheme.surfaceElevated,
146
+ borderRadius: 10,
147
+ borderWidth: 1,
148
+ borderColor: DarkTheme.border,
149
+ paddingHorizontal: 12,
150
+ height: 38
151
+ },
152
+ searchIcon: {
153
+ fontSize: 16,
154
+ color: DarkTheme.textMuted,
155
+ marginRight: 8
156
+ },
157
+ searchInput: {
158
+ flex: 1,
159
+ fontFamily: MonospaceFont,
160
+ fontSize: 13,
161
+ color: DarkTheme.text,
162
+ padding: 0
163
+ },
164
+ copyAllButton: {
165
+ backgroundColor: DarkTheme.accentDim,
166
+ borderRadius: 8,
167
+ borderWidth: 1,
168
+ borderColor: DarkTheme.accent,
169
+ paddingHorizontal: 14,
170
+ height: 38,
171
+ justifyContent: 'center'
172
+ },
173
+ copyAllText: {
174
+ fontFamily: MonospaceFont,
175
+ fontSize: 12,
176
+ fontWeight: '700',
177
+ color: DarkTheme.accent,
178
+ letterSpacing: 0.5
179
+ },
180
+ countBar: {
181
+ flexDirection: 'row',
182
+ justifyContent: 'space-between',
183
+ alignItems: 'center',
184
+ paddingHorizontal: 16,
185
+ paddingVertical: 6,
186
+ backgroundColor: DarkTheme.surface
187
+ },
188
+ countText: {
189
+ fontFamily: MonospaceFont,
190
+ fontSize: 11,
191
+ color: DarkTheme.textMuted
192
+ },
193
+ pullHint: {
194
+ fontFamily: MonospaceFont,
195
+ fontSize: 10,
196
+ color: DarkTheme.textMuted,
197
+ fontStyle: 'italic'
198
+ },
199
+ list: {
200
+ flex: 1
201
+ },
202
+ emptyContainer: {
203
+ flex: 1,
204
+ justifyContent: 'center'
205
+ },
206
+ emptyState: {
207
+ alignItems: 'center',
208
+ justifyContent: 'center',
209
+ padding: 40
210
+ },
211
+ emptyIcon: {
212
+ fontSize: 48,
213
+ marginBottom: 16,
214
+ opacity: 0.5
215
+ },
216
+ emptyTitle: {
217
+ fontFamily: MonospaceFont,
218
+ fontSize: 16,
219
+ fontWeight: '700',
220
+ color: DarkTheme.textSecondary,
221
+ marginBottom: 8
222
+ },
223
+ emptySubtitle: {
224
+ fontFamily: MonospaceFont,
225
+ fontSize: 13,
226
+ color: DarkTheme.textMuted,
227
+ textAlign: 'center'
228
+ }
229
+ });
230
+ //# sourceMappingURL=LogsTab.js.map