@chromepilot/recording-ui 0.1.1 → 0.1.2

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 (47) hide show
  1. package/dist/components/EventStreamPanel.d.ts +10 -1
  2. package/dist/components/EventStreamPanel.d.ts.map +1 -1
  3. package/dist/components/EventStreamPanel.js +290 -6
  4. package/dist/components/EventStreamPanel.js.map +1 -1
  5. package/dist/components/EventStreamPanel.test.d.ts +2 -0
  6. package/dist/components/EventStreamPanel.test.d.ts.map +1 -0
  7. package/dist/components/EventStreamPanel.test.js +200 -0
  8. package/dist/components/EventStreamPanel.test.js.map +1 -0
  9. package/dist/components/RecordingCompareBody.d.ts +30 -0
  10. package/dist/components/RecordingCompareBody.d.ts.map +1 -0
  11. package/dist/components/RecordingCompareBody.js +243 -0
  12. package/dist/components/RecordingCompareBody.js.map +1 -0
  13. package/dist/components/RecordingCompareBody.test.d.ts +2 -0
  14. package/dist/components/RecordingCompareBody.test.d.ts.map +1 -0
  15. package/dist/components/RecordingCompareBody.test.js +225 -0
  16. package/dist/components/RecordingCompareBody.test.js.map +1 -0
  17. package/dist/components/RequestDiffModal.d.ts +11 -0
  18. package/dist/components/RequestDiffModal.d.ts.map +1 -0
  19. package/dist/components/RequestDiffModal.js +150 -0
  20. package/dist/components/RequestDiffModal.js.map +1 -0
  21. package/dist/components/RequestDiffModal.test.d.ts +2 -0
  22. package/dist/components/RequestDiffModal.test.d.ts.map +1 -0
  23. package/dist/components/RequestDiffModal.test.js +115 -0
  24. package/dist/components/RequestDiffModal.test.js.map +1 -0
  25. package/dist/diff.d.ts +59 -0
  26. package/dist/diff.d.ts.map +1 -0
  27. package/dist/diff.js +137 -0
  28. package/dist/diff.js.map +1 -0
  29. package/dist/diff.test.d.ts +2 -0
  30. package/dist/diff.test.d.ts.map +1 -0
  31. package/dist/diff.test.js +137 -0
  32. package/dist/diff.test.js.map +1 -0
  33. package/dist/index.d.ts +3 -0
  34. package/dist/index.d.ts.map +1 -1
  35. package/dist/index.js +3 -0
  36. package/dist/index.js.map +1 -1
  37. package/dist/logic.d.ts +1 -0
  38. package/dist/logic.d.ts.map +1 -1
  39. package/dist/logic.js +1 -0
  40. package/dist/logic.js.map +1 -1
  41. package/dist/player.d.ts +2 -0
  42. package/dist/player.d.ts.map +1 -1
  43. package/dist/player.js +2 -0
  44. package/dist/player.js.map +1 -1
  45. package/dist/types.d.ts +5 -0
  46. package/dist/types.d.ts.map +1 -1
  47. package/package.json +1 -1
@@ -11,6 +11,15 @@ export interface EventStreamPanelProps {
11
11
  /** 点击事件行 → seek 播放器 */
12
12
  onSeek: (offsetMs: number) => void;
13
13
  height?: number;
14
+ /** 会话标识(折叠状态持久化 key);不传用 baseTimestamp */
15
+ sessionId?: string;
16
+ /**
17
+ * 逃生门:true 时渲染 FID-133 旧三页签实现(chromepilot 对端反馈通道,
18
+ * FID-134 iter2 后视反馈删除)。
19
+ */
20
+ tabs?: boolean;
21
+ /** 网络分区勾选对比开关;hm/cp 消费方可关,默认开 */
22
+ selectionMode?: boolean;
14
23
  }
15
- export declare function EventStreamPanel({ network, console: consoleEvents, exceptions, baseTimestamp, currentOffsetMs, onSeek, height, }: EventStreamPanelProps): import("react").JSX.Element;
24
+ export declare function EventStreamPanel(props: EventStreamPanelProps): import("react").JSX.Element;
16
25
  //# sourceMappingURL=EventStreamPanel.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"EventStreamPanel.d.ts","sourceRoot":"","sources":["../../src/components/EventStreamPanel.tsx"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAErD,MAAM,MAAM,cAAc,GAAG,SAAS,GAAG,SAAS,GAAG,YAAY,CAAC;AAElE,MAAM,WAAW,qBAAqB;IACpC,OAAO,EAAE,iBAAiB,EAAE,CAAC;IAC7B,OAAO,EAAE,iBAAiB,EAAE,CAAC;IAC7B,UAAU,EAAE,iBAAiB,EAAE,CAAC;IAChC,6CAA6C;IAC7C,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,0CAA0C;IAC1C,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,uBAAuB;IACvB,MAAM,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC;IACnC,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAoCD,wBAAgB,gBAAgB,CAAC,EAC/B,OAAO,EACP,OAAO,EAAE,aAAa,EACtB,UAAU,EACV,aAAa,EACb,eAAe,EACf,MAAM,EACN,MAAY,GACb,EAAE,qBAAqB,+BAiHvB"}
