@bbearai/react 0.4.5 → 0.5.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/dist/index.d.mts +4 -0
- package/dist/index.d.ts +4 -0
- package/dist/index.js +764 -445
- package/dist/index.mjs +764 -445
- package/package.json +2 -2
package/dist/index.js
CHANGED
|
@@ -84,6 +84,8 @@ var BugBearContext = (0, import_react.createContext)({
|
|
|
84
84
|
issueCounts: { open: 0, done: 0, reopened: 0 },
|
|
85
85
|
refreshIssueCounts: async () => {
|
|
86
86
|
},
|
|
87
|
+
queuedCount: 0,
|
|
88
|
+
dashboardUrl: void 0,
|
|
87
89
|
onError: void 0
|
|
88
90
|
});
|
|
89
91
|
function useBugBear() {
|
|
@@ -102,6 +104,7 @@ function BugBearProvider({ config, children, enabled = true }) {
|
|
|
102
104
|
const [threads, setThreads] = (0, import_react.useState)([]);
|
|
103
105
|
const [unreadCount, setUnreadCount] = (0, import_react.useState)(0);
|
|
104
106
|
const [issueCounts, setIssueCounts] = (0, import_react.useState)({ open: 0, done: 0, reopened: 0 });
|
|
107
|
+
const [queuedCount, setQueuedCount] = (0, import_react.useState)(0);
|
|
105
108
|
const refreshAssignments = (0, import_react.useCallback)(async () => {
|
|
106
109
|
if (!client) return;
|
|
107
110
|
const newAssignments = await client.getAssignedTests();
|
|
@@ -249,18 +252,45 @@ function BugBearProvider({ config, children, enabled = true }) {
|
|
|
249
252
|
hasInitialized.current = true;
|
|
250
253
|
import_core.contextCapture.startCapture();
|
|
251
254
|
const newClient = (0, import_core.createBugBear)(config);
|
|
255
|
+
if (newClient.queue) {
|
|
256
|
+
newClient.queue.onChange(setQueuedCount);
|
|
257
|
+
newClient.initQueue();
|
|
258
|
+
}
|
|
252
259
|
setClient(newClient);
|
|
253
260
|
initializeBugBear(newClient);
|
|
254
261
|
}
|
|
255
262
|
}, [enabled, config, initializeBugBear]);
|
|
263
|
+
(0, import_react.useEffect)(() => {
|
|
264
|
+
if (!client?.queue) return;
|
|
265
|
+
const handleOnline = () => {
|
|
266
|
+
client.queue?.flush();
|
|
267
|
+
};
|
|
268
|
+
window.addEventListener("online", handleOnline);
|
|
269
|
+
if (navigator.onLine && client.queue.count > 0) {
|
|
270
|
+
client.queue.flush();
|
|
271
|
+
}
|
|
272
|
+
return () => window.removeEventListener("online", handleOnline);
|
|
273
|
+
}, [client]);
|
|
256
274
|
(0, import_react.useEffect)(() => {
|
|
257
275
|
if (!client || !isTester || !isQAEnabled) return;
|
|
276
|
+
let unsubscribe;
|
|
277
|
+
if (client.realtimeEnabled) {
|
|
278
|
+
unsubscribe = client.subscribeToChanges({
|
|
279
|
+
onAssignmentChange: refreshAssignments,
|
|
280
|
+
onMessageChange: refreshThreads,
|
|
281
|
+
onReportChange: refreshIssueCounts
|
|
282
|
+
});
|
|
283
|
+
}
|
|
284
|
+
const pollInterval = client.realtimeEnabled ? 12e4 : 3e4;
|
|
258
285
|
const interval = setInterval(() => {
|
|
259
286
|
refreshThreads();
|
|
260
287
|
refreshIssueCounts();
|
|
261
|
-
},
|
|
262
|
-
return () =>
|
|
263
|
-
|
|
288
|
+
}, pollInterval);
|
|
289
|
+
return () => {
|
|
290
|
+
clearInterval(interval);
|
|
291
|
+
unsubscribe?.();
|
|
292
|
+
};
|
|
293
|
+
}, [client, isTester, isQAEnabled, refreshThreads, refreshIssueCounts, refreshAssignments]);
|
|
264
294
|
const currentAssignment = assignments.find(
|
|
265
295
|
(a) => a.status === "in_progress"
|
|
266
296
|
) || assignments.find(
|
|
@@ -303,6 +333,8 @@ function BugBearProvider({ config, children, enabled = true }) {
|
|
|
303
333
|
// Issue tracking
|
|
304
334
|
issueCounts,
|
|
305
335
|
refreshIssueCounts,
|
|
336
|
+
queuedCount,
|
|
337
|
+
dashboardUrl: config.dashboardUrl,
|
|
306
338
|
onError: config.onError
|
|
307
339
|
},
|
|
308
340
|
children
|
|
@@ -429,9 +461,148 @@ function getThreadTypeIcon(type) {
|
|
|
429
461
|
|
|
430
462
|
// src/widget/screens/HomeScreen.tsx
|
|
431
463
|
var import_react3 = require("react");
|
|
464
|
+
|
|
465
|
+
// src/widget/Skeleton.tsx
|
|
432
466
|
var import_jsx_runtime2 = require("react/jsx-runtime");
|
|
467
|
+
var PULSE_CSS = `@keyframes bb-skeleton-pulse{0%,100%{opacity:.6}50%{opacity:.25}}`;
|
|
468
|
+
var styleInjected = false;
|
|
469
|
+
function injectStyle() {
|
|
470
|
+
if (styleInjected || typeof document === "undefined") return;
|
|
471
|
+
const style = document.createElement("style");
|
|
472
|
+
style.textContent = PULSE_CSS;
|
|
473
|
+
document.head.appendChild(style);
|
|
474
|
+
styleInjected = true;
|
|
475
|
+
}
|
|
476
|
+
function Bar({ width = "100%", height = 12, radius = 6, style }) {
|
|
477
|
+
injectStyle();
|
|
478
|
+
return /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
|
|
479
|
+
"div",
|
|
480
|
+
{
|
|
481
|
+
style: {
|
|
482
|
+
width,
|
|
483
|
+
height,
|
|
484
|
+
borderRadius: radius,
|
|
485
|
+
backgroundColor: colors.border,
|
|
486
|
+
animation: "bb-skeleton-pulse 1.5s ease-in-out infinite",
|
|
487
|
+
...style
|
|
488
|
+
}
|
|
489
|
+
}
|
|
490
|
+
);
|
|
491
|
+
}
|
|
492
|
+
function Circle({ size = 20, style }) {
|
|
493
|
+
injectStyle();
|
|
494
|
+
return /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
|
|
495
|
+
"div",
|
|
496
|
+
{
|
|
497
|
+
style: {
|
|
498
|
+
width: size,
|
|
499
|
+
height: size,
|
|
500
|
+
borderRadius: size / 2,
|
|
501
|
+
backgroundColor: colors.border,
|
|
502
|
+
animation: "bb-skeleton-pulse 1.5s ease-in-out infinite",
|
|
503
|
+
flexShrink: 0,
|
|
504
|
+
...style
|
|
505
|
+
}
|
|
506
|
+
}
|
|
507
|
+
);
|
|
508
|
+
}
|
|
509
|
+
function HomeScreenSkeleton() {
|
|
510
|
+
return /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { children: [
|
|
511
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)(Bar, { width: "100%", height: 100, radius: 16, style: { marginBottom: 20 } }),
|
|
512
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)("div", { style: { display: "grid", gridTemplateColumns: "1fr 1fr", gap: 12, marginBottom: 20 }, children: [0, 1, 2, 3].map((i) => /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { style: { backgroundColor: colors.card, border: `1px solid ${colors.border}`, borderRadius: 12, padding: 16, display: "flex", flexDirection: "column", alignItems: "center", gap: 8 }, children: [
|
|
513
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)(Circle, { size: 28 }),
|
|
514
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)(Bar, { width: 60, height: 10 })
|
|
515
|
+
] }, i)) }),
|
|
516
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)("div", { style: { display: "grid", gridTemplateColumns: "1fr 1fr 1fr", gap: 10, marginBottom: 20 }, children: [0, 1, 2].map((i) => /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { style: { backgroundColor: colors.card, border: `1px solid ${colors.border}`, borderRadius: 10, padding: "12px 8px", display: "flex", flexDirection: "column", alignItems: "center", gap: 6 }, children: [
|
|
517
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)(Bar, { width: 30, height: 18 }),
|
|
518
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)(Bar, { width: 40, height: 8 })
|
|
519
|
+
] }, i)) }),
|
|
520
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)(Bar, { width: "100%", height: 6, radius: 3, style: { marginBottom: 8 } }),
|
|
521
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)(Bar, { width: 120, height: 10, style: { margin: "0 auto 16px" } })
|
|
522
|
+
] });
|
|
523
|
+
}
|
|
524
|
+
function TestItemSkeleton({ delay = 0 }) {
|
|
525
|
+
return /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { style: { display: "flex", alignItems: "center", padding: "10px 12px", borderRadius: 8, marginBottom: 4, backgroundColor: colors.card }, children: [
|
|
526
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)(Circle, { size: 18, style: { marginRight: 10, animationDelay: `${delay}ms` } }),
|
|
527
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { style: { flex: 1 }, children: [
|
|
528
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)(Bar, { width: "70%", height: 11, style: { marginBottom: 4, animationDelay: `${delay}ms` } }),
|
|
529
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)(Bar, { width: "45%", height: 8, style: { animationDelay: `${delay}ms` } })
|
|
530
|
+
] }),
|
|
531
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)(Bar, { width: 50, height: 18, radius: 6, style: { marginLeft: 8, animationDelay: `${delay}ms` } })
|
|
532
|
+
] });
|
|
533
|
+
}
|
|
534
|
+
function TestListScreenSkeleton() {
|
|
535
|
+
return /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { children: [
|
|
536
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)("div", { style: { display: "flex", gap: 8, marginBottom: 8 }, children: [55, 50, 50, 70].map((w, i) => /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(Bar, { width: w, height: 28, radius: 8, style: { animationDelay: `${i * 50}ms` } }, i)) }),
|
|
537
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)(Bar, { width: "100%", height: 36, radius: 8, style: { marginBottom: 10 } }),
|
|
538
|
+
[0, 1].map((g) => /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { style: { marginBottom: 12 }, children: [
|
|
539
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { style: { display: "flex", alignItems: "center", gap: 8, padding: "8px 4px" }, children: [
|
|
540
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)(Bar, { width: 12, height: 10 }),
|
|
541
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)(Bar, { width: "40%", height: 12 }),
|
|
542
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)(Bar, { width: 40, height: 4, radius: 2, style: { marginLeft: "auto" } }),
|
|
543
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)(Bar, { width: 24, height: 10 })
|
|
544
|
+
] }),
|
|
545
|
+
[0, 1, 2].map((i) => /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(TestItemSkeleton, { delay: (g * 3 + i) * 80 }, i))
|
|
546
|
+
] }, g))
|
|
547
|
+
] });
|
|
548
|
+
}
|
|
549
|
+
function IssueListScreenSkeleton() {
|
|
550
|
+
return /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("div", { children: [0, 1, 2, 3].map((i) => /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(
|
|
551
|
+
"div",
|
|
552
|
+
{
|
|
553
|
+
style: {
|
|
554
|
+
backgroundColor: colors.card,
|
|
555
|
+
border: `1px solid ${colors.border}`,
|
|
556
|
+
borderRadius: 10,
|
|
557
|
+
padding: "12px 14px",
|
|
558
|
+
marginBottom: 8
|
|
559
|
+
},
|
|
560
|
+
children: [
|
|
561
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { style: { display: "flex", alignItems: "center", gap: 8 }, children: [
|
|
562
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)(Circle, { size: 8, style: { animationDelay: `${i * 100}ms` } }),
|
|
563
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)(Bar, { width: "65%", height: 11, style: { animationDelay: `${i * 100}ms` } })
|
|
564
|
+
] }),
|
|
565
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { style: { display: "flex", justifyContent: "space-between", marginTop: 8 }, children: [
|
|
566
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)(Bar, { width: "40%", height: 8, style: { animationDelay: `${i * 100}ms` } }),
|
|
567
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)(Bar, { width: 40, height: 8, style: { animationDelay: `${i * 100}ms` } })
|
|
568
|
+
] })
|
|
569
|
+
]
|
|
570
|
+
},
|
|
571
|
+
i
|
|
572
|
+
)) });
|
|
573
|
+
}
|
|
574
|
+
function MessageListScreenSkeleton() {
|
|
575
|
+
return /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { children: [
|
|
576
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)(Bar, { width: "100%", height: 44, radius: 12, style: { marginBottom: 16 } }),
|
|
577
|
+
[0, 1, 2, 3].map((i) => /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(
|
|
578
|
+
"div",
|
|
579
|
+
{
|
|
580
|
+
style: {
|
|
581
|
+
display: "flex",
|
|
582
|
+
alignItems: "flex-start",
|
|
583
|
+
padding: 12,
|
|
584
|
+
borderRadius: 10,
|
|
585
|
+
marginBottom: 4,
|
|
586
|
+
backgroundColor: colors.card
|
|
587
|
+
},
|
|
588
|
+
children: [
|
|
589
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)(Circle, { size: 20, style: { marginRight: 10, marginTop: 2, animationDelay: `${i * 100}ms` } }),
|
|
590
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { style: { flex: 1 }, children: [
|
|
591
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)(Bar, { width: "55%", height: 11, style: { marginBottom: 5, animationDelay: `${i * 100}ms` } }),
|
|
592
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)(Bar, { width: "80%", height: 9, style: { animationDelay: `${i * 100}ms` } })
|
|
593
|
+
] }),
|
|
594
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)(Bar, { width: 30, height: 8, style: { marginLeft: 8, animationDelay: `${i * 100}ms` } })
|
|
595
|
+
]
|
|
596
|
+
},
|
|
597
|
+
i
|
|
598
|
+
))
|
|
599
|
+
] });
|
|
600
|
+
}
|
|
601
|
+
|
|
602
|
+
// src/widget/screens/HomeScreen.tsx
|
|
603
|
+
var import_jsx_runtime3 = require("react/jsx-runtime");
|
|
433
604
|
function HomeScreen({ nav }) {
|
|
434
|
-
const { assignments, unreadCount, threads, refreshAssignments, refreshThreads, issueCounts, refreshIssueCounts } = useBugBear();
|
|
605
|
+
const { assignments, unreadCount, threads, refreshAssignments, refreshThreads, issueCounts, refreshIssueCounts, isLoading } = useBugBear();
|
|
435
606
|
(0, import_react3.useEffect)(() => {
|
|
436
607
|
refreshAssignments();
|
|
437
608
|
refreshThreads();
|
|
@@ -442,8 +613,9 @@ function HomeScreen({ nav }) {
|
|
|
442
613
|
const retestCount = pendingAssignments.filter((a) => a.isVerification).length;
|
|
443
614
|
const completedCount = assignments.filter((a) => a.status === "passed" || a.status === "failed").length;
|
|
444
615
|
const totalTests = assignments.length;
|
|
445
|
-
return /* @__PURE__ */ (0,
|
|
446
|
-
|
|
616
|
+
if (isLoading) return /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(HomeScreenSkeleton, {});
|
|
617
|
+
return /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)("div", { children: [
|
|
618
|
+
pendingCount > 0 ? /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)(
|
|
447
619
|
"div",
|
|
448
620
|
{
|
|
449
621
|
role: "button",
|
|
@@ -465,13 +637,13 @@ function HomeScreen({ nav }) {
|
|
|
465
637
|
userSelect: "none"
|
|
466
638
|
},
|
|
467
639
|
children: [
|
|
468
|
-
/* @__PURE__ */ (0,
|
|
469
|
-
/* @__PURE__ */ (0,
|
|
640
|
+
/* @__PURE__ */ (0, import_jsx_runtime3.jsx)("span", { style: { fontSize: 48, fontWeight: 700, color: colors.blueLight }, children: pendingCount }),
|
|
641
|
+
/* @__PURE__ */ (0, import_jsx_runtime3.jsxs)("span", { style: { fontSize: 16, color: colors.blueText, marginTop: 2 }, children: [
|
|
470
642
|
"test",
|
|
471
643
|
pendingCount !== 1 ? "s" : "",
|
|
472
644
|
" waiting"
|
|
473
645
|
] }),
|
|
474
|
-
retestCount > 0 && /* @__PURE__ */ (0,
|
|
646
|
+
retestCount > 0 && /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)(
|
|
475
647
|
"span",
|
|
476
648
|
{
|
|
477
649
|
style: {
|
|
@@ -495,10 +667,10 @@ function HomeScreen({ nav }) {
|
|
|
495
667
|
]
|
|
496
668
|
}
|
|
497
669
|
),
|
|
498
|
-
/* @__PURE__ */ (0,
|
|
670
|
+
/* @__PURE__ */ (0, import_jsx_runtime3.jsx)("span", { style: { fontSize: 14, fontWeight: 600, color: colors.blue, marginTop: 12 }, children: "Start Testing \u2192" })
|
|
499
671
|
]
|
|
500
672
|
}
|
|
501
|
-
) : unreadCount > 0 ? /* @__PURE__ */ (0,
|
|
673
|
+
) : unreadCount > 0 ? /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)(
|
|
502
674
|
"div",
|
|
503
675
|
{
|
|
504
676
|
role: "button",
|
|
@@ -520,15 +692,15 @@ function HomeScreen({ nav }) {
|
|
|
520
692
|
userSelect: "none"
|
|
521
693
|
},
|
|
522
694
|
children: [
|
|
523
|
-
/* @__PURE__ */ (0,
|
|
524
|
-
/* @__PURE__ */ (0,
|
|
695
|
+
/* @__PURE__ */ (0, import_jsx_runtime3.jsx)("span", { style: { fontSize: 48, fontWeight: 700, color: colors.blueLight }, children: unreadCount }),
|
|
696
|
+
/* @__PURE__ */ (0, import_jsx_runtime3.jsxs)("span", { style: { fontSize: 16, color: colors.blueText, marginTop: 2 }, children: [
|
|
525
697
|
"unread message",
|
|
526
698
|
unreadCount !== 1 ? "s" : ""
|
|
527
699
|
] }),
|
|
528
|
-
/* @__PURE__ */ (0,
|
|
700
|
+
/* @__PURE__ */ (0, import_jsx_runtime3.jsx)("span", { style: { fontSize: 14, fontWeight: 600, color: colors.blue, marginTop: 12 }, children: "View Messages \u2192" })
|
|
529
701
|
]
|
|
530
702
|
}
|
|
531
|
-
) : /* @__PURE__ */ (0,
|
|
703
|
+
) : /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)(
|
|
532
704
|
"div",
|
|
533
705
|
{
|
|
534
706
|
style: {
|
|
@@ -542,9 +714,9 @@ function HomeScreen({ nav }) {
|
|
|
542
714
|
marginBottom: 20
|
|
543
715
|
},
|
|
544
716
|
children: [
|
|
545
|
-
/* @__PURE__ */ (0,
|
|
546
|
-
/* @__PURE__ */ (0,
|
|
547
|
-
totalTests > 0 && /* @__PURE__ */ (0,
|
|
717
|
+
/* @__PURE__ */ (0, import_jsx_runtime3.jsx)("span", { style: { fontSize: 36, marginBottom: 8 }, children: "\u2705" }),
|
|
718
|
+
/* @__PURE__ */ (0, import_jsx_runtime3.jsx)("span", { style: { fontSize: 18, fontWeight: 600, color: colors.textPrimary }, children: "All caught up!" }),
|
|
719
|
+
totalTests > 0 && /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)("span", { style: { fontSize: 14, color: colors.textMuted, marginTop: 4 }, children: [
|
|
548
720
|
completedCount,
|
|
549
721
|
"/",
|
|
550
722
|
totalTests,
|
|
@@ -553,7 +725,7 @@ function HomeScreen({ nav }) {
|
|
|
553
725
|
]
|
|
554
726
|
}
|
|
555
727
|
),
|
|
556
|
-
/* @__PURE__ */ (0,
|
|
728
|
+
/* @__PURE__ */ (0, import_jsx_runtime3.jsxs)(
|
|
557
729
|
"div",
|
|
558
730
|
{
|
|
559
731
|
style: {
|
|
@@ -563,7 +735,7 @@ function HomeScreen({ nav }) {
|
|
|
563
735
|
marginBottom: 20
|
|
564
736
|
},
|
|
565
737
|
children: [
|
|
566
|
-
/* @__PURE__ */ (0,
|
|
738
|
+
/* @__PURE__ */ (0, import_jsx_runtime3.jsxs)(
|
|
567
739
|
"div",
|
|
568
740
|
{
|
|
569
741
|
role: "button",
|
|
@@ -585,9 +757,9 @@ function HomeScreen({ nav }) {
|
|
|
585
757
|
userSelect: "none"
|
|
586
758
|
},
|
|
587
759
|
children: [
|
|
588
|
-
/* @__PURE__ */ (0,
|
|
589
|
-
/* @__PURE__ */ (0,
|
|
590
|
-
pendingCount > 0 && /* @__PURE__ */ (0,
|
|
760
|
+
/* @__PURE__ */ (0, import_jsx_runtime3.jsx)("span", { style: { fontSize: 28, marginBottom: 8 }, children: "\u2705" }),
|
|
761
|
+
/* @__PURE__ */ (0, import_jsx_runtime3.jsx)("span", { style: { fontSize: 14, fontWeight: 500, color: colors.textPrimary }, children: "Tests" }),
|
|
762
|
+
pendingCount > 0 && /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
|
|
591
763
|
"span",
|
|
592
764
|
{
|
|
593
765
|
style: {
|
|
@@ -613,7 +785,7 @@ function HomeScreen({ nav }) {
|
|
|
613
785
|
]
|
|
614
786
|
}
|
|
615
787
|
),
|
|
616
|
-
/* @__PURE__ */ (0,
|
|
788
|
+
/* @__PURE__ */ (0, import_jsx_runtime3.jsxs)(
|
|
617
789
|
"div",
|
|
618
790
|
{
|
|
619
791
|
role: "button",
|
|
@@ -635,12 +807,12 @@ function HomeScreen({ nav }) {
|
|
|
635
807
|
userSelect: "none"
|
|
636
808
|
},
|
|
637
809
|
children: [
|
|
638
|
-
/* @__PURE__ */ (0,
|
|
639
|
-
/* @__PURE__ */ (0,
|
|
810
|
+
/* @__PURE__ */ (0, import_jsx_runtime3.jsx)("span", { style: { fontSize: 28, marginBottom: 8 }, children: "\u{1F41B}" }),
|
|
811
|
+
/* @__PURE__ */ (0, import_jsx_runtime3.jsx)("span", { style: { fontSize: 14, fontWeight: 500, color: colors.textPrimary }, children: "Report Bug" })
|
|
640
812
|
]
|
|
641
813
|
}
|
|
642
814
|
),
|
|
643
|
-
/* @__PURE__ */ (0,
|
|
815
|
+
/* @__PURE__ */ (0, import_jsx_runtime3.jsxs)(
|
|
644
816
|
"div",
|
|
645
817
|
{
|
|
646
818
|
role: "button",
|
|
@@ -662,12 +834,12 @@ function HomeScreen({ nav }) {
|
|
|
662
834
|
userSelect: "none"
|
|
663
835
|
},
|
|
664
836
|
children: [
|
|
665
|
-
/* @__PURE__ */ (0,
|
|
666
|
-
/* @__PURE__ */ (0,
|
|
837
|
+
/* @__PURE__ */ (0, import_jsx_runtime3.jsx)("span", { style: { fontSize: 28, marginBottom: 8 }, children: "\u{1F4A1}" }),
|
|
838
|
+
/* @__PURE__ */ (0, import_jsx_runtime3.jsx)("span", { style: { fontSize: 14, fontWeight: 500, color: colors.textPrimary }, children: "Feedback" })
|
|
667
839
|
]
|
|
668
840
|
}
|
|
669
841
|
),
|
|
670
|
-
/* @__PURE__ */ (0,
|
|
842
|
+
/* @__PURE__ */ (0, import_jsx_runtime3.jsxs)(
|
|
671
843
|
"div",
|
|
672
844
|
{
|
|
673
845
|
role: "button",
|
|
@@ -689,9 +861,9 @@ function HomeScreen({ nav }) {
|
|
|
689
861
|
userSelect: "none"
|
|
690
862
|
},
|
|
691
863
|
children: [
|
|
692
|
-
/* @__PURE__ */ (0,
|
|
693
|
-
/* @__PURE__ */ (0,
|
|
694
|
-
unreadCount > 0 && /* @__PURE__ */ (0,
|
|
864
|
+
/* @__PURE__ */ (0, import_jsx_runtime3.jsx)("span", { style: { fontSize: 28, marginBottom: 8 }, children: "\u{1F4AC}" }),
|
|
865
|
+
/* @__PURE__ */ (0, import_jsx_runtime3.jsx)("span", { style: { fontSize: 14, fontWeight: 500, color: colors.textPrimary }, children: "Messages" }),
|
|
866
|
+
unreadCount > 0 && /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
|
|
695
867
|
"span",
|
|
696
868
|
{
|
|
697
869
|
style: {
|
|
@@ -720,8 +892,8 @@ function HomeScreen({ nav }) {
|
|
|
720
892
|
]
|
|
721
893
|
}
|
|
722
894
|
),
|
|
723
|
-
/* @__PURE__ */ (0,
|
|
724
|
-
/* @__PURE__ */ (0,
|
|
895
|
+
/* @__PURE__ */ (0, import_jsx_runtime3.jsxs)("div", { style: { display: "grid", gridTemplateColumns: "1fr 1fr 1fr", gap: 10, marginBottom: 20 }, children: [
|
|
896
|
+
/* @__PURE__ */ (0, import_jsx_runtime3.jsxs)(
|
|
725
897
|
"div",
|
|
726
898
|
{
|
|
727
899
|
role: "button",
|
|
@@ -743,12 +915,12 @@ function HomeScreen({ nav }) {
|
|
|
743
915
|
userSelect: "none"
|
|
744
916
|
},
|
|
745
917
|
children: [
|
|
746
|
-
/* @__PURE__ */ (0,
|
|
747
|
-
/* @__PURE__ */ (0,
|
|
918
|
+
/* @__PURE__ */ (0, import_jsx_runtime3.jsx)("span", { style: { fontSize: 22, fontWeight: 700, color: "#f97316" }, children: issueCounts.open }),
|
|
919
|
+
/* @__PURE__ */ (0, import_jsx_runtime3.jsx)("span", { style: { fontSize: 11, fontWeight: 600, color: "#a1a1aa", marginTop: 2 }, children: "Open" })
|
|
748
920
|
]
|
|
749
921
|
}
|
|
750
922
|
),
|
|
751
|
-
/* @__PURE__ */ (0,
|
|
923
|
+
/* @__PURE__ */ (0, import_jsx_runtime3.jsxs)(
|
|
752
924
|
"div",
|
|
753
925
|
{
|
|
754
926
|
role: "button",
|
|
@@ -770,12 +942,12 @@ function HomeScreen({ nav }) {
|
|
|
770
942
|
userSelect: "none"
|
|
771
943
|
},
|
|
772
944
|
children: [
|
|
773
|
-
/* @__PURE__ */ (0,
|
|
774
|
-
/* @__PURE__ */ (0,
|
|
945
|
+
/* @__PURE__ */ (0, import_jsx_runtime3.jsx)("span", { style: { fontSize: 22, fontWeight: 700, color: "#22c55e" }, children: issueCounts.done }),
|
|
946
|
+
/* @__PURE__ */ (0, import_jsx_runtime3.jsx)("span", { style: { fontSize: 11, fontWeight: 600, color: "#a1a1aa", marginTop: 2 }, children: "Done" })
|
|
775
947
|
]
|
|
776
948
|
}
|
|
777
949
|
),
|
|
778
|
-
/* @__PURE__ */ (0,
|
|
950
|
+
/* @__PURE__ */ (0, import_jsx_runtime3.jsxs)(
|
|
779
951
|
"div",
|
|
780
952
|
{
|
|
781
953
|
role: "button",
|
|
@@ -797,14 +969,14 @@ function HomeScreen({ nav }) {
|
|
|
797
969
|
userSelect: "none"
|
|
798
970
|
},
|
|
799
971
|
children: [
|
|
800
|
-
/* @__PURE__ */ (0,
|
|
801
|
-
/* @__PURE__ */ (0,
|
|
972
|
+
/* @__PURE__ */ (0, import_jsx_runtime3.jsx)("span", { style: { fontSize: 22, fontWeight: 700, color: "#ef4444" }, children: issueCounts.reopened }),
|
|
973
|
+
/* @__PURE__ */ (0, import_jsx_runtime3.jsx)("span", { style: { fontSize: 11, fontWeight: 600, color: "#a1a1aa", marginTop: 2 }, children: "Reopened" })
|
|
802
974
|
]
|
|
803
975
|
}
|
|
804
976
|
)
|
|
805
977
|
] }),
|
|
806
|
-
totalTests > 0 && /* @__PURE__ */ (0,
|
|
807
|
-
/* @__PURE__ */ (0,
|
|
978
|
+
totalTests > 0 && /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)("div", { style: { marginBottom: 16 }, children: [
|
|
979
|
+
/* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
|
|
808
980
|
"div",
|
|
809
981
|
{
|
|
810
982
|
style: {
|
|
@@ -814,7 +986,7 @@ function HomeScreen({ nav }) {
|
|
|
814
986
|
overflow: "hidden",
|
|
815
987
|
marginBottom: 6
|
|
816
988
|
},
|
|
817
|
-
children: /* @__PURE__ */ (0,
|
|
989
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
|
|
818
990
|
"div",
|
|
819
991
|
{
|
|
820
992
|
style: {
|
|
@@ -828,14 +1000,14 @@ function HomeScreen({ nav }) {
|
|
|
828
1000
|
)
|
|
829
1001
|
}
|
|
830
1002
|
),
|
|
831
|
-
/* @__PURE__ */ (0,
|
|
1003
|
+
/* @__PURE__ */ (0, import_jsx_runtime3.jsxs)("div", { style: { fontSize: 12, color: colors.textMuted, textAlign: "center" }, children: [
|
|
832
1004
|
completedCount,
|
|
833
1005
|
"/",
|
|
834
1006
|
totalTests,
|
|
835
1007
|
" tests completed"
|
|
836
1008
|
] })
|
|
837
1009
|
] }),
|
|
838
|
-
/* @__PURE__ */ (0,
|
|
1010
|
+
/* @__PURE__ */ (0, import_jsx_runtime3.jsx)("div", { style: { display: "flex", justifyContent: "center", padding: "8px 0" }, children: /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
|
|
839
1011
|
"button",
|
|
840
1012
|
{
|
|
841
1013
|
type: "button",
|
|
@@ -860,7 +1032,7 @@ function HomeScreen({ nav }) {
|
|
|
860
1032
|
|
|
861
1033
|
// src/widget/screens/TestDetailScreen.tsx
|
|
862
1034
|
var import_react4 = require("react");
|
|
863
|
-
var
|
|
1035
|
+
var import_jsx_runtime4 = require("react/jsx-runtime");
|
|
864
1036
|
function TestDetailScreen({ testId, nav }) {
|
|
865
1037
|
const { client, assignments, currentAssignment, refreshAssignments, onNavigate } = useBugBear();
|
|
866
1038
|
const displayedAssignment = testId ? assignments.find((a) => a.id === testId) || currentAssignment : currentAssignment;
|
|
@@ -948,7 +1120,7 @@ function TestDetailScreen({ testId, nav }) {
|
|
|
948
1120
|
}
|
|
949
1121
|
}, [client, displayedAssignment, selectedSkipReason, skipNotes, refreshAssignments, assignments, nav]);
|
|
950
1122
|
if (!displayedAssignment) {
|
|
951
|
-
return /* @__PURE__ */ (0,
|
|
1123
|
+
return /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)(
|
|
952
1124
|
"div",
|
|
953
1125
|
{
|
|
954
1126
|
style: {
|
|
@@ -959,10 +1131,10 @@ function TestDetailScreen({ testId, nav }) {
|
|
|
959
1131
|
padding: 40
|
|
960
1132
|
},
|
|
961
1133
|
children: [
|
|
962
|
-
/* @__PURE__ */ (0,
|
|
963
|
-
/* @__PURE__ */ (0,
|
|
964
|
-
/* @__PURE__ */ (0,
|
|
965
|
-
/* @__PURE__ */ (0,
|
|
1134
|
+
/* @__PURE__ */ (0, import_jsx_runtime4.jsx)("span", { style: { fontSize: 48, marginBottom: 12 }, children: "\u2705" }),
|
|
1135
|
+
/* @__PURE__ */ (0, import_jsx_runtime4.jsx)("span", { style: { fontSize: 18, fontWeight: 600, color: colors.textPrimary, marginBottom: 4 }, children: "No tests assigned" }),
|
|
1136
|
+
/* @__PURE__ */ (0, import_jsx_runtime4.jsx)("span", { style: { fontSize: 14, color: colors.textMuted, marginBottom: 20 }, children: "Check back later for new tests" }),
|
|
1137
|
+
/* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
|
|
966
1138
|
"button",
|
|
967
1139
|
{
|
|
968
1140
|
type: "button",
|
|
@@ -995,8 +1167,8 @@ function TestDetailScreen({ testId, nav }) {
|
|
|
995
1167
|
{ reason: "dependency", label: "\u{1F517} Needs another test first" },
|
|
996
1168
|
{ reason: "other", label: "\u{1F4DD} Other reason" }
|
|
997
1169
|
];
|
|
998
|
-
return /* @__PURE__ */ (0,
|
|
999
|
-
/* @__PURE__ */ (0,
|
|
1170
|
+
return /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)("div", { style: { paddingBottom: 16 }, children: [
|
|
1171
|
+
/* @__PURE__ */ (0, import_jsx_runtime4.jsxs)(
|
|
1000
1172
|
"div",
|
|
1001
1173
|
{
|
|
1002
1174
|
style: {
|
|
@@ -1006,14 +1178,14 @@ function TestDetailScreen({ testId, nav }) {
|
|
|
1006
1178
|
marginBottom: 12
|
|
1007
1179
|
},
|
|
1008
1180
|
children: [
|
|
1009
|
-
/* @__PURE__ */ (0,
|
|
1010
|
-
/* @__PURE__ */ (0,
|
|
1181
|
+
/* @__PURE__ */ (0, import_jsx_runtime4.jsxs)("div", { style: { display: "flex", alignItems: "center", gap: 8 }, children: [
|
|
1182
|
+
/* @__PURE__ */ (0, import_jsx_runtime4.jsxs)("span", { style: { fontSize: 13, color: colors.textMuted }, children: [
|
|
1011
1183
|
"Test ",
|
|
1012
1184
|
currentIndex + 1,
|
|
1013
1185
|
" of ",
|
|
1014
1186
|
allTests.length
|
|
1015
1187
|
] }),
|
|
1016
|
-
displayedAssignment.status === "in_progress" && assignmentElapsedTime > 0 && /* @__PURE__ */ (0,
|
|
1188
|
+
displayedAssignment.status === "in_progress" && assignmentElapsedTime > 0 && /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
|
|
1017
1189
|
"span",
|
|
1018
1190
|
{
|
|
1019
1191
|
style: {
|
|
@@ -1032,7 +1204,7 @@ function TestDetailScreen({ testId, nav }) {
|
|
|
1032
1204
|
}
|
|
1033
1205
|
)
|
|
1034
1206
|
] }),
|
|
1035
|
-
/* @__PURE__ */ (0,
|
|
1207
|
+
/* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
|
|
1036
1208
|
"button",
|
|
1037
1209
|
{
|
|
1038
1210
|
type: "button",
|
|
@@ -1052,7 +1224,7 @@ function TestDetailScreen({ testId, nav }) {
|
|
|
1052
1224
|
]
|
|
1053
1225
|
}
|
|
1054
1226
|
),
|
|
1055
|
-
displayedAssignment.isVerification && /* @__PURE__ */ (0,
|
|
1227
|
+
displayedAssignment.isVerification && /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)(
|
|
1056
1228
|
"div",
|
|
1057
1229
|
{
|
|
1058
1230
|
style: {
|
|
@@ -1066,14 +1238,14 @@ function TestDetailScreen({ testId, nav }) {
|
|
|
1066
1238
|
marginBottom: 10
|
|
1067
1239
|
},
|
|
1068
1240
|
children: [
|
|
1069
|
-
/* @__PURE__ */ (0,
|
|
1070
|
-
/* @__PURE__ */ (0,
|
|
1071
|
-
/* @__PURE__ */ (0,
|
|
1241
|
+
/* @__PURE__ */ (0, import_jsx_runtime4.jsx)("span", { style: { fontSize: 14 }, children: "\u{1F504}" }),
|
|
1242
|
+
/* @__PURE__ */ (0, import_jsx_runtime4.jsx)("span", { style: { fontSize: 13, fontWeight: 600, color: "#fbbf24" }, children: "Retest" }),
|
|
1243
|
+
/* @__PURE__ */ (0, import_jsx_runtime4.jsx)("span", { style: { fontSize: 12, color: "#d97706" }, children: "\u2014 Verify bug fix" })
|
|
1072
1244
|
]
|
|
1073
1245
|
}
|
|
1074
1246
|
),
|
|
1075
|
-
/* @__PURE__ */ (0,
|
|
1076
|
-
testCase.testKey && /* @__PURE__ */ (0,
|
|
1247
|
+
/* @__PURE__ */ (0, import_jsx_runtime4.jsx)("div", { style: { fontSize: 20, fontWeight: 700, color: colors.textPrimary, marginBottom: 4 }, children: testCase.title }),
|
|
1248
|
+
testCase.testKey && /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
|
|
1077
1249
|
"div",
|
|
1078
1250
|
{
|
|
1079
1251
|
style: {
|
|
@@ -1085,7 +1257,7 @@ function TestDetailScreen({ testId, nav }) {
|
|
|
1085
1257
|
children: testCase.testKey
|
|
1086
1258
|
}
|
|
1087
1259
|
),
|
|
1088
|
-
/* @__PURE__ */ (0,
|
|
1260
|
+
/* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
|
|
1089
1261
|
"button",
|
|
1090
1262
|
{
|
|
1091
1263
|
type: "button",
|
|
@@ -1101,7 +1273,7 @@ function TestDetailScreen({ testId, nav }) {
|
|
|
1101
1273
|
cursor: "pointer",
|
|
1102
1274
|
textAlign: "left"
|
|
1103
1275
|
},
|
|
1104
|
-
children: /* @__PURE__ */ (0,
|
|
1276
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)("span", { style: { fontSize: 14, fontWeight: 500, color: colors.textSecondary }, children: [
|
|
1105
1277
|
showSteps ? "\u25BC" : "\u25B6",
|
|
1106
1278
|
" ",
|
|
1107
1279
|
info.icon,
|
|
@@ -1110,9 +1282,9 @@ function TestDetailScreen({ testId, nav }) {
|
|
|
1110
1282
|
] })
|
|
1111
1283
|
}
|
|
1112
1284
|
),
|
|
1113
|
-
showSteps && /* @__PURE__ */ (0,
|
|
1114
|
-
template === "steps" && steps.map((step, idx) => /* @__PURE__ */ (0,
|
|
1115
|
-
/* @__PURE__ */ (0,
|
|
1285
|
+
showSteps && /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)("div", { style: { marginBottom: 16 }, children: [
|
|
1286
|
+
template === "steps" && steps.map((step, idx) => /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)("div", { style: { display: "flex", marginBottom: 10 }, children: [
|
|
1287
|
+
/* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
|
|
1116
1288
|
"div",
|
|
1117
1289
|
{
|
|
1118
1290
|
style: {
|
|
@@ -1127,12 +1299,12 @@ function TestDetailScreen({ testId, nav }) {
|
|
|
1127
1299
|
marginTop: 2,
|
|
1128
1300
|
flexShrink: 0
|
|
1129
1301
|
},
|
|
1130
|
-
children: /* @__PURE__ */ (0,
|
|
1302
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("span", { style: { fontSize: 12, fontWeight: 600, color: "#fff" }, children: step.stepNumber })
|
|
1131
1303
|
}
|
|
1132
1304
|
),
|
|
1133
|
-
/* @__PURE__ */ (0,
|
|
1134
|
-
/* @__PURE__ */ (0,
|
|
1135
|
-
step.expectedResult && /* @__PURE__ */ (0,
|
|
1305
|
+
/* @__PURE__ */ (0, import_jsx_runtime4.jsxs)("div", { style: { flex: 1 }, children: [
|
|
1306
|
+
/* @__PURE__ */ (0, import_jsx_runtime4.jsx)("span", { style: { fontSize: 14, color: colors.textPrimary, lineHeight: "20px" }, children: step.action }),
|
|
1307
|
+
step.expectedResult && /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)(
|
|
1136
1308
|
"div",
|
|
1137
1309
|
{
|
|
1138
1310
|
style: {
|
|
@@ -1149,8 +1321,8 @@ function TestDetailScreen({ testId, nav }) {
|
|
|
1149
1321
|
)
|
|
1150
1322
|
] })
|
|
1151
1323
|
] }, idx)),
|
|
1152
|
-
template === "checklist" && /* @__PURE__ */ (0,
|
|
1153
|
-
steps.map((step, idx) => /* @__PURE__ */ (0,
|
|
1324
|
+
template === "checklist" && /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)(import_jsx_runtime4.Fragment, { children: [
|
|
1325
|
+
steps.map((step, idx) => /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)(
|
|
1154
1326
|
"button",
|
|
1155
1327
|
{
|
|
1156
1328
|
type: "button",
|
|
@@ -1176,7 +1348,7 @@ function TestDetailScreen({ testId, nav }) {
|
|
|
1176
1348
|
textAlign: "left"
|
|
1177
1349
|
},
|
|
1178
1350
|
children: [
|
|
1179
|
-
/* @__PURE__ */ (0,
|
|
1351
|
+
/* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
|
|
1180
1352
|
"div",
|
|
1181
1353
|
{
|
|
1182
1354
|
style: {
|
|
@@ -1191,10 +1363,10 @@ function TestDetailScreen({ testId, nav }) {
|
|
|
1191
1363
|
alignItems: "center",
|
|
1192
1364
|
flexShrink: 0
|
|
1193
1365
|
},
|
|
1194
|
-
children: criteriaResults[idx] === true && /* @__PURE__ */ (0,
|
|
1366
|
+
children: criteriaResults[idx] === true && /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("span", { style: { color: "#fff", fontSize: 14, fontWeight: "bold" }, children: "\u2713" })
|
|
1195
1367
|
}
|
|
1196
1368
|
),
|
|
1197
|
-
/* @__PURE__ */ (0,
|
|
1369
|
+
/* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
|
|
1198
1370
|
"span",
|
|
1199
1371
|
{
|
|
1200
1372
|
style: {
|
|
@@ -1210,7 +1382,7 @@ function TestDetailScreen({ testId, nav }) {
|
|
|
1210
1382
|
},
|
|
1211
1383
|
idx
|
|
1212
1384
|
)),
|
|
1213
|
-
Object.keys(criteriaResults).length > 0 && /* @__PURE__ */ (0,
|
|
1385
|
+
Object.keys(criteriaResults).length > 0 && /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("div", { style: { display: "flex", justifyContent: "flex-end", paddingTop: 4 }, children: /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
|
|
1214
1386
|
"button",
|
|
1215
1387
|
{
|
|
1216
1388
|
type: "button",
|
|
@@ -1227,8 +1399,8 @@ function TestDetailScreen({ testId, nav }) {
|
|
|
1227
1399
|
}
|
|
1228
1400
|
) })
|
|
1229
1401
|
] }),
|
|
1230
|
-
template === "rubric" && steps.map((step, idx) => /* @__PURE__ */ (0,
|
|
1231
|
-
/* @__PURE__ */ (0,
|
|
1402
|
+
template === "rubric" && steps.map((step, idx) => /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)("div", { style: { marginBottom: 14 }, children: [
|
|
1403
|
+
/* @__PURE__ */ (0, import_jsx_runtime4.jsxs)(
|
|
1232
1404
|
"div",
|
|
1233
1405
|
{
|
|
1234
1406
|
style: {
|
|
@@ -1244,7 +1416,7 @@ function TestDetailScreen({ testId, nav }) {
|
|
|
1244
1416
|
]
|
|
1245
1417
|
}
|
|
1246
1418
|
),
|
|
1247
|
-
step.expectedResult && /* @__PURE__ */ (0,
|
|
1419
|
+
step.expectedResult && /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
|
|
1248
1420
|
"div",
|
|
1249
1421
|
{
|
|
1250
1422
|
style: {
|
|
@@ -1256,8 +1428,8 @@ function TestDetailScreen({ testId, nav }) {
|
|
|
1256
1428
|
children: step.expectedResult
|
|
1257
1429
|
}
|
|
1258
1430
|
),
|
|
1259
|
-
rubricMode === "pass_fail" ? /* @__PURE__ */ (0,
|
|
1260
|
-
/* @__PURE__ */ (0,
|
|
1431
|
+
rubricMode === "pass_fail" ? /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)("div", { style: { display: "flex", gap: 8, marginLeft: 16 }, children: [
|
|
1432
|
+
/* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
|
|
1261
1433
|
"button",
|
|
1262
1434
|
{
|
|
1263
1435
|
type: "button",
|
|
@@ -1278,7 +1450,7 @@ function TestDetailScreen({ testId, nav }) {
|
|
|
1278
1450
|
children: "\u2713 Pass"
|
|
1279
1451
|
}
|
|
1280
1452
|
),
|
|
1281
|
-
/* @__PURE__ */ (0,
|
|
1453
|
+
/* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
|
|
1282
1454
|
"button",
|
|
1283
1455
|
{
|
|
1284
1456
|
type: "button",
|
|
@@ -1299,7 +1471,7 @@ function TestDetailScreen({ testId, nav }) {
|
|
|
1299
1471
|
children: "\u2717 Fail"
|
|
1300
1472
|
}
|
|
1301
1473
|
)
|
|
1302
|
-
] }) : /* @__PURE__ */ (0,
|
|
1474
|
+
] }) : /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("div", { style: { display: "flex", gap: 6, marginLeft: 16 }, children: [1, 2, 3, 4, 5].map((n) => /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
|
|
1303
1475
|
"button",
|
|
1304
1476
|
{
|
|
1305
1477
|
type: "button",
|
|
@@ -1323,7 +1495,7 @@ function TestDetailScreen({ testId, nav }) {
|
|
|
1323
1495
|
n
|
|
1324
1496
|
)) })
|
|
1325
1497
|
] }, idx)),
|
|
1326
|
-
template === "freeform" && /* @__PURE__ */ (0,
|
|
1498
|
+
template === "freeform" && /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)(
|
|
1327
1499
|
"div",
|
|
1328
1500
|
{
|
|
1329
1501
|
style: {
|
|
@@ -1333,15 +1505,15 @@ function TestDetailScreen({ testId, nav }) {
|
|
|
1333
1505
|
border: "1px solid #854d0e"
|
|
1334
1506
|
},
|
|
1335
1507
|
children: [
|
|
1336
|
-
/* @__PURE__ */ (0,
|
|
1337
|
-
/* @__PURE__ */ (0,
|
|
1338
|
-
/* @__PURE__ */ (0,
|
|
1339
|
-
/* @__PURE__ */ (0,
|
|
1508
|
+
/* @__PURE__ */ (0, import_jsx_runtime4.jsx)("div", { style: { fontSize: 14, color: "#fde68a", marginBottom: 6 }, children: "Review the area and note:" }),
|
|
1509
|
+
/* @__PURE__ */ (0, import_jsx_runtime4.jsx)("div", { style: { fontSize: 13, color: "#fde68a", marginLeft: 8, marginBottom: 2 }, children: "\u2022 What works well" }),
|
|
1510
|
+
/* @__PURE__ */ (0, import_jsx_runtime4.jsx)("div", { style: { fontSize: 13, color: "#fde68a", marginLeft: 8, marginBottom: 2 }, children: "\u2022 Issues or concerns" }),
|
|
1511
|
+
/* @__PURE__ */ (0, import_jsx_runtime4.jsx)("div", { style: { fontSize: 13, color: "#fde68a", marginLeft: 8, marginBottom: 2 }, children: "\u2022 Suggestions" })
|
|
1340
1512
|
]
|
|
1341
1513
|
}
|
|
1342
1514
|
)
|
|
1343
1515
|
] }),
|
|
1344
|
-
testCase.expectedResult && /* @__PURE__ */ (0,
|
|
1516
|
+
testCase.expectedResult && /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)(
|
|
1345
1517
|
"div",
|
|
1346
1518
|
{
|
|
1347
1519
|
style: {
|
|
@@ -1352,12 +1524,12 @@ function TestDetailScreen({ testId, nav }) {
|
|
|
1352
1524
|
marginBottom: 12
|
|
1353
1525
|
},
|
|
1354
1526
|
children: [
|
|
1355
|
-
/* @__PURE__ */ (0,
|
|
1356
|
-
/* @__PURE__ */ (0,
|
|
1527
|
+
/* @__PURE__ */ (0, import_jsx_runtime4.jsx)("div", { style: { fontSize: 13, fontWeight: 600, color: colors.green, marginBottom: 4 }, children: "\u2705 Expected Result" }),
|
|
1528
|
+
/* @__PURE__ */ (0, import_jsx_runtime4.jsx)("div", { style: { fontSize: 14, color: "#bbf7d0", lineHeight: "20px" }, children: testCase.expectedResult })
|
|
1357
1529
|
]
|
|
1358
1530
|
}
|
|
1359
1531
|
),
|
|
1360
|
-
testCase.targetRoute && onNavigate && /* @__PURE__ */ (0,
|
|
1532
|
+
testCase.targetRoute && onNavigate && /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
|
|
1361
1533
|
"button",
|
|
1362
1534
|
{
|
|
1363
1535
|
type: "button",
|
|
@@ -1379,7 +1551,7 @@ function TestDetailScreen({ testId, nav }) {
|
|
|
1379
1551
|
children: "\u{1F9ED} Go to test location"
|
|
1380
1552
|
}
|
|
1381
1553
|
),
|
|
1382
|
-
/* @__PURE__ */ (0,
|
|
1554
|
+
/* @__PURE__ */ (0, import_jsx_runtime4.jsxs)(
|
|
1383
1555
|
"button",
|
|
1384
1556
|
{
|
|
1385
1557
|
type: "button",
|
|
@@ -1403,7 +1575,7 @@ function TestDetailScreen({ testId, nav }) {
|
|
|
1403
1575
|
]
|
|
1404
1576
|
}
|
|
1405
1577
|
),
|
|
1406
|
-
showDetails && /* @__PURE__ */ (0,
|
|
1578
|
+
showDetails && /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)(
|
|
1407
1579
|
"div",
|
|
1408
1580
|
{
|
|
1409
1581
|
style: {
|
|
@@ -1414,7 +1586,7 @@ function TestDetailScreen({ testId, nav }) {
|
|
|
1414
1586
|
marginBottom: 16
|
|
1415
1587
|
},
|
|
1416
1588
|
children: [
|
|
1417
|
-
testCase.testKey && /* @__PURE__ */ (0,
|
|
1589
|
+
testCase.testKey && /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)(
|
|
1418
1590
|
"div",
|
|
1419
1591
|
{
|
|
1420
1592
|
style: {
|
|
@@ -1432,16 +1604,16 @@ function TestDetailScreen({ testId, nav }) {
|
|
|
1432
1604
|
]
|
|
1433
1605
|
}
|
|
1434
1606
|
),
|
|
1435
|
-
testCase.description && /* @__PURE__ */ (0,
|
|
1436
|
-
testCase.group && /* @__PURE__ */ (0,
|
|
1607
|
+
testCase.description && /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("div", { style: { fontSize: 13, color: colors.textSecondary, lineHeight: "18px" }, children: testCase.description }),
|
|
1608
|
+
testCase.group && /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("div", { style: { marginTop: 8 }, children: /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)("span", { style: { fontSize: 12, color: colors.textMuted }, children: [
|
|
1437
1609
|
"\u{1F4C1} ",
|
|
1438
1610
|
testCase.group.name
|
|
1439
1611
|
] }) })
|
|
1440
1612
|
]
|
|
1441
1613
|
}
|
|
1442
1614
|
),
|
|
1443
|
-
/* @__PURE__ */ (0,
|
|
1444
|
-
/* @__PURE__ */ (0,
|
|
1615
|
+
/* @__PURE__ */ (0, import_jsx_runtime4.jsxs)("div", { style: { display: "flex", gap: 10, marginTop: 8 }, children: [
|
|
1616
|
+
/* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
|
|
1445
1617
|
"button",
|
|
1446
1618
|
{
|
|
1447
1619
|
type: "button",
|
|
@@ -1464,7 +1636,7 @@ function TestDetailScreen({ testId, nav }) {
|
|
|
1464
1636
|
children: isSubmitting ? "Failing..." : "Fail"
|
|
1465
1637
|
}
|
|
1466
1638
|
),
|
|
1467
|
-
/* @__PURE__ */ (0,
|
|
1639
|
+
/* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
|
|
1468
1640
|
"button",
|
|
1469
1641
|
{
|
|
1470
1642
|
type: "button",
|
|
@@ -1487,7 +1659,7 @@ function TestDetailScreen({ testId, nav }) {
|
|
|
1487
1659
|
children: "Skip"
|
|
1488
1660
|
}
|
|
1489
1661
|
),
|
|
1490
|
-
/* @__PURE__ */ (0,
|
|
1662
|
+
/* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
|
|
1491
1663
|
"button",
|
|
1492
1664
|
{
|
|
1493
1665
|
type: "button",
|
|
@@ -1511,7 +1683,7 @@ function TestDetailScreen({ testId, nav }) {
|
|
|
1511
1683
|
}
|
|
1512
1684
|
)
|
|
1513
1685
|
] }),
|
|
1514
|
-
showSkipModal && /* @__PURE__ */ (0,
|
|
1686
|
+
showSkipModal && /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
|
|
1515
1687
|
"div",
|
|
1516
1688
|
{
|
|
1517
1689
|
style: {
|
|
@@ -1524,7 +1696,7 @@ function TestDetailScreen({ testId, nav }) {
|
|
|
1524
1696
|
zIndex: 9999,
|
|
1525
1697
|
padding: 24
|
|
1526
1698
|
},
|
|
1527
|
-
children: /* @__PURE__ */ (0,
|
|
1699
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)(
|
|
1528
1700
|
"div",
|
|
1529
1701
|
{
|
|
1530
1702
|
style: {
|
|
@@ -1536,7 +1708,7 @@ function TestDetailScreen({ testId, nav }) {
|
|
|
1536
1708
|
width: "100%"
|
|
1537
1709
|
},
|
|
1538
1710
|
children: [
|
|
1539
|
-
/* @__PURE__ */ (0,
|
|
1711
|
+
/* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
|
|
1540
1712
|
"div",
|
|
1541
1713
|
{
|
|
1542
1714
|
style: {
|
|
@@ -1548,8 +1720,8 @@ function TestDetailScreen({ testId, nav }) {
|
|
|
1548
1720
|
children: "Skip this test?"
|
|
1549
1721
|
}
|
|
1550
1722
|
),
|
|
1551
|
-
/* @__PURE__ */ (0,
|
|
1552
|
-
skipReasons.map(({ reason, label }) => /* @__PURE__ */ (0,
|
|
1723
|
+
/* @__PURE__ */ (0, import_jsx_runtime4.jsx)("div", { style: { fontSize: 14, color: colors.textMuted, marginBottom: 12 }, children: "Select a reason:" }),
|
|
1724
|
+
skipReasons.map(({ reason, label }) => /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
|
|
1553
1725
|
"button",
|
|
1554
1726
|
{
|
|
1555
1727
|
type: "button",
|
|
@@ -1575,7 +1747,7 @@ function TestDetailScreen({ testId, nav }) {
|
|
|
1575
1747
|
},
|
|
1576
1748
|
reason
|
|
1577
1749
|
)),
|
|
1578
|
-
/* @__PURE__ */ (0,
|
|
1750
|
+
/* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
|
|
1579
1751
|
"textarea",
|
|
1580
1752
|
{
|
|
1581
1753
|
value: skipNotes,
|
|
@@ -1598,8 +1770,8 @@ function TestDetailScreen({ testId, nav }) {
|
|
|
1598
1770
|
}
|
|
1599
1771
|
}
|
|
1600
1772
|
),
|
|
1601
|
-
/* @__PURE__ */ (0,
|
|
1602
|
-
/* @__PURE__ */ (0,
|
|
1773
|
+
/* @__PURE__ */ (0, import_jsx_runtime4.jsxs)("div", { style: { display: "flex", gap: 10, marginTop: 14 }, children: [
|
|
1774
|
+
/* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
|
|
1603
1775
|
"button",
|
|
1604
1776
|
{
|
|
1605
1777
|
type: "button",
|
|
@@ -1623,7 +1795,7 @@ function TestDetailScreen({ testId, nav }) {
|
|
|
1623
1795
|
children: "Cancel"
|
|
1624
1796
|
}
|
|
1625
1797
|
),
|
|
1626
|
-
/* @__PURE__ */ (0,
|
|
1798
|
+
/* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
|
|
1627
1799
|
"button",
|
|
1628
1800
|
{
|
|
1629
1801
|
type: "button",
|
|
@@ -1657,11 +1829,14 @@ function TestDetailScreen({ testId, nav }) {
|
|
|
1657
1829
|
|
|
1658
1830
|
// src/widget/screens/TestListScreen.tsx
|
|
1659
1831
|
var import_react5 = require("react");
|
|
1660
|
-
var
|
|
1832
|
+
var import_jsx_runtime5 = require("react/jsx-runtime");
|
|
1661
1833
|
function TestListScreen({ nav }) {
|
|
1662
|
-
const { assignments, currentAssignment, refreshAssignments } = useBugBear();
|
|
1834
|
+
const { assignments, currentAssignment, refreshAssignments, isLoading } = useBugBear();
|
|
1663
1835
|
const [filter, setFilter] = (0, import_react5.useState)("all");
|
|
1664
1836
|
const [roleFilter, setRoleFilter] = (0, import_react5.useState)(null);
|
|
1837
|
+
const [trackFilter, setTrackFilter] = (0, import_react5.useState)(null);
|
|
1838
|
+
const [searchQuery, setSearchQuery] = (0, import_react5.useState)("");
|
|
1839
|
+
const [sortMode, setSortMode] = (0, import_react5.useState)("priority");
|
|
1665
1840
|
const [collapsedFolders, setCollapsedFolders] = (0, import_react5.useState)(/* @__PURE__ */ new Set());
|
|
1666
1841
|
const availableRoles = (0, import_react5.useMemo)(() => {
|
|
1667
1842
|
const roleMap = /* @__PURE__ */ new Map();
|
|
@@ -1670,6 +1845,13 @@ function TestListScreen({ nav }) {
|
|
|
1670
1845
|
}
|
|
1671
1846
|
return Array.from(roleMap.values());
|
|
1672
1847
|
}, [assignments]);
|
|
1848
|
+
const availableTracks = (0, import_react5.useMemo)(() => {
|
|
1849
|
+
const trackMap = /* @__PURE__ */ new Map();
|
|
1850
|
+
for (const a of assignments) {
|
|
1851
|
+
if (a.testCase.track) trackMap.set(a.testCase.track.id, a.testCase.track);
|
|
1852
|
+
}
|
|
1853
|
+
return Array.from(trackMap.values());
|
|
1854
|
+
}, [assignments]);
|
|
1673
1855
|
const selectedRole = availableRoles.find((r) => r.id === roleFilter);
|
|
1674
1856
|
const groupedAssignments = (0, import_react5.useMemo)(() => {
|
|
1675
1857
|
const groups = /* @__PURE__ */ new Map();
|
|
@@ -1703,6 +1885,12 @@ function TestListScreen({ nav }) {
|
|
|
1703
1885
|
folder.assignments.sort((a, b) => {
|
|
1704
1886
|
if (a.isVerification && !b.isVerification) return -1;
|
|
1705
1887
|
if (!a.isVerification && b.isVerification) return 1;
|
|
1888
|
+
if (sortMode === "alpha") {
|
|
1889
|
+
return a.testCase.title.localeCompare(b.testCase.title);
|
|
1890
|
+
}
|
|
1891
|
+
if (sortMode === "recent") {
|
|
1892
|
+
return 0;
|
|
1893
|
+
}
|
|
1706
1894
|
const sd = (statusOrder[a.status] ?? 5) - (statusOrder[b.status] ?? 5);
|
|
1707
1895
|
if (sd !== 0) return sd;
|
|
1708
1896
|
return (priorityOrder[a.testCase.priority] ?? 4) - (priorityOrder[b.testCase.priority] ?? 4);
|
|
@@ -1714,7 +1902,7 @@ function TestListScreen({ nav }) {
|
|
|
1714
1902
|
if (!b.group) return -1;
|
|
1715
1903
|
return a.group.sortOrder - b.group.sortOrder;
|
|
1716
1904
|
});
|
|
1717
|
-
}, [assignments]);
|
|
1905
|
+
}, [assignments, sortMode]);
|
|
1718
1906
|
const toggleFolder = (0, import_react5.useCallback)((id) => {
|
|
1719
1907
|
setCollapsedFolders((prev) => {
|
|
1720
1908
|
const next = new Set(prev);
|
|
@@ -1723,13 +1911,20 @@ function TestListScreen({ nav }) {
|
|
|
1723
1911
|
return next;
|
|
1724
1912
|
});
|
|
1725
1913
|
}, []);
|
|
1726
|
-
const filterAssignment = (a) => {
|
|
1914
|
+
const filterAssignment = (0, import_react5.useCallback)((a) => {
|
|
1727
1915
|
if (roleFilter && a.testCase.role?.id !== roleFilter) return false;
|
|
1916
|
+
if (trackFilter && a.testCase.track?.id !== trackFilter) return false;
|
|
1917
|
+
if (searchQuery) {
|
|
1918
|
+
const q = searchQuery.toLowerCase();
|
|
1919
|
+
const titleMatch = a.testCase.title.toLowerCase().includes(q);
|
|
1920
|
+
const keyMatch = a.testCase.testKey.toLowerCase().includes(q);
|
|
1921
|
+
if (!titleMatch && !keyMatch) return false;
|
|
1922
|
+
}
|
|
1728
1923
|
if (filter === "pending") return a.status === "pending" || a.status === "in_progress";
|
|
1729
1924
|
if (filter === "done") return a.status === "passed";
|
|
1730
1925
|
if (filter === "reopened") return a.status === "failed";
|
|
1731
1926
|
return true;
|
|
1732
|
-
};
|
|
1927
|
+
}, [roleFilter, trackFilter, searchQuery, filter]);
|
|
1733
1928
|
const pendingCount = assignments.filter(
|
|
1734
1929
|
(a) => a.status === "pending" || a.status === "in_progress"
|
|
1735
1930
|
).length;
|
|
@@ -1741,8 +1936,9 @@ function TestListScreen({ nav }) {
|
|
|
1741
1936
|
{ key: "done", label: "Done", count: doneCount },
|
|
1742
1937
|
{ key: "reopened", label: "Re Opened", count: reopenedCount }
|
|
1743
1938
|
];
|
|
1744
|
-
return /* @__PURE__ */ (0,
|
|
1745
|
-
|
|
1939
|
+
if (isLoading) return /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(TestListScreenSkeleton, {});
|
|
1940
|
+
return /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("div", { children: [
|
|
1941
|
+
/* @__PURE__ */ (0, import_jsx_runtime5.jsx)("div", { style: { display: "flex", gap: 8, marginBottom: availableRoles.length >= 2 ? 8 : 16 }, children: filters.map((f) => /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)(
|
|
1746
1942
|
"button",
|
|
1747
1943
|
{
|
|
1748
1944
|
type: "button",
|
|
@@ -1769,9 +1965,9 @@ function TestListScreen({ nav }) {
|
|
|
1769
1965
|
},
|
|
1770
1966
|
f.key
|
|
1771
1967
|
)) }),
|
|
1772
|
-
availableRoles.length >= 2 && /* @__PURE__ */ (0,
|
|
1773
|
-
/* @__PURE__ */ (0,
|
|
1774
|
-
/* @__PURE__ */ (0,
|
|
1968
|
+
availableRoles.length >= 2 && /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("div", { style: { marginBottom: 12 }, children: [
|
|
1969
|
+
/* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("div", { style: { display: "flex", gap: 6, flexWrap: "wrap", marginBottom: selectedRole?.loginHint ? 8 : 0 }, children: [
|
|
1970
|
+
/* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
|
|
1775
1971
|
"button",
|
|
1776
1972
|
{
|
|
1777
1973
|
type: "button",
|
|
@@ -1794,7 +1990,7 @@ function TestListScreen({ nav }) {
|
|
|
1794
1990
|
),
|
|
1795
1991
|
availableRoles.map((role) => {
|
|
1796
1992
|
const isActive = roleFilter === role.id;
|
|
1797
|
-
return /* @__PURE__ */ (0,
|
|
1993
|
+
return /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)(
|
|
1798
1994
|
"button",
|
|
1799
1995
|
{
|
|
1800
1996
|
type: "button",
|
|
@@ -1816,7 +2012,7 @@ function TestListScreen({ nav }) {
|
|
|
1816
2012
|
fontWeight: isActive ? 600 : 400
|
|
1817
2013
|
},
|
|
1818
2014
|
children: [
|
|
1819
|
-
/* @__PURE__ */ (0,
|
|
2015
|
+
/* @__PURE__ */ (0, import_jsx_runtime5.jsx)("span", { style: {
|
|
1820
2016
|
width: 6,
|
|
1821
2017
|
height: 6,
|
|
1822
2018
|
borderRadius: 3,
|
|
@@ -1830,7 +2026,7 @@ function TestListScreen({ nav }) {
|
|
|
1830
2026
|
);
|
|
1831
2027
|
})
|
|
1832
2028
|
] }),
|
|
1833
|
-
selectedRole?.loginHint && /* @__PURE__ */ (0,
|
|
2029
|
+
selectedRole?.loginHint && /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("div", { style: {
|
|
1834
2030
|
fontSize: 11,
|
|
1835
2031
|
color: colors.textSecondary,
|
|
1836
2032
|
backgroundColor: selectedRole.color + "10",
|
|
@@ -1842,6 +2038,103 @@ function TestListScreen({ nav }) {
|
|
|
1842
2038
|
selectedRole.loginHint
|
|
1843
2039
|
] })
|
|
1844
2040
|
] }),
|
|
2041
|
+
/* @__PURE__ */ (0, import_jsx_runtime5.jsx)("div", { style: { marginBottom: 8 }, children: /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
|
|
2042
|
+
"input",
|
|
2043
|
+
{
|
|
2044
|
+
type: "text",
|
|
2045
|
+
value: searchQuery,
|
|
2046
|
+
onChange: (e) => setSearchQuery(e.target.value),
|
|
2047
|
+
placeholder: "Search tests...",
|
|
2048
|
+
style: {
|
|
2049
|
+
width: "100%",
|
|
2050
|
+
padding: "8px 12px",
|
|
2051
|
+
borderRadius: 8,
|
|
2052
|
+
border: `1px solid ${colors.border}`,
|
|
2053
|
+
backgroundColor: colors.card,
|
|
2054
|
+
color: colors.textPrimary,
|
|
2055
|
+
fontSize: 13,
|
|
2056
|
+
outline: "none",
|
|
2057
|
+
boxSizing: "border-box"
|
|
2058
|
+
}
|
|
2059
|
+
}
|
|
2060
|
+
) }),
|
|
2061
|
+
(availableTracks.length >= 2 || true) && /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("div", { style: { display: "flex", alignItems: "center", gap: 6, marginBottom: 12 }, children: [
|
|
2062
|
+
availableTracks.length >= 2 && /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("div", { style: { display: "flex", gap: 4, flex: 1, overflow: "auto" }, children: [
|
|
2063
|
+
/* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
|
|
2064
|
+
"button",
|
|
2065
|
+
{
|
|
2066
|
+
type: "button",
|
|
2067
|
+
onClick: () => setTrackFilter(null),
|
|
2068
|
+
style: {
|
|
2069
|
+
padding: "3px 8px",
|
|
2070
|
+
borderRadius: 6,
|
|
2071
|
+
backgroundColor: !trackFilter ? colors.card : "transparent",
|
|
2072
|
+
border: !trackFilter ? `1px solid ${colors.border}` : "1px solid transparent",
|
|
2073
|
+
cursor: "pointer",
|
|
2074
|
+
fontSize: 11,
|
|
2075
|
+
color: !trackFilter ? colors.textPrimary : colors.textMuted,
|
|
2076
|
+
fontWeight: !trackFilter ? 600 : 400,
|
|
2077
|
+
whiteSpace: "nowrap"
|
|
2078
|
+
},
|
|
2079
|
+
children: "All Tracks"
|
|
2080
|
+
}
|
|
2081
|
+
),
|
|
2082
|
+
availableTracks.map((track) => {
|
|
2083
|
+
const isActive = trackFilter === track.id;
|
|
2084
|
+
return /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)(
|
|
2085
|
+
"button",
|
|
2086
|
+
{
|
|
2087
|
+
type: "button",
|
|
2088
|
+
onClick: () => setTrackFilter(isActive ? null : track.id),
|
|
2089
|
+
style: {
|
|
2090
|
+
display: "flex",
|
|
2091
|
+
alignItems: "center",
|
|
2092
|
+
gap: 4,
|
|
2093
|
+
padding: "3px 8px",
|
|
2094
|
+
borderRadius: 6,
|
|
2095
|
+
backgroundColor: isActive ? track.color + "20" : "transparent",
|
|
2096
|
+
border: isActive ? `1px solid ${track.color}60` : "1px solid transparent",
|
|
2097
|
+
cursor: "pointer",
|
|
2098
|
+
fontSize: 11,
|
|
2099
|
+
color: isActive ? track.color : colors.textMuted,
|
|
2100
|
+
fontWeight: isActive ? 600 : 400,
|
|
2101
|
+
whiteSpace: "nowrap"
|
|
2102
|
+
},
|
|
2103
|
+
children: [
|
|
2104
|
+
track.icon,
|
|
2105
|
+
" ",
|
|
2106
|
+
track.name
|
|
2107
|
+
]
|
|
2108
|
+
},
|
|
2109
|
+
track.id
|
|
2110
|
+
);
|
|
2111
|
+
})
|
|
2112
|
+
] }),
|
|
2113
|
+
/* @__PURE__ */ (0, import_jsx_runtime5.jsx)("div", { style: { display: "flex", gap: 2, marginLeft: "auto", flexShrink: 0 }, children: [
|
|
2114
|
+
{ key: "priority", label: "\u2195 Priority" },
|
|
2115
|
+
{ key: "recent", label: "\u{1F550} Recent" },
|
|
2116
|
+
{ key: "alpha", label: "A-Z" }
|
|
2117
|
+
].map((s) => /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
|
|
2118
|
+
"button",
|
|
2119
|
+
{
|
|
2120
|
+
type: "button",
|
|
2121
|
+
onClick: () => setSortMode(s.key),
|
|
2122
|
+
style: {
|
|
2123
|
+
padding: "3px 8px",
|
|
2124
|
+
borderRadius: 6,
|
|
2125
|
+
backgroundColor: sortMode === s.key ? colors.card : "transparent",
|
|
2126
|
+
border: sortMode === s.key ? `1px solid ${colors.border}` : "1px solid transparent",
|
|
2127
|
+
cursor: "pointer",
|
|
2128
|
+
fontSize: 10,
|
|
2129
|
+
color: sortMode === s.key ? colors.textPrimary : colors.textMuted,
|
|
2130
|
+
fontWeight: sortMode === s.key ? 600 : 400,
|
|
2131
|
+
whiteSpace: "nowrap"
|
|
2132
|
+
},
|
|
2133
|
+
children: s.label
|
|
2134
|
+
},
|
|
2135
|
+
s.key
|
|
2136
|
+
)) })
|
|
2137
|
+
] }),
|
|
1845
2138
|
groupedAssignments.map((folder) => {
|
|
1846
2139
|
const folderId = folder.group?.id || "ungrouped";
|
|
1847
2140
|
const isCollapsed = collapsedFolders.has(folderId);
|
|
@@ -1849,8 +2142,8 @@ function TestListScreen({ nav }) {
|
|
|
1849
2142
|
if (filtered.length === 0 && filter !== "all") return null;
|
|
1850
2143
|
const completedInFolder = folder.stats.passed + folder.stats.failed;
|
|
1851
2144
|
const progressPercent = folder.stats.total > 0 ? Math.round(completedInFolder / folder.stats.total * 100) : 0;
|
|
1852
|
-
return /* @__PURE__ */ (0,
|
|
1853
|
-
/* @__PURE__ */ (0,
|
|
2145
|
+
return /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("div", { style: { marginBottom: 12 }, children: [
|
|
2146
|
+
/* @__PURE__ */ (0, import_jsx_runtime5.jsxs)(
|
|
1854
2147
|
"button",
|
|
1855
2148
|
{
|
|
1856
2149
|
type: "button",
|
|
@@ -1870,8 +2163,8 @@ function TestListScreen({ nav }) {
|
|
|
1870
2163
|
textAlign: "left"
|
|
1871
2164
|
},
|
|
1872
2165
|
children: [
|
|
1873
|
-
/* @__PURE__ */ (0,
|
|
1874
|
-
/* @__PURE__ */ (0,
|
|
2166
|
+
/* @__PURE__ */ (0, import_jsx_runtime5.jsx)("span", { style: { fontSize: 10, color: colors.textMuted, width: 14 }, children: isCollapsed ? "\u25B6" : "\u25BC" }),
|
|
2167
|
+
/* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
|
|
1875
2168
|
"span",
|
|
1876
2169
|
{
|
|
1877
2170
|
style: {
|
|
@@ -1886,7 +2179,7 @@ function TestListScreen({ nav }) {
|
|
|
1886
2179
|
children: folder.group?.name || "Ungrouped"
|
|
1887
2180
|
}
|
|
1888
2181
|
),
|
|
1889
|
-
/* @__PURE__ */ (0,
|
|
2182
|
+
/* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
|
|
1890
2183
|
"div",
|
|
1891
2184
|
{
|
|
1892
2185
|
style: {
|
|
@@ -1897,7 +2190,7 @@ function TestListScreen({ nav }) {
|
|
|
1897
2190
|
overflow: "hidden",
|
|
1898
2191
|
flexShrink: 0
|
|
1899
2192
|
},
|
|
1900
|
-
children: /* @__PURE__ */ (0,
|
|
2193
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
|
|
1901
2194
|
"div",
|
|
1902
2195
|
{
|
|
1903
2196
|
style: {
|
|
@@ -1911,7 +2204,7 @@ function TestListScreen({ nav }) {
|
|
|
1911
2204
|
)
|
|
1912
2205
|
}
|
|
1913
2206
|
),
|
|
1914
|
-
/* @__PURE__ */ (0,
|
|
2207
|
+
/* @__PURE__ */ (0, import_jsx_runtime5.jsxs)(
|
|
1915
2208
|
"span",
|
|
1916
2209
|
{
|
|
1917
2210
|
style: {
|
|
@@ -1935,7 +2228,7 @@ function TestListScreen({ nav }) {
|
|
|
1935
2228
|
const badge = getStatusBadge(assignment.status);
|
|
1936
2229
|
const isCurrent = currentAssignment?.id === assignment.id;
|
|
1937
2230
|
const priorityColor = assignment.testCase.priority === "P0" ? colors.red : assignment.testCase.priority === "P1" ? colors.orange : colors.textDim;
|
|
1938
|
-
return /* @__PURE__ */ (0,
|
|
2231
|
+
return /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)(
|
|
1939
2232
|
"button",
|
|
1940
2233
|
{
|
|
1941
2234
|
type: "button",
|
|
@@ -1957,9 +2250,9 @@ function TestListScreen({ nav }) {
|
|
|
1957
2250
|
textAlign: "left"
|
|
1958
2251
|
},
|
|
1959
2252
|
children: [
|
|
1960
|
-
/* @__PURE__ */ (0,
|
|
1961
|
-
/* @__PURE__ */ (0,
|
|
1962
|
-
/* @__PURE__ */ (0,
|
|
2253
|
+
/* @__PURE__ */ (0, import_jsx_runtime5.jsx)("span", { style: { fontSize: 16, marginRight: 10, width: 20, flexShrink: 0 }, children: badge.icon }),
|
|
2254
|
+
/* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("div", { style: { flex: 1, minWidth: 0 }, children: [
|
|
2255
|
+
/* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
|
|
1963
2256
|
"div",
|
|
1964
2257
|
{
|
|
1965
2258
|
style: {
|
|
@@ -1973,9 +2266,9 @@ function TestListScreen({ nav }) {
|
|
|
1973
2266
|
children: assignment.testCase.title
|
|
1974
2267
|
}
|
|
1975
2268
|
),
|
|
1976
|
-
/* @__PURE__ */ (0,
|
|
1977
|
-
assignment.isVerification && /* @__PURE__ */ (0,
|
|
1978
|
-
/* @__PURE__ */ (0,
|
|
2269
|
+
/* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("div", { style: { display: "flex", alignItems: "center", gap: 6 }, children: [
|
|
2270
|
+
assignment.isVerification && /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)(import_jsx_runtime5.Fragment, { children: [
|
|
2271
|
+
/* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
|
|
1979
2272
|
"span",
|
|
1980
2273
|
{
|
|
1981
2274
|
style: {
|
|
@@ -1990,9 +2283,9 @@ function TestListScreen({ nav }) {
|
|
|
1990
2283
|
children: "Retest"
|
|
1991
2284
|
}
|
|
1992
2285
|
),
|
|
1993
|
-
/* @__PURE__ */ (0,
|
|
2286
|
+
/* @__PURE__ */ (0, import_jsx_runtime5.jsx)("span", { style: { fontSize: 11, color: colors.textDim }, children: "\xB7" })
|
|
1994
2287
|
] }),
|
|
1995
|
-
/* @__PURE__ */ (0,
|
|
2288
|
+
/* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
|
|
1996
2289
|
"span",
|
|
1997
2290
|
{
|
|
1998
2291
|
style: {
|
|
@@ -2003,8 +2296,8 @@ function TestListScreen({ nav }) {
|
|
|
2003
2296
|
children: assignment.testCase.testKey
|
|
2004
2297
|
}
|
|
2005
2298
|
),
|
|
2006
|
-
/* @__PURE__ */ (0,
|
|
2007
|
-
/* @__PURE__ */ (0,
|
|
2299
|
+
/* @__PURE__ */ (0, import_jsx_runtime5.jsx)("span", { style: { fontSize: 11, color: colors.textDim }, children: "\xB7" }),
|
|
2300
|
+
/* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
|
|
2008
2301
|
"span",
|
|
2009
2302
|
{
|
|
2010
2303
|
style: {
|
|
@@ -2015,9 +2308,9 @@ function TestListScreen({ nav }) {
|
|
|
2015
2308
|
children: assignment.testCase.priority
|
|
2016
2309
|
}
|
|
2017
2310
|
),
|
|
2018
|
-
assignment.testCase.role && /* @__PURE__ */ (0,
|
|
2019
|
-
/* @__PURE__ */ (0,
|
|
2020
|
-
/* @__PURE__ */ (0,
|
|
2311
|
+
assignment.testCase.role && /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)(import_jsx_runtime5.Fragment, { children: [
|
|
2312
|
+
/* @__PURE__ */ (0, import_jsx_runtime5.jsx)("span", { style: { fontSize: 11, color: colors.textDim }, children: "\xB7" }),
|
|
2313
|
+
/* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("span", { style: {
|
|
2021
2314
|
display: "inline-flex",
|
|
2022
2315
|
alignItems: "center",
|
|
2023
2316
|
gap: 3,
|
|
@@ -2025,7 +2318,7 @@ function TestListScreen({ nav }) {
|
|
|
2025
2318
|
color: assignment.testCase.role.color,
|
|
2026
2319
|
fontWeight: 500
|
|
2027
2320
|
}, children: [
|
|
2028
|
-
/* @__PURE__ */ (0,
|
|
2321
|
+
/* @__PURE__ */ (0, import_jsx_runtime5.jsx)("span", { style: {
|
|
2029
2322
|
width: 5,
|
|
2030
2323
|
height: 5,
|
|
2031
2324
|
borderRadius: 3,
|
|
@@ -2036,7 +2329,7 @@ function TestListScreen({ nav }) {
|
|
|
2036
2329
|
] })
|
|
2037
2330
|
] })
|
|
2038
2331
|
] }),
|
|
2039
|
-
/* @__PURE__ */ (0,
|
|
2332
|
+
/* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
|
|
2040
2333
|
"span",
|
|
2041
2334
|
{
|
|
2042
2335
|
style: {
|
|
@@ -2063,7 +2356,7 @@ function TestListScreen({ nav }) {
|
|
|
2063
2356
|
groupedAssignments.every((folder) => {
|
|
2064
2357
|
const filtered = folder.assignments.filter(filterAssignment);
|
|
2065
2358
|
return filtered.length === 0;
|
|
2066
|
-
}) && /* @__PURE__ */ (0,
|
|
2359
|
+
}) && /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)(
|
|
2067
2360
|
"div",
|
|
2068
2361
|
{
|
|
2069
2362
|
style: {
|
|
@@ -2073,12 +2366,12 @@ function TestListScreen({ nav }) {
|
|
|
2073
2366
|
padding: 32
|
|
2074
2367
|
},
|
|
2075
2368
|
children: [
|
|
2076
|
-
/* @__PURE__ */ (0,
|
|
2077
|
-
/* @__PURE__ */ (0,
|
|
2369
|
+
/* @__PURE__ */ (0, import_jsx_runtime5.jsx)("span", { style: { fontSize: 32, marginBottom: 8 }, children: filter === "pending" ? "\u{1F389}" : filter === "reopened" ? "\u{1F44D}" : "\u{1F4CB}" }),
|
|
2370
|
+
/* @__PURE__ */ (0, import_jsx_runtime5.jsx)("span", { style: { fontSize: 14, color: colors.textMuted }, children: filter === "pending" ? "All tests completed!" : filter === "done" ? "No passed tests yet" : filter === "reopened" ? "No reopened issues" : "No tests assigned" })
|
|
2078
2371
|
]
|
|
2079
2372
|
}
|
|
2080
2373
|
),
|
|
2081
|
-
/* @__PURE__ */ (0,
|
|
2374
|
+
/* @__PURE__ */ (0, import_jsx_runtime5.jsx)("div", { style: { display: "flex", justifyContent: "center", paddingTop: 12, paddingBottom: 8 }, children: /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
|
|
2082
2375
|
"button",
|
|
2083
2376
|
{
|
|
2084
2377
|
type: "button",
|
|
@@ -2174,13 +2467,13 @@ function useImageAttachments(uploadFn, maxImages, bucket = "screenshots") {
|
|
|
2174
2467
|
}
|
|
2175
2468
|
|
|
2176
2469
|
// src/widget/ImagePreviewStrip.tsx
|
|
2177
|
-
var
|
|
2470
|
+
var import_jsx_runtime6 = require("react/jsx-runtime");
|
|
2178
2471
|
function ImagePreviewStrip({ images, onRemove }) {
|
|
2179
2472
|
if (images.length === 0) return null;
|
|
2180
|
-
return /* @__PURE__ */ (0,
|
|
2181
|
-
images.map((img) => /* @__PURE__ */ (0,
|
|
2182
|
-
/* @__PURE__ */ (0,
|
|
2183
|
-
img.status === "uploading" && /* @__PURE__ */ (0,
|
|
2473
|
+
return /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)("div", { style: { display: "flex", gap: 8, overflowX: "auto", paddingTop: 4 }, children: [
|
|
2474
|
+
images.map((img) => /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)("div", { style: { position: "relative", width: 64, height: 64, flexShrink: 0, borderRadius: 8, overflow: "hidden" }, children: [
|
|
2475
|
+
/* @__PURE__ */ (0, import_jsx_runtime6.jsx)("img", { src: img.localUri, alt: img.name, style: { width: 64, height: 64, objectFit: "cover", borderRadius: 8 } }),
|
|
2476
|
+
img.status === "uploading" && /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("div", { style: {
|
|
2184
2477
|
position: "absolute",
|
|
2185
2478
|
inset: 0,
|
|
2186
2479
|
backgroundColor: "rgba(0,0,0,0.5)",
|
|
@@ -2188,7 +2481,7 @@ function ImagePreviewStrip({ images, onRemove }) {
|
|
|
2188
2481
|
alignItems: "center",
|
|
2189
2482
|
justifyContent: "center",
|
|
2190
2483
|
borderRadius: 8
|
|
2191
|
-
}, children: /* @__PURE__ */ (0,
|
|
2484
|
+
}, children: /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("div", { style: {
|
|
2192
2485
|
width: 16,
|
|
2193
2486
|
height: 16,
|
|
2194
2487
|
border: "2px solid #fff",
|
|
@@ -2196,7 +2489,7 @@ function ImagePreviewStrip({ images, onRemove }) {
|
|
|
2196
2489
|
borderRadius: "50%",
|
|
2197
2490
|
animation: "bb-spin 0.6s linear infinite"
|
|
2198
2491
|
} }) }),
|
|
2199
|
-
img.status === "error" && /* @__PURE__ */ (0,
|
|
2492
|
+
img.status === "error" && /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("div", { style: {
|
|
2200
2493
|
position: "absolute",
|
|
2201
2494
|
inset: 0,
|
|
2202
2495
|
backgroundColor: "rgba(127,29,29,0.7)",
|
|
@@ -2204,8 +2497,8 @@ function ImagePreviewStrip({ images, onRemove }) {
|
|
|
2204
2497
|
alignItems: "center",
|
|
2205
2498
|
justifyContent: "center",
|
|
2206
2499
|
borderRadius: 8
|
|
2207
|
-
}, children: /* @__PURE__ */ (0,
|
|
2208
|
-
/* @__PURE__ */ (0,
|
|
2500
|
+
}, children: /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("span", { style: { color: "#fca5a5", fontSize: 18, fontWeight: "bold" }, children: "!" }) }),
|
|
2501
|
+
/* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
|
|
2209
2502
|
"button",
|
|
2210
2503
|
{
|
|
2211
2504
|
type: "button",
|
|
@@ -2232,18 +2525,18 @@ function ImagePreviewStrip({ images, onRemove }) {
|
|
|
2232
2525
|
}
|
|
2233
2526
|
)
|
|
2234
2527
|
] }, img.id)),
|
|
2235
|
-
/* @__PURE__ */ (0,
|
|
2528
|
+
/* @__PURE__ */ (0, import_jsx_runtime6.jsx)("style", { children: `@keyframes bb-spin { to { transform: rotate(360deg); } }` })
|
|
2236
2529
|
] });
|
|
2237
2530
|
}
|
|
2238
2531
|
|
|
2239
2532
|
// src/widget/ImagePickerButtons.tsx
|
|
2240
|
-
var
|
|
2533
|
+
var import_jsx_runtime7 = require("react/jsx-runtime");
|
|
2241
2534
|
function ImagePickerButtons({ images, maxImages, onPickGallery, onPickCamera, onRemove, label }) {
|
|
2242
2535
|
const disabled = images.length >= maxImages;
|
|
2243
|
-
return /* @__PURE__ */ (0,
|
|
2244
|
-
label && /* @__PURE__ */ (0,
|
|
2245
|
-
/* @__PURE__ */ (0,
|
|
2246
|
-
/* @__PURE__ */ (0,
|
|
2536
|
+
return /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)("div", { style: { marginTop: 12, marginBottom: 4 }, children: [
|
|
2537
|
+
label && /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("div", { style: { fontSize: 14, fontWeight: 500, color: "#e4e4e7", marginBottom: 8 }, children: label }),
|
|
2538
|
+
/* @__PURE__ */ (0, import_jsx_runtime7.jsxs)("div", { style: { display: "flex", alignItems: "center", gap: 8, marginBottom: 8 }, children: [
|
|
2539
|
+
/* @__PURE__ */ (0, import_jsx_runtime7.jsx)(
|
|
2247
2540
|
"button",
|
|
2248
2541
|
{
|
|
2249
2542
|
type: "button",
|
|
@@ -2264,7 +2557,7 @@ function ImagePickerButtons({ images, maxImages, onPickGallery, onPickCamera, on
|
|
|
2264
2557
|
children: "Gallery"
|
|
2265
2558
|
}
|
|
2266
2559
|
),
|
|
2267
|
-
/* @__PURE__ */ (0,
|
|
2560
|
+
/* @__PURE__ */ (0, import_jsx_runtime7.jsx)(
|
|
2268
2561
|
"button",
|
|
2269
2562
|
{
|
|
2270
2563
|
type: "button",
|
|
@@ -2285,18 +2578,18 @@ function ImagePickerButtons({ images, maxImages, onPickGallery, onPickCamera, on
|
|
|
2285
2578
|
children: "Camera"
|
|
2286
2579
|
}
|
|
2287
2580
|
),
|
|
2288
|
-
/* @__PURE__ */ (0,
|
|
2581
|
+
/* @__PURE__ */ (0, import_jsx_runtime7.jsxs)("span", { style: { fontSize: 12, color: colors.textDim, marginLeft: 4 }, children: [
|
|
2289
2582
|
images.length,
|
|
2290
2583
|
"/",
|
|
2291
2584
|
maxImages
|
|
2292
2585
|
] })
|
|
2293
2586
|
] }),
|
|
2294
|
-
/* @__PURE__ */ (0,
|
|
2587
|
+
/* @__PURE__ */ (0, import_jsx_runtime7.jsx)(ImagePreviewStrip, { images, onRemove })
|
|
2295
2588
|
] });
|
|
2296
2589
|
}
|
|
2297
2590
|
|
|
2298
2591
|
// src/widget/screens/TestFeedbackScreen.tsx
|
|
2299
|
-
var
|
|
2592
|
+
var import_jsx_runtime8 = require("react/jsx-runtime");
|
|
2300
2593
|
function TestFeedbackScreen({ status, assignmentId, nav }) {
|
|
2301
2594
|
const { client, assignments, refreshAssignments, uploadImage } = useBugBear();
|
|
2302
2595
|
const images = useImageAttachments(uploadImage, 3, "screenshots");
|
|
@@ -2329,6 +2622,7 @@ function TestFeedbackScreen({ status, assignmentId, nav }) {
|
|
|
2329
2622
|
}
|
|
2330
2623
|
};
|
|
2331
2624
|
const handleSubmit = async () => {
|
|
2625
|
+
if (submitting || images.isUploading) return;
|
|
2332
2626
|
setSubmitting(true);
|
|
2333
2627
|
if (client && assignment) {
|
|
2334
2628
|
const screenshotUrls = images.getScreenshotUrls();
|
|
@@ -2364,10 +2658,10 @@ function TestFeedbackScreen({ status, assignmentId, nav }) {
|
|
|
2364
2658
|
{ key: "stepsUnclear", label: "Steps are unclear" },
|
|
2365
2659
|
{ key: "expectedResultUnclear", label: "Expected result unclear" }
|
|
2366
2660
|
];
|
|
2367
|
-
return /* @__PURE__ */ (0,
|
|
2368
|
-
/* @__PURE__ */ (0,
|
|
2369
|
-
/* @__PURE__ */ (0,
|
|
2370
|
-
/* @__PURE__ */ (0,
|
|
2661
|
+
return /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)("div", { style: styles.container, children: [
|
|
2662
|
+
/* @__PURE__ */ (0, import_jsx_runtime8.jsx)("div", { style: styles.header, children: status === "passed" ? "\u2705 Test Passed!" : "\u274C Test Failed" }),
|
|
2663
|
+
/* @__PURE__ */ (0, import_jsx_runtime8.jsx)("div", { style: styles.subheader, children: "Rate this test case" }),
|
|
2664
|
+
/* @__PURE__ */ (0, import_jsx_runtime8.jsx)("div", { style: styles.starRow, children: [1, 2, 3, 4, 5].map((n) => /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(
|
|
2371
2665
|
"button",
|
|
2372
2666
|
{
|
|
2373
2667
|
onClick: () => setRating(n),
|
|
@@ -2379,9 +2673,9 @@ function TestFeedbackScreen({ status, assignmentId, nav }) {
|
|
|
2379
2673
|
},
|
|
2380
2674
|
n
|
|
2381
2675
|
)) }),
|
|
2382
|
-
showFlags && /* @__PURE__ */ (0,
|
|
2383
|
-
/* @__PURE__ */ (0,
|
|
2384
|
-
flagOptions.map(({ key, label }) => /* @__PURE__ */ (0,
|
|
2676
|
+
showFlags && /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)("div", { style: styles.flagsSection, children: [
|
|
2677
|
+
/* @__PURE__ */ (0, import_jsx_runtime8.jsx)("div", { style: styles.flagsLabel, children: "What could be improved?" }),
|
|
2678
|
+
flagOptions.map(({ key, label }) => /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)(
|
|
2385
2679
|
"button",
|
|
2386
2680
|
{
|
|
2387
2681
|
onClick: () => toggleFlag(key),
|
|
@@ -2390,17 +2684,17 @@ function TestFeedbackScreen({ status, assignmentId, nav }) {
|
|
|
2390
2684
|
...flags[key] ? styles.flagItemActive : {}
|
|
2391
2685
|
},
|
|
2392
2686
|
children: [
|
|
2393
|
-
/* @__PURE__ */ (0,
|
|
2687
|
+
/* @__PURE__ */ (0, import_jsx_runtime8.jsx)(
|
|
2394
2688
|
"div",
|
|
2395
2689
|
{
|
|
2396
2690
|
style: {
|
|
2397
2691
|
...styles.flagCheck,
|
|
2398
2692
|
...flags[key] ? styles.flagCheckActive : {}
|
|
2399
2693
|
},
|
|
2400
|
-
children: flags[key] && /* @__PURE__ */ (0,
|
|
2694
|
+
children: flags[key] && /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("span", { style: styles.flagCheckmark, children: "\u2713" })
|
|
2401
2695
|
}
|
|
2402
2696
|
),
|
|
2403
|
-
/* @__PURE__ */ (0,
|
|
2697
|
+
/* @__PURE__ */ (0, import_jsx_runtime8.jsx)(
|
|
2404
2698
|
"span",
|
|
2405
2699
|
{
|
|
2406
2700
|
style: {
|
|
@@ -2415,7 +2709,7 @@ function TestFeedbackScreen({ status, assignmentId, nav }) {
|
|
|
2415
2709
|
key
|
|
2416
2710
|
))
|
|
2417
2711
|
] }),
|
|
2418
|
-
/* @__PURE__ */ (0,
|
|
2712
|
+
/* @__PURE__ */ (0, import_jsx_runtime8.jsx)(
|
|
2419
2713
|
"textarea",
|
|
2420
2714
|
{
|
|
2421
2715
|
style: styles.noteInput,
|
|
@@ -2425,7 +2719,7 @@ function TestFeedbackScreen({ status, assignmentId, nav }) {
|
|
|
2425
2719
|
rows: 3
|
|
2426
2720
|
}
|
|
2427
2721
|
),
|
|
2428
|
-
/* @__PURE__ */ (0,
|
|
2722
|
+
/* @__PURE__ */ (0, import_jsx_runtime8.jsx)(
|
|
2429
2723
|
ImagePickerButtons,
|
|
2430
2724
|
{
|
|
2431
2725
|
images: images.images,
|
|
@@ -2436,9 +2730,9 @@ function TestFeedbackScreen({ status, assignmentId, nav }) {
|
|
|
2436
2730
|
label: "Screenshots (optional)"
|
|
2437
2731
|
}
|
|
2438
2732
|
),
|
|
2439
|
-
/* @__PURE__ */ (0,
|
|
2440
|
-
/* @__PURE__ */ (0,
|
|
2441
|
-
/* @__PURE__ */ (0,
|
|
2733
|
+
/* @__PURE__ */ (0, import_jsx_runtime8.jsxs)("div", { style: styles.actions, children: [
|
|
2734
|
+
/* @__PURE__ */ (0, import_jsx_runtime8.jsx)("button", { style: styles.skipButton, onClick: handleSkip, children: "Skip" }),
|
|
2735
|
+
/* @__PURE__ */ (0, import_jsx_runtime8.jsx)(
|
|
2442
2736
|
"button",
|
|
2443
2737
|
{
|
|
2444
2738
|
style: {
|
|
@@ -2591,7 +2885,7 @@ var styles = {
|
|
|
2591
2885
|
var import_react8 = __toESM(require("react"));
|
|
2592
2886
|
|
|
2593
2887
|
// src/widget/CategoryDropdown.tsx
|
|
2594
|
-
var
|
|
2888
|
+
var import_jsx_runtime9 = require("react/jsx-runtime");
|
|
2595
2889
|
var categoryOptions = [
|
|
2596
2890
|
{ value: "ui_ux", label: "UI/UX", icon: "\u{1F3A8}" },
|
|
2597
2891
|
{ value: "functional", label: "Functional", icon: "\u2699\uFE0F" },
|
|
@@ -2600,7 +2894,7 @@ var categoryOptions = [
|
|
|
2600
2894
|
{ value: "other", label: "Other", icon: "\u{1F4DD}" }
|
|
2601
2895
|
];
|
|
2602
2896
|
function CategoryDropdown({ value, onChange, optional = true, disabled = false }) {
|
|
2603
|
-
return /* @__PURE__ */ (0,
|
|
2897
|
+
return /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)(
|
|
2604
2898
|
"select",
|
|
2605
2899
|
{
|
|
2606
2900
|
value: value || "",
|
|
@@ -2623,8 +2917,8 @@ function CategoryDropdown({ value, onChange, optional = true, disabled = false }
|
|
|
2623
2917
|
paddingRight: 32
|
|
2624
2918
|
},
|
|
2625
2919
|
children: [
|
|
2626
|
-
/* @__PURE__ */ (0,
|
|
2627
|
-
categoryOptions.map(({ value: value2, label, icon }) => /* @__PURE__ */ (0,
|
|
2920
|
+
/* @__PURE__ */ (0, import_jsx_runtime9.jsx)("option", { value: "", children: optional ? "Select category (optional)" : "Select category" }),
|
|
2921
|
+
categoryOptions.map(({ value: value2, label, icon }) => /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)("option", { value: value2, children: [
|
|
2628
2922
|
icon,
|
|
2629
2923
|
" ",
|
|
2630
2924
|
label
|
|
@@ -2635,7 +2929,7 @@ function CategoryDropdown({ value, onChange, optional = true, disabled = false }
|
|
|
2635
2929
|
}
|
|
2636
2930
|
|
|
2637
2931
|
// src/widget/screens/ReportScreen.tsx
|
|
2638
|
-
var
|
|
2932
|
+
var import_jsx_runtime10 = require("react/jsx-runtime");
|
|
2639
2933
|
function ReportScreen({ nav, prefill }) {
|
|
2640
2934
|
const { client, refreshAssignments, uploadImage } = useBugBear();
|
|
2641
2935
|
const images = useImageAttachments(uploadImage, 5, "screenshots");
|
|
@@ -2710,17 +3004,17 @@ function ReportScreen({ nav, prefill }) {
|
|
|
2710
3004
|
{ sev: "medium", color: "#eab308" },
|
|
2711
3005
|
{ sev: "low", color: "#6b7280" }
|
|
2712
3006
|
];
|
|
2713
|
-
return /* @__PURE__ */ (0,
|
|
2714
|
-
/* @__PURE__ */ (0,
|
|
2715
|
-
/* @__PURE__ */ (0,
|
|
2716
|
-
/* @__PURE__ */ (0,
|
|
2717
|
-
/* @__PURE__ */ (0,
|
|
2718
|
-
/* @__PURE__ */ (0,
|
|
3007
|
+
return /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("div", { children: isRetestFailure ? /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)(import_jsx_runtime10.Fragment, { children: [
|
|
3008
|
+
/* @__PURE__ */ (0, import_jsx_runtime10.jsxs)("div", { style: styles2.retestBanner, children: [
|
|
3009
|
+
/* @__PURE__ */ (0, import_jsx_runtime10.jsx)("span", { style: { fontSize: 16 }, children: "\u{1F504}" }),
|
|
3010
|
+
/* @__PURE__ */ (0, import_jsx_runtime10.jsxs)("div", { children: [
|
|
3011
|
+
/* @__PURE__ */ (0, import_jsx_runtime10.jsx)("div", { style: styles2.retestTitle, children: "Bug Still Present" }),
|
|
3012
|
+
/* @__PURE__ */ (0, import_jsx_runtime10.jsx)("div", { style: styles2.retestSubtitle, children: "The fix did not resolve this issue" })
|
|
2719
3013
|
] })
|
|
2720
3014
|
] }),
|
|
2721
|
-
/* @__PURE__ */ (0,
|
|
2722
|
-
/* @__PURE__ */ (0,
|
|
2723
|
-
/* @__PURE__ */ (0,
|
|
3015
|
+
/* @__PURE__ */ (0, import_jsx_runtime10.jsxs)("div", { style: styles2.section, children: [
|
|
3016
|
+
/* @__PURE__ */ (0, import_jsx_runtime10.jsx)("div", { style: styles2.label, children: "Severity" }),
|
|
3017
|
+
/* @__PURE__ */ (0, import_jsx_runtime10.jsx)("div", { style: styles2.severityRow, children: severityOptions.map(({ sev, color }) => /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(
|
|
2724
3018
|
"button",
|
|
2725
3019
|
{
|
|
2726
3020
|
onClick: () => setSeverity(sev),
|
|
@@ -2728,18 +3022,18 @@ function ReportScreen({ nav, prefill }) {
|
|
|
2728
3022
|
...styles2.sevButton,
|
|
2729
3023
|
...severity === sev ? { backgroundColor: `${color}30`, borderColor: color } : {}
|
|
2730
3024
|
},
|
|
2731
|
-
children: /* @__PURE__ */ (0,
|
|
3025
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("span", { style: { ...styles2.sevText, ...severity === sev ? { color } : {} }, children: sev })
|
|
2732
3026
|
},
|
|
2733
3027
|
sev
|
|
2734
3028
|
)) })
|
|
2735
3029
|
] }),
|
|
2736
|
-
/* @__PURE__ */ (0,
|
|
2737
|
-
/* @__PURE__ */ (0,
|
|
2738
|
-
/* @__PURE__ */ (0,
|
|
3030
|
+
/* @__PURE__ */ (0, import_jsx_runtime10.jsxs)("div", { style: styles2.section, children: [
|
|
3031
|
+
/* @__PURE__ */ (0, import_jsx_runtime10.jsx)("div", { style: styles2.label, children: "Category (optional)" }),
|
|
3032
|
+
/* @__PURE__ */ (0, import_jsx_runtime10.jsx)(CategoryDropdown, { value: category, onChange: setCategory, optional: true })
|
|
2739
3033
|
] }),
|
|
2740
|
-
/* @__PURE__ */ (0,
|
|
2741
|
-
/* @__PURE__ */ (0,
|
|
2742
|
-
/* @__PURE__ */ (0,
|
|
3034
|
+
/* @__PURE__ */ (0, import_jsx_runtime10.jsxs)("div", { style: styles2.section, children: [
|
|
3035
|
+
/* @__PURE__ */ (0, import_jsx_runtime10.jsx)("div", { style: styles2.label, children: "What went wrong?" }),
|
|
3036
|
+
/* @__PURE__ */ (0, import_jsx_runtime10.jsx)(
|
|
2743
3037
|
"textarea",
|
|
2744
3038
|
{
|
|
2745
3039
|
style: styles2.descInput,
|
|
@@ -2750,7 +3044,7 @@ function ReportScreen({ nav, prefill }) {
|
|
|
2750
3044
|
}
|
|
2751
3045
|
)
|
|
2752
3046
|
] }),
|
|
2753
|
-
/* @__PURE__ */ (0,
|
|
3047
|
+
/* @__PURE__ */ (0, import_jsx_runtime10.jsx)(
|
|
2754
3048
|
ImagePickerButtons,
|
|
2755
3049
|
{
|
|
2756
3050
|
images: images.images,
|
|
@@ -2761,8 +3055,8 @@ function ReportScreen({ nav, prefill }) {
|
|
|
2761
3055
|
label: "Attachments (optional)"
|
|
2762
3056
|
}
|
|
2763
3057
|
),
|
|
2764
|
-
error && /* @__PURE__ */ (0,
|
|
2765
|
-
/* @__PURE__ */ (0,
|
|
3058
|
+
error && /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("div", { style: styles2.errorBanner, children: error }),
|
|
3059
|
+
/* @__PURE__ */ (0, import_jsx_runtime10.jsx)(
|
|
2766
3060
|
"button",
|
|
2767
3061
|
{
|
|
2768
3062
|
style: {
|
|
@@ -2775,9 +3069,9 @@ function ReportScreen({ nav, prefill }) {
|
|
|
2775
3069
|
children: images.isUploading ? "Uploading images..." : submitting ? "Submitting..." : error ? "Retry" : "Submit Failed Retest"
|
|
2776
3070
|
}
|
|
2777
3071
|
)
|
|
2778
|
-
] }) : /* @__PURE__ */ (0,
|
|
2779
|
-
/* @__PURE__ */ (0,
|
|
2780
|
-
/* @__PURE__ */ (0,
|
|
3072
|
+
] }) : /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)(import_jsx_runtime10.Fragment, { children: [
|
|
3073
|
+
/* @__PURE__ */ (0, import_jsx_runtime10.jsx)("div", { style: styles2.label, children: "What are you reporting?" }),
|
|
3074
|
+
/* @__PURE__ */ (0, import_jsx_runtime10.jsx)("div", { style: styles2.typeRow, children: typeOptions.map(({ type, label, icon }) => /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)(
|
|
2781
3075
|
"button",
|
|
2782
3076
|
{
|
|
2783
3077
|
onClick: () => setReportType(type),
|
|
@@ -2786,8 +3080,8 @@ function ReportScreen({ nav, prefill }) {
|
|
|
2786
3080
|
...reportType === type ? styles2.typeCardActive : {}
|
|
2787
3081
|
},
|
|
2788
3082
|
children: [
|
|
2789
|
-
/* @__PURE__ */ (0,
|
|
2790
|
-
/* @__PURE__ */ (0,
|
|
3083
|
+
/* @__PURE__ */ (0, import_jsx_runtime10.jsx)("div", { style: styles2.typeIcon, children: icon }),
|
|
3084
|
+
/* @__PURE__ */ (0, import_jsx_runtime10.jsx)(
|
|
2791
3085
|
"div",
|
|
2792
3086
|
{
|
|
2793
3087
|
style: {
|
|
@@ -2801,9 +3095,9 @@ function ReportScreen({ nav, prefill }) {
|
|
|
2801
3095
|
},
|
|
2802
3096
|
type
|
|
2803
3097
|
)) }),
|
|
2804
|
-
isBugType && /* @__PURE__ */ (0,
|
|
2805
|
-
/* @__PURE__ */ (0,
|
|
2806
|
-
/* @__PURE__ */ (0,
|
|
3098
|
+
isBugType && /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)("div", { style: styles2.section, children: [
|
|
3099
|
+
/* @__PURE__ */ (0, import_jsx_runtime10.jsx)("div", { style: styles2.label, children: "Severity" }),
|
|
3100
|
+
/* @__PURE__ */ (0, import_jsx_runtime10.jsx)("div", { style: styles2.severityRow, children: severityOptions.map(({ sev, color }) => /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(
|
|
2807
3101
|
"button",
|
|
2808
3102
|
{
|
|
2809
3103
|
onClick: () => setSeverity(sev),
|
|
@@ -2814,7 +3108,7 @@ function ReportScreen({ nav, prefill }) {
|
|
|
2814
3108
|
borderColor: color
|
|
2815
3109
|
} : {}
|
|
2816
3110
|
},
|
|
2817
|
-
children: /* @__PURE__ */ (0,
|
|
3111
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(
|
|
2818
3112
|
"span",
|
|
2819
3113
|
{
|
|
2820
3114
|
style: {
|
|
@@ -2828,13 +3122,13 @@ function ReportScreen({ nav, prefill }) {
|
|
|
2828
3122
|
sev
|
|
2829
3123
|
)) })
|
|
2830
3124
|
] }),
|
|
2831
|
-
isBugType && /* @__PURE__ */ (0,
|
|
2832
|
-
/* @__PURE__ */ (0,
|
|
2833
|
-
/* @__PURE__ */ (0,
|
|
3125
|
+
isBugType && /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)("div", { style: styles2.section, children: [
|
|
3126
|
+
/* @__PURE__ */ (0, import_jsx_runtime10.jsx)("div", { style: styles2.label, children: "Category (optional)" }),
|
|
3127
|
+
/* @__PURE__ */ (0, import_jsx_runtime10.jsx)(CategoryDropdown, { value: category, onChange: setCategory, optional: true })
|
|
2834
3128
|
] }),
|
|
2835
|
-
/* @__PURE__ */ (0,
|
|
2836
|
-
/* @__PURE__ */ (0,
|
|
2837
|
-
/* @__PURE__ */ (0,
|
|
3129
|
+
/* @__PURE__ */ (0, import_jsx_runtime10.jsxs)("div", { style: styles2.section, children: [
|
|
3130
|
+
/* @__PURE__ */ (0, import_jsx_runtime10.jsx)("div", { style: styles2.label, children: "What happened?" }),
|
|
3131
|
+
/* @__PURE__ */ (0, import_jsx_runtime10.jsx)(
|
|
2838
3132
|
"textarea",
|
|
2839
3133
|
{
|
|
2840
3134
|
style: styles2.descInput,
|
|
@@ -2845,9 +3139,9 @@ function ReportScreen({ nav, prefill }) {
|
|
|
2845
3139
|
}
|
|
2846
3140
|
)
|
|
2847
3141
|
] }),
|
|
2848
|
-
isBugType && /* @__PURE__ */ (0,
|
|
2849
|
-
/* @__PURE__ */ (0,
|
|
2850
|
-
/* @__PURE__ */ (0,
|
|
3142
|
+
isBugType && /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)("div", { style: styles2.section, children: [
|
|
3143
|
+
/* @__PURE__ */ (0, import_jsx_runtime10.jsx)("div", { style: styles2.label, children: "Where did it happen?" }),
|
|
3144
|
+
/* @__PURE__ */ (0, import_jsx_runtime10.jsx)(
|
|
2851
3145
|
"input",
|
|
2852
3146
|
{
|
|
2853
3147
|
style: styles2.routeInput,
|
|
@@ -2856,13 +3150,13 @@ function ReportScreen({ nav, prefill }) {
|
|
|
2856
3150
|
placeholder: observedRoute.current
|
|
2857
3151
|
}
|
|
2858
3152
|
),
|
|
2859
|
-
/* @__PURE__ */ (0,
|
|
3153
|
+
/* @__PURE__ */ (0, import_jsx_runtime10.jsxs)("div", { style: styles2.routeHint, children: [
|
|
2860
3154
|
"Leave blank to use current page (",
|
|
2861
3155
|
observedRoute.current,
|
|
2862
3156
|
")"
|
|
2863
3157
|
] })
|
|
2864
3158
|
] }),
|
|
2865
|
-
/* @__PURE__ */ (0,
|
|
3159
|
+
/* @__PURE__ */ (0, import_jsx_runtime10.jsx)(
|
|
2866
3160
|
ImagePickerButtons,
|
|
2867
3161
|
{
|
|
2868
3162
|
images: images.images,
|
|
@@ -2873,8 +3167,8 @@ function ReportScreen({ nav, prefill }) {
|
|
|
2873
3167
|
label: "Screenshots (optional)"
|
|
2874
3168
|
}
|
|
2875
3169
|
),
|
|
2876
|
-
error && /* @__PURE__ */ (0,
|
|
2877
|
-
/* @__PURE__ */ (0,
|
|
3170
|
+
error && /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("div", { style: styles2.errorBanner, children: error }),
|
|
3171
|
+
/* @__PURE__ */ (0, import_jsx_runtime10.jsx)(
|
|
2878
3172
|
"button",
|
|
2879
3173
|
{
|
|
2880
3174
|
style: {
|
|
@@ -3039,16 +3333,16 @@ var styles2 = {
|
|
|
3039
3333
|
|
|
3040
3334
|
// src/widget/screens/ReportSuccessScreen.tsx
|
|
3041
3335
|
var import_react9 = require("react");
|
|
3042
|
-
var
|
|
3336
|
+
var import_jsx_runtime11 = require("react/jsx-runtime");
|
|
3043
3337
|
function ReportSuccessScreen({ nav }) {
|
|
3044
3338
|
(0, import_react9.useEffect)(() => {
|
|
3045
3339
|
const timer = setTimeout(() => nav.reset(), 2e3);
|
|
3046
3340
|
return () => clearTimeout(timer);
|
|
3047
3341
|
}, [nav]);
|
|
3048
|
-
return /* @__PURE__ */ (0,
|
|
3049
|
-
/* @__PURE__ */ (0,
|
|
3050
|
-
/* @__PURE__ */ (0,
|
|
3051
|
-
/* @__PURE__ */ (0,
|
|
3342
|
+
return /* @__PURE__ */ (0, import_jsx_runtime11.jsxs)("div", { style: styles3.container, children: [
|
|
3343
|
+
/* @__PURE__ */ (0, import_jsx_runtime11.jsx)("div", { style: styles3.emoji, children: "\u{1F389}" }),
|
|
3344
|
+
/* @__PURE__ */ (0, import_jsx_runtime11.jsx)("div", { style: styles3.title, children: "Report submitted!" }),
|
|
3345
|
+
/* @__PURE__ */ (0, import_jsx_runtime11.jsx)("div", { style: styles3.subtitle, children: "Thank you for your feedback" })
|
|
3052
3346
|
] });
|
|
3053
3347
|
}
|
|
3054
3348
|
var styles3 = {
|
|
@@ -3077,11 +3371,12 @@ var styles3 = {
|
|
|
3077
3371
|
};
|
|
3078
3372
|
|
|
3079
3373
|
// src/widget/screens/MessageListScreen.tsx
|
|
3080
|
-
var
|
|
3374
|
+
var import_jsx_runtime12 = require("react/jsx-runtime");
|
|
3081
3375
|
function MessageListScreen({ nav }) {
|
|
3082
|
-
const { threads, unreadCount, refreshThreads } = useBugBear();
|
|
3083
|
-
return /* @__PURE__ */ (0,
|
|
3084
|
-
|
|
3376
|
+
const { threads, unreadCount, refreshThreads, isLoading } = useBugBear();
|
|
3377
|
+
if (isLoading) return /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(MessageListScreenSkeleton, {});
|
|
3378
|
+
return /* @__PURE__ */ (0, import_jsx_runtime12.jsxs)("div", { children: [
|
|
3379
|
+
/* @__PURE__ */ (0, import_jsx_runtime12.jsx)(
|
|
3085
3380
|
"button",
|
|
3086
3381
|
{
|
|
3087
3382
|
style: {
|
|
@@ -3100,7 +3395,7 @@ function MessageListScreen({ nav }) {
|
|
|
3100
3395
|
children: "\u2709\uFE0F New Message"
|
|
3101
3396
|
}
|
|
3102
3397
|
),
|
|
3103
|
-
threads.length === 0 ? /* @__PURE__ */ (0,
|
|
3398
|
+
threads.length === 0 ? /* @__PURE__ */ (0, import_jsx_runtime12.jsxs)(
|
|
3104
3399
|
"div",
|
|
3105
3400
|
{
|
|
3106
3401
|
style: {
|
|
@@ -3111,8 +3406,8 @@ function MessageListScreen({ nav }) {
|
|
|
3111
3406
|
paddingBottom: 40
|
|
3112
3407
|
},
|
|
3113
3408
|
children: [
|
|
3114
|
-
/* @__PURE__ */ (0,
|
|
3115
|
-
/* @__PURE__ */ (0,
|
|
3409
|
+
/* @__PURE__ */ (0, import_jsx_runtime12.jsx)("span", { style: { fontSize: 36, marginBottom: 12 }, children: "\u{1F4AC}" }),
|
|
3410
|
+
/* @__PURE__ */ (0, import_jsx_runtime12.jsx)(
|
|
3116
3411
|
"span",
|
|
3117
3412
|
{
|
|
3118
3413
|
style: {
|
|
@@ -3124,7 +3419,7 @@ function MessageListScreen({ nav }) {
|
|
|
3124
3419
|
children: "No messages yet"
|
|
3125
3420
|
}
|
|
3126
3421
|
),
|
|
3127
|
-
/* @__PURE__ */ (0,
|
|
3422
|
+
/* @__PURE__ */ (0, import_jsx_runtime12.jsx)(
|
|
3128
3423
|
"span",
|
|
3129
3424
|
{
|
|
3130
3425
|
style: {
|
|
@@ -3137,7 +3432,7 @@ function MessageListScreen({ nav }) {
|
|
|
3137
3432
|
)
|
|
3138
3433
|
]
|
|
3139
3434
|
}
|
|
3140
|
-
) : /* @__PURE__ */ (0,
|
|
3435
|
+
) : /* @__PURE__ */ (0, import_jsx_runtime12.jsx)("div", { children: threads.map((thread) => /* @__PURE__ */ (0, import_jsx_runtime12.jsxs)(
|
|
3141
3436
|
"button",
|
|
3142
3437
|
{
|
|
3143
3438
|
style: {
|
|
@@ -3155,8 +3450,8 @@ function MessageListScreen({ nav }) {
|
|
|
3155
3450
|
},
|
|
3156
3451
|
onClick: () => nav.push({ name: "THREAD_DETAIL", thread }),
|
|
3157
3452
|
children: [
|
|
3158
|
-
/* @__PURE__ */ (0,
|
|
3159
|
-
/* @__PURE__ */ (0,
|
|
3453
|
+
/* @__PURE__ */ (0, import_jsx_runtime12.jsxs)("div", { style: { display: "flex", flex: 1, minWidth: 0 }, children: [
|
|
3454
|
+
/* @__PURE__ */ (0, import_jsx_runtime12.jsx)(
|
|
3160
3455
|
"span",
|
|
3161
3456
|
{
|
|
3162
3457
|
style: {
|
|
@@ -3168,7 +3463,7 @@ function MessageListScreen({ nav }) {
|
|
|
3168
3463
|
children: getThreadTypeIcon(thread.threadType)
|
|
3169
3464
|
}
|
|
3170
3465
|
),
|
|
3171
|
-
/* @__PURE__ */ (0,
|
|
3466
|
+
/* @__PURE__ */ (0, import_jsx_runtime12.jsxs)(
|
|
3172
3467
|
"div",
|
|
3173
3468
|
{
|
|
3174
3469
|
style: {
|
|
@@ -3176,7 +3471,7 @@ function MessageListScreen({ nav }) {
|
|
|
3176
3471
|
minWidth: 0
|
|
3177
3472
|
},
|
|
3178
3473
|
children: [
|
|
3179
|
-
/* @__PURE__ */ (0,
|
|
3474
|
+
/* @__PURE__ */ (0, import_jsx_runtime12.jsxs)(
|
|
3180
3475
|
"div",
|
|
3181
3476
|
{
|
|
3182
3477
|
style: {
|
|
@@ -3185,8 +3480,8 @@ function MessageListScreen({ nav }) {
|
|
|
3185
3480
|
gap: 4
|
|
3186
3481
|
},
|
|
3187
3482
|
children: [
|
|
3188
|
-
thread.isPinned && /* @__PURE__ */ (0,
|
|
3189
|
-
/* @__PURE__ */ (0,
|
|
3483
|
+
thread.isPinned && /* @__PURE__ */ (0, import_jsx_runtime12.jsx)("span", { style: { fontSize: 12, flexShrink: 0 }, children: "\u{1F4CC}" }),
|
|
3484
|
+
/* @__PURE__ */ (0, import_jsx_runtime12.jsx)(
|
|
3190
3485
|
"span",
|
|
3191
3486
|
{
|
|
3192
3487
|
style: {
|
|
@@ -3203,7 +3498,7 @@ function MessageListScreen({ nav }) {
|
|
|
3203
3498
|
]
|
|
3204
3499
|
}
|
|
3205
3500
|
),
|
|
3206
|
-
thread.lastMessage && /* @__PURE__ */ (0,
|
|
3501
|
+
thread.lastMessage && /* @__PURE__ */ (0, import_jsx_runtime12.jsxs)(
|
|
3207
3502
|
"span",
|
|
3208
3503
|
{
|
|
3209
3504
|
style: {
|
|
@@ -3227,7 +3522,7 @@ function MessageListScreen({ nav }) {
|
|
|
3227
3522
|
}
|
|
3228
3523
|
)
|
|
3229
3524
|
] }),
|
|
3230
|
-
/* @__PURE__ */ (0,
|
|
3525
|
+
/* @__PURE__ */ (0, import_jsx_runtime12.jsxs)(
|
|
3231
3526
|
"div",
|
|
3232
3527
|
{
|
|
3233
3528
|
style: {
|
|
@@ -3239,8 +3534,8 @@ function MessageListScreen({ nav }) {
|
|
|
3239
3534
|
flexShrink: 0
|
|
3240
3535
|
},
|
|
3241
3536
|
children: [
|
|
3242
|
-
/* @__PURE__ */ (0,
|
|
3243
|
-
thread.unreadCount > 0 && /* @__PURE__ */ (0,
|
|
3537
|
+
/* @__PURE__ */ (0, import_jsx_runtime12.jsx)("span", { style: { fontSize: 11, color: colors.textDim }, children: formatRelativeTime(thread.lastMessageAt) }),
|
|
3538
|
+
thread.unreadCount > 0 && /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(
|
|
3244
3539
|
"span",
|
|
3245
3540
|
{
|
|
3246
3541
|
style: {
|
|
@@ -3267,7 +3562,7 @@ function MessageListScreen({ nav }) {
|
|
|
3267
3562
|
},
|
|
3268
3563
|
thread.id
|
|
3269
3564
|
)) }),
|
|
3270
|
-
/* @__PURE__ */ (0,
|
|
3565
|
+
/* @__PURE__ */ (0, import_jsx_runtime12.jsxs)(
|
|
3271
3566
|
"div",
|
|
3272
3567
|
{
|
|
3273
3568
|
style: {
|
|
@@ -3279,7 +3574,7 @@ function MessageListScreen({ nav }) {
|
|
|
3279
3574
|
paddingRight: 4
|
|
3280
3575
|
},
|
|
3281
3576
|
children: [
|
|
3282
|
-
/* @__PURE__ */ (0,
|
|
3577
|
+
/* @__PURE__ */ (0, import_jsx_runtime12.jsxs)("span", { style: { fontSize: 12, color: colors.textMuted }, children: [
|
|
3283
3578
|
threads.length,
|
|
3284
3579
|
" thread",
|
|
3285
3580
|
threads.length !== 1 ? "s" : "",
|
|
@@ -3288,7 +3583,7 @@ function MessageListScreen({ nav }) {
|
|
|
3288
3583
|
unreadCount,
|
|
3289
3584
|
" unread"
|
|
3290
3585
|
] }),
|
|
3291
|
-
/* @__PURE__ */ (0,
|
|
3586
|
+
/* @__PURE__ */ (0, import_jsx_runtime12.jsx)(
|
|
3292
3587
|
"button",
|
|
3293
3588
|
{
|
|
3294
3589
|
style: {
|
|
@@ -3311,7 +3606,7 @@ function MessageListScreen({ nav }) {
|
|
|
3311
3606
|
|
|
3312
3607
|
// src/widget/screens/ThreadDetailScreen.tsx
|
|
3313
3608
|
var import_react10 = require("react");
|
|
3314
|
-
var
|
|
3609
|
+
var import_jsx_runtime13 = require("react/jsx-runtime");
|
|
3315
3610
|
var inputStyle = {
|
|
3316
3611
|
backgroundColor: "#27272a",
|
|
3317
3612
|
border: "1px solid #3f3f46",
|
|
@@ -3333,15 +3628,28 @@ function ThreadDetailScreen({
|
|
|
3333
3628
|
const [sending, setSending] = (0, import_react10.useState)(false);
|
|
3334
3629
|
const [sendError, setSendError] = (0, import_react10.useState)(false);
|
|
3335
3630
|
(0, import_react10.useEffect)(() => {
|
|
3631
|
+
let cancelled = false;
|
|
3632
|
+
setLoading(true);
|
|
3336
3633
|
(async () => {
|
|
3337
|
-
|
|
3338
|
-
|
|
3339
|
-
|
|
3340
|
-
|
|
3341
|
-
|
|
3342
|
-
|
|
3634
|
+
try {
|
|
3635
|
+
const msgs = await getThreadMessages(thread.id);
|
|
3636
|
+
if (!cancelled) {
|
|
3637
|
+
setMessages(msgs);
|
|
3638
|
+
}
|
|
3639
|
+
if (thread.unreadCount > 0) {
|
|
3640
|
+
await markAsRead(thread.id);
|
|
3641
|
+
}
|
|
3642
|
+
} catch (err) {
|
|
3643
|
+
console.error("BugBear: Failed to load thread messages", err);
|
|
3644
|
+
} finally {
|
|
3645
|
+
if (!cancelled) {
|
|
3646
|
+
setLoading(false);
|
|
3647
|
+
}
|
|
3343
3648
|
}
|
|
3344
3649
|
})();
|
|
3650
|
+
return () => {
|
|
3651
|
+
cancelled = true;
|
|
3652
|
+
};
|
|
3345
3653
|
}, [thread.id]);
|
|
3346
3654
|
const handleSend = async () => {
|
|
3347
3655
|
if (!replyText.trim() && replyImages.images.length === 0 || sending || replyImages.isUploading) return;
|
|
@@ -3370,8 +3678,8 @@ function ThreadDetailScreen({
|
|
|
3370
3678
|
handleSend();
|
|
3371
3679
|
}
|
|
3372
3680
|
};
|
|
3373
|
-
return /* @__PURE__ */ (0,
|
|
3374
|
-
/* @__PURE__ */ (0,
|
|
3681
|
+
return /* @__PURE__ */ (0, import_jsx_runtime13.jsxs)("div", { style: { display: "flex", flexDirection: "column", flex: 1 }, children: [
|
|
3682
|
+
/* @__PURE__ */ (0, import_jsx_runtime13.jsxs)(
|
|
3375
3683
|
"div",
|
|
3376
3684
|
{
|
|
3377
3685
|
style: {
|
|
@@ -3383,8 +3691,8 @@ function ThreadDetailScreen({
|
|
|
3383
3691
|
borderBottom: `1px solid ${colors.border}`
|
|
3384
3692
|
},
|
|
3385
3693
|
children: [
|
|
3386
|
-
/* @__PURE__ */ (0,
|
|
3387
|
-
/* @__PURE__ */ (0,
|
|
3694
|
+
/* @__PURE__ */ (0, import_jsx_runtime13.jsx)("span", { style: { fontSize: 20 }, children: getThreadTypeIcon(thread.threadType) }),
|
|
3695
|
+
/* @__PURE__ */ (0, import_jsx_runtime13.jsx)(
|
|
3388
3696
|
"span",
|
|
3389
3697
|
{
|
|
3390
3698
|
style: {
|
|
@@ -3404,7 +3712,7 @@ function ThreadDetailScreen({
|
|
|
3404
3712
|
]
|
|
3405
3713
|
}
|
|
3406
3714
|
),
|
|
3407
|
-
loading ? /* @__PURE__ */ (0,
|
|
3715
|
+
loading ? /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(
|
|
3408
3716
|
"div",
|
|
3409
3717
|
{
|
|
3410
3718
|
style: {
|
|
@@ -3412,11 +3720,11 @@ function ThreadDetailScreen({
|
|
|
3412
3720
|
paddingBottom: 40,
|
|
3413
3721
|
textAlign: "center"
|
|
3414
3722
|
},
|
|
3415
|
-
children: /* @__PURE__ */ (0,
|
|
3723
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime13.jsx)("span", { style: { fontSize: 14, color: colors.textMuted }, children: "Loading messages..." })
|
|
3416
3724
|
}
|
|
3417
|
-
) : /* @__PURE__ */ (0,
|
|
3725
|
+
) : /* @__PURE__ */ (0, import_jsx_runtime13.jsx)("div", { style: { paddingBottom: 8, marginBottom: 8 }, children: messages.map((msg) => {
|
|
3418
3726
|
const isTester = msg.senderType === "tester";
|
|
3419
|
-
return /* @__PURE__ */ (0,
|
|
3727
|
+
return /* @__PURE__ */ (0, import_jsx_runtime13.jsxs)(
|
|
3420
3728
|
"div",
|
|
3421
3729
|
{
|
|
3422
3730
|
style: {
|
|
@@ -3432,7 +3740,7 @@ function ThreadDetailScreen({
|
|
|
3432
3740
|
borderBottomRightRadius: isTester ? 4 : 16
|
|
3433
3741
|
},
|
|
3434
3742
|
children: [
|
|
3435
|
-
/* @__PURE__ */ (0,
|
|
3743
|
+
/* @__PURE__ */ (0, import_jsx_runtime13.jsx)(
|
|
3436
3744
|
"span",
|
|
3437
3745
|
{
|
|
3438
3746
|
style: {
|
|
@@ -3445,7 +3753,7 @@ function ThreadDetailScreen({
|
|
|
3445
3753
|
children: isTester ? "You" : msg.senderName
|
|
3446
3754
|
}
|
|
3447
3755
|
),
|
|
3448
|
-
/* @__PURE__ */ (0,
|
|
3756
|
+
/* @__PURE__ */ (0, import_jsx_runtime13.jsx)(
|
|
3449
3757
|
"span",
|
|
3450
3758
|
{
|
|
3451
3759
|
style: {
|
|
@@ -3459,7 +3767,7 @@ function ThreadDetailScreen({
|
|
|
3459
3767
|
children: msg.content
|
|
3460
3768
|
}
|
|
3461
3769
|
),
|
|
3462
|
-
msg.attachments && msg.attachments.length > 0 && /* @__PURE__ */ (0,
|
|
3770
|
+
msg.attachments && msg.attachments.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime13.jsx)("div", { style: { marginTop: 8, display: "flex", flexDirection: "column", gap: 6 }, children: msg.attachments.filter((a) => a.type === "image" && typeof a.url === "string" && /^https?:\/\//i.test(a.url)).map((att, idx) => /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(
|
|
3463
3771
|
"img",
|
|
3464
3772
|
{
|
|
3465
3773
|
src: att.url,
|
|
@@ -3468,7 +3776,7 @@ function ThreadDetailScreen({
|
|
|
3468
3776
|
},
|
|
3469
3777
|
idx
|
|
3470
3778
|
)) }),
|
|
3471
|
-
/* @__PURE__ */ (0,
|
|
3779
|
+
/* @__PURE__ */ (0, import_jsx_runtime13.jsx)(
|
|
3472
3780
|
"span",
|
|
3473
3781
|
{
|
|
3474
3782
|
style: {
|
|
@@ -3486,7 +3794,7 @@ function ThreadDetailScreen({
|
|
|
3486
3794
|
msg.id
|
|
3487
3795
|
);
|
|
3488
3796
|
}) }),
|
|
3489
|
-
sendError && /* @__PURE__ */ (0,
|
|
3797
|
+
sendError && /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(
|
|
3490
3798
|
"div",
|
|
3491
3799
|
{
|
|
3492
3800
|
style: {
|
|
@@ -3498,7 +3806,7 @@ function ThreadDetailScreen({
|
|
|
3498
3806
|
borderRadius: 8,
|
|
3499
3807
|
marginBottom: 8
|
|
3500
3808
|
},
|
|
3501
|
-
children: /* @__PURE__ */ (0,
|
|
3809
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(
|
|
3502
3810
|
"span",
|
|
3503
3811
|
{
|
|
3504
3812
|
style: {
|
|
@@ -3512,8 +3820,8 @@ function ThreadDetailScreen({
|
|
|
3512
3820
|
)
|
|
3513
3821
|
}
|
|
3514
3822
|
),
|
|
3515
|
-
replyImages.images.length > 0 && /* @__PURE__ */ (0,
|
|
3516
|
-
/* @__PURE__ */ (0,
|
|
3823
|
+
replyImages.images.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime13.jsx)("div", { style: { paddingTop: 8 }, children: /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(ImagePreviewStrip, { images: replyImages.images, onRemove: replyImages.removeImage }) }),
|
|
3824
|
+
/* @__PURE__ */ (0, import_jsx_runtime13.jsxs)(
|
|
3517
3825
|
"div",
|
|
3518
3826
|
{
|
|
3519
3827
|
style: {
|
|
@@ -3524,7 +3832,7 @@ function ThreadDetailScreen({
|
|
|
3524
3832
|
gap: 8
|
|
3525
3833
|
},
|
|
3526
3834
|
children: [
|
|
3527
|
-
/* @__PURE__ */ (0,
|
|
3835
|
+
/* @__PURE__ */ (0, import_jsx_runtime13.jsx)(
|
|
3528
3836
|
"button",
|
|
3529
3837
|
{
|
|
3530
3838
|
type: "button",
|
|
@@ -3543,7 +3851,7 @@ function ThreadDetailScreen({
|
|
|
3543
3851
|
children: "\u{1F4CE}"
|
|
3544
3852
|
}
|
|
3545
3853
|
),
|
|
3546
|
-
/* @__PURE__ */ (0,
|
|
3854
|
+
/* @__PURE__ */ (0, import_jsx_runtime13.jsx)(
|
|
3547
3855
|
"input",
|
|
3548
3856
|
{
|
|
3549
3857
|
type: "text",
|
|
@@ -3559,7 +3867,7 @@ function ThreadDetailScreen({
|
|
|
3559
3867
|
}
|
|
3560
3868
|
}
|
|
3561
3869
|
),
|
|
3562
|
-
/* @__PURE__ */ (0,
|
|
3870
|
+
/* @__PURE__ */ (0, import_jsx_runtime13.jsx)(
|
|
3563
3871
|
"button",
|
|
3564
3872
|
{
|
|
3565
3873
|
style: {
|
|
@@ -3587,7 +3895,7 @@ function ThreadDetailScreen({
|
|
|
3587
3895
|
|
|
3588
3896
|
// src/widget/screens/ComposeMessageScreen.tsx
|
|
3589
3897
|
var import_react11 = require("react");
|
|
3590
|
-
var
|
|
3898
|
+
var import_jsx_runtime14 = require("react/jsx-runtime");
|
|
3591
3899
|
var inputStyle2 = {
|
|
3592
3900
|
backgroundColor: "#27272a",
|
|
3593
3901
|
border: "1px solid #3f3f46",
|
|
@@ -3618,9 +3926,9 @@ function ComposeMessageScreen({ nav }) {
|
|
|
3618
3926
|
nav.pop();
|
|
3619
3927
|
}
|
|
3620
3928
|
};
|
|
3621
|
-
return /* @__PURE__ */ (0,
|
|
3622
|
-
/* @__PURE__ */ (0,
|
|
3623
|
-
/* @__PURE__ */ (0,
|
|
3929
|
+
return /* @__PURE__ */ (0, import_jsx_runtime14.jsxs)("div", { children: [
|
|
3930
|
+
/* @__PURE__ */ (0, import_jsx_runtime14.jsxs)("div", { style: { marginBottom: 20 }, children: [
|
|
3931
|
+
/* @__PURE__ */ (0, import_jsx_runtime14.jsx)(
|
|
3624
3932
|
"div",
|
|
3625
3933
|
{
|
|
3626
3934
|
style: {
|
|
@@ -3632,9 +3940,9 @@ function ComposeMessageScreen({ nav }) {
|
|
|
3632
3940
|
children: "New Message"
|
|
3633
3941
|
}
|
|
3634
3942
|
),
|
|
3635
|
-
/* @__PURE__ */ (0,
|
|
3943
|
+
/* @__PURE__ */ (0, import_jsx_runtime14.jsx)("div", { style: { fontSize: 14, color: colors.textMuted }, children: "Send a message to the QA team" })
|
|
3636
3944
|
] }),
|
|
3637
|
-
/* @__PURE__ */ (0,
|
|
3945
|
+
/* @__PURE__ */ (0, import_jsx_runtime14.jsxs)(
|
|
3638
3946
|
"div",
|
|
3639
3947
|
{
|
|
3640
3948
|
style: {
|
|
@@ -3644,7 +3952,7 @@ function ComposeMessageScreen({ nav }) {
|
|
|
3644
3952
|
border: `1px solid ${colors.border}`
|
|
3645
3953
|
},
|
|
3646
3954
|
children: [
|
|
3647
|
-
/* @__PURE__ */ (0,
|
|
3955
|
+
/* @__PURE__ */ (0, import_jsx_runtime14.jsx)(
|
|
3648
3956
|
"label",
|
|
3649
3957
|
{
|
|
3650
3958
|
style: {
|
|
@@ -3657,7 +3965,7 @@ function ComposeMessageScreen({ nav }) {
|
|
|
3657
3965
|
children: "Subject"
|
|
3658
3966
|
}
|
|
3659
3967
|
),
|
|
3660
|
-
/* @__PURE__ */ (0,
|
|
3968
|
+
/* @__PURE__ */ (0, import_jsx_runtime14.jsx)(
|
|
3661
3969
|
"input",
|
|
3662
3970
|
{
|
|
3663
3971
|
type: "text",
|
|
@@ -3672,7 +3980,7 @@ function ComposeMessageScreen({ nav }) {
|
|
|
3672
3980
|
}
|
|
3673
3981
|
}
|
|
3674
3982
|
),
|
|
3675
|
-
/* @__PURE__ */ (0,
|
|
3983
|
+
/* @__PURE__ */ (0, import_jsx_runtime14.jsx)(
|
|
3676
3984
|
"label",
|
|
3677
3985
|
{
|
|
3678
3986
|
style: {
|
|
@@ -3686,7 +3994,7 @@ function ComposeMessageScreen({ nav }) {
|
|
|
3686
3994
|
children: "Message"
|
|
3687
3995
|
}
|
|
3688
3996
|
),
|
|
3689
|
-
/* @__PURE__ */ (0,
|
|
3997
|
+
/* @__PURE__ */ (0, import_jsx_runtime14.jsx)(
|
|
3690
3998
|
"textarea",
|
|
3691
3999
|
{
|
|
3692
4000
|
value: message,
|
|
@@ -3705,7 +4013,7 @@ function ComposeMessageScreen({ nav }) {
|
|
|
3705
4013
|
}
|
|
3706
4014
|
}
|
|
3707
4015
|
),
|
|
3708
|
-
/* @__PURE__ */ (0,
|
|
4016
|
+
/* @__PURE__ */ (0, import_jsx_runtime14.jsx)(
|
|
3709
4017
|
ImagePickerButtons,
|
|
3710
4018
|
{
|
|
3711
4019
|
images: images.images,
|
|
@@ -3716,7 +4024,7 @@ function ComposeMessageScreen({ nav }) {
|
|
|
3716
4024
|
label: "Attachments (optional)"
|
|
3717
4025
|
}
|
|
3718
4026
|
),
|
|
3719
|
-
/* @__PURE__ */ (0,
|
|
4027
|
+
/* @__PURE__ */ (0, import_jsx_runtime14.jsx)(
|
|
3720
4028
|
"button",
|
|
3721
4029
|
{
|
|
3722
4030
|
style: {
|
|
@@ -3745,7 +4053,7 @@ function ComposeMessageScreen({ nav }) {
|
|
|
3745
4053
|
|
|
3746
4054
|
// src/widget/screens/ProfileScreen.tsx
|
|
3747
4055
|
var import_react12 = require("react");
|
|
3748
|
-
var
|
|
4056
|
+
var import_jsx_runtime15 = require("react/jsx-runtime");
|
|
3749
4057
|
function ProfileScreen({ nav }) {
|
|
3750
4058
|
const { testerInfo, assignments, updateTesterProfile, refreshTesterInfo } = useBugBear();
|
|
3751
4059
|
const [editing, setEditing] = (0, import_react12.useState)(false);
|
|
@@ -3765,6 +4073,7 @@ function ProfileScreen({ nav }) {
|
|
|
3765
4073
|
}
|
|
3766
4074
|
}, [testerInfo]);
|
|
3767
4075
|
const handleSave = async () => {
|
|
4076
|
+
if (saving) return;
|
|
3768
4077
|
setSaving(true);
|
|
3769
4078
|
const updates = {
|
|
3770
4079
|
name: name.trim(),
|
|
@@ -3791,22 +4100,22 @@ function ProfileScreen({ nav }) {
|
|
|
3791
4100
|
}
|
|
3792
4101
|
};
|
|
3793
4102
|
if (saved) {
|
|
3794
|
-
return /* @__PURE__ */ (0,
|
|
3795
|
-
/* @__PURE__ */ (0,
|
|
3796
|
-
/* @__PURE__ */ (0,
|
|
4103
|
+
return /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)("div", { style: styles4.emptyState, children: [
|
|
4104
|
+
/* @__PURE__ */ (0, import_jsx_runtime15.jsx)("span", { style: styles4.emptyEmoji, children: "\u2705" }),
|
|
4105
|
+
/* @__PURE__ */ (0, import_jsx_runtime15.jsx)("span", { style: styles4.emptyTitle, children: "Profile saved!" })
|
|
3797
4106
|
] });
|
|
3798
4107
|
}
|
|
3799
4108
|
if (!testerInfo) {
|
|
3800
|
-
return /* @__PURE__ */ (0,
|
|
3801
|
-
/* @__PURE__ */ (0,
|
|
3802
|
-
/* @__PURE__ */ (0,
|
|
4109
|
+
return /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)("div", { style: styles4.emptyState, children: [
|
|
4110
|
+
/* @__PURE__ */ (0, import_jsx_runtime15.jsx)("span", { style: styles4.emptyEmoji, children: "\u{1F464}" }),
|
|
4111
|
+
/* @__PURE__ */ (0, import_jsx_runtime15.jsx)("span", { style: styles4.emptyTitle, children: "No profile found" })
|
|
3803
4112
|
] });
|
|
3804
4113
|
}
|
|
3805
4114
|
if (editing) {
|
|
3806
|
-
return /* @__PURE__ */ (0,
|
|
3807
|
-
/* @__PURE__ */ (0,
|
|
3808
|
-
/* @__PURE__ */ (0,
|
|
3809
|
-
/* @__PURE__ */ (0,
|
|
4115
|
+
return /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)("div", { children: [
|
|
4116
|
+
/* @__PURE__ */ (0, import_jsx_runtime15.jsxs)("div", { style: styles4.editHeader, children: [
|
|
4117
|
+
/* @__PURE__ */ (0, import_jsx_runtime15.jsx)("span", { style: styles4.editTitle, children: "Edit Profile" }),
|
|
4118
|
+
/* @__PURE__ */ (0, import_jsx_runtime15.jsx)(
|
|
3810
4119
|
"button",
|
|
3811
4120
|
{
|
|
3812
4121
|
style: styles4.cancelButton,
|
|
@@ -3818,9 +4127,9 @@ function ProfileScreen({ nav }) {
|
|
|
3818
4127
|
}
|
|
3819
4128
|
)
|
|
3820
4129
|
] }),
|
|
3821
|
-
/* @__PURE__ */ (0,
|
|
3822
|
-
/* @__PURE__ */ (0,
|
|
3823
|
-
/* @__PURE__ */ (0,
|
|
4130
|
+
/* @__PURE__ */ (0, import_jsx_runtime15.jsxs)("div", { style: styles4.field, children: [
|
|
4131
|
+
/* @__PURE__ */ (0, import_jsx_runtime15.jsx)("label", { style: styles4.label, children: "Name" }),
|
|
4132
|
+
/* @__PURE__ */ (0, import_jsx_runtime15.jsx)(
|
|
3824
4133
|
"input",
|
|
3825
4134
|
{
|
|
3826
4135
|
style: styles4.input,
|
|
@@ -3830,15 +4139,15 @@ function ProfileScreen({ nav }) {
|
|
|
3830
4139
|
}
|
|
3831
4140
|
)
|
|
3832
4141
|
] }),
|
|
3833
|
-
/* @__PURE__ */ (0,
|
|
3834
|
-
/* @__PURE__ */ (0,
|
|
3835
|
-
/* @__PURE__ */ (0,
|
|
4142
|
+
/* @__PURE__ */ (0, import_jsx_runtime15.jsxs)("div", { style: styles4.field, children: [
|
|
4143
|
+
/* @__PURE__ */ (0, import_jsx_runtime15.jsx)("label", { style: styles4.label, children: "Primary Email" }),
|
|
4144
|
+
/* @__PURE__ */ (0, import_jsx_runtime15.jsx)("span", { style: styles4.emailFixed, children: testerInfo.email })
|
|
3836
4145
|
] }),
|
|
3837
|
-
/* @__PURE__ */ (0,
|
|
3838
|
-
/* @__PURE__ */ (0,
|
|
3839
|
-
additionalEmails.map((email) => /* @__PURE__ */ (0,
|
|
3840
|
-
/* @__PURE__ */ (0,
|
|
3841
|
-
/* @__PURE__ */ (0,
|
|
4146
|
+
/* @__PURE__ */ (0, import_jsx_runtime15.jsxs)("div", { style: styles4.field, children: [
|
|
4147
|
+
/* @__PURE__ */ (0, import_jsx_runtime15.jsx)("label", { style: styles4.label, children: "Additional Emails" }),
|
|
4148
|
+
additionalEmails.map((email) => /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)("div", { style: styles4.emailRow, children: [
|
|
4149
|
+
/* @__PURE__ */ (0, import_jsx_runtime15.jsx)("span", { style: styles4.emailText, children: email }),
|
|
4150
|
+
/* @__PURE__ */ (0, import_jsx_runtime15.jsx)(
|
|
3842
4151
|
"button",
|
|
3843
4152
|
{
|
|
3844
4153
|
style: styles4.removeEmailButton,
|
|
@@ -3847,8 +4156,8 @@ function ProfileScreen({ nav }) {
|
|
|
3847
4156
|
}
|
|
3848
4157
|
)
|
|
3849
4158
|
] }, email)),
|
|
3850
|
-
/* @__PURE__ */ (0,
|
|
3851
|
-
/* @__PURE__ */ (0,
|
|
4159
|
+
/* @__PURE__ */ (0, import_jsx_runtime15.jsxs)("div", { style: styles4.addEmailRow, children: [
|
|
4160
|
+
/* @__PURE__ */ (0, import_jsx_runtime15.jsx)(
|
|
3852
4161
|
"input",
|
|
3853
4162
|
{
|
|
3854
4163
|
style: { ...styles4.input, flex: 1, marginRight: 8 },
|
|
@@ -3861,18 +4170,18 @@ function ProfileScreen({ nav }) {
|
|
|
3861
4170
|
}
|
|
3862
4171
|
}
|
|
3863
4172
|
),
|
|
3864
|
-
/* @__PURE__ */ (0,
|
|
4173
|
+
/* @__PURE__ */ (0, import_jsx_runtime15.jsx)("button", { style: styles4.addButton, onClick: handleAddEmail, children: "Add" })
|
|
3865
4174
|
] })
|
|
3866
4175
|
] }),
|
|
3867
|
-
/* @__PURE__ */ (0,
|
|
3868
|
-
/* @__PURE__ */ (0,
|
|
3869
|
-
/* @__PURE__ */ (0,
|
|
4176
|
+
/* @__PURE__ */ (0, import_jsx_runtime15.jsxs)("div", { style: styles4.field, children: [
|
|
4177
|
+
/* @__PURE__ */ (0, import_jsx_runtime15.jsx)("label", { style: styles4.label, children: "Testing Platforms" }),
|
|
4178
|
+
/* @__PURE__ */ (0, import_jsx_runtime15.jsx)("div", { style: styles4.platformRow, children: [
|
|
3870
4179
|
{ key: "ios", label: "\u{1F4F1} iOS" },
|
|
3871
4180
|
{ key: "android", label: "\u{1F916} Android" },
|
|
3872
4181
|
{ key: "web", label: "\u{1F310} Web" }
|
|
3873
4182
|
].map(({ key, label }) => {
|
|
3874
4183
|
const isActive = platforms.includes(key);
|
|
3875
|
-
return /* @__PURE__ */ (0,
|
|
4184
|
+
return /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(
|
|
3876
4185
|
"button",
|
|
3877
4186
|
{
|
|
3878
4187
|
style: {
|
|
@@ -3882,13 +4191,13 @@ function ProfileScreen({ nav }) {
|
|
|
3882
4191
|
onClick: () => setPlatforms(
|
|
3883
4192
|
(prev) => prev.includes(key) ? prev.filter((p) => p !== key) : [...prev, key]
|
|
3884
4193
|
),
|
|
3885
|
-
children: /* @__PURE__ */ (0,
|
|
4194
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime15.jsx)("span", { style: isActive ? styles4.platformTextActive : styles4.platformText, children: label })
|
|
3886
4195
|
},
|
|
3887
4196
|
key
|
|
3888
4197
|
);
|
|
3889
4198
|
}) })
|
|
3890
4199
|
] }),
|
|
3891
|
-
/* @__PURE__ */ (0,
|
|
4200
|
+
/* @__PURE__ */ (0, import_jsx_runtime15.jsx)(
|
|
3892
4201
|
"button",
|
|
3893
4202
|
{
|
|
3894
4203
|
style: { ...styles4.primaryButton, marginTop: 20 },
|
|
@@ -3899,45 +4208,45 @@ function ProfileScreen({ nav }) {
|
|
|
3899
4208
|
)
|
|
3900
4209
|
] });
|
|
3901
4210
|
}
|
|
3902
|
-
return /* @__PURE__ */ (0,
|
|
3903
|
-
/* @__PURE__ */ (0,
|
|
3904
|
-
/* @__PURE__ */ (0,
|
|
3905
|
-
/* @__PURE__ */ (0,
|
|
3906
|
-
/* @__PURE__ */ (0,
|
|
4211
|
+
return /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)("div", { children: [
|
|
4212
|
+
/* @__PURE__ */ (0, import_jsx_runtime15.jsxs)("div", { style: styles4.profileCard, children: [
|
|
4213
|
+
/* @__PURE__ */ (0, import_jsx_runtime15.jsx)("div", { style: styles4.avatar, children: /* @__PURE__ */ (0, import_jsx_runtime15.jsx)("span", { style: styles4.avatarText, children: testerInfo.name.charAt(0).toUpperCase() }) }),
|
|
4214
|
+
/* @__PURE__ */ (0, import_jsx_runtime15.jsx)("span", { style: styles4.profileName, children: testerInfo.name }),
|
|
4215
|
+
/* @__PURE__ */ (0, import_jsx_runtime15.jsx)("span", { style: styles4.profileEmail, children: testerInfo.email })
|
|
3907
4216
|
] }),
|
|
3908
|
-
/* @__PURE__ */ (0,
|
|
3909
|
-
/* @__PURE__ */ (0,
|
|
3910
|
-
/* @__PURE__ */ (0,
|
|
3911
|
-
/* @__PURE__ */ (0,
|
|
4217
|
+
/* @__PURE__ */ (0, import_jsx_runtime15.jsxs)("div", { style: styles4.statsRow, children: [
|
|
4218
|
+
/* @__PURE__ */ (0, import_jsx_runtime15.jsxs)("div", { style: styles4.statItem, children: [
|
|
4219
|
+
/* @__PURE__ */ (0, import_jsx_runtime15.jsx)("span", { style: styles4.statNumber, children: completedCount }),
|
|
4220
|
+
/* @__PURE__ */ (0, import_jsx_runtime15.jsx)("span", { style: styles4.statLabel, children: "Completed" })
|
|
3912
4221
|
] }),
|
|
3913
|
-
/* @__PURE__ */ (0,
|
|
3914
|
-
/* @__PURE__ */ (0,
|
|
3915
|
-
/* @__PURE__ */ (0,
|
|
3916
|
-
/* @__PURE__ */ (0,
|
|
4222
|
+
/* @__PURE__ */ (0, import_jsx_runtime15.jsx)("div", { style: styles4.statDivider }),
|
|
4223
|
+
/* @__PURE__ */ (0, import_jsx_runtime15.jsxs)("div", { style: styles4.statItem, children: [
|
|
4224
|
+
/* @__PURE__ */ (0, import_jsx_runtime15.jsx)("span", { style: styles4.statNumber, children: assignments.length }),
|
|
4225
|
+
/* @__PURE__ */ (0, import_jsx_runtime15.jsx)("span", { style: styles4.statLabel, children: "Total Assigned" })
|
|
3917
4226
|
] })
|
|
3918
4227
|
] }),
|
|
3919
|
-
/* @__PURE__ */ (0,
|
|
4228
|
+
/* @__PURE__ */ (0, import_jsx_runtime15.jsx)(
|
|
3920
4229
|
"button",
|
|
3921
4230
|
{
|
|
3922
4231
|
style: styles4.detailsToggle,
|
|
3923
4232
|
onClick: () => setShowDetails(!showDetails),
|
|
3924
|
-
children: /* @__PURE__ */ (0,
|
|
4233
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)("span", { style: styles4.detailsToggleText, children: [
|
|
3925
4234
|
showDetails ? "\u25BC" : "\u25B6",
|
|
3926
4235
|
" Details"
|
|
3927
4236
|
] })
|
|
3928
4237
|
}
|
|
3929
4238
|
),
|
|
3930
|
-
showDetails && /* @__PURE__ */ (0,
|
|
3931
|
-
additionalEmails.length > 0 && /* @__PURE__ */ (0,
|
|
3932
|
-
/* @__PURE__ */ (0,
|
|
3933
|
-
additionalEmails.map((e) => /* @__PURE__ */ (0,
|
|
4239
|
+
showDetails && /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)("div", { style: styles4.detailsSection, children: [
|
|
4240
|
+
additionalEmails.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)("div", { style: styles4.detailBlock, children: [
|
|
4241
|
+
/* @__PURE__ */ (0, import_jsx_runtime15.jsx)("span", { style: styles4.detailLabel, children: "Additional Emails" }),
|
|
4242
|
+
additionalEmails.map((e) => /* @__PURE__ */ (0, import_jsx_runtime15.jsx)("span", { style: styles4.detailValue, children: e }, e))
|
|
3934
4243
|
] }),
|
|
3935
|
-
platforms.length > 0 && /* @__PURE__ */ (0,
|
|
3936
|
-
/* @__PURE__ */ (0,
|
|
3937
|
-
/* @__PURE__ */ (0,
|
|
4244
|
+
platforms.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)("div", { style: styles4.detailBlock, children: [
|
|
4245
|
+
/* @__PURE__ */ (0, import_jsx_runtime15.jsx)("span", { style: styles4.detailLabel, children: "Platforms" }),
|
|
4246
|
+
/* @__PURE__ */ (0, import_jsx_runtime15.jsx)("div", { style: styles4.platformTags, children: platforms.map((p) => /* @__PURE__ */ (0, import_jsx_runtime15.jsx)("span", { style: styles4.platformTag, children: /* @__PURE__ */ (0, import_jsx_runtime15.jsx)("span", { style: styles4.platformTagText, children: p === "ios" ? "\u{1F4F1} iOS" : p === "android" ? "\u{1F916} Android" : "\u{1F310} Web" }) }, p)) })
|
|
3938
4247
|
] })
|
|
3939
4248
|
] }),
|
|
3940
|
-
/* @__PURE__ */ (0,
|
|
4249
|
+
/* @__PURE__ */ (0, import_jsx_runtime15.jsx)(
|
|
3941
4250
|
"button",
|
|
3942
4251
|
{
|
|
3943
4252
|
style: { ...styles4.primaryButton, marginTop: 20 },
|
|
@@ -4221,7 +4530,7 @@ var styles4 = {
|
|
|
4221
4530
|
|
|
4222
4531
|
// src/widget/screens/IssueListScreen.tsx
|
|
4223
4532
|
var import_react13 = require("react");
|
|
4224
|
-
var
|
|
4533
|
+
var import_jsx_runtime16 = require("react/jsx-runtime");
|
|
4225
4534
|
var CATEGORY_CONFIG = {
|
|
4226
4535
|
open: { label: "Open Issues", accent: "#f97316", emptyIcon: "\u2705", emptyText: "No open issues" },
|
|
4227
4536
|
done: { label: "Done", accent: "#22c55e", emptyIcon: "\u{1F389}", emptyText: "No completed issues yet" },
|
|
@@ -4242,11 +4551,21 @@ function IssueListScreen({ nav, category }) {
|
|
|
4242
4551
|
let cancelled = false;
|
|
4243
4552
|
setLoading(true);
|
|
4244
4553
|
(async () => {
|
|
4245
|
-
if (!client)
|
|
4246
|
-
const data = await client.getIssues(category);
|
|
4247
|
-
if (!cancelled) {
|
|
4248
|
-
setIssues(data);
|
|
4554
|
+
if (!client) {
|
|
4249
4555
|
setLoading(false);
|
|
4556
|
+
return;
|
|
4557
|
+
}
|
|
4558
|
+
try {
|
|
4559
|
+
const data = await client.getIssues(category);
|
|
4560
|
+
if (!cancelled) {
|
|
4561
|
+
setIssues(data);
|
|
4562
|
+
}
|
|
4563
|
+
} catch (err) {
|
|
4564
|
+
console.error("BugBear: Failed to load issues", err);
|
|
4565
|
+
} finally {
|
|
4566
|
+
if (!cancelled) {
|
|
4567
|
+
setLoading(false);
|
|
4568
|
+
}
|
|
4250
4569
|
}
|
|
4251
4570
|
})();
|
|
4252
4571
|
return () => {
|
|
@@ -4254,15 +4573,15 @@ function IssueListScreen({ nav, category }) {
|
|
|
4254
4573
|
};
|
|
4255
4574
|
}, [client, category]);
|
|
4256
4575
|
if (loading) {
|
|
4257
|
-
return /* @__PURE__ */ (0,
|
|
4576
|
+
return /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(IssueListScreenSkeleton, {});
|
|
4258
4577
|
}
|
|
4259
4578
|
if (issues.length === 0) {
|
|
4260
|
-
return /* @__PURE__ */ (0,
|
|
4261
|
-
/* @__PURE__ */ (0,
|
|
4262
|
-
/* @__PURE__ */ (0,
|
|
4579
|
+
return /* @__PURE__ */ (0, import_jsx_runtime16.jsxs)("div", { style: { padding: "40px 0", textAlign: "center" }, children: [
|
|
4580
|
+
/* @__PURE__ */ (0, import_jsx_runtime16.jsx)("div", { style: { fontSize: 36, marginBottom: 8 }, children: config.emptyIcon }),
|
|
4581
|
+
/* @__PURE__ */ (0, import_jsx_runtime16.jsx)("div", { style: { color: colors.textMuted, fontSize: 14 }, children: config.emptyText })
|
|
4263
4582
|
] });
|
|
4264
4583
|
}
|
|
4265
|
-
return /* @__PURE__ */ (0,
|
|
4584
|
+
return /* @__PURE__ */ (0, import_jsx_runtime16.jsx)("div", { children: issues.map((issue) => /* @__PURE__ */ (0, import_jsx_runtime16.jsxs)(
|
|
4266
4585
|
"div",
|
|
4267
4586
|
{
|
|
4268
4587
|
role: "button",
|
|
@@ -4281,8 +4600,8 @@ function IssueListScreen({ nav, category }) {
|
|
|
4281
4600
|
userSelect: "none"
|
|
4282
4601
|
},
|
|
4283
4602
|
children: [
|
|
4284
|
-
/* @__PURE__ */ (0,
|
|
4285
|
-
issue.severity && /* @__PURE__ */ (0,
|
|
4603
|
+
/* @__PURE__ */ (0, import_jsx_runtime16.jsxs)("div", { style: { display: "flex", alignItems: "flex-start", gap: 8 }, children: [
|
|
4604
|
+
issue.severity && /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(
|
|
4286
4605
|
"span",
|
|
4287
4606
|
{
|
|
4288
4607
|
style: {
|
|
@@ -4295,7 +4614,7 @@ function IssueListScreen({ nav, category }) {
|
|
|
4295
4614
|
}
|
|
4296
4615
|
}
|
|
4297
4616
|
),
|
|
4298
|
-
/* @__PURE__ */ (0,
|
|
4617
|
+
/* @__PURE__ */ (0, import_jsx_runtime16.jsx)("span", { style: {
|
|
4299
4618
|
fontSize: 13,
|
|
4300
4619
|
fontWeight: 600,
|
|
4301
4620
|
color: colors.textPrimary,
|
|
@@ -4305,11 +4624,11 @@ function IssueListScreen({ nav, category }) {
|
|
|
4305
4624
|
whiteSpace: "nowrap"
|
|
4306
4625
|
}, children: issue.title })
|
|
4307
4626
|
] }),
|
|
4308
|
-
/* @__PURE__ */ (0,
|
|
4309
|
-
issue.route && /* @__PURE__ */ (0,
|
|
4310
|
-
/* @__PURE__ */ (0,
|
|
4627
|
+
/* @__PURE__ */ (0, import_jsx_runtime16.jsxs)("div", { style: { display: "flex", justifyContent: "space-between", marginTop: 6 }, children: [
|
|
4628
|
+
issue.route && /* @__PURE__ */ (0, import_jsx_runtime16.jsx)("span", { style: { fontSize: 11, color: colors.textDim, maxWidth: "60%", overflow: "hidden", textOverflow: "ellipsis", whiteSpace: "nowrap" }, children: issue.route }),
|
|
4629
|
+
/* @__PURE__ */ (0, import_jsx_runtime16.jsx)("span", { style: { fontSize: 11, color: colors.textDim, marginLeft: "auto" }, children: formatRelativeTime(issue.updatedAt) })
|
|
4311
4630
|
] }),
|
|
4312
|
-
category === "done" && issue.verifiedByName && /* @__PURE__ */ (0,
|
|
4631
|
+
category === "done" && issue.verifiedByName && /* @__PURE__ */ (0, import_jsx_runtime16.jsxs)("div", { style: {
|
|
4313
4632
|
display: "inline-flex",
|
|
4314
4633
|
alignItems: "center",
|
|
4315
4634
|
gap: 4,
|
|
@@ -4325,7 +4644,7 @@ function IssueListScreen({ nav, category }) {
|
|
|
4325
4644
|
"\u2714 Verified by ",
|
|
4326
4645
|
issue.verifiedByName
|
|
4327
4646
|
] }),
|
|
4328
|
-
category === "reopened" && issue.originalBugTitle && /* @__PURE__ */ (0,
|
|
4647
|
+
category === "reopened" && issue.originalBugTitle && /* @__PURE__ */ (0, import_jsx_runtime16.jsxs)("div", { style: {
|
|
4329
4648
|
display: "inline-flex",
|
|
4330
4649
|
alignItems: "center",
|
|
4331
4650
|
gap: 4,
|
|
@@ -4352,7 +4671,7 @@ function IssueListScreen({ nav, category }) {
|
|
|
4352
4671
|
}
|
|
4353
4672
|
|
|
4354
4673
|
// src/widget/screens/IssueDetailScreen.tsx
|
|
4355
|
-
var
|
|
4674
|
+
var import_jsx_runtime17 = require("react/jsx-runtime");
|
|
4356
4675
|
var STATUS_LABELS = {
|
|
4357
4676
|
new: { label: "New", bg: "#1e3a5f", color: "#60a5fa" },
|
|
4358
4677
|
triaging: { label: "Triaging", bg: "#1e3a5f", color: "#60a5fa" },
|
|
@@ -4376,9 +4695,9 @@ var SEVERITY_CONFIG = {
|
|
|
4376
4695
|
function IssueDetailScreen({ nav, issue }) {
|
|
4377
4696
|
const statusConfig = STATUS_LABELS[issue.status] || { label: issue.status, bg: "#27272a", color: "#a1a1aa" };
|
|
4378
4697
|
const severityConfig = issue.severity ? SEVERITY_CONFIG[issue.severity] : null;
|
|
4379
|
-
return /* @__PURE__ */ (0,
|
|
4380
|
-
/* @__PURE__ */ (0,
|
|
4381
|
-
/* @__PURE__ */ (0,
|
|
4698
|
+
return /* @__PURE__ */ (0, import_jsx_runtime17.jsxs)("div", { children: [
|
|
4699
|
+
/* @__PURE__ */ (0, import_jsx_runtime17.jsxs)("div", { style: { display: "flex", gap: 8, flexWrap: "wrap", marginBottom: 12 }, children: [
|
|
4700
|
+
/* @__PURE__ */ (0, import_jsx_runtime17.jsx)("span", { style: {
|
|
4382
4701
|
backgroundColor: statusConfig.bg,
|
|
4383
4702
|
color: statusConfig.color,
|
|
4384
4703
|
fontSize: 11,
|
|
@@ -4386,7 +4705,7 @@ function IssueDetailScreen({ nav, issue }) {
|
|
|
4386
4705
|
padding: "3px 10px",
|
|
4387
4706
|
borderRadius: 6
|
|
4388
4707
|
}, children: statusConfig.label }),
|
|
4389
|
-
severityConfig && /* @__PURE__ */ (0,
|
|
4708
|
+
severityConfig && /* @__PURE__ */ (0, import_jsx_runtime17.jsx)("span", { style: {
|
|
4390
4709
|
backgroundColor: severityConfig.bg,
|
|
4391
4710
|
color: severityConfig.color,
|
|
4392
4711
|
fontSize: 11,
|
|
@@ -4395,9 +4714,9 @@ function IssueDetailScreen({ nav, issue }) {
|
|
|
4395
4714
|
borderRadius: 6
|
|
4396
4715
|
}, children: severityConfig.label })
|
|
4397
4716
|
] }),
|
|
4398
|
-
/* @__PURE__ */ (0,
|
|
4399
|
-
issue.route && /* @__PURE__ */ (0,
|
|
4400
|
-
issue.description && /* @__PURE__ */ (0,
|
|
4717
|
+
/* @__PURE__ */ (0, import_jsx_runtime17.jsx)("h3", { style: { fontSize: 16, fontWeight: 700, color: colors.textPrimary, margin: "0 0 8px 0", lineHeight: 1.3 }, children: issue.title }),
|
|
4718
|
+
issue.route && /* @__PURE__ */ (0, import_jsx_runtime17.jsx)("div", { style: { fontSize: 12, color: colors.textDim, marginBottom: 12 }, children: issue.route }),
|
|
4719
|
+
issue.description && /* @__PURE__ */ (0, import_jsx_runtime17.jsx)("div", { style: {
|
|
4401
4720
|
backgroundColor: colors.card,
|
|
4402
4721
|
border: `1px solid ${colors.border}`,
|
|
4403
4722
|
borderRadius: 8,
|
|
@@ -4409,56 +4728,56 @@ function IssueDetailScreen({ nav, issue }) {
|
|
|
4409
4728
|
whiteSpace: "pre-wrap",
|
|
4410
4729
|
wordBreak: "break-word"
|
|
4411
4730
|
}, children: issue.description }),
|
|
4412
|
-
issue.verifiedByName && /* @__PURE__ */ (0,
|
|
4731
|
+
issue.verifiedByName && /* @__PURE__ */ (0, import_jsx_runtime17.jsxs)("div", { style: {
|
|
4413
4732
|
backgroundColor: "#14532d",
|
|
4414
4733
|
border: "1px solid #166534",
|
|
4415
4734
|
borderRadius: 8,
|
|
4416
4735
|
padding: 12,
|
|
4417
4736
|
marginBottom: 12
|
|
4418
4737
|
}, children: [
|
|
4419
|
-
/* @__PURE__ */ (0,
|
|
4420
|
-
/* @__PURE__ */ (0,
|
|
4421
|
-
/* @__PURE__ */ (0,
|
|
4738
|
+
/* @__PURE__ */ (0, import_jsx_runtime17.jsxs)("div", { style: { display: "flex", alignItems: "center", gap: 8, marginBottom: 4 }, children: [
|
|
4739
|
+
/* @__PURE__ */ (0, import_jsx_runtime17.jsx)("span", { style: { fontSize: 16 }, children: "\u2705" }),
|
|
4740
|
+
/* @__PURE__ */ (0, import_jsx_runtime17.jsx)("span", { style: { fontSize: 13, fontWeight: 600, color: "#4ade80" }, children: "Retesting Proof" })
|
|
4422
4741
|
] }),
|
|
4423
|
-
/* @__PURE__ */ (0,
|
|
4742
|
+
/* @__PURE__ */ (0, import_jsx_runtime17.jsxs)("div", { style: { fontSize: 12, color: "#86efac" }, children: [
|
|
4424
4743
|
"Verified by ",
|
|
4425
|
-
/* @__PURE__ */ (0,
|
|
4426
|
-
issue.verifiedAt && /* @__PURE__ */ (0,
|
|
4744
|
+
/* @__PURE__ */ (0, import_jsx_runtime17.jsx)("strong", { children: issue.verifiedByName }),
|
|
4745
|
+
issue.verifiedAt && /* @__PURE__ */ (0, import_jsx_runtime17.jsxs)("span", { children: [
|
|
4427
4746
|
" on ",
|
|
4428
4747
|
new Date(issue.verifiedAt).toLocaleDateString(void 0, { month: "short", day: "numeric", year: "numeric" })
|
|
4429
4748
|
] })
|
|
4430
4749
|
] })
|
|
4431
4750
|
] }),
|
|
4432
|
-
issue.originalBugTitle && /* @__PURE__ */ (0,
|
|
4751
|
+
issue.originalBugTitle && /* @__PURE__ */ (0, import_jsx_runtime17.jsxs)("div", { style: {
|
|
4433
4752
|
backgroundColor: "#422006",
|
|
4434
4753
|
border: "1px solid #854d0e",
|
|
4435
4754
|
borderRadius: 8,
|
|
4436
4755
|
padding: 12,
|
|
4437
4756
|
marginBottom: 12
|
|
4438
4757
|
}, children: [
|
|
4439
|
-
/* @__PURE__ */ (0,
|
|
4440
|
-
/* @__PURE__ */ (0,
|
|
4441
|
-
/* @__PURE__ */ (0,
|
|
4758
|
+
/* @__PURE__ */ (0, import_jsx_runtime17.jsxs)("div", { style: { display: "flex", alignItems: "center", gap: 8, marginBottom: 4 }, children: [
|
|
4759
|
+
/* @__PURE__ */ (0, import_jsx_runtime17.jsx)("span", { style: { fontSize: 16 }, children: "\u{1F504}" }),
|
|
4760
|
+
/* @__PURE__ */ (0, import_jsx_runtime17.jsx)("span", { style: { fontSize: 13, fontWeight: 600, color: "#fbbf24" }, children: "Original Bug" })
|
|
4442
4761
|
] }),
|
|
4443
|
-
/* @__PURE__ */ (0,
|
|
4762
|
+
/* @__PURE__ */ (0, import_jsx_runtime17.jsxs)("div", { style: { fontSize: 12, color: "#fde68a" }, children: [
|
|
4444
4763
|
"Retest of: ",
|
|
4445
|
-
/* @__PURE__ */ (0,
|
|
4764
|
+
/* @__PURE__ */ (0, import_jsx_runtime17.jsx)("strong", { children: issue.originalBugTitle })
|
|
4446
4765
|
] })
|
|
4447
4766
|
] }),
|
|
4448
|
-
issue.screenshotUrls && issue.screenshotUrls.length > 0 && /* @__PURE__ */ (0,
|
|
4449
|
-
/* @__PURE__ */ (0,
|
|
4767
|
+
issue.screenshotUrls && issue.screenshotUrls.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime17.jsxs)("div", { style: { marginBottom: 12 }, children: [
|
|
4768
|
+
/* @__PURE__ */ (0, import_jsx_runtime17.jsxs)("div", { style: { fontSize: 12, fontWeight: 600, color: colors.textMuted, marginBottom: 8 }, children: [
|
|
4450
4769
|
"Screenshots (",
|
|
4451
4770
|
issue.screenshotUrls.length,
|
|
4452
4771
|
")"
|
|
4453
4772
|
] }),
|
|
4454
|
-
/* @__PURE__ */ (0,
|
|
4773
|
+
/* @__PURE__ */ (0, import_jsx_runtime17.jsx)("div", { style: { display: "flex", gap: 8, overflowX: "auto" }, children: issue.screenshotUrls.map((url, i) => /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(
|
|
4455
4774
|
"a",
|
|
4456
4775
|
{
|
|
4457
4776
|
href: url,
|
|
4458
4777
|
target: "_blank",
|
|
4459
4778
|
rel: "noopener noreferrer",
|
|
4460
4779
|
style: { flexShrink: 0 },
|
|
4461
|
-
children: /* @__PURE__ */ (0,
|
|
4780
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(
|
|
4462
4781
|
"img",
|
|
4463
4782
|
{
|
|
4464
4783
|
src: url,
|
|
@@ -4476,16 +4795,16 @@ function IssueDetailScreen({ nav, issue }) {
|
|
|
4476
4795
|
i
|
|
4477
4796
|
)) })
|
|
4478
4797
|
] }),
|
|
4479
|
-
/* @__PURE__ */ (0,
|
|
4798
|
+
/* @__PURE__ */ (0, import_jsx_runtime17.jsxs)("div", { style: {
|
|
4480
4799
|
borderTop: `1px solid ${colors.border}`,
|
|
4481
4800
|
paddingTop: 12,
|
|
4482
4801
|
marginTop: 4
|
|
4483
4802
|
}, children: [
|
|
4484
|
-
issue.reporterName && /* @__PURE__ */ (0,
|
|
4803
|
+
issue.reporterName && /* @__PURE__ */ (0, import_jsx_runtime17.jsxs)("div", { style: { fontSize: 12, color: colors.textDim, marginBottom: 4 }, children: [
|
|
4485
4804
|
"Reported by ",
|
|
4486
4805
|
issue.reporterName
|
|
4487
4806
|
] }),
|
|
4488
|
-
/* @__PURE__ */ (0,
|
|
4807
|
+
/* @__PURE__ */ (0, import_jsx_runtime17.jsxs)("div", { style: { fontSize: 11, color: colors.textDim }, children: [
|
|
4489
4808
|
"Created ",
|
|
4490
4809
|
formatRelativeTime(issue.createdAt),
|
|
4491
4810
|
" \xB7 Updated ",
|
|
@@ -4499,9 +4818,9 @@ function IssueDetailScreen({ nav, issue }) {
|
|
|
4499
4818
|
var BUGBEAR_LOGO_BASE64 = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGAAAABgCAYAAADimHc4AAAAAXNSR0IArs4c6QAAAJhlWElmTU0AKgAAAAgABAEaAAUAAAABAAAAPgEbAAUAAAABAAAARgEoAAMAAAABAAIAAIdpAAQAAAABAAAATgAAAAAAAABIAAAAAQAAAEgAAAABAASQBAACAAAAFAAAAISgAQADAAAAAQABAACgAgAEAAAAAQAAAGCgAwAEAAAAAQAAAGAAAAAAMjAyNjowMToyNCAxNjoyMTozOABbbVCuAAAACXBIWXMAAAsTAAALEwEAmpwYAAACo2lUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iWE1QIENvcmUgNi4wLjAiPgogICA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPgogICAgICA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIgogICAgICAgICAgICB4bWxuczpJcHRjNHhtcEV4dD0iaHR0cDovL2lwdGMub3JnL3N0ZC9JcHRjNHhtcEV4dC8yMDA4LTAyLTI5LyIKICAgICAgICAgICAgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIj4KICAgICAgICAgPElwdGM0eG1wRXh0OkRpZ2l0YWxTb3VyY2VUeXBlPmh0dHA6Ly9jdi5pcHRjLm9yZy9uZXdzY29kZXMvZGlnaXRhbHNvdXJjZXR5cGUvdHJhaW5lZEFsZ29yaXRobWljTWVkaWE8L0lwdGM0eG1wRXh0OkRpZ2l0YWxTb3VyY2VUeXBlPgogICAgICAgICA8SXB0YzR4bXBFeHQ6RGlnSW1hZ2VHVUlEPmZjNzJlN2Q2LTYyYTEtNDE1ZS04MjY5LWM2NjA4MjY0OWRiMDwvSXB0YzR4bXBFeHQ6RGlnSW1hZ2VHVUlEPgogICAgICAgICA8eG1wOkNyZWF0ZURhdGU+MjAyNi0wMS0yNFQxNjoyMTozODwveG1wOkNyZWF0ZURhdGU+CiAgICAgIDwvcmRmOkRlc2NyaXB0aW9uPgogICA8L3JkZjpSREY+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";
|
|
4500
4819
|
|
|
4501
4820
|
// src/BugBearPanel.tsx
|
|
4502
|
-
var
|
|
4821
|
+
var import_jsx_runtime18 = require("react/jsx-runtime");
|
|
4503
4822
|
function BugBearIcon({ size = 24 }) {
|
|
4504
|
-
return /* @__PURE__ */ (0,
|
|
4823
|
+
return /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(
|
|
4505
4824
|
"img",
|
|
4506
4825
|
{
|
|
4507
4826
|
src: BUGBEAR_LOGO_BASE64,
|
|
@@ -4666,37 +4985,37 @@ function BugBearPanel({
|
|
|
4666
4985
|
const renderScreen = () => {
|
|
4667
4986
|
switch (currentScreen.name) {
|
|
4668
4987
|
case "HOME":
|
|
4669
|
-
return /* @__PURE__ */ (0,
|
|
4988
|
+
return /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(HomeScreen, { nav });
|
|
4670
4989
|
case "TEST_DETAIL":
|
|
4671
|
-
return /* @__PURE__ */ (0,
|
|
4990
|
+
return /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(TestDetailScreen, { testId: currentScreen.testId, nav });
|
|
4672
4991
|
case "TEST_LIST":
|
|
4673
|
-
return /* @__PURE__ */ (0,
|
|
4992
|
+
return /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(TestListScreen, { nav });
|
|
4674
4993
|
case "TEST_FEEDBACK":
|
|
4675
|
-
return /* @__PURE__ */ (0,
|
|
4994
|
+
return /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(TestFeedbackScreen, { status: currentScreen.status, assignmentId: currentScreen.assignmentId, nav });
|
|
4676
4995
|
case "REPORT":
|
|
4677
|
-
return /* @__PURE__ */ (0,
|
|
4996
|
+
return /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(ReportScreen, { nav, prefill: currentScreen.prefill });
|
|
4678
4997
|
case "REPORT_SUCCESS":
|
|
4679
|
-
return /* @__PURE__ */ (0,
|
|
4998
|
+
return /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(ReportSuccessScreen, { nav });
|
|
4680
4999
|
case "MESSAGE_LIST":
|
|
4681
|
-
return /* @__PURE__ */ (0,
|
|
5000
|
+
return /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(MessageListScreen, { nav });
|
|
4682
5001
|
case "THREAD_DETAIL":
|
|
4683
|
-
return /* @__PURE__ */ (0,
|
|
5002
|
+
return /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(ThreadDetailScreen, { thread: currentScreen.thread, nav });
|
|
4684
5003
|
case "COMPOSE_MESSAGE":
|
|
4685
|
-
return /* @__PURE__ */ (0,
|
|
5004
|
+
return /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(ComposeMessageScreen, { nav });
|
|
4686
5005
|
case "ISSUE_LIST":
|
|
4687
|
-
return /* @__PURE__ */ (0,
|
|
5006
|
+
return /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(IssueListScreen, { nav, category: currentScreen.category });
|
|
4688
5007
|
case "ISSUE_DETAIL":
|
|
4689
|
-
return /* @__PURE__ */ (0,
|
|
5008
|
+
return /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(IssueDetailScreen, { nav, issue: currentScreen.issue });
|
|
4690
5009
|
case "PROFILE":
|
|
4691
|
-
return /* @__PURE__ */ (0,
|
|
5010
|
+
return /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(ProfileScreen, { nav });
|
|
4692
5011
|
default:
|
|
4693
|
-
return /* @__PURE__ */ (0,
|
|
5012
|
+
return /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(HomeScreen, { nav });
|
|
4694
5013
|
}
|
|
4695
5014
|
};
|
|
4696
5015
|
if (typeof document === "undefined") return null;
|
|
4697
5016
|
const headerTitle = getHeaderTitle();
|
|
4698
5017
|
return (0, import_react_dom.createPortal)(
|
|
4699
|
-
/* @__PURE__ */ (0,
|
|
5018
|
+
/* @__PURE__ */ (0, import_jsx_runtime18.jsxs)(
|
|
4700
5019
|
"div",
|
|
4701
5020
|
{
|
|
4702
5021
|
ref: panelRef,
|
|
@@ -4715,7 +5034,7 @@ function BugBearPanel({
|
|
|
4715
5034
|
},
|
|
4716
5035
|
onMouseDown: handleMouseDown,
|
|
4717
5036
|
children: [
|
|
4718
|
-
collapsed && /* @__PURE__ */ (0,
|
|
5037
|
+
collapsed && /* @__PURE__ */ (0, import_jsx_runtime18.jsxs)(
|
|
4719
5038
|
"button",
|
|
4720
5039
|
{
|
|
4721
5040
|
onClick: () => setCollapsed(false),
|
|
@@ -4737,9 +5056,9 @@ function BugBearPanel({
|
|
|
4737
5056
|
fontWeight: 500
|
|
4738
5057
|
},
|
|
4739
5058
|
children: [
|
|
4740
|
-
/* @__PURE__ */ (0,
|
|
4741
|
-
/* @__PURE__ */ (0,
|
|
4742
|
-
badgeCount > 0 && /* @__PURE__ */ (0,
|
|
5059
|
+
/* @__PURE__ */ (0, import_jsx_runtime18.jsx)(BugBearIcon, { size: 24 }),
|
|
5060
|
+
/* @__PURE__ */ (0, import_jsx_runtime18.jsx)("span", { children: "BugBear" }),
|
|
5061
|
+
badgeCount > 0 && /* @__PURE__ */ (0, import_jsx_runtime18.jsx)("span", { style: {
|
|
4743
5062
|
backgroundColor: "#fff",
|
|
4744
5063
|
color: colors.blue,
|
|
4745
5064
|
fontSize: "0.75rem",
|
|
@@ -4750,7 +5069,7 @@ function BugBearPanel({
|
|
|
4750
5069
|
]
|
|
4751
5070
|
}
|
|
4752
5071
|
),
|
|
4753
|
-
!collapsed && /* @__PURE__ */ (0,
|
|
5072
|
+
!collapsed && /* @__PURE__ */ (0, import_jsx_runtime18.jsxs)("div", { style: {
|
|
4754
5073
|
width: PANEL_WIDTH,
|
|
4755
5074
|
backgroundColor: colors.bg,
|
|
4756
5075
|
borderRadius: 12,
|
|
@@ -4758,7 +5077,7 @@ function BugBearPanel({
|
|
|
4758
5077
|
overflow: "hidden",
|
|
4759
5078
|
boxShadow: "0 25px 50px -12px rgba(0,0,0,0.5)"
|
|
4760
5079
|
}, children: [
|
|
4761
|
-
/* @__PURE__ */ (0,
|
|
5080
|
+
/* @__PURE__ */ (0, import_jsx_runtime18.jsxs)(
|
|
4762
5081
|
"div",
|
|
4763
5082
|
{
|
|
4764
5083
|
"data-drag-handle": true,
|
|
@@ -4774,7 +5093,7 @@ function BugBearPanel({
|
|
|
4774
5093
|
cursor: draggable ? isDragging ? "grabbing" : "grab" : "default"
|
|
4775
5094
|
},
|
|
4776
5095
|
children: [
|
|
4777
|
-
/* @__PURE__ */ (0,
|
|
5096
|
+
/* @__PURE__ */ (0, import_jsx_runtime18.jsx)("div", { style: { display: "flex", alignItems: "center", gap: 8, flex: 1, minWidth: 0 }, children: canGoBack ? /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(
|
|
4778
5097
|
"button",
|
|
4779
5098
|
{
|
|
4780
5099
|
onClick: pop,
|
|
@@ -4790,14 +5109,14 @@ function BugBearPanel({
|
|
|
4790
5109
|
},
|
|
4791
5110
|
children: "\u2190 Back"
|
|
4792
5111
|
}
|
|
4793
|
-
) : /* @__PURE__ */ (0,
|
|
4794
|
-
/* @__PURE__ */ (0,
|
|
4795
|
-
/* @__PURE__ */ (0,
|
|
4796
|
-
/* @__PURE__ */ (0,
|
|
4797
|
-
/* @__PURE__ */ (0,
|
|
4798
|
-
draggable && /* @__PURE__ */ (0,
|
|
5112
|
+
) : /* @__PURE__ */ (0, import_jsx_runtime18.jsxs)(import_jsx_runtime18.Fragment, { children: [
|
|
5113
|
+
/* @__PURE__ */ (0, import_jsx_runtime18.jsx)(BugBearIcon, { size: 28 }),
|
|
5114
|
+
/* @__PURE__ */ (0, import_jsx_runtime18.jsxs)("div", { children: [
|
|
5115
|
+
/* @__PURE__ */ (0, import_jsx_runtime18.jsxs)("div", { style: { display: "flex", alignItems: "center", gap: 8 }, children: [
|
|
5116
|
+
/* @__PURE__ */ (0, import_jsx_runtime18.jsx)("span", { style: { fontWeight: 600, fontSize: "0.875rem" }, children: "BugBear" }),
|
|
5117
|
+
draggable && /* @__PURE__ */ (0, import_jsx_runtime18.jsx)("span", { style: { color: colors.textMuted, fontSize: "0.75rem" }, title: "Drag to move, double-click to reset", children: "\u22EE\u22EE" })
|
|
4799
5118
|
] }),
|
|
4800
|
-
testerInfo && /* @__PURE__ */ (0,
|
|
5119
|
+
testerInfo && /* @__PURE__ */ (0, import_jsx_runtime18.jsxs)(
|
|
4801
5120
|
"button",
|
|
4802
5121
|
{
|
|
4803
5122
|
onClick: () => push({ name: "PROFILE" }),
|
|
@@ -4815,13 +5134,13 @@ function BugBearPanel({
|
|
|
4815
5134
|
},
|
|
4816
5135
|
children: [
|
|
4817
5136
|
testerInfo.name,
|
|
4818
|
-
/* @__PURE__ */ (0,
|
|
5137
|
+
/* @__PURE__ */ (0, import_jsx_runtime18.jsx)("span", { style: { fontSize: "0.625rem" }, children: "\u270E" })
|
|
4819
5138
|
]
|
|
4820
5139
|
}
|
|
4821
5140
|
)
|
|
4822
5141
|
] })
|
|
4823
5142
|
] }) }),
|
|
4824
|
-
headerTitle ? /* @__PURE__ */ (0,
|
|
5143
|
+
headerTitle ? /* @__PURE__ */ (0, import_jsx_runtime18.jsx)("span", { style: {
|
|
4825
5144
|
fontSize: "0.8125rem",
|
|
4826
5145
|
fontWeight: 600,
|
|
4827
5146
|
color: colors.textSecondary,
|
|
@@ -4831,7 +5150,7 @@ function BugBearPanel({
|
|
|
4831
5150
|
textOverflow: "ellipsis",
|
|
4832
5151
|
whiteSpace: "nowrap"
|
|
4833
5152
|
}, children: headerTitle }) : null,
|
|
4834
|
-
/* @__PURE__ */ (0,
|
|
5153
|
+
/* @__PURE__ */ (0, import_jsx_runtime18.jsx)(
|
|
4835
5154
|
"button",
|
|
4836
5155
|
{
|
|
4837
5156
|
onClick: handleClose,
|
|
@@ -4855,13 +5174,13 @@ function BugBearPanel({
|
|
|
4855
5174
|
]
|
|
4856
5175
|
}
|
|
4857
5176
|
),
|
|
4858
|
-
/* @__PURE__ */ (0,
|
|
5177
|
+
/* @__PURE__ */ (0, import_jsx_runtime18.jsx)("div", { style: {
|
|
4859
5178
|
padding: 16,
|
|
4860
5179
|
maxHeight: 400,
|
|
4861
5180
|
overflowY: "auto",
|
|
4862
5181
|
backgroundColor: colors.bg,
|
|
4863
5182
|
color: colors.textSecondary
|
|
4864
|
-
}, children: isLoading ? /* @__PURE__ */ (0,
|
|
5183
|
+
}, children: isLoading ? /* @__PURE__ */ (0, import_jsx_runtime18.jsx)("div", { style: { padding: "60px 0", textAlign: "center" }, children: /* @__PURE__ */ (0, import_jsx_runtime18.jsx)("div", { style: { color: colors.textMuted, fontSize: "0.875rem" }, children: "Loading..." }) }) : renderScreen() })
|
|
4865
5184
|
] })
|
|
4866
5185
|
]
|
|
4867
5186
|
}
|
|
@@ -4873,7 +5192,7 @@ function BugBearPanel({
|
|
|
4873
5192
|
// src/BugBearErrorBoundary.tsx
|
|
4874
5193
|
var import_react15 = require("react");
|
|
4875
5194
|
var import_core2 = require("@bbearai/core");
|
|
4876
|
-
var
|
|
5195
|
+
var import_jsx_runtime19 = require("react/jsx-runtime");
|
|
4877
5196
|
var BugBearErrorBoundary = class extends import_react15.Component {
|
|
4878
5197
|
constructor(props) {
|
|
4879
5198
|
super(props);
|
|
@@ -4918,7 +5237,7 @@ var BugBearErrorBoundary = class extends import_react15.Component {
|
|
|
4918
5237
|
if (fallback) {
|
|
4919
5238
|
return fallback;
|
|
4920
5239
|
}
|
|
4921
|
-
return /* @__PURE__ */ (0,
|
|
5240
|
+
return /* @__PURE__ */ (0, import_jsx_runtime19.jsxs)(
|
|
4922
5241
|
"div",
|
|
4923
5242
|
{
|
|
4924
5243
|
style: {
|
|
@@ -4930,13 +5249,13 @@ var BugBearErrorBoundary = class extends import_react15.Component {
|
|
|
4930
5249
|
fontFamily: '-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif'
|
|
4931
5250
|
},
|
|
4932
5251
|
children: [
|
|
4933
|
-
/* @__PURE__ */ (0,
|
|
4934
|
-
/* @__PURE__ */ (0,
|
|
4935
|
-
/* @__PURE__ */ (0,
|
|
5252
|
+
/* @__PURE__ */ (0, import_jsx_runtime19.jsxs)("div", { style: { display: "flex", alignItems: "center", gap: "8px", marginBottom: "12px" }, children: [
|
|
5253
|
+
/* @__PURE__ */ (0, import_jsx_runtime19.jsx)("img", { src: BUGBEAR_LOGO_BASE64, alt: "BugBear", width: 28, height: 28, style: { objectFit: "contain" } }),
|
|
5254
|
+
/* @__PURE__ */ (0, import_jsx_runtime19.jsx)("h3", { style: { margin: 0, color: "#991b1b", fontSize: "16px" }, children: "Something went wrong" })
|
|
4936
5255
|
] }),
|
|
4937
|
-
/* @__PURE__ */ (0,
|
|
4938
|
-
/* @__PURE__ */ (0,
|
|
4939
|
-
/* @__PURE__ */ (0,
|
|
5256
|
+
/* @__PURE__ */ (0, import_jsx_runtime19.jsx)("p", { style: { color: "#7f1d1d", fontSize: "14px", margin: "0 0 12px 0" }, children: error.message }),
|
|
5257
|
+
/* @__PURE__ */ (0, import_jsx_runtime19.jsxs)("div", { style: { display: "flex", gap: "8px" }, children: [
|
|
5258
|
+
/* @__PURE__ */ (0, import_jsx_runtime19.jsx)(
|
|
4940
5259
|
"button",
|
|
4941
5260
|
{
|
|
4942
5261
|
onClick: this.reset,
|
|
@@ -4953,7 +5272,7 @@ var BugBearErrorBoundary = class extends import_react15.Component {
|
|
|
4953
5272
|
children: "Try Again"
|
|
4954
5273
|
}
|
|
4955
5274
|
),
|
|
4956
|
-
/* @__PURE__ */ (0,
|
|
5275
|
+
/* @__PURE__ */ (0, import_jsx_runtime19.jsx)(
|
|
4957
5276
|
"button",
|
|
4958
5277
|
{
|
|
4959
5278
|
onClick: () => window.location.reload(),
|
|
@@ -4971,7 +5290,7 @@ var BugBearErrorBoundary = class extends import_react15.Component {
|
|
|
4971
5290
|
}
|
|
4972
5291
|
)
|
|
4973
5292
|
] }),
|
|
4974
|
-
/* @__PURE__ */ (0,
|
|
5293
|
+
/* @__PURE__ */ (0, import_jsx_runtime19.jsx)("p", { style: { color: "#9ca3af", fontSize: "12px", marginTop: "12px" }, children: "The error has been captured by BugBear" })
|
|
4975
5294
|
]
|
|
4976
5295
|
}
|
|
4977
5296
|
);
|