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.
- package/README.md +80 -0
- package/lib/commonjs/Backstage.js +130 -0
- package/lib/commonjs/Backstage.js.map +1 -0
- package/lib/commonjs/components/BackstagePanel.js +192 -0
- package/lib/commonjs/components/BackstagePanel.js.map +1 -0
- package/lib/commonjs/components/FloatingPill.js +147 -0
- package/lib/commonjs/components/FloatingPill.js.map +1 -0
- package/lib/commonjs/components/InfoTab.js +260 -0
- package/lib/commonjs/components/InfoTab.js.map +1 -0
- package/lib/commonjs/components/JsonTreeView.js +245 -0
- package/lib/commonjs/components/JsonTreeView.js.map +1 -0
- package/lib/commonjs/components/LogItem.js +191 -0
- package/lib/commonjs/components/LogItem.js.map +1 -0
- package/lib/commonjs/components/LogsTab.js +235 -0
- package/lib/commonjs/components/LogsTab.js.map +1 -0
- package/lib/commonjs/components/TabBar.js +132 -0
- package/lib/commonjs/components/TabBar.js.map +1 -0
- package/lib/commonjs/constants.js +89 -0
- package/lib/commonjs/constants.js.map +1 -0
- package/lib/commonjs/index.js +20 -0
- package/lib/commonjs/index.js.map +1 -0
- package/lib/commonjs/log-interceptor.js +114 -0
- package/lib/commonjs/log-interceptor.js.map +1 -0
- package/lib/commonjs/package.json +1 -0
- package/lib/commonjs/types.js +21 -0
- package/lib/commonjs/types.js.map +1 -0
- package/lib/commonjs/utils/formatTimestamp.js +26 -0
- package/lib/commonjs/utils/formatTimestamp.js.map +1 -0
- package/lib/commonjs/utils/stringify.js +78 -0
- package/lib/commonjs/utils/stringify.js.map +1 -0
- package/lib/module/Backstage.js +125 -0
- package/lib/module/Backstage.js.map +1 -0
- package/lib/module/components/BackstagePanel.js +187 -0
- package/lib/module/components/BackstagePanel.js.map +1 -0
- package/lib/module/components/FloatingPill.js +142 -0
- package/lib/module/components/FloatingPill.js.map +1 -0
- package/lib/module/components/InfoTab.js +255 -0
- package/lib/module/components/InfoTab.js.map +1 -0
- package/lib/module/components/JsonTreeView.js +241 -0
- package/lib/module/components/JsonTreeView.js.map +1 -0
- package/lib/module/components/LogItem.js +186 -0
- package/lib/module/components/LogItem.js.map +1 -0
- package/lib/module/components/LogsTab.js +230 -0
- package/lib/module/components/LogsTab.js.map +1 -0
- package/lib/module/components/TabBar.js +127 -0
- package/lib/module/components/TabBar.js.map +1 -0
- package/lib/module/constants.js +85 -0
- package/lib/module/constants.js.map +1 -0
- package/lib/module/index.js +5 -0
- package/lib/module/index.js.map +1 -0
- package/lib/module/log-interceptor.js +108 -0
- package/lib/module/log-interceptor.js.map +1 -0
- package/lib/module/package.json +1 -0
- package/lib/module/types.js +25 -0
- package/lib/module/types.js.map +1 -0
- package/lib/module/utils/formatTimestamp.js +22 -0
- package/lib/module/utils/formatTimestamp.js.map +1 -0
- package/lib/module/utils/stringify.js +73 -0
- package/lib/module/utils/stringify.js.map +1 -0
- package/lib/typescript/Backstage.d.ts +4 -0
- package/lib/typescript/Backstage.d.ts.map +1 -0
- package/lib/typescript/components/BackstagePanel.d.ts +21 -0
- package/lib/typescript/components/BackstagePanel.d.ts.map +1 -0
- package/lib/typescript/components/FloatingPill.d.ts +13 -0
- package/lib/typescript/components/FloatingPill.d.ts.map +1 -0
- package/lib/typescript/components/InfoTab.d.ts +16 -0
- package/lib/typescript/components/InfoTab.d.ts.map +1 -0
- package/lib/typescript/components/JsonTreeView.d.ts +10 -0
- package/lib/typescript/components/JsonTreeView.d.ts.map +1 -0
- package/lib/typescript/components/LogItem.d.ts +10 -0
- package/lib/typescript/components/LogItem.d.ts.map +1 -0
- package/lib/typescript/components/LogsTab.d.ts +11 -0
- package/lib/typescript/components/LogsTab.d.ts.map +1 -0
- package/lib/typescript/components/TabBar.d.ts +14 -0
- package/lib/typescript/components/TabBar.d.ts.map +1 -0
- package/lib/typescript/constants.d.ts +43 -0
- package/lib/typescript/constants.d.ts.map +1 -0
- package/lib/typescript/index.d.ts +4 -0
- package/lib/typescript/index.d.ts.map +1 -0
- package/lib/typescript/log-interceptor.d.ts +16 -0
- package/lib/typescript/log-interceptor.d.ts.map +1 -0
- package/lib/typescript/types.d.ts +110 -0
- package/lib/typescript/types.d.ts.map +1 -0
- package/lib/typescript/utils/formatTimestamp.d.ts +7 -0
- package/lib/typescript/utils/formatTimestamp.d.ts.map +1 -0
- package/lib/typescript/utils/stringify.d.ts +9 -0
- package/lib/typescript/utils/stringify.d.ts.map +1 -0
- package/package.json +91 -0
- package/src/Backstage.tsx +145 -0
- package/src/components/BackstagePanel.tsx +208 -0
- package/src/components/FloatingPill.tsx +150 -0
- package/src/components/InfoTab.tsx +264 -0
- package/src/components/JsonTreeView.tsx +259 -0
- package/src/components/LogItem.tsx +189 -0
- package/src/components/LogsTab.tsx +239 -0
- package/src/components/TabBar.tsx +150 -0
- package/src/constants.ts +82 -0
- package/src/index.ts +14 -0
- package/src/log-interceptor.ts +137 -0
- package/src/types.ts +147 -0
- package/src/utils/formatTimestamp.ts +22 -0
- 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
|