1
+ {"version":3,"file":"EventStreamPanel.d.ts","sourceRoot":"","sources":["../../src/components/EventStreamPanel.tsx"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAGrD,MAAM,MAAM,cAAc,GAAG,SAAS,GAAG,SAAS,GAAG,YAAY,CAAC;AAElE,MAAM,WAAW,qBAAqB;IACpC,OAAO,EAAE,iBAAiB,EAAE,CAAC;IAC7B,OAAO,EAAE,iBAAiB,EAAE,CAAC;IAC7B,UAAU,EAAE,iBAAiB,EAAE,CAAC;IAChC,6CAA6C;IAC7C,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,0CAA0C;IAC1C,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,uBAAuB;IACvB,MAAM,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC;IACnC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,0CAA0C;IAC1C,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;;OAGG;IACH,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,iCAAiC;IACjC,aAAa,CAAC,EAAE,OAAO,CAAC;CACzB;AAqkBD,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,qBAAqB,+BAI5D"}
@@ -1,25 +1,47 @@
1
- import { jsxs as _jsxs, jsx as _jsx } from "react/jsx-runtime";
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  /**
3
- * FID-133:事件流面板——网络请求 / 控制台 / 异常(JS 栈)三页签,
3
+ * FID-134 iter2:事件流面板——三分区(网络请求/控制台/页面异常)同屏平铺可折叠,
4
4
  * 与回放播放器时间轴联动:播放进度高亮"当前事件"(最后一个已越过的),
5
- * 点击事件行 seek 播放器到对应时间点。
5
+ * 点击事件行 seek 播放器到对应时间点;网络分区支持勾选多条发起请求级对比弹窗。
6
6
  *
7
7
  * 时间口径:事件 timestamp 是 epoch ms;播放器 getCurrentTime 是回放偏移 ms。
8
- * 换算基准 = 首个 rrweb 事件 timestamp(调用方传入 baseTimestamp)。
8
+ * 换算基准 = 首个 rrweb 事件 timestamp(调用方传入 baseTimestamp);
9
+ * 时间列展示相对偏移 m:ss.mmm。
10
+ *
11
+ * 逃生门:props.tabs=true 渲染 FID-133 旧三页签实现(chromepilot 对端反馈通道,
12
+ * FID-134 iter2 后视反馈删除)。
9
13
  */
10
14
  import { useEffect, useMemo, useRef, useState } from "react";
15
+ import { RequestDiffModal } from "./RequestDiffModal.js";
16
+ /** 分区键与展示配置(顺序即高亮优先级顺序) */
17
+ const SECTIONS = [
18
+ { key: "network", label: "网络请求", color: "#2563eb", empty: "这次录制没有产生网络请求" },
19
+ { key: "console", label: "控制台", color: "#f59e0b", empty: "这次录制没有产生控制台输出" },
20
+ { key: "exceptions", label: "页面异常", color: "#ef4444", empty: "这次录制没有产生页面异常" },
21
+ ];
11
22
  function formatClock(ts) {
12
23
  const d = new Date(ts);
13
24
  const pad = (n, l = 2) => n.toString().padStart(l, "0");
14
25
  return `${pad(d.getHours())}:${pad(d.getMinutes())}:${pad(d.getSeconds())}.${pad(d.getMilliseconds(), 3)}`;
15
26
  }
27
+ /** 相对偏移 m:ss.mmm(分不补零,秒/毫秒补零) */
28
+ function formatOffset(ms) {
29
+ if (!Number.isFinite(ms) || ms < 0)
30
+ return "-";
31
+ const totalSec = Math.floor(ms / 1000);
32
+ const min = Math.floor(totalSec / 60);
33
+ const sec = totalSec % 60;
34
+ const milli = Math.floor(ms % 1000);
35
+ const pad = (n, l = 2) => n.toString().padStart(l, "0");
36
+ return `${min}:${pad(sec)}.${pad(milli, 3)}`;
37
+ }
16
38
  function rowText(kind, ev) {
17
39
  const p = ev.payload;
18
40
  if (kind === "network") {
19
41
  const status = p.status;
20
42
  return {
21
43
  main: `${p.method || "GET"} ${p.url || ""}`,
22
- sub: p.phase === "request" ? "请求发出" : p.phase === "response" ? "响应返回" : undefined,
44
+ sub: p.phase === "request" ? "已发送" : p.phase === "response" ? "已返回" : undefined,
23
45
  badge: status != null ? String(status) : p.phase,
24
46
  badgeColor: status != null ? (status >= 400 ? "#ef4444" : status >= 300 ? "#f59e0b" : "#22c55e") : "#9ca3af",
25
47
  };
@@ -40,7 +62,263 @@ function rowText(kind, ev) {
40
62
  badgeColor: "#ef4444",
41
63
  };
42
64
  }
43
- export function EventStreamPanel({ network, console: consoleEvents, exceptions, baseTimestamp, currentOffsetMs, onSeek, height = 260, }) {
65
+ function storageKey(sessionId, baseTimestamp) {
66
+ return `esp-collapsed:${sessionId ?? String(baseTimestamp)}`;
67
+ }
68
+ function readCollapsed(key) {
69
+ try {
70
+ const raw = sessionStorage.getItem(key);
71
+ if (!raw)
72
+ return null;
73
+ const parsed = JSON.parse(raw);
74
+ return Array.isArray(parsed) ? parsed.filter((x) => typeof x === "string") : null;
75
+ }
76
+ catch {
77
+ return null;
78
+ }
79
+ }
80
+ function writeCollapsed(key, collapsed) {
81
+ try {
82
+ sessionStorage.setItem(key, JSON.stringify(collapsed));
83
+ }
84
+ catch {
85
+ // 存储不可用时折叠状态仅内存生效
86
+ }
87
+ }
88
+ /** 勾选持久化(验收检必修#2):存 key 列表(`${timestamp}-${idx}`),刷新后按 network 数组还原 */
89
+ function selectedStorageKey(sessionId, baseTimestamp) {
90
+ return `esp-selected:${sessionId ?? String(baseTimestamp)}`;
91
+ }
92
+ function readSelectedKeys(key) {
93
+ try {
94
+ const raw = sessionStorage.getItem(key);
95
+ if (!raw)
96
+ return null;
97
+ const parsed = JSON.parse(raw);
98
+ return Array.isArray(parsed) ? parsed.filter((x) => typeof x === "string") : null;
99
+ }
100
+ catch {
101
+ return null;
102
+ }
103
+ }
104
+ function writeSelectedKeys(key, keys) {
105
+ try {
106
+ if (keys.length === 0)
107
+ sessionStorage.removeItem(key);
108
+ else
109
+ sessionStorage.setItem(key, JSON.stringify(keys));
110
+ }
111
+ catch {
112
+ // 存储不可用时勾选仅内存生效
113
+ }
114
+ }
115
+ // ---------- 平铺视图(FID-134 iter2 默认) ----------
116
+ function FlatView({ network, console: consoleEvents, exceptions, baseTimestamp, currentOffsetMs, onSeek, height = 260, sessionId, selectionMode = true }) {
117
+ const compact = height <= 200;
118
+ const storeKey = storageKey(sessionId, baseTimestamp);
119
+ const sectionRefs = useRef({});
120
+ // 折叠状态:compact 默认只展开控制台+页面异常;持久化 sessionStorage
121
+ const [collapsedKeys, setCollapsedKeys] = useState(() => {
122
+ const stored = readCollapsed(storeKey);
123
+ if (stored)
124
+ return stored;
125
+ return compact ? ["network"] : [];
126
+ });
127
+ useEffect(() => {
128
+ writeCollapsed(storeKey, collapsedKeys);
129
+ }, [storeKey, collapsedKeys]);
130
+ const items = {
131
+ network,
132
+ console: consoleEvents,
133
+ exceptions,
134
+ };
135
+ const totalCount = network.length + consoleEvents.length + exceptions.length;
136
+ // 各分区独立高亮:最后一个 timestamp <= 基准+偏移 的下标
137
+ const linkageOn = baseTimestamp != null && currentOffsetMs != null;
138
+ const highlighted = useMemo(() => {
139
+ const out = { network: -1, console: -1, exceptions: -1 };
140
+ if (!linkageOn)
141
+ return out;
142
+ const nowTs = baseTimestamp + currentOffsetMs;
143
+ for (const s of SECTIONS) {
144
+ const list = items[s.key];
145
+ let best = -1;
146
+ for (let i = 0; i < list.length; i++) {
147
+ if (list[i].timestamp <= nowTs)
148
+ best = i;
149
+ else
150
+ break;
151
+ }
152
+ out[s.key] = best;
153
+ }
154
+ return out;
155
+ }, [network, consoleEvents, exceptions, baseTimestamp, currentOffsetMs, linkageOn]);
156
+ // 播放头所在分区 = 高亮优先级(network<console<exceptions)中最后一个 highlightedIdx>=0
157
+ const activeSection = [...SECTIONS].reverse().find((s) => highlighted[s.key] >= 0)?.key;
158
+ // 自动滚入抑制:用户手动滚动后 3 秒内不强制 scrollIntoView。
159
+ // 程序化滚动计数器:effect 触发的 scrollIntoView 也会冒 scroll 事件,
160
+ // 必须排除,否则自动跟随退化为「每 3 秒一跳」(验收检建议项)。
161
+ const suppressUntilRef = useRef(0);
162
+ const programmaticScrollsRef = useRef(0);
163
+ const handleSectionScroll = () => {
164
+ if (programmaticScrollsRef.current > 0) {
165
+ programmaticScrollsRef.current -= 1;
166
+ return;
167
+ }
168
+ suppressUntilRef.current = Date.now() + 3000;
169
+ };
170
+ useEffect(() => {
171
+ if (!linkageOn)
172
+ return;
173
+ if (Date.now() < suppressUntilRef.current)
174
+ return;
175
+ for (const s of SECTIONS) {
176
+ const idx = highlighted[s.key];
177
+ if (idx < 0)
178
+ continue;
179
+ const listEl = sectionRefs.current[s.key];
180
+ const rowEl = listEl?.children[idx];
181
+ if (!rowEl?.scrollIntoView)
182
+ continue;
183
+ programmaticScrollsRef.current += 1;
184
+ try {
185
+ rowEl.scrollIntoView({ block: "nearest" });
186
+ }
187
+ catch {
188
+ programmaticScrollsRef.current -= 1;
189
+ }
190
+ }
191
+ }, [highlighted, linkageOn]);
192
+ // 勾选(仅网络分区):key=`${timestamp}-${idx}`,值保留完整事件(勾选序);
193
+ // 勾选集持久化 sessionStorage(验收检必修#2),刷新按 network 数组还原
194
+ const selectedKey = selectedStorageKey(sessionId, baseTimestamp);
195
+ const [selectedMap, setSelectedMap] = useState(() => {
196
+ const m = new Map();
197
+ const stored = readSelectedKeys(selectedKey);
198
+ if (stored && network.length > 0) {
199
+ const byKey = new Map(network.map((ev, idx) => [`${ev.timestamp}-${idx}`, ev]));
200
+ for (const k of stored) {
201
+ const ev = byKey.get(k);
202
+ if (ev)
203
+ m.set(k, ev);
204
+ }
205
+ }
206
+ return m;
207
+ });
208
+ const [selectOn, setSelectOn] = useState(false);
209
+ const [guideVisible, setGuideVisible] = useState(false);
210
+ const [modalOpen, setModalOpen] = useState(false);
211
+ useEffect(() => {
212
+ writeSelectedKeys(selectedKey, [...selectedMap.keys()]);
213
+ }, [selectedKey, selectedMap]);
214
+ // 切录制(baseTimestamp 或 network 数组引用变化即新会话)→ 清空勾选。
215
+ // 首挂跳过:勾选可能来自 sessionStorage 持久化还原(验收检必修#2)
216
+ const prevSessionRef = useRef(null);
217
+ useEffect(() => {
218
+ const prev = prevSessionRef.current;
219
+ prevSessionRef.current = { baseTimestamp, network };
220
+ if (prev === null)
221
+ return;
222
+ if (prev.baseTimestamp === baseTimestamp && prev.network === network)
223
+ return;
224
+ setSelectedMap(new Map());
225
+ setGuideVisible(false);
226
+ setModalOpen(false);
227
+ }, [baseTimestamp, network]);
228
+ // 勾选第 1 条 → 灰字引导,选第 2 条或 3 秒后消失
229
+ useEffect(() => {
230
+ if (selectedMap.size === 1) {
231
+ setGuideVisible(true);
232
+ const t = setTimeout(() => setGuideVisible(false), 3000);
233
+ return () => clearTimeout(t);
234
+ }
235
+ setGuideVisible(false);
236
+ return undefined;
237
+ }, [selectedMap.size]);
238
+ const toggleSelect = (key, ev) => {
239
+ setSelectedMap((prev) => {
240
+ const next = new Map(prev);
241
+ if (next.has(key))
242
+ next.delete(key);
243
+ else
244
+ next.set(key, ev);
245
+ return next;
246
+ });
247
+ };
248
+ const selectedItems = [...selectedMap.values()];
249
+ return (_jsxs("div", { style: { border: "1px solid #e5e7eb", borderRadius: 6, background: "#fff" }, children: [_jsx("style", { children: `.esp-row .esp-cb{opacity:0;transition:opacity .12s}.esp-row:hover .esp-cb,.esp-cb[data-on="1"]{opacity:1}` }), _jsxs("div", { style: { display: "flex", alignItems: "center", gap: 4, padding: "6px 8px", borderBottom: "1px solid #f3f4f6", flexWrap: "wrap" }, children: [_jsxs("span", { style: { fontSize: 11, padding: "1px 7px", borderRadius: 8, background: "#f3f4f6", color: "#6b7280", marginRight: 4 }, children: ["\u5168\u90E8 ", totalCount] }), SECTIONS.map((s) => (_jsxs("button", { onClick: () => sectionRefs.current[s.key]?.scrollIntoView?.({ block: "start" }), style: {
250
+ fontSize: 12,
251
+ padding: "3px 8px",
252
+ border: "none",
253
+ borderRadius: 4,
254
+ background: activeSection === s.key ? "#dbeafe" : "transparent",
255
+ color: activeSection === s.key ? "#2563eb" : "#6b7280",
256
+ cursor: "pointer",
257
+ fontWeight: activeSection === s.key ? 600 : 400,
258
+ }, children: [s.label, " (", items[s.key].length, ")"] }, s.key)))] }), selectionMode && (_jsxs("div", { style: { display: "flex", alignItems: "center", justifyContent: "flex-end", gap: 8, padding: "4px 8px", borderBottom: "1px solid #f3f4f6", minHeight: 28 }, children: [selectedMap.size > 0 && (_jsxs("span", { style: { fontSize: 11, color: "#6b7280" }, children: ["\u5DF2\u9009 ", selectedMap.size, " \u6761", _jsx("button", { "aria-label": "\u6E05\u9664\u9009\u62E9", onClick: () => setSelectedMap(new Map()), style: { marginLeft: 6, border: "none", background: "transparent", cursor: "pointer", color: "#9ca3af", fontSize: 12, lineHeight: 1 }, children: "\u00D7" })] })), guideVisible && _jsx("span", { style: { fontSize: 11, color: "#9ca3af" }, children: "\u518D\u9009\u4E00\u6761\u5373\u53EF\u5BF9\u6BD4" }), _jsx("button", { onClick: () => setSelectOn((v) => !v), style: {
259
+ fontSize: 11,
260
+ padding: "2px 8px",
261
+ borderRadius: 4,
262
+ border: "1px solid #d1d5db",
263
+ background: selectOn ? "#eff6ff" : "#fff",
264
+ color: selectOn ? "#2563eb" : "#6b7280",
265
+ cursor: "pointer",
266
+ }, children: "\u9009\u62E9\u5BF9\u6BD4" })] })), totalCount === 0 ? (_jsx("div", { style: { padding: "20px 0", textAlign: "center", fontSize: 12, color: "#9ca3af" }, children: "\u8FD9\u6B21\u5F55\u5236\u8FD8\u6CA1\u6709\u6355\u6349\u5230\u4EFB\u4F55\u4E8B\u4EF6" })) : (SECTIONS.map((s) => {
267
+ const list = items[s.key];
268
+ const collapsed = collapsedKeys.includes(s.key);
269
+ const hi = highlighted[s.key];
270
+ return (_jsxs("div", { ref: (el) => {
271
+ sectionRefs.current[s.key] = el;
272
+ }, style: { scrollMarginTop: 4 }, children: [_jsxs("div", { style: {
273
+ display: "flex",
274
+ alignItems: "center",
275
+ gap: 6,
276
+ padding: "5px 8px",
277
+ borderBottom: "1px solid #f3f4f6",
278
+ background: "#fafafa",
279
+ }, children: [_jsx("button", { "aria-label": collapsed ? `展开${s.label}` : `折叠${s.label}`, onClick: () => setCollapsedKeys((prev) => collapsed ? prev.filter((k) => k !== s.key) : [...prev, s.key]), style: { border: "none", background: "transparent", cursor: "pointer", fontSize: 11, color: "#6b7280", padding: "0 2px" }, children: collapsed ? "▸" : "▾" }), _jsxs("span", { style: { fontSize: 12, fontWeight: 600, color: "#374151" }, children: [s.label, " (", list.length, ")"] }), _jsx("button", { onClick: () => setCollapsedKeys((prev) => collapsed ? prev.filter((k) => k !== s.key) : [...prev, s.key]), style: { marginLeft: "auto", border: "none", background: "transparent", cursor: "pointer", fontSize: 11, color: "#9ca3af" }, children: "[\u6298\u53E0]" })] }), !collapsed && (_jsx("div", { onScroll: handleSectionScroll, style: { maxHeight: height, overflowY: "auto", padding: "4px 0" }, "data-section": s.key, children: list.length === 0 ? (_jsx("div", { style: { padding: "14px 0", textAlign: "center", fontSize: 12, color: "#9ca3af" }, children: s.empty })) : (list.map((ev, idx) => {
280
+ const { main, sub, badge, badgeColor } = rowText(s.key, ev);
281
+ const highlightedRow = idx === hi;
282
+ const offsetMs = baseTimestamp != null ? ev.timestamp - baseTimestamp : null;
283
+ const seekable = offsetMs != null && offsetMs >= 0;
284
+ const rowKey = `${ev.timestamp}-${idx}`;
285
+ const checked = selectedMap.has(rowKey);
286
+ return (_jsxs("div", { className: "esp-row", "data-row": rowKey, onClick: () => seekable && onSeek(offsetMs), title: offsetMs != null ? `点击跳转到这一刻 · 完整时刻 ${formatClock(ev.timestamp)}` : undefined, style: {
287
+ display: "flex",
288
+ alignItems: "flex-start",
289
+ gap: 8,
290
+ padding: "4px 10px",
291
+ fontSize: 12,
292
+ background: checked ? "#eff6ff" : highlightedRow ? "#dbeafe" : idx % 2 === 0 ? "#fafafa" : "#fff",
293
+ cursor: seekable ? "pointer" : "default",
294
+ borderLeft: `3px solid ${s.color}`,
295
+ }, children: [selectionMode && s.key === "network" && (_jsx("input", { type: "checkbox", className: "esp-cb", "data-on": selectOn || checked ? "1" : "0", "aria-label": `选择第 ${idx + 1} 条请求`, checked: checked, onClick: (e) => e.stopPropagation(), onChange: () => toggleSelect(rowKey, ev), style: { marginTop: 2, flexShrink: 0, cursor: "pointer" } })), _jsx("span", { style: { fontFamily: "monospace", fontSize: 11, color: "#9ca3af", flexShrink: 0, minWidth: 76 }, children: offsetMs != null ? formatOffset(offsetMs) : formatClock(ev.timestamp) }), _jsx("span", { style: {
296
+ fontSize: 10,
297
+ padding: "1px 5px",
298
+ borderRadius: 4,
299
+ color: "#fff",
300
+ background: badgeColor ?? "#9ca3af",
301
+ flexShrink: 0,
302
+ marginTop: 1,
303
+ }, children: badge ?? "-" }), _jsxs("span", { style: { flex: 1, minWidth: 0 }, children: [_jsx("span", { style: { display: "block", color: "#111827", overflow: "hidden", textOverflow: "ellipsis", whiteSpace: "nowrap", fontFamily: s.key === "console" || s.key === "exceptions" ? "monospace" : undefined }, children: main }), sub && (_jsx("span", { style: { display: "block", color: "#9ca3af", fontSize: 10, overflow: "hidden", textOverflow: "ellipsis", whiteSpace: "nowrap", fontFamily: "monospace" }, children: sub }))] })] }, rowKey));
304
+ })) }))] }, s.key));
305
+ })), selectionMode && selectedMap.size >= 2 && (_jsxs("button", { onClick: () => setModalOpen(true), style: {
306
+ position: "fixed",
307
+ bottom: 24,
308
+ right: 24,
309
+ zIndex: 1000,
310
+ padding: "8px 16px",
311
+ borderRadius: 20,
312
+ border: "none",
313
+ background: "#2563eb",
314
+ color: "#fff",
315
+ fontSize: 13,
316
+ cursor: "pointer",
317
+ boxShadow: "0 4px 14px rgba(37,99,235,0.4)",
318
+ }, children: ["\u5BF9\u6BD4\u8FD9 ", selectedMap.size, " \u6761\u8BF7\u6C42"] })), _jsx(RequestDiffModal, { open: modalOpen, onClose: () => setModalOpen(false), selected: selectedItems, initialBaselineIndex: 0 })] }));
319
+ }
320
+ // ---------- 页签视图(FID-133 旧实现,逃生门) ----------
321
+ function TabsView({ network, console: consoleEvents, exceptions, baseTimestamp, currentOffsetMs, onSeek, height = 260 }) {
44
322
  const [tab, setTab] = useState("network");
45
323
  const listRef = useRef(null);
46
324
  const tabs = [
@@ -103,4 +381,10 @@ export function EventStreamPanel({ network, console: consoleEvents, exceptions,
103
381
  }, children: badge ?? "-" }), _jsxs("span", { style: { flex: 1, minWidth: 0 }, children: [_jsx("span", { style: { display: "block", color: "#111827", overflow: "hidden", textOverflow: "ellipsis", whiteSpace: "nowrap", fontFamily: tab === "console" || tab === "exceptions" ? "monospace" : undefined }, children: main }), sub && (_jsx("span", { style: { display: "block", color: "#9ca3af", fontSize: 10, overflow: "hidden", textOverflow: "ellipsis", whiteSpace: "nowrap", fontFamily: "monospace" }, children: sub }))] })] }, `${ev.timestamp}-${idx}`));
104
382
  })) })] }));
105
383
  }
384
+ export function EventStreamPanel(props) {
385
+ // 逃生门:tabs=true → 旧三页签实现(chromepilot 对端反馈通道)
386
+ if (props.tabs)
387
+ return _jsx(TabsView, { ...props });
388
+ return _jsx(FlatView, { ...props });
389
+ }
106
390
  //# sourceMappingURL=EventStreamPanel.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"EventStreamPanel.js","sourceRoot":"","sources":["../../src/components/EventStreamPanel.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"EventStreamPanel.js","sourceRoot":"","sources":["../../src/components/EventStreamPanel.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=EventStreamPanel.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EventStreamPanel.test.d.ts","sourceRoot":"","sources":["../../src/components/EventStreamPanel.test.tsx"],"names":[],"mappings":""}
@@ -0,0 +1,200 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ // @vitest-environment happy-dom
3
+ import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
4
+ import { act } from "react";
5
+ import { createRoot } from "react-dom/client";
6
+ import { EventStreamPanel } from "./EventStreamPanel.js";
7
+ globalThis.IS_REACT_ACT_ENVIRONMENT = true;
8
+ const BASE_TS = 1_700_000_000_000;
9
+ function netEv(url, ts, phase = "response", status = 200) {
10
+ return { type: "network", timestamp: ts, sessionId: "s", payload: { method: "GET", url, phase, status } };
11
+ }
12
+ function consoleEv(ts, level = "log") {
13
+ return { type: "console", timestamp: ts, sessionId: "s", payload: { level, message: "hello" } };
14
+ }
15
+ let container;
16
+ let root;
17
+ beforeEach(() => {
18
+ sessionStorage.clear();
19
+ container = document.createElement("div");
20
+ document.body.appendChild(container);
21
+ });
22
+ afterEach(() => {
23
+ act(() => root.unmount());
24
+ container.remove();
25
+ });
26
+ function render(ui) {
27
+ root = createRoot(container);
28
+ act(() => root.render(ui));
29
+ return container;
30
+ }
31
+ const PROPS = {
32
+ network: [netEv("https://a.com/1", BASE_TS + 1000), netEv("https://a.com/2", BASE_TS + 2000)],
33
+ console: [consoleEv(BASE_TS + 1500)],
34
+ exceptions: [],
35
+ baseTimestamp: BASE_TS,
36
+ currentOffsetMs: 1600,
37
+ onSeek: (_ms) => { },
38
+ };
39
+ describe("EventStreamPanel 平铺视图", () => {
40
+ it("三分区同屏渲染,分区头带计数与全部徽标", () => {
41
+ const c = render(_jsx(EventStreamPanel, { ...PROPS }));
42
+ const text = c.textContent ?? "";
43
+ expect(text).toContain("全部 3");
44
+ expect(text).toContain("网络请求 (2)");
45
+ expect(text).toContain("控制台 (1)");
46
+ expect(text).toContain("页面异常 (0)");
47
+ });
48
+ it("空分区独立空态文案;三分区全空整板空态", () => {
49
+ const c = render(_jsx(EventStreamPanel, { ...PROPS }));
50
+ expect(c.textContent).toContain("这次录制没有产生页面异常");
51
+ act(() => root.unmount());
52
+ const empty = render(_jsx(EventStreamPanel, { ...PROPS, network: [], console: [], exceptions: [] }));
53
+ expect(empty.textContent).toContain("这次录制还没有捕捉到任何事件");
54
+ });
55
+ it("时间列展示相对偏移 m:ss.mmm,title 带完整时刻", () => {
56
+ const c = render(_jsx(EventStreamPanel, { ...PROPS }));
57
+ const netSection = c.querySelector("[data-section='network']");
58
+ expect(netSection.textContent).toContain("0:01.000");
59
+ expect(netSection.textContent).toContain("0:02.000");
60
+ const row = netSection.querySelector("[data-row]");
61
+ expect(row.title).toContain("点击跳转到这一刻 · 完整时刻");
62
+ });
63
+ it("baseTimestamp=null 时显示原始时钟且禁用联动", () => {
64
+ const c = render(_jsx(EventStreamPanel, { ...PROPS, baseTimestamp: null, currentOffsetMs: null }));
65
+ const netSection = c.querySelector("[data-section='network']");
66
+ // 原始时钟 HH:MM:SS.mmm
67
+ expect(netSection.textContent).toMatch(/\d{2}:\d{2}:\d{2}\.\d{3}/);
68
+ });
69
+ it("播放头所在分区名高亮(最后一个 highlightedIdx>=0)", () => {
70
+ const c = render(_jsx(EventStreamPanel, { ...PROPS }));
71
+ const headerButtons = [...c.querySelectorAll("button")].filter((b) => /网络请求 \(2\)|控制台 \(1\)|页面异常 \(0\)/.test(b.textContent ?? ""));
72
+ const active = headerButtons.filter((b) => b.style.fontWeight === "600");
73
+ expect(active).toHaveLength(1);
74
+ expect(active[0].textContent).toContain("控制台"); // 1500<=1600,网络第 2 条 2000>1600
75
+ });
76
+ it("compact(height<=200)默认折叠网络分区并写入 sessionStorage", () => {
77
+ render(_jsx(EventStreamPanel, { ...PROPS, height: 200, sessionId: "s" }));
78
+ expect(sessionStorage.getItem("esp-collapsed:s")).toBe(JSON.stringify(["network"]));
79
+ });
80
+ it("折叠/展开写入 sessionStorage(无 sessionId 用 baseTimestamp)", () => {
81
+ const c = render(_jsx(EventStreamPanel, { ...PROPS }));
82
+ const collapseBtn = [...c.querySelectorAll("button")].find((b) => b.textContent === "[折叠]");
83
+ act(() => {
84
+ collapseBtn.dispatchEvent(new MouseEvent("click", { bubbles: true }));
85
+ });
86
+ expect(sessionStorage.getItem(`esp-collapsed:${BASE_TS}`)).toBe(JSON.stringify(["network"]));
87
+ act(() => root.unmount());
88
+ // 重挂:读回折叠状态 → 网络分区行不可见
89
+ const c2 = render(_jsx(EventStreamPanel, { ...PROPS }));
90
+ expect(c2.querySelector("[data-section='network']")).toBeNull();
91
+ expect(c2.querySelector("[data-section='console']")).toBeTruthy();
92
+ });
93
+ it("网络行 phase 文案:已发送/已返回", () => {
94
+ const c = render(_jsx(EventStreamPanel, { ...PROPS, network: [netEv("https://a.com/1", BASE_TS + 1000, "request"), netEv("https://a.com/2", BASE_TS + 2000, "response")] }));
95
+ const text = c.textContent ?? "";
96
+ expect(text).toContain("已发送");
97
+ expect(text).toContain("已返回");
98
+ });
99
+ it("勾选两条 → 已选计数/引导/对比按钮/弹窗打开,关闭弹窗不丢勾选", () => {
100
+ const c = render(_jsx(EventStreamPanel, { ...PROPS, sessionId: "sel1" }));
101
+ const boxes = c.querySelectorAll("[data-section='network'] input[type='checkbox']");
102
+ expect(boxes).toHaveLength(2);
103
+ act(() => {
104
+ boxes[0].dispatchEvent(new MouseEvent("click", { bubbles: true }));
105
+ });
106
+ expect(c.textContent).toContain("已选 1 条");
107
+ expect(c.textContent).toContain("再选一条即可对比");
108
+ act(() => {
109
+ boxes[1].dispatchEvent(new MouseEvent("click", { bubbles: true }));
110
+ });
111
+ expect(c.textContent).toContain("已选 2 条");
112
+ expect(c.textContent).toContain("对比这 2 条请求");
113
+ const cmpBtn = [...c.querySelectorAll("button")].find((b) => b.textContent?.includes("对比这 2 条"));
114
+ act(() => {
115
+ cmpBtn.dispatchEvent(new MouseEvent("click", { bubbles: true }));
116
+ });
117
+ expect(c.querySelector('[role="dialog"]')).toBeTruthy();
118
+ // 关闭弹窗不丢勾选
119
+ act(() => {
120
+ c.querySelector("button[aria-label='关闭']").dispatchEvent(new MouseEvent("click", { bubbles: true }));
121
+ });
122
+ expect(c.querySelector('[role="dialog"]')).toBeNull();
123
+ expect(c.textContent).toContain("已选 2 条");
124
+ });
125
+ it("× 清除勾选", () => {
126
+ const c = render(_jsx(EventStreamPanel, { ...PROPS, sessionId: "sel2" }));
127
+ const box = c.querySelector("[data-section='network'] input[type='checkbox']");
128
+ act(() => {
129
+ box.dispatchEvent(new MouseEvent("click", { bubbles: true }));
130
+ });
131
+ expect(c.textContent).toContain("已选 1 条");
132
+ act(() => {
133
+ c.querySelector("button[aria-label='清除选择']").dispatchEvent(new MouseEvent("click", { bubbles: true }));
134
+ });
135
+ expect(c.textContent).not.toContain("已选 1 条");
136
+ });
137
+ it("勾选变化写入 sessionStorage(key 含会话标识;验收检必修#2)", () => {
138
+ const c = render(_jsx(EventStreamPanel, { ...PROPS, sessionId: "sel5" }));
139
+ const box = c.querySelector("[data-section='network'] input[type='checkbox']");
140
+ act(() => {
141
+ box.dispatchEvent(new MouseEvent("click", { bubbles: true }));
142
+ });
143
+ expect(sessionStorage.getItem("esp-selected:sel5")).toBe(JSON.stringify([`${BASE_TS + 1000}-0`]));
144
+ expect(c.textContent).toContain("已选 1 条");
145
+ });
146
+ it("勾选持久化:重挂载(模拟刷新)后勾选还原,取消后存储清空(验收检必修#2)", () => {
147
+ // 预置上次会话勾了第 2 条(`${BASE_TS + 2000}-1`)
148
+ sessionStorage.setItem("esp-selected:sel4", JSON.stringify([`${BASE_TS + 2000}-1`]));
149
+ const c = render(_jsx(EventStreamPanel, { ...PROPS, sessionId: "sel4" }));
150
+ expect(c.textContent).toContain("已选 1 条");
151
+ const boxes = c.querySelectorAll("[data-section='network'] input[type='checkbox']");
152
+ expect(boxes[1].checked).toBe(true);
153
+ act(() => {
154
+ boxes[1].dispatchEvent(new MouseEvent("click", { bubbles: true }));
155
+ });
156
+ expect(c.textContent).not.toContain("已选 1 条");
157
+ expect(sessionStorage.getItem("esp-selected:sel4")).toBeNull();
158
+ });
159
+ it("切换录制(network 引用变化)清空勾选", () => {
160
+ const c = render(_jsx(EventStreamPanel, { ...PROPS, sessionId: "sel3" }));
161
+ const box = c.querySelector("[data-section='network'] input[type='checkbox']");
162
+ act(() => {
163
+ box.dispatchEvent(new MouseEvent("click", { bubbles: true }));
164
+ });
165
+ expect(c.textContent).toContain("已选 1 条");
166
+ act(() => {
167
+ root.render(_jsx(EventStreamPanel, { ...PROPS, network: [netEv("https://a.com/9", BASE_TS + 500)], sessionId: "sel3" }));
168
+ });
169
+ expect(c.textContent).not.toContain("已选 1 条");
170
+ });
171
+ it("selectionMode=false 不渲染勾选工具行", () => {
172
+ const c = render(_jsx(EventStreamPanel, { ...PROPS, selectionMode: false }));
173
+ expect(c.textContent).not.toContain("选择对比");
174
+ expect(c.querySelector("[data-section='network'] input[type='checkbox']")).toBeNull();
175
+ });
176
+ it("点击行触发 onSeek(相对偏移)", () => {
177
+ const onSeek = vi.fn();
178
+ const c = render(_jsx(EventStreamPanel, { ...PROPS, onSeek: onSeek }));
179
+ const row = c.querySelector("[data-section='network'] [data-row]");
180
+ act(() => {
181
+ row.dispatchEvent(new MouseEvent("click", { bubbles: true }));
182
+ });
183
+ expect(onSeek).toHaveBeenCalledWith(1000);
184
+ });
185
+ });
186
+ describe("EventStreamPanel tabs 逃生门", () => {
187
+ it("tabs=true 渲染旧三页签实现", () => {
188
+ const c = render(_jsx(EventStreamPanel, { ...PROPS, tabs: true }));
189
+ // 页签实现:无平铺分区容器
190
+ expect(c.textContent).toContain("网络请求 (2)");
191
+ expect(c.querySelector("[data-section='network']")).toBeNull();
192
+ // 切到控制台页签
193
+ const consoleTab = [...c.querySelectorAll("button")].find((b) => b.textContent === "控制台 (1)");
194
+ act(() => {
195
+ consoleTab.dispatchEvent(new MouseEvent("click", { bubbles: true }));
196
+ });
197
+ expect(c.textContent).toContain("hello");
198
+ });
199
+ });
200
+ //# sourceMappingURL=EventStreamPanel.test.js.map