@bbearai/react 0.4.6 → 0.5.1

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.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
- }, 3e4);
262
- return () => clearInterval(interval);
263
- }, [client, isTester, isQAEnabled, refreshThreads, refreshIssueCounts]);
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, dashboardUrl, 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, import_jsx_runtime2.jsxs)("div", { children: [
446
- pendingCount > 0 ? /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(
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, import_jsx_runtime2.jsx)("span", { style: { fontSize: 48, fontWeight: 700, color: colors.blueLight }, children: pendingCount }),
469
- /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("span", { style: { fontSize: 16, color: colors.blueText, marginTop: 2 }, children: [
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, import_jsx_runtime2.jsxs)(
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, import_jsx_runtime2.jsx)("span", { style: { fontSize: 14, fontWeight: 600, color: colors.blue, marginTop: 12 }, children: "Start Testing \u2192" })
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, import_jsx_runtime2.jsxs)(
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, import_jsx_runtime2.jsx)("span", { style: { fontSize: 48, fontWeight: 700, color: colors.blueLight }, children: unreadCount }),
524
- /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("span", { style: { fontSize: 16, color: colors.blueText, marginTop: 2 }, children: [
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, import_jsx_runtime2.jsx)("span", { style: { fontSize: 14, fontWeight: 600, color: colors.blue, marginTop: 12 }, children: "View Messages \u2192" })
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, import_jsx_runtime2.jsxs)(
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, import_jsx_runtime2.jsx)("span", { style: { fontSize: 36, marginBottom: 8 }, children: "\u2705" }),
546
- /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("span", { style: { fontSize: 18, fontWeight: 600, color: colors.textPrimary }, children: "All caught up!" }),
547
- totalTests > 0 && /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("span", { style: { fontSize: 14, color: colors.textMuted, marginTop: 4 }, children: [
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, import_jsx_runtime2.jsxs)(
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, import_jsx_runtime2.jsxs)(
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, import_jsx_runtime2.jsx)("span", { style: { fontSize: 28, marginBottom: 8 }, children: "\u2705" }),
589
- /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("span", { style: { fontSize: 14, fontWeight: 500, color: colors.textPrimary }, children: "Tests" }),
590
- pendingCount > 0 && /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
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, import_jsx_runtime2.jsxs)(
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, import_jsx_runtime2.jsx)("span", { style: { fontSize: 28, marginBottom: 8 }, children: "\u{1F41B}" }),
639
- /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("span", { style: { fontSize: 14, fontWeight: 500, color: colors.textPrimary }, children: "Report Bug" })
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, import_jsx_runtime2.jsxs)(
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, import_jsx_runtime2.jsx)("span", { style: { fontSize: 28, marginBottom: 8 }, children: "\u{1F4A1}" }),
666
- /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("span", { style: { fontSize: 14, fontWeight: 500, color: colors.textPrimary }, children: "Feedback" })
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, import_jsx_runtime2.jsxs)(
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, import_jsx_runtime2.jsx)("span", { style: { fontSize: 28, marginBottom: 8 }, children: "\u{1F4AC}" }),
693
- /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("span", { style: { fontSize: 14, fontWeight: 500, color: colors.textPrimary }, children: "Messages" }),
694
- unreadCount > 0 && /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
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, import_jsx_runtime2.jsxs)("div", { style: { display: "grid", gridTemplateColumns: "1fr 1fr 1fr", gap: 10, marginBottom: 20 }, children: [
724
- /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(
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, import_jsx_runtime2.jsx)("span", { style: { fontSize: 22, fontWeight: 700, color: "#f97316" }, children: issueCounts.open }),
747
- /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("span", { style: { fontSize: 11, fontWeight: 600, color: "#a1a1aa", marginTop: 2 }, children: "Open" })
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, import_jsx_runtime2.jsxs)(
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, import_jsx_runtime2.jsx)("span", { style: { fontSize: 22, fontWeight: 700, color: "#22c55e" }, children: issueCounts.done }),
774
- /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("span", { style: { fontSize: 11, fontWeight: 600, color: "#a1a1aa", marginTop: 2 }, children: "Done" })
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, import_jsx_runtime2.jsxs)(
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, import_jsx_runtime2.jsx)("span", { style: { fontSize: 22, fontWeight: 700, color: "#ef4444" }, children: issueCounts.reopened }),
801
- /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("span", { style: { fontSize: 11, fontWeight: 600, color: "#a1a1aa", marginTop: 2 }, children: "Reopened" })
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, import_jsx_runtime2.jsxs)("div", { style: { marginBottom: 16 }, children: [
807
- /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
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, import_jsx_runtime2.jsx)(
989
+ children: /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
818
990
  "div",
819
991
  {
820
992
  style: {
@@ -828,14 +1000,41 @@ function HomeScreen({ nav }) {
828
1000
  )
829
1001
  }
830
1002
  ),
831
- /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { style: { fontSize: 12, color: colors.textMuted, textAlign: "center" }, children: [
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, import_jsx_runtime2.jsx)("div", { style: { display: "flex", justifyContent: "center", padding: "8px 0" }, children: /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
1010
+ dashboardUrl && /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)(
1011
+ "a",
1012
+ {
1013
+ href: dashboardUrl,
1014
+ target: "_blank",
1015
+ rel: "noopener noreferrer",
1016
+ style: {
1017
+ display: "flex",
1018
+ alignItems: "center",
1019
+ backgroundColor: colors.card,
1020
+ border: `1px solid ${colors.border}`,
1021
+ borderRadius: 12,
1022
+ padding: 14,
1023
+ marginBottom: 16,
1024
+ textDecoration: "none",
1025
+ cursor: "pointer"
1026
+ },
1027
+ children: [
1028
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("span", { style: { fontSize: 22, marginRight: 12 }, children: "\u{1F310}" }),
1029
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)("span", { style: { flex: 1 }, children: [
1030
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("span", { style: { display: "block", fontSize: 14, fontWeight: 600, color: colors.textPrimary }, children: "Open Dashboard" }),
1031
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("span", { style: { display: "block", fontSize: 12, color: colors.textMuted, marginTop: 2 }, children: "View analytics, history & more" })
1032
+ ] }),
1033
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("span", { style: { fontSize: 16, color: colors.textMuted, marginLeft: 8 }, children: "\u2192" })
1034
+ ]
1035
+ }
1036
+ ),
1037
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("div", { style: { display: "flex", justifyContent: "center", padding: "8px 0" }, children: /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
839
1038
  "button",
840
1039
  {
841
1040
  type: "button",
@@ -860,7 +1059,7 @@ function HomeScreen({ nav }) {
860
1059
 
861
1060
  // src/widget/screens/TestDetailScreen.tsx
862
1061
  var import_react4 = require("react");
863
- var import_jsx_runtime3 = require("react/jsx-runtime");
1062
+ var import_jsx_runtime4 = require("react/jsx-runtime");
864
1063
  function TestDetailScreen({ testId, nav }) {
865
1064
  const { client, assignments, currentAssignment, refreshAssignments, onNavigate } = useBugBear();
866
1065
  const displayedAssignment = testId ? assignments.find((a) => a.id === testId) || currentAssignment : currentAssignment;
@@ -925,6 +1124,37 @@ function TestDetailScreen({ testId, nav }) {
925
1124
  setIsSubmitting(false);
926
1125
  }
927
1126
  }, [client, displayedAssignment, refreshAssignments, nav, isSubmitting]);
1127
+ const handleReopen = (0, import_react4.useCallback)(async () => {
1128
+ if (!client || !displayedAssignment || isSubmitting) return;
1129
+ setIsSubmitting(true);
1130
+ try {
1131
+ await client.reopenAssignment(displayedAssignment.id);
1132
+ await refreshAssignments();
1133
+ } finally {
1134
+ setIsSubmitting(false);
1135
+ }
1136
+ }, [client, displayedAssignment, refreshAssignments, isSubmitting]);
1137
+ const handleChangeResult = (0, import_react4.useCallback)(async (newStatus) => {
1138
+ if (!client || !displayedAssignment || isSubmitting) return;
1139
+ setIsSubmitting(true);
1140
+ try {
1141
+ await client.reopenAssignment(displayedAssignment.id);
1142
+ await client.updateAssignmentStatus(displayedAssignment.id, newStatus);
1143
+ await refreshAssignments();
1144
+ if (newStatus === "failed") {
1145
+ nav.replace({
1146
+ name: "REPORT",
1147
+ prefill: {
1148
+ type: "test_fail",
1149
+ assignmentId: displayedAssignment.id,
1150
+ testCaseId: displayedAssignment.testCase.id
1151
+ }
1152
+ });
1153
+ }
1154
+ } finally {
1155
+ setIsSubmitting(false);
1156
+ }
1157
+ }, [client, displayedAssignment, refreshAssignments, nav, isSubmitting]);
928
1158
  const handleSkip = (0, import_react4.useCallback)(async () => {
929
1159
  if (!client || !displayedAssignment || !selectedSkipReason) return;
930
1160
  setSkipping(true);
@@ -948,7 +1178,7 @@ function TestDetailScreen({ testId, nav }) {
948
1178
  }
949
1179
  }, [client, displayedAssignment, selectedSkipReason, skipNotes, refreshAssignments, assignments, nav]);
950
1180
  if (!displayedAssignment) {
951
- return /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)(
1181
+ return /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)(
952
1182
  "div",
953
1183
  {
954
1184
  style: {
@@ -959,10 +1189,10 @@ function TestDetailScreen({ testId, nav }) {
959
1189
  padding: 40
960
1190
  },
961
1191
  children: [
962
- /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("span", { style: { fontSize: 48, marginBottom: 12 }, children: "\u2705" }),
963
- /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("span", { style: { fontSize: 18, fontWeight: 600, color: colors.textPrimary, marginBottom: 4 }, children: "No tests assigned" }),
964
- /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("span", { style: { fontSize: 14, color: colors.textMuted, marginBottom: 20 }, children: "Check back later for new tests" }),
965
- /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
1192
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("span", { style: { fontSize: 48, marginBottom: 12 }, children: "\u2705" }),
1193
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("span", { style: { fontSize: 18, fontWeight: 600, color: colors.textPrimary, marginBottom: 4 }, children: "No tests assigned" }),
1194
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("span", { style: { fontSize: 14, color: colors.textMuted, marginBottom: 20 }, children: "Check back later for new tests" }),
1195
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
966
1196
  "button",
967
1197
  {
968
1198
  type: "button",
@@ -995,8 +1225,8 @@ function TestDetailScreen({ testId, nav }) {
995
1225
  { reason: "dependency", label: "\u{1F517} Needs another test first" },
996
1226
  { reason: "other", label: "\u{1F4DD} Other reason" }
997
1227
  ];
998
- return /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)("div", { style: { paddingBottom: 16 }, children: [
999
- /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)(
1228
+ return /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)("div", { style: { paddingBottom: 16 }, children: [
1229
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)(
1000
1230
  "div",
1001
1231
  {
1002
1232
  style: {
@@ -1006,14 +1236,14 @@ function TestDetailScreen({ testId, nav }) {
1006
1236
  marginBottom: 12
1007
1237
  },
1008
1238
  children: [
1009
- /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)("div", { style: { display: "flex", alignItems: "center", gap: 8 }, children: [
1010
- /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)("span", { style: { fontSize: 13, color: colors.textMuted }, children: [
1239
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)("div", { style: { display: "flex", alignItems: "center", gap: 8 }, children: [
1240
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)("span", { style: { fontSize: 13, color: colors.textMuted }, children: [
1011
1241
  "Test ",
1012
1242
  currentIndex + 1,
1013
1243
  " of ",
1014
1244
  allTests.length
1015
1245
  ] }),
1016
- displayedAssignment.status === "in_progress" && assignmentElapsedTime > 0 && /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
1246
+ displayedAssignment.status === "in_progress" && assignmentElapsedTime > 0 && /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
1017
1247
  "span",
1018
1248
  {
1019
1249
  style: {
@@ -1032,7 +1262,7 @@ function TestDetailScreen({ testId, nav }) {
1032
1262
  }
1033
1263
  )
1034
1264
  ] }),
1035
- /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
1265
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
1036
1266
  "button",
1037
1267
  {
1038
1268
  type: "button",
@@ -1052,7 +1282,7 @@ function TestDetailScreen({ testId, nav }) {
1052
1282
  ]
1053
1283
  }
1054
1284
  ),
1055
- displayedAssignment.isVerification && /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)(
1285
+ displayedAssignment.isVerification && /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)(
1056
1286
  "div",
1057
1287
  {
1058
1288
  style: {
@@ -1066,14 +1296,14 @@ function TestDetailScreen({ testId, nav }) {
1066
1296
  marginBottom: 10
1067
1297
  },
1068
1298
  children: [
1069
- /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("span", { style: { fontSize: 14 }, children: "\u{1F504}" }),
1070
- /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("span", { style: { fontSize: 13, fontWeight: 600, color: "#fbbf24" }, children: "Retest" }),
1071
- /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("span", { style: { fontSize: 12, color: "#d97706" }, children: "\u2014 Verify bug fix" })
1299
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("span", { style: { fontSize: 14 }, children: "\u{1F504}" }),
1300
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("span", { style: { fontSize: 13, fontWeight: 600, color: "#fbbf24" }, children: "Retest" }),
1301
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("span", { style: { fontSize: 12, color: "#d97706" }, children: "\u2014 Verify bug fix" })
1072
1302
  ]
1073
1303
  }
1074
1304
  ),
1075
- /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("div", { style: { fontSize: 20, fontWeight: 700, color: colors.textPrimary, marginBottom: 4 }, children: testCase.title }),
1076
- testCase.testKey && /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
1305
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("div", { style: { fontSize: 20, fontWeight: 700, color: colors.textPrimary, marginBottom: 4 }, children: testCase.title }),
1306
+ testCase.testKey && /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
1077
1307
  "div",
1078
1308
  {
1079
1309
  style: {
@@ -1085,7 +1315,7 @@ function TestDetailScreen({ testId, nav }) {
1085
1315
  children: testCase.testKey
1086
1316
  }
1087
1317
  ),
1088
- /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
1318
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
1089
1319
  "button",
1090
1320
  {
1091
1321
  type: "button",
@@ -1101,7 +1331,7 @@ function TestDetailScreen({ testId, nav }) {
1101
1331
  cursor: "pointer",
1102
1332
  textAlign: "left"
1103
1333
  },
1104
- children: /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)("span", { style: { fontSize: 14, fontWeight: 500, color: colors.textSecondary }, children: [
1334
+ children: /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)("span", { style: { fontSize: 14, fontWeight: 500, color: colors.textSecondary }, children: [
1105
1335
  showSteps ? "\u25BC" : "\u25B6",
1106
1336
  " ",
1107
1337
  info.icon,
@@ -1110,9 +1340,9 @@ function TestDetailScreen({ testId, nav }) {
1110
1340
  ] })
1111
1341
  }
1112
1342
  ),
1113
- showSteps && /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)("div", { style: { marginBottom: 16 }, children: [
1114
- template === "steps" && steps.map((step, idx) => /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)("div", { style: { display: "flex", marginBottom: 10 }, children: [
1115
- /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
1343
+ showSteps && /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)("div", { style: { marginBottom: 16 }, children: [
1344
+ template === "steps" && steps.map((step, idx) => /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)("div", { style: { display: "flex", marginBottom: 10 }, children: [
1345
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
1116
1346
  "div",
1117
1347
  {
1118
1348
  style: {
@@ -1127,12 +1357,12 @@ function TestDetailScreen({ testId, nav }) {
1127
1357
  marginTop: 2,
1128
1358
  flexShrink: 0
1129
1359
  },
1130
- children: /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("span", { style: { fontSize: 12, fontWeight: 600, color: "#fff" }, children: step.stepNumber })
1360
+ children: /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("span", { style: { fontSize: 12, fontWeight: 600, color: "#fff" }, children: step.stepNumber })
1131
1361
  }
1132
1362
  ),
1133
- /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)("div", { style: { flex: 1 }, children: [
1134
- /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("span", { style: { fontSize: 14, color: colors.textPrimary, lineHeight: "20px" }, children: step.action }),
1135
- step.expectedResult && /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)(
1363
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)("div", { style: { flex: 1 }, children: [
1364
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("span", { style: { fontSize: 14, color: colors.textPrimary, lineHeight: "20px" }, children: step.action }),
1365
+ step.expectedResult && /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)(
1136
1366
  "div",
1137
1367
  {
1138
1368
  style: {
@@ -1149,8 +1379,8 @@ function TestDetailScreen({ testId, nav }) {
1149
1379
  )
1150
1380
  ] })
1151
1381
  ] }, idx)),
1152
- template === "checklist" && /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)(import_jsx_runtime3.Fragment, { children: [
1153
- steps.map((step, idx) => /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)(
1382
+ template === "checklist" && /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)(import_jsx_runtime4.Fragment, { children: [
1383
+ steps.map((step, idx) => /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)(
1154
1384
  "button",
1155
1385
  {
1156
1386
  type: "button",
@@ -1176,7 +1406,7 @@ function TestDetailScreen({ testId, nav }) {
1176
1406
  textAlign: "left"
1177
1407
  },
1178
1408
  children: [
1179
- /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
1409
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
1180
1410
  "div",
1181
1411
  {
1182
1412
  style: {
@@ -1191,10 +1421,10 @@ function TestDetailScreen({ testId, nav }) {
1191
1421
  alignItems: "center",
1192
1422
  flexShrink: 0
1193
1423
  },
1194
- children: criteriaResults[idx] === true && /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("span", { style: { color: "#fff", fontSize: 14, fontWeight: "bold" }, children: "\u2713" })
1424
+ children: criteriaResults[idx] === true && /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("span", { style: { color: "#fff", fontSize: 14, fontWeight: "bold" }, children: "\u2713" })
1195
1425
  }
1196
1426
  ),
1197
- /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
1427
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
1198
1428
  "span",
1199
1429
  {
1200
1430
  style: {
@@ -1210,7 +1440,7 @@ function TestDetailScreen({ testId, nav }) {
1210
1440
  },
1211
1441
  idx
1212
1442
  )),
1213
- Object.keys(criteriaResults).length > 0 && /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("div", { style: { display: "flex", justifyContent: "flex-end", paddingTop: 4 }, children: /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
1443
+ 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
1444
  "button",
1215
1445
  {
1216
1446
  type: "button",
@@ -1227,8 +1457,8 @@ function TestDetailScreen({ testId, nav }) {
1227
1457
  }
1228
1458
  ) })
1229
1459
  ] }),
1230
- template === "rubric" && steps.map((step, idx) => /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)("div", { style: { marginBottom: 14 }, children: [
1231
- /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)(
1460
+ template === "rubric" && steps.map((step, idx) => /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)("div", { style: { marginBottom: 14 }, children: [
1461
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)(
1232
1462
  "div",
1233
1463
  {
1234
1464
  style: {
@@ -1244,7 +1474,7 @@ function TestDetailScreen({ testId, nav }) {
1244
1474
  ]
1245
1475
  }
1246
1476
  ),
1247
- step.expectedResult && /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
1477
+ step.expectedResult && /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
1248
1478
  "div",
1249
1479
  {
1250
1480
  style: {
@@ -1256,8 +1486,8 @@ function TestDetailScreen({ testId, nav }) {
1256
1486
  children: step.expectedResult
1257
1487
  }
1258
1488
  ),
1259
- rubricMode === "pass_fail" ? /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)("div", { style: { display: "flex", gap: 8, marginLeft: 16 }, children: [
1260
- /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
1489
+ rubricMode === "pass_fail" ? /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)("div", { style: { display: "flex", gap: 8, marginLeft: 16 }, children: [
1490
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
1261
1491
  "button",
1262
1492
  {
1263
1493
  type: "button",
@@ -1278,7 +1508,7 @@ function TestDetailScreen({ testId, nav }) {
1278
1508
  children: "\u2713 Pass"
1279
1509
  }
1280
1510
  ),
1281
- /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
1511
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
1282
1512
  "button",
1283
1513
  {
1284
1514
  type: "button",
@@ -1299,7 +1529,7 @@ function TestDetailScreen({ testId, nav }) {
1299
1529
  children: "\u2717 Fail"
1300
1530
  }
1301
1531
  )
1302
- ] }) : /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("div", { style: { display: "flex", gap: 6, marginLeft: 16 }, children: [1, 2, 3, 4, 5].map((n) => /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
1532
+ ] }) : /* @__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
1533
  "button",
1304
1534
  {
1305
1535
  type: "button",
@@ -1323,7 +1553,7 @@ function TestDetailScreen({ testId, nav }) {
1323
1553
  n
1324
1554
  )) })
1325
1555
  ] }, idx)),
1326
- template === "freeform" && /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)(
1556
+ template === "freeform" && /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)(
1327
1557
  "div",
1328
1558
  {
1329
1559
  style: {
@@ -1333,15 +1563,15 @@ function TestDetailScreen({ testId, nav }) {
1333
1563
  border: "1px solid #854d0e"
1334
1564
  },
1335
1565
  children: [
1336
- /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("div", { style: { fontSize: 14, color: "#fde68a", marginBottom: 6 }, children: "Review the area and note:" }),
1337
- /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("div", { style: { fontSize: 13, color: "#fde68a", marginLeft: 8, marginBottom: 2 }, children: "\u2022 What works well" }),
1338
- /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("div", { style: { fontSize: 13, color: "#fde68a", marginLeft: 8, marginBottom: 2 }, children: "\u2022 Issues or concerns" }),
1339
- /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("div", { style: { fontSize: 13, color: "#fde68a", marginLeft: 8, marginBottom: 2 }, children: "\u2022 Suggestions" })
1566
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("div", { style: { fontSize: 14, color: "#fde68a", marginBottom: 6 }, children: "Review the area and note:" }),
1567
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("div", { style: { fontSize: 13, color: "#fde68a", marginLeft: 8, marginBottom: 2 }, children: "\u2022 What works well" }),
1568
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("div", { style: { fontSize: 13, color: "#fde68a", marginLeft: 8, marginBottom: 2 }, children: "\u2022 Issues or concerns" }),
1569
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("div", { style: { fontSize: 13, color: "#fde68a", marginLeft: 8, marginBottom: 2 }, children: "\u2022 Suggestions" })
1340
1570
  ]
1341
1571
  }
1342
1572
  )
1343
1573
  ] }),
1344
- testCase.expectedResult && /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)(
1574
+ testCase.expectedResult && /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)(
1345
1575
  "div",
1346
1576
  {
1347
1577
  style: {
@@ -1352,12 +1582,12 @@ function TestDetailScreen({ testId, nav }) {
1352
1582
  marginBottom: 12
1353
1583
  },
1354
1584
  children: [
1355
- /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("div", { style: { fontSize: 13, fontWeight: 600, color: colors.green, marginBottom: 4 }, children: "\u2705 Expected Result" }),
1356
- /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("div", { style: { fontSize: 14, color: "#bbf7d0", lineHeight: "20px" }, children: testCase.expectedResult })
1585
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("div", { style: { fontSize: 13, fontWeight: 600, color: colors.green, marginBottom: 4 }, children: "\u2705 Expected Result" }),
1586
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("div", { style: { fontSize: 14, color: "#bbf7d0", lineHeight: "20px" }, children: testCase.expectedResult })
1357
1587
  ]
1358
1588
  }
1359
1589
  ),
1360
- testCase.targetRoute && onNavigate && /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
1590
+ testCase.targetRoute && onNavigate && /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
1361
1591
  "button",
1362
1592
  {
1363
1593
  type: "button",
@@ -1379,7 +1609,7 @@ function TestDetailScreen({ testId, nav }) {
1379
1609
  children: "\u{1F9ED} Go to test location"
1380
1610
  }
1381
1611
  ),
1382
- /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)(
1612
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)(
1383
1613
  "button",
1384
1614
  {
1385
1615
  type: "button",
@@ -1403,7 +1633,7 @@ function TestDetailScreen({ testId, nav }) {
1403
1633
  ]
1404
1634
  }
1405
1635
  ),
1406
- showDetails && /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)(
1636
+ showDetails && /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)(
1407
1637
  "div",
1408
1638
  {
1409
1639
  style: {
@@ -1414,7 +1644,7 @@ function TestDetailScreen({ testId, nav }) {
1414
1644
  marginBottom: 16
1415
1645
  },
1416
1646
  children: [
1417
- testCase.testKey && /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)(
1647
+ testCase.testKey && /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)(
1418
1648
  "div",
1419
1649
  {
1420
1650
  style: {
@@ -1432,16 +1662,122 @@ function TestDetailScreen({ testId, nav }) {
1432
1662
  ]
1433
1663
  }
1434
1664
  ),
1435
- testCase.description && /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("div", { style: { fontSize: 13, color: colors.textSecondary, lineHeight: "18px" }, children: testCase.description }),
1436
- testCase.group && /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("div", { style: { marginTop: 8 }, children: /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)("span", { style: { fontSize: 12, color: colors.textMuted }, children: [
1665
+ testCase.description && /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("div", { style: { fontSize: 13, color: colors.textSecondary, lineHeight: "18px" }, children: testCase.description }),
1666
+ 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
1667
  "\u{1F4C1} ",
1438
1668
  testCase.group.name
1439
1669
  ] }) })
1440
1670
  ]
1441
1671
  }
1442
1672
  ),
1443
- /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)("div", { style: { display: "flex", gap: 10, marginTop: 8 }, children: [
1444
- /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
1673
+ displayedAssignment.status === "passed" || displayedAssignment.status === "failed" || displayedAssignment.status === "skipped" || displayedAssignment.status === "blocked" ? /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)(import_jsx_runtime4.Fragment, { children: [
1674
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)(
1675
+ "div",
1676
+ {
1677
+ style: {
1678
+ display: "flex",
1679
+ alignItems: "center",
1680
+ justifyContent: "center",
1681
+ gap: 6,
1682
+ padding: "8px 12px",
1683
+ borderRadius: 8,
1684
+ marginTop: 8,
1685
+ marginBottom: 8,
1686
+ backgroundColor: displayedAssignment.status === "passed" ? colors.greenDark : displayedAssignment.status === "failed" ? colors.redDark : colors.card,
1687
+ border: `1px solid ${displayedAssignment.status === "passed" ? colors.green : displayedAssignment.status === "failed" ? colors.red : colors.border}`
1688
+ },
1689
+ children: [
1690
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("span", { style: { fontSize: 14 }, children: displayedAssignment.status === "passed" ? "\u2705" : displayedAssignment.status === "failed" ? "\u274C" : displayedAssignment.status === "skipped" ? "\u23ED" : "\u{1F6AB}" }),
1691
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)(
1692
+ "span",
1693
+ {
1694
+ style: {
1695
+ fontSize: 13,
1696
+ fontWeight: 600,
1697
+ color: displayedAssignment.status === "passed" ? colors.green : displayedAssignment.status === "failed" ? "#fca5a5" : colors.textSecondary
1698
+ },
1699
+ children: [
1700
+ "Marked as ",
1701
+ displayedAssignment.status.charAt(0).toUpperCase() + displayedAssignment.status.slice(1)
1702
+ ]
1703
+ }
1704
+ )
1705
+ ]
1706
+ }
1707
+ ),
1708
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)("div", { style: { display: "flex", gap: 10, marginTop: 4 }, children: [
1709
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
1710
+ "button",
1711
+ {
1712
+ type: "button",
1713
+ onClick: handleReopen,
1714
+ disabled: isSubmitting,
1715
+ style: {
1716
+ flex: 1,
1717
+ paddingTop: 14,
1718
+ paddingBottom: 14,
1719
+ borderRadius: 12,
1720
+ textAlign: "center",
1721
+ backgroundColor: colors.card,
1722
+ border: `1px solid ${colors.blue}`,
1723
+ cursor: isSubmitting ? "not-allowed" : "pointer",
1724
+ fontSize: 14,
1725
+ fontWeight: 600,
1726
+ color: colors.blue,
1727
+ opacity: isSubmitting ? 0.5 : 1
1728
+ },
1729
+ children: isSubmitting ? "Reopening..." : "\u{1F504} Reopen Test"
1730
+ }
1731
+ ),
1732
+ displayedAssignment.status === "passed" && /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
1733
+ "button",
1734
+ {
1735
+ type: "button",
1736
+ onClick: () => handleChangeResult("failed"),
1737
+ disabled: isSubmitting,
1738
+ style: {
1739
+ flex: 1,
1740
+ paddingTop: 14,
1741
+ paddingBottom: 14,
1742
+ borderRadius: 12,
1743
+ textAlign: "center",
1744
+ backgroundColor: colors.redDark,
1745
+ border: `1px solid ${colors.red}`,
1746
+ cursor: isSubmitting ? "not-allowed" : "pointer",
1747
+ fontSize: 14,
1748
+ fontWeight: 600,
1749
+ color: "#fca5a5",
1750
+ opacity: isSubmitting ? 0.5 : 1
1751
+ },
1752
+ children: "Change to Fail"
1753
+ }
1754
+ ),
1755
+ displayedAssignment.status === "failed" && /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
1756
+ "button",
1757
+ {
1758
+ type: "button",
1759
+ onClick: () => handleChangeResult("passed"),
1760
+ disabled: isSubmitting,
1761
+ style: {
1762
+ flex: 1,
1763
+ paddingTop: 14,
1764
+ paddingBottom: 14,
1765
+ borderRadius: 12,
1766
+ textAlign: "center",
1767
+ backgroundColor: colors.greenDark,
1768
+ border: `1px solid ${colors.green}`,
1769
+ cursor: isSubmitting ? "not-allowed" : "pointer",
1770
+ fontSize: 14,
1771
+ fontWeight: 600,
1772
+ color: "#86efac",
1773
+ opacity: isSubmitting ? 0.5 : 1
1774
+ },
1775
+ children: "Change to Pass"
1776
+ }
1777
+ )
1778
+ ] })
1779
+ ] }) : /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)("div", { style: { display: "flex", gap: 10, marginTop: 8 }, children: [
1780
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
1445
1781
  "button",
1446
1782
  {
1447
1783
  type: "button",
@@ -1464,7 +1800,7 @@ function TestDetailScreen({ testId, nav }) {
1464
1800
  children: isSubmitting ? "Failing..." : "Fail"
1465
1801
  }
1466
1802
  ),
1467
- /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
1803
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
1468
1804
  "button",
1469
1805
  {
1470
1806
  type: "button",
@@ -1487,7 +1823,7 @@ function TestDetailScreen({ testId, nav }) {
1487
1823
  children: "Skip"
1488
1824
  }
1489
1825
  ),
1490
- /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
1826
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
1491
1827
  "button",
1492
1828
  {
1493
1829
  type: "button",
@@ -1511,7 +1847,7 @@ function TestDetailScreen({ testId, nav }) {
1511
1847
  }
1512
1848
  )
1513
1849
  ] }),
1514
- showSkipModal && /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
1850
+ showSkipModal && /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
1515
1851
  "div",
1516
1852
  {
1517
1853
  style: {
@@ -1524,7 +1860,7 @@ function TestDetailScreen({ testId, nav }) {
1524
1860
  zIndex: 9999,
1525
1861
  padding: 24
1526
1862
  },
1527
- children: /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)(
1863
+ children: /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)(
1528
1864
  "div",
1529
1865
  {
1530
1866
  style: {
@@ -1536,7 +1872,7 @@ function TestDetailScreen({ testId, nav }) {
1536
1872
  width: "100%"
1537
1873
  },
1538
1874
  children: [
1539
- /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
1875
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
1540
1876
  "div",
1541
1877
  {
1542
1878
  style: {
@@ -1548,8 +1884,8 @@ function TestDetailScreen({ testId, nav }) {
1548
1884
  children: "Skip this test?"
1549
1885
  }
1550
1886
  ),
1551
- /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("div", { style: { fontSize: 14, color: colors.textMuted, marginBottom: 12 }, children: "Select a reason:" }),
1552
- skipReasons.map(({ reason, label }) => /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
1887
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("div", { style: { fontSize: 14, color: colors.textMuted, marginBottom: 12 }, children: "Select a reason:" }),
1888
+ skipReasons.map(({ reason, label }) => /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
1553
1889
  "button",
1554
1890
  {
1555
1891
  type: "button",
@@ -1575,7 +1911,7 @@ function TestDetailScreen({ testId, nav }) {
1575
1911
  },
1576
1912
  reason
1577
1913
  )),
1578
- /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
1914
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
1579
1915
  "textarea",
1580
1916
  {
1581
1917
  value: skipNotes,
@@ -1598,8 +1934,8 @@ function TestDetailScreen({ testId, nav }) {
1598
1934
  }
1599
1935
  }
1600
1936
  ),
1601
- /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)("div", { style: { display: "flex", gap: 10, marginTop: 14 }, children: [
1602
- /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
1937
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)("div", { style: { display: "flex", gap: 10, marginTop: 14 }, children: [
1938
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
1603
1939
  "button",
1604
1940
  {
1605
1941
  type: "button",
@@ -1623,7 +1959,7 @@ function TestDetailScreen({ testId, nav }) {
1623
1959
  children: "Cancel"
1624
1960
  }
1625
1961
  ),
1626
- /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
1962
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
1627
1963
  "button",
1628
1964
  {
1629
1965
  type: "button",
@@ -1657,11 +1993,15 @@ function TestDetailScreen({ testId, nav }) {
1657
1993
 
1658
1994
  // src/widget/screens/TestListScreen.tsx
1659
1995
  var import_react5 = require("react");
1660
- var import_jsx_runtime4 = require("react/jsx-runtime");
1996
+ var import_jsx_runtime5 = require("react/jsx-runtime");
1661
1997
  function TestListScreen({ nav }) {
1662
- const { assignments, currentAssignment, refreshAssignments } = useBugBear();
1998
+ const { assignments, currentAssignment, refreshAssignments, dashboardUrl, isLoading } = useBugBear();
1663
1999
  const [filter, setFilter] = (0, import_react5.useState)("all");
1664
2000
  const [roleFilter, setRoleFilter] = (0, import_react5.useState)(null);
2001
+ const [trackFilter, setTrackFilter] = (0, import_react5.useState)(null);
2002
+ const [platformFilter, setPlatformFilter] = (0, import_react5.useState)("web");
2003
+ const [searchQuery, setSearchQuery] = (0, import_react5.useState)("");
2004
+ const [sortMode, setSortMode] = (0, import_react5.useState)("priority");
1665
2005
  const [collapsedFolders, setCollapsedFolders] = (0, import_react5.useState)(/* @__PURE__ */ new Set());
1666
2006
  const availableRoles = (0, import_react5.useMemo)(() => {
1667
2007
  const roleMap = /* @__PURE__ */ new Map();
@@ -1670,6 +2010,20 @@ function TestListScreen({ nav }) {
1670
2010
  }
1671
2011
  return Array.from(roleMap.values());
1672
2012
  }, [assignments]);
2013
+ const availableTracks = (0, import_react5.useMemo)(() => {
2014
+ const trackMap = /* @__PURE__ */ new Map();
2015
+ for (const a of assignments) {
2016
+ if (a.testCase.track) trackMap.set(a.testCase.track.id, a.testCase.track);
2017
+ }
2018
+ return Array.from(trackMap.values());
2019
+ }, [assignments]);
2020
+ const availablePlatforms = (0, import_react5.useMemo)(() => {
2021
+ const set = /* @__PURE__ */ new Set();
2022
+ for (const a of assignments) {
2023
+ if (a.testCase.platforms) a.testCase.platforms.forEach((p) => set.add(p));
2024
+ }
2025
+ return Array.from(set).sort();
2026
+ }, [assignments]);
1673
2027
  const selectedRole = availableRoles.find((r) => r.id === roleFilter);
1674
2028
  const groupedAssignments = (0, import_react5.useMemo)(() => {
1675
2029
  const groups = /* @__PURE__ */ new Map();
@@ -1703,6 +2057,12 @@ function TestListScreen({ nav }) {
1703
2057
  folder.assignments.sort((a, b) => {
1704
2058
  if (a.isVerification && !b.isVerification) return -1;
1705
2059
  if (!a.isVerification && b.isVerification) return 1;
2060
+ if (sortMode === "alpha") {
2061
+ return a.testCase.title.localeCompare(b.testCase.title);
2062
+ }
2063
+ if (sortMode === "recent") {
2064
+ return 0;
2065
+ }
1706
2066
  const sd = (statusOrder[a.status] ?? 5) - (statusOrder[b.status] ?? 5);
1707
2067
  if (sd !== 0) return sd;
1708
2068
  return (priorityOrder[a.testCase.priority] ?? 4) - (priorityOrder[b.testCase.priority] ?? 4);
@@ -1714,7 +2074,7 @@ function TestListScreen({ nav }) {
1714
2074
  if (!b.group) return -1;
1715
2075
  return a.group.sortOrder - b.group.sortOrder;
1716
2076
  });
1717
- }, [assignments]);
2077
+ }, [assignments, sortMode]);
1718
2078
  const toggleFolder = (0, import_react5.useCallback)((id) => {
1719
2079
  setCollapsedFolders((prev) => {
1720
2080
  const next = new Set(prev);
@@ -1723,13 +2083,21 @@ function TestListScreen({ nav }) {
1723
2083
  return next;
1724
2084
  });
1725
2085
  }, []);
1726
- const filterAssignment = (a) => {
2086
+ const filterAssignment = (0, import_react5.useCallback)((a) => {
2087
+ if (platformFilter && a.testCase.platforms && !a.testCase.platforms.includes(platformFilter)) return false;
1727
2088
  if (roleFilter && a.testCase.role?.id !== roleFilter) return false;
2089
+ if (trackFilter && a.testCase.track?.id !== trackFilter) return false;
2090
+ if (searchQuery) {
2091
+ const q = searchQuery.toLowerCase();
2092
+ const titleMatch = a.testCase.title.toLowerCase().includes(q);
2093
+ const keyMatch = a.testCase.testKey.toLowerCase().includes(q);
2094
+ if (!titleMatch && !keyMatch) return false;
2095
+ }
1728
2096
  if (filter === "pending") return a.status === "pending" || a.status === "in_progress";
1729
2097
  if (filter === "done") return a.status === "passed";
1730
2098
  if (filter === "reopened") return a.status === "failed";
1731
2099
  return true;
1732
- };
2100
+ }, [platformFilter, roleFilter, trackFilter, searchQuery, filter]);
1733
2101
  const pendingCount = assignments.filter(
1734
2102
  (a) => a.status === "pending" || a.status === "in_progress"
1735
2103
  ).length;
@@ -1741,8 +2109,9 @@ function TestListScreen({ nav }) {
1741
2109
  { key: "done", label: "Done", count: doneCount },
1742
2110
  { key: "reopened", label: "Re Opened", count: reopenedCount }
1743
2111
  ];
1744
- return /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)("div", { children: [
1745
- /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("div", { style: { display: "flex", gap: 8, marginBottom: availableRoles.length >= 2 ? 8 : 16 }, children: filters.map((f) => /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)(
2112
+ if (isLoading) return /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(TestListScreenSkeleton, {});
2113
+ return /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("div", { children: [
2114
+ /* @__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
2115
  "button",
1747
2116
  {
1748
2117
  type: "button",
@@ -1769,9 +2138,9 @@ function TestListScreen({ nav }) {
1769
2138
  },
1770
2139
  f.key
1771
2140
  )) }),
1772
- availableRoles.length >= 2 && /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)("div", { style: { marginBottom: 12 }, children: [
1773
- /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)("div", { style: { display: "flex", gap: 6, flexWrap: "wrap", marginBottom: selectedRole?.loginHint ? 8 : 0 }, children: [
1774
- /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
2141
+ availableRoles.length >= 2 && /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("div", { style: { marginBottom: 12 }, children: [
2142
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("div", { style: { display: "flex", gap: 6, flexWrap: "wrap", marginBottom: selectedRole?.loginHint ? 8 : 0 }, children: [
2143
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
1775
2144
  "button",
1776
2145
  {
1777
2146
  type: "button",
@@ -1794,7 +2163,7 @@ function TestListScreen({ nav }) {
1794
2163
  ),
1795
2164
  availableRoles.map((role) => {
1796
2165
  const isActive = roleFilter === role.id;
1797
- return /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)(
2166
+ return /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)(
1798
2167
  "button",
1799
2168
  {
1800
2169
  type: "button",
@@ -1816,7 +2185,7 @@ function TestListScreen({ nav }) {
1816
2185
  fontWeight: isActive ? 600 : 400
1817
2186
  },
1818
2187
  children: [
1819
- /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("span", { style: {
2188
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("span", { style: {
1820
2189
  width: 6,
1821
2190
  height: 6,
1822
2191
  borderRadius: 3,
@@ -1830,7 +2199,7 @@ function TestListScreen({ nav }) {
1830
2199
  );
1831
2200
  })
1832
2201
  ] }),
1833
- selectedRole?.loginHint && /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)("div", { style: {
2202
+ selectedRole?.loginHint && /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("div", { style: {
1834
2203
  fontSize: 11,
1835
2204
  color: colors.textSecondary,
1836
2205
  backgroundColor: selectedRole.color + "10",
@@ -1842,6 +2211,156 @@ function TestListScreen({ nav }) {
1842
2211
  selectedRole.loginHint
1843
2212
  ] })
1844
2213
  ] }),
2214
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("div", { style: { marginBottom: 8 }, children: /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
2215
+ "input",
2216
+ {
2217
+ type: "text",
2218
+ value: searchQuery,
2219
+ onChange: (e) => setSearchQuery(e.target.value),
2220
+ placeholder: "Search tests...",
2221
+ style: {
2222
+ width: "100%",
2223
+ padding: "8px 12px",
2224
+ borderRadius: 8,
2225
+ border: `1px solid ${colors.border}`,
2226
+ backgroundColor: colors.card,
2227
+ color: colors.textPrimary,
2228
+ fontSize: 13,
2229
+ outline: "none",
2230
+ boxSizing: "border-box"
2231
+ }
2232
+ }
2233
+ ) }),
2234
+ availablePlatforms.length >= 2 && /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("div", { style: { display: "flex", gap: 4, marginBottom: 8 }, children: [
2235
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
2236
+ "button",
2237
+ {
2238
+ type: "button",
2239
+ onClick: () => setPlatformFilter(null),
2240
+ style: {
2241
+ padding: "3px 8px",
2242
+ borderRadius: 6,
2243
+ backgroundColor: !platformFilter ? colors.card : "transparent",
2244
+ border: !platformFilter ? `1px solid ${colors.border}` : "1px solid transparent",
2245
+ cursor: "pointer",
2246
+ fontSize: 11,
2247
+ color: !platformFilter ? colors.textPrimary : colors.textMuted,
2248
+ fontWeight: !platformFilter ? 600 : 400,
2249
+ whiteSpace: "nowrap"
2250
+ },
2251
+ children: "All Platforms"
2252
+ }
2253
+ ),
2254
+ availablePlatforms.map((p) => {
2255
+ const isActive = platformFilter === p;
2256
+ const label = p === "ios" ? "iOS" : p === "android" ? "Android" : p === "web" ? "Web" : p;
2257
+ const icon = p === "ios" ? "\u{1F4F1}" : p === "android" ? "\u{1F916}" : p === "web" ? "\u{1F310}" : "\u{1F4CB}";
2258
+ return /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)(
2259
+ "button",
2260
+ {
2261
+ type: "button",
2262
+ onClick: () => setPlatformFilter(isActive ? null : p),
2263
+ style: {
2264
+ display: "flex",
2265
+ alignItems: "center",
2266
+ gap: 4,
2267
+ padding: "3px 8px",
2268
+ borderRadius: 6,
2269
+ backgroundColor: isActive ? colors.blue + "20" : "transparent",
2270
+ border: isActive ? `1px solid ${colors.blue}60` : "1px solid transparent",
2271
+ cursor: "pointer",
2272
+ fontSize: 11,
2273
+ color: isActive ? colors.blue : colors.textMuted,
2274
+ fontWeight: isActive ? 600 : 400,
2275
+ whiteSpace: "nowrap"
2276
+ },
2277
+ children: [
2278
+ icon,
2279
+ " ",
2280
+ label
2281
+ ]
2282
+ },
2283
+ p
2284
+ );
2285
+ })
2286
+ ] }),
2287
+ (availableTracks.length >= 2 || true) && /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("div", { style: { display: "flex", alignItems: "center", gap: 6, marginBottom: 12 }, children: [
2288
+ availableTracks.length >= 2 && /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("div", { style: { display: "flex", gap: 4, flex: 1, overflow: "auto" }, children: [
2289
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
2290
+ "button",
2291
+ {
2292
+ type: "button",
2293
+ onClick: () => setTrackFilter(null),
2294
+ style: {
2295
+ padding: "3px 8px",
2296
+ borderRadius: 6,
2297
+ backgroundColor: !trackFilter ? colors.card : "transparent",
2298
+ border: !trackFilter ? `1px solid ${colors.border}` : "1px solid transparent",
2299
+ cursor: "pointer",
2300
+ fontSize: 11,
2301
+ color: !trackFilter ? colors.textPrimary : colors.textMuted,
2302
+ fontWeight: !trackFilter ? 600 : 400,
2303
+ whiteSpace: "nowrap"
2304
+ },
2305
+ children: "All Tracks"
2306
+ }
2307
+ ),
2308
+ availableTracks.map((track) => {
2309
+ const isActive = trackFilter === track.id;
2310
+ return /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)(
2311
+ "button",
2312
+ {
2313
+ type: "button",
2314
+ onClick: () => setTrackFilter(isActive ? null : track.id),
2315
+ style: {
2316
+ display: "flex",
2317
+ alignItems: "center",
2318
+ gap: 4,
2319
+ padding: "3px 8px",
2320
+ borderRadius: 6,
2321
+ backgroundColor: isActive ? track.color + "20" : "transparent",
2322
+ border: isActive ? `1px solid ${track.color}60` : "1px solid transparent",
2323
+ cursor: "pointer",
2324
+ fontSize: 11,
2325
+ color: isActive ? track.color : colors.textMuted,
2326
+ fontWeight: isActive ? 600 : 400,
2327
+ whiteSpace: "nowrap"
2328
+ },
2329
+ children: [
2330
+ track.icon,
2331
+ " ",
2332
+ track.name
2333
+ ]
2334
+ },
2335
+ track.id
2336
+ );
2337
+ })
2338
+ ] }),
2339
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("div", { style: { display: "flex", gap: 2, marginLeft: "auto", flexShrink: 0 }, children: [
2340
+ { key: "priority", label: "\u2195 Priority" },
2341
+ { key: "recent", label: "\u{1F550} Recent" },
2342
+ { key: "alpha", label: "A-Z" }
2343
+ ].map((s) => /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
2344
+ "button",
2345
+ {
2346
+ type: "button",
2347
+ onClick: () => setSortMode(s.key),
2348
+ style: {
2349
+ padding: "3px 8px",
2350
+ borderRadius: 6,
2351
+ backgroundColor: sortMode === s.key ? colors.card : "transparent",
2352
+ border: sortMode === s.key ? `1px solid ${colors.border}` : "1px solid transparent",
2353
+ cursor: "pointer",
2354
+ fontSize: 10,
2355
+ color: sortMode === s.key ? colors.textPrimary : colors.textMuted,
2356
+ fontWeight: sortMode === s.key ? 600 : 400,
2357
+ whiteSpace: "nowrap"
2358
+ },
2359
+ children: s.label
2360
+ },
2361
+ s.key
2362
+ )) })
2363
+ ] }),
1845
2364
  groupedAssignments.map((folder) => {
1846
2365
  const folderId = folder.group?.id || "ungrouped";
1847
2366
  const isCollapsed = collapsedFolders.has(folderId);
@@ -1849,8 +2368,8 @@ function TestListScreen({ nav }) {
1849
2368
  if (filtered.length === 0 && filter !== "all") return null;
1850
2369
  const completedInFolder = folder.stats.passed + folder.stats.failed;
1851
2370
  const progressPercent = folder.stats.total > 0 ? Math.round(completedInFolder / folder.stats.total * 100) : 0;
1852
- return /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)("div", { style: { marginBottom: 12 }, children: [
1853
- /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)(
2371
+ return /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("div", { style: { marginBottom: 12 }, children: [
2372
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)(
1854
2373
  "button",
1855
2374
  {
1856
2375
  type: "button",
@@ -1870,8 +2389,8 @@ function TestListScreen({ nav }) {
1870
2389
  textAlign: "left"
1871
2390
  },
1872
2391
  children: [
1873
- /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("span", { style: { fontSize: 10, color: colors.textMuted, width: 14 }, children: isCollapsed ? "\u25B6" : "\u25BC" }),
1874
- /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
2392
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("span", { style: { fontSize: 10, color: colors.textMuted, width: 14 }, children: isCollapsed ? "\u25B6" : "\u25BC" }),
2393
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
1875
2394
  "span",
1876
2395
  {
1877
2396
  style: {
@@ -1886,7 +2405,7 @@ function TestListScreen({ nav }) {
1886
2405
  children: folder.group?.name || "Ungrouped"
1887
2406
  }
1888
2407
  ),
1889
- /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
2408
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
1890
2409
  "div",
1891
2410
  {
1892
2411
  style: {
@@ -1897,7 +2416,7 @@ function TestListScreen({ nav }) {
1897
2416
  overflow: "hidden",
1898
2417
  flexShrink: 0
1899
2418
  },
1900
- children: /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
2419
+ children: /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
1901
2420
  "div",
1902
2421
  {
1903
2422
  style: {
@@ -1911,7 +2430,7 @@ function TestListScreen({ nav }) {
1911
2430
  )
1912
2431
  }
1913
2432
  ),
1914
- /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)(
2433
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)(
1915
2434
  "span",
1916
2435
  {
1917
2436
  style: {
@@ -1935,7 +2454,7 @@ function TestListScreen({ nav }) {
1935
2454
  const badge = getStatusBadge(assignment.status);
1936
2455
  const isCurrent = currentAssignment?.id === assignment.id;
1937
2456
  const priorityColor = assignment.testCase.priority === "P0" ? colors.red : assignment.testCase.priority === "P1" ? colors.orange : colors.textDim;
1938
- return /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)(
2457
+ return /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)(
1939
2458
  "button",
1940
2459
  {
1941
2460
  type: "button",
@@ -1957,9 +2476,9 @@ function TestListScreen({ nav }) {
1957
2476
  textAlign: "left"
1958
2477
  },
1959
2478
  children: [
1960
- /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("span", { style: { fontSize: 16, marginRight: 10, width: 20, flexShrink: 0 }, children: badge.icon }),
1961
- /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)("div", { style: { flex: 1, minWidth: 0 }, children: [
1962
- /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
2479
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("span", { style: { fontSize: 16, marginRight: 10, width: 20, flexShrink: 0 }, children: badge.icon }),
2480
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("div", { style: { flex: 1, minWidth: 0 }, children: [
2481
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
1963
2482
  "div",
1964
2483
  {
1965
2484
  style: {
@@ -1973,9 +2492,9 @@ function TestListScreen({ nav }) {
1973
2492
  children: assignment.testCase.title
1974
2493
  }
1975
2494
  ),
1976
- /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)("div", { style: { display: "flex", alignItems: "center", gap: 6 }, children: [
1977
- assignment.isVerification && /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)(import_jsx_runtime4.Fragment, { children: [
1978
- /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
2495
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("div", { style: { display: "flex", alignItems: "center", gap: 6 }, children: [
2496
+ assignment.isVerification && /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)(import_jsx_runtime5.Fragment, { children: [
2497
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
1979
2498
  "span",
1980
2499
  {
1981
2500
  style: {
@@ -1990,9 +2509,9 @@ function TestListScreen({ nav }) {
1990
2509
  children: "Retest"
1991
2510
  }
1992
2511
  ),
1993
- /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("span", { style: { fontSize: 11, color: colors.textDim }, children: "\xB7" })
2512
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("span", { style: { fontSize: 11, color: colors.textDim }, children: "\xB7" })
1994
2513
  ] }),
1995
- /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
2514
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
1996
2515
  "span",
1997
2516
  {
1998
2517
  style: {
@@ -2003,8 +2522,8 @@ function TestListScreen({ nav }) {
2003
2522
  children: assignment.testCase.testKey
2004
2523
  }
2005
2524
  ),
2006
- /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("span", { style: { fontSize: 11, color: colors.textDim }, children: "\xB7" }),
2007
- /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
2525
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("span", { style: { fontSize: 11, color: colors.textDim }, children: "\xB7" }),
2526
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
2008
2527
  "span",
2009
2528
  {
2010
2529
  style: {
@@ -2015,9 +2534,9 @@ function TestListScreen({ nav }) {
2015
2534
  children: assignment.testCase.priority
2016
2535
  }
2017
2536
  ),
2018
- assignment.testCase.role && /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)(import_jsx_runtime4.Fragment, { children: [
2019
- /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("span", { style: { fontSize: 11, color: colors.textDim }, children: "\xB7" }),
2020
- /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)("span", { style: {
2537
+ assignment.testCase.role && /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)(import_jsx_runtime5.Fragment, { children: [
2538
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("span", { style: { fontSize: 11, color: colors.textDim }, children: "\xB7" }),
2539
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("span", { style: {
2021
2540
  display: "inline-flex",
2022
2541
  alignItems: "center",
2023
2542
  gap: 3,
@@ -2025,7 +2544,7 @@ function TestListScreen({ nav }) {
2025
2544
  color: assignment.testCase.role.color,
2026
2545
  fontWeight: 500
2027
2546
  }, children: [
2028
- /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("span", { style: {
2547
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("span", { style: {
2029
2548
  width: 5,
2030
2549
  height: 5,
2031
2550
  borderRadius: 3,
@@ -2036,7 +2555,7 @@ function TestListScreen({ nav }) {
2036
2555
  ] })
2037
2556
  ] })
2038
2557
  ] }),
2039
- /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
2558
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
2040
2559
  "span",
2041
2560
  {
2042
2561
  style: {
@@ -2063,7 +2582,7 @@ function TestListScreen({ nav }) {
2063
2582
  groupedAssignments.every((folder) => {
2064
2583
  const filtered = folder.assignments.filter(filterAssignment);
2065
2584
  return filtered.length === 0;
2066
- }) && /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)(
2585
+ }) && /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)(
2067
2586
  "div",
2068
2587
  {
2069
2588
  style: {
@@ -2073,12 +2592,32 @@ function TestListScreen({ nav }) {
2073
2592
  padding: 32
2074
2593
  },
2075
2594
  children: [
2076
- /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("span", { style: { fontSize: 32, marginBottom: 8 }, children: filter === "pending" ? "\u{1F389}" : filter === "reopened" ? "\u{1F44D}" : "\u{1F4CB}" }),
2077
- /* @__PURE__ */ (0, import_jsx_runtime4.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" })
2595
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("span", { style: { fontSize: 32, marginBottom: 8 }, children: filter === "pending" ? "\u{1F389}" : filter === "reopened" ? "\u{1F44D}" : "\u{1F4CB}" }),
2596
+ /* @__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
2597
  ]
2079
2598
  }
2080
2599
  ),
2081
- /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("div", { style: { display: "flex", justifyContent: "center", paddingTop: 12, paddingBottom: 8 }, children: /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
2600
+ dashboardUrl && /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
2601
+ "a",
2602
+ {
2603
+ href: `${dashboardUrl}/test-cases`,
2604
+ target: "_blank",
2605
+ rel: "noopener noreferrer",
2606
+ style: {
2607
+ display: "flex",
2608
+ alignItems: "center",
2609
+ justifyContent: "center",
2610
+ gap: 6,
2611
+ paddingTop: 12,
2612
+ fontSize: 13,
2613
+ fontWeight: 500,
2614
+ color: colors.blue,
2615
+ textDecoration: "none"
2616
+ },
2617
+ children: "\u{1F310} Manage on Dashboard \u2192"
2618
+ }
2619
+ ),
2620
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("div", { style: { display: "flex", justifyContent: "center", paddingTop: 8, paddingBottom: 8 }, children: /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
2082
2621
  "button",
2083
2622
  {
2084
2623
  type: "button",
@@ -2174,13 +2713,13 @@ function useImageAttachments(uploadFn, maxImages, bucket = "screenshots") {
2174
2713
  }
2175
2714
 
2176
2715
  // src/widget/ImagePreviewStrip.tsx
2177
- var import_jsx_runtime5 = require("react/jsx-runtime");
2716
+ var import_jsx_runtime6 = require("react/jsx-runtime");
2178
2717
  function ImagePreviewStrip({ images, onRemove }) {
2179
2718
  if (images.length === 0) return null;
2180
- return /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("div", { style: { display: "flex", gap: 8, overflowX: "auto", paddingTop: 4 }, children: [
2181
- images.map((img) => /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("div", { style: { position: "relative", width: 64, height: 64, flexShrink: 0, borderRadius: 8, overflow: "hidden" }, children: [
2182
- /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("img", { src: img.localUri, alt: img.name, style: { width: 64, height: 64, objectFit: "cover", borderRadius: 8 } }),
2183
- img.status === "uploading" && /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("div", { style: {
2719
+ return /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)("div", { style: { display: "flex", gap: 8, overflowX: "auto", paddingTop: 4 }, children: [
2720
+ images.map((img) => /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)("div", { style: { position: "relative", width: 64, height: 64, flexShrink: 0, borderRadius: 8, overflow: "hidden" }, children: [
2721
+ /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("img", { src: img.localUri, alt: img.name, style: { width: 64, height: 64, objectFit: "cover", borderRadius: 8 } }),
2722
+ img.status === "uploading" && /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("div", { style: {
2184
2723
  position: "absolute",
2185
2724
  inset: 0,
2186
2725
  backgroundColor: "rgba(0,0,0,0.5)",
@@ -2188,7 +2727,7 @@ function ImagePreviewStrip({ images, onRemove }) {
2188
2727
  alignItems: "center",
2189
2728
  justifyContent: "center",
2190
2729
  borderRadius: 8
2191
- }, children: /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("div", { style: {
2730
+ }, children: /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("div", { style: {
2192
2731
  width: 16,
2193
2732
  height: 16,
2194
2733
  border: "2px solid #fff",
@@ -2196,7 +2735,7 @@ function ImagePreviewStrip({ images, onRemove }) {
2196
2735
  borderRadius: "50%",
2197
2736
  animation: "bb-spin 0.6s linear infinite"
2198
2737
  } }) }),
2199
- img.status === "error" && /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("div", { style: {
2738
+ img.status === "error" && /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("div", { style: {
2200
2739
  position: "absolute",
2201
2740
  inset: 0,
2202
2741
  backgroundColor: "rgba(127,29,29,0.7)",
@@ -2204,8 +2743,8 @@ function ImagePreviewStrip({ images, onRemove }) {
2204
2743
  alignItems: "center",
2205
2744
  justifyContent: "center",
2206
2745
  borderRadius: 8
2207
- }, children: /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("span", { style: { color: "#fca5a5", fontSize: 18, fontWeight: "bold" }, children: "!" }) }),
2208
- /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
2746
+ }, children: /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("span", { style: { color: "#fca5a5", fontSize: 18, fontWeight: "bold" }, children: "!" }) }),
2747
+ /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
2209
2748
  "button",
2210
2749
  {
2211
2750
  type: "button",
@@ -2232,18 +2771,18 @@ function ImagePreviewStrip({ images, onRemove }) {
2232
2771
  }
2233
2772
  )
2234
2773
  ] }, img.id)),
2235
- /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("style", { children: `@keyframes bb-spin { to { transform: rotate(360deg); } }` })
2774
+ /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("style", { children: `@keyframes bb-spin { to { transform: rotate(360deg); } }` })
2236
2775
  ] });
2237
2776
  }
2238
2777
 
2239
2778
  // src/widget/ImagePickerButtons.tsx
2240
- var import_jsx_runtime6 = require("react/jsx-runtime");
2779
+ var import_jsx_runtime7 = require("react/jsx-runtime");
2241
2780
  function ImagePickerButtons({ images, maxImages, onPickGallery, onPickCamera, onRemove, label }) {
2242
2781
  const disabled = images.length >= maxImages;
2243
- return /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)("div", { style: { marginTop: 12, marginBottom: 4 }, children: [
2244
- label && /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("div", { style: { fontSize: 14, fontWeight: 500, color: "#e4e4e7", marginBottom: 8 }, children: label }),
2245
- /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)("div", { style: { display: "flex", alignItems: "center", gap: 8, marginBottom: 8 }, children: [
2246
- /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
2782
+ return /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)("div", { style: { marginTop: 12, marginBottom: 4 }, children: [
2783
+ label && /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("div", { style: { fontSize: 14, fontWeight: 500, color: "#e4e4e7", marginBottom: 8 }, children: label }),
2784
+ /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)("div", { style: { display: "flex", alignItems: "center", gap: 8, marginBottom: 8 }, children: [
2785
+ /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(
2247
2786
  "button",
2248
2787
  {
2249
2788
  type: "button",
@@ -2264,7 +2803,7 @@ function ImagePickerButtons({ images, maxImages, onPickGallery, onPickCamera, on
2264
2803
  children: "Gallery"
2265
2804
  }
2266
2805
  ),
2267
- /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
2806
+ /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(
2268
2807
  "button",
2269
2808
  {
2270
2809
  type: "button",
@@ -2285,18 +2824,18 @@ function ImagePickerButtons({ images, maxImages, onPickGallery, onPickCamera, on
2285
2824
  children: "Camera"
2286
2825
  }
2287
2826
  ),
2288
- /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)("span", { style: { fontSize: 12, color: colors.textDim, marginLeft: 4 }, children: [
2827
+ /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)("span", { style: { fontSize: 12, color: colors.textDim, marginLeft: 4 }, children: [
2289
2828
  images.length,
2290
2829
  "/",
2291
2830
  maxImages
2292
2831
  ] })
2293
2832
  ] }),
2294
- /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(ImagePreviewStrip, { images, onRemove })
2833
+ /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(ImagePreviewStrip, { images, onRemove })
2295
2834
  ] });
2296
2835
  }
2297
2836
 
2298
2837
  // src/widget/screens/TestFeedbackScreen.tsx
2299
- var import_jsx_runtime7 = require("react/jsx-runtime");
2838
+ var import_jsx_runtime8 = require("react/jsx-runtime");
2300
2839
  function TestFeedbackScreen({ status, assignmentId, nav }) {
2301
2840
  const { client, assignments, refreshAssignments, uploadImage } = useBugBear();
2302
2841
  const images = useImageAttachments(uploadImage, 3, "screenshots");
@@ -2365,10 +2904,10 @@ function TestFeedbackScreen({ status, assignmentId, nav }) {
2365
2904
  { key: "stepsUnclear", label: "Steps are unclear" },
2366
2905
  { key: "expectedResultUnclear", label: "Expected result unclear" }
2367
2906
  ];
2368
- return /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)("div", { style: styles.container, children: [
2369
- /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("div", { style: styles.header, children: status === "passed" ? "\u2705 Test Passed!" : "\u274C Test Failed" }),
2370
- /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("div", { style: styles.subheader, children: "Rate this test case" }),
2371
- /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("div", { style: styles.starRow, children: [1, 2, 3, 4, 5].map((n) => /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(
2907
+ return /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)("div", { style: styles.container, children: [
2908
+ /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("div", { style: styles.header, children: status === "passed" ? "\u2705 Test Passed!" : "\u274C Test Failed" }),
2909
+ /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("div", { style: styles.subheader, children: "Rate this test case" }),
2910
+ /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("div", { style: styles.starRow, children: [1, 2, 3, 4, 5].map((n) => /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(
2372
2911
  "button",
2373
2912
  {
2374
2913
  onClick: () => setRating(n),
@@ -2380,9 +2919,9 @@ function TestFeedbackScreen({ status, assignmentId, nav }) {
2380
2919
  },
2381
2920
  n
2382
2921
  )) }),
2383
- showFlags && /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)("div", { style: styles.flagsSection, children: [
2384
- /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("div", { style: styles.flagsLabel, children: "What could be improved?" }),
2385
- flagOptions.map(({ key, label }) => /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)(
2922
+ showFlags && /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)("div", { style: styles.flagsSection, children: [
2923
+ /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("div", { style: styles.flagsLabel, children: "What could be improved?" }),
2924
+ flagOptions.map(({ key, label }) => /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)(
2386
2925
  "button",
2387
2926
  {
2388
2927
  onClick: () => toggleFlag(key),
@@ -2391,17 +2930,17 @@ function TestFeedbackScreen({ status, assignmentId, nav }) {
2391
2930
  ...flags[key] ? styles.flagItemActive : {}
2392
2931
  },
2393
2932
  children: [
2394
- /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(
2933
+ /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(
2395
2934
  "div",
2396
2935
  {
2397
2936
  style: {
2398
2937
  ...styles.flagCheck,
2399
2938
  ...flags[key] ? styles.flagCheckActive : {}
2400
2939
  },
2401
- children: flags[key] && /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("span", { style: styles.flagCheckmark, children: "\u2713" })
2940
+ children: flags[key] && /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("span", { style: styles.flagCheckmark, children: "\u2713" })
2402
2941
  }
2403
2942
  ),
2404
- /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(
2943
+ /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(
2405
2944
  "span",
2406
2945
  {
2407
2946
  style: {
@@ -2416,7 +2955,7 @@ function TestFeedbackScreen({ status, assignmentId, nav }) {
2416
2955
  key
2417
2956
  ))
2418
2957
  ] }),
2419
- /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(
2958
+ /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(
2420
2959
  "textarea",
2421
2960
  {
2422
2961
  style: styles.noteInput,
@@ -2426,7 +2965,7 @@ function TestFeedbackScreen({ status, assignmentId, nav }) {
2426
2965
  rows: 3
2427
2966
  }
2428
2967
  ),
2429
- /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(
2968
+ /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(
2430
2969
  ImagePickerButtons,
2431
2970
  {
2432
2971
  images: images.images,
@@ -2437,9 +2976,9 @@ function TestFeedbackScreen({ status, assignmentId, nav }) {
2437
2976
  label: "Screenshots (optional)"
2438
2977
  }
2439
2978
  ),
2440
- /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)("div", { style: styles.actions, children: [
2441
- /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("button", { style: styles.skipButton, onClick: handleSkip, children: "Skip" }),
2442
- /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(
2979
+ /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)("div", { style: styles.actions, children: [
2980
+ /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("button", { style: styles.skipButton, onClick: handleSkip, children: "Skip" }),
2981
+ /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(
2443
2982
  "button",
2444
2983
  {
2445
2984
  style: {
@@ -2592,7 +3131,7 @@ var styles = {
2592
3131
  var import_react8 = __toESM(require("react"));
2593
3132
 
2594
3133
  // src/widget/CategoryDropdown.tsx
2595
- var import_jsx_runtime8 = require("react/jsx-runtime");
3134
+ var import_jsx_runtime9 = require("react/jsx-runtime");
2596
3135
  var categoryOptions = [
2597
3136
  { value: "ui_ux", label: "UI/UX", icon: "\u{1F3A8}" },
2598
3137
  { value: "functional", label: "Functional", icon: "\u2699\uFE0F" },
@@ -2601,7 +3140,7 @@ var categoryOptions = [
2601
3140
  { value: "other", label: "Other", icon: "\u{1F4DD}" }
2602
3141
  ];
2603
3142
  function CategoryDropdown({ value, onChange, optional = true, disabled = false }) {
2604
- return /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)(
3143
+ return /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)(
2605
3144
  "select",
2606
3145
  {
2607
3146
  value: value || "",
@@ -2624,8 +3163,8 @@ function CategoryDropdown({ value, onChange, optional = true, disabled = false }
2624
3163
  paddingRight: 32
2625
3164
  },
2626
3165
  children: [
2627
- /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("option", { value: "", children: optional ? "Select category (optional)" : "Select category" }),
2628
- categoryOptions.map(({ value: value2, label, icon }) => /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)("option", { value: value2, children: [
3166
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("option", { value: "", children: optional ? "Select category (optional)" : "Select category" }),
3167
+ categoryOptions.map(({ value: value2, label, icon }) => /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)("option", { value: value2, children: [
2629
3168
  icon,
2630
3169
  " ",
2631
3170
  label
@@ -2636,7 +3175,7 @@ function CategoryDropdown({ value, onChange, optional = true, disabled = false }
2636
3175
  }
2637
3176
 
2638
3177
  // src/widget/screens/ReportScreen.tsx
2639
- var import_jsx_runtime9 = require("react/jsx-runtime");
3178
+ var import_jsx_runtime10 = require("react/jsx-runtime");
2640
3179
  function ReportScreen({ nav, prefill }) {
2641
3180
  const { client, refreshAssignments, uploadImage } = useBugBear();
2642
3181
  const images = useImageAttachments(uploadImage, 5, "screenshots");
@@ -2711,17 +3250,17 @@ function ReportScreen({ nav, prefill }) {
2711
3250
  { sev: "medium", color: "#eab308" },
2712
3251
  { sev: "low", color: "#6b7280" }
2713
3252
  ];
2714
- return /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("div", { children: isRetestFailure ? /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)(import_jsx_runtime9.Fragment, { children: [
2715
- /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)("div", { style: styles2.retestBanner, children: [
2716
- /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("span", { style: { fontSize: 16 }, children: "\u{1F504}" }),
2717
- /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)("div", { children: [
2718
- /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("div", { style: styles2.retestTitle, children: "Bug Still Present" }),
2719
- /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("div", { style: styles2.retestSubtitle, children: "The fix did not resolve this issue" })
3253
+ return /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("div", { children: isRetestFailure ? /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)(import_jsx_runtime10.Fragment, { children: [
3254
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)("div", { style: styles2.retestBanner, children: [
3255
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("span", { style: { fontSize: 16 }, children: "\u{1F504}" }),
3256
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)("div", { children: [
3257
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("div", { style: styles2.retestTitle, children: "Bug Still Present" }),
3258
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("div", { style: styles2.retestSubtitle, children: "The fix did not resolve this issue" })
2720
3259
  ] })
2721
3260
  ] }),
2722
- /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)("div", { style: styles2.section, children: [
2723
- /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("div", { style: styles2.label, children: "Severity" }),
2724
- /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("div", { style: styles2.severityRow, children: severityOptions.map(({ sev, color }) => /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(
3261
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)("div", { style: styles2.section, children: [
3262
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("div", { style: styles2.label, children: "Severity" }),
3263
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("div", { style: styles2.severityRow, children: severityOptions.map(({ sev, color }) => /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(
2725
3264
  "button",
2726
3265
  {
2727
3266
  onClick: () => setSeverity(sev),
@@ -2729,18 +3268,18 @@ function ReportScreen({ nav, prefill }) {
2729
3268
  ...styles2.sevButton,
2730
3269
  ...severity === sev ? { backgroundColor: `${color}30`, borderColor: color } : {}
2731
3270
  },
2732
- children: /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("span", { style: { ...styles2.sevText, ...severity === sev ? { color } : {} }, children: sev })
3271
+ children: /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("span", { style: { ...styles2.sevText, ...severity === sev ? { color } : {} }, children: sev })
2733
3272
  },
2734
3273
  sev
2735
3274
  )) })
2736
3275
  ] }),
2737
- /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)("div", { style: styles2.section, children: [
2738
- /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("div", { style: styles2.label, children: "Category (optional)" }),
2739
- /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(CategoryDropdown, { value: category, onChange: setCategory, optional: true })
3276
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)("div", { style: styles2.section, children: [
3277
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("div", { style: styles2.label, children: "Category (optional)" }),
3278
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(CategoryDropdown, { value: category, onChange: setCategory, optional: true })
2740
3279
  ] }),
2741
- /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)("div", { style: styles2.section, children: [
2742
- /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("div", { style: styles2.label, children: "What went wrong?" }),
2743
- /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(
3280
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)("div", { style: styles2.section, children: [
3281
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("div", { style: styles2.label, children: "What went wrong?" }),
3282
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(
2744
3283
  "textarea",
2745
3284
  {
2746
3285
  style: styles2.descInput,
@@ -2751,7 +3290,7 @@ function ReportScreen({ nav, prefill }) {
2751
3290
  }
2752
3291
  )
2753
3292
  ] }),
2754
- /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(
3293
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(
2755
3294
  ImagePickerButtons,
2756
3295
  {
2757
3296
  images: images.images,
@@ -2762,8 +3301,8 @@ function ReportScreen({ nav, prefill }) {
2762
3301
  label: "Attachments (optional)"
2763
3302
  }
2764
3303
  ),
2765
- error && /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("div", { style: styles2.errorBanner, children: error }),
2766
- /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(
3304
+ error && /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("div", { style: styles2.errorBanner, children: error }),
3305
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(
2767
3306
  "button",
2768
3307
  {
2769
3308
  style: {
@@ -2776,9 +3315,9 @@ function ReportScreen({ nav, prefill }) {
2776
3315
  children: images.isUploading ? "Uploading images..." : submitting ? "Submitting..." : error ? "Retry" : "Submit Failed Retest"
2777
3316
  }
2778
3317
  )
2779
- ] }) : /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)(import_jsx_runtime9.Fragment, { children: [
2780
- /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("div", { style: styles2.label, children: "What are you reporting?" }),
2781
- /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("div", { style: styles2.typeRow, children: typeOptions.map(({ type, label, icon }) => /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)(
3318
+ ] }) : /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)(import_jsx_runtime10.Fragment, { children: [
3319
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("div", { style: styles2.label, children: "What are you reporting?" }),
3320
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("div", { style: styles2.typeRow, children: typeOptions.map(({ type, label, icon }) => /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)(
2782
3321
  "button",
2783
3322
  {
2784
3323
  onClick: () => setReportType(type),
@@ -2787,8 +3326,8 @@ function ReportScreen({ nav, prefill }) {
2787
3326
  ...reportType === type ? styles2.typeCardActive : {}
2788
3327
  },
2789
3328
  children: [
2790
- /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("div", { style: styles2.typeIcon, children: icon }),
2791
- /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(
3329
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("div", { style: styles2.typeIcon, children: icon }),
3330
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(
2792
3331
  "div",
2793
3332
  {
2794
3333
  style: {
@@ -2802,9 +3341,9 @@ function ReportScreen({ nav, prefill }) {
2802
3341
  },
2803
3342
  type
2804
3343
  )) }),
2805
- isBugType && /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)("div", { style: styles2.section, children: [
2806
- /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("div", { style: styles2.label, children: "Severity" }),
2807
- /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("div", { style: styles2.severityRow, children: severityOptions.map(({ sev, color }) => /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(
3344
+ isBugType && /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)("div", { style: styles2.section, children: [
3345
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("div", { style: styles2.label, children: "Severity" }),
3346
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("div", { style: styles2.severityRow, children: severityOptions.map(({ sev, color }) => /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(
2808
3347
  "button",
2809
3348
  {
2810
3349
  onClick: () => setSeverity(sev),
@@ -2815,7 +3354,7 @@ function ReportScreen({ nav, prefill }) {
2815
3354
  borderColor: color
2816
3355
  } : {}
2817
3356
  },
2818
- children: /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(
3357
+ children: /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(
2819
3358
  "span",
2820
3359
  {
2821
3360
  style: {
@@ -2829,13 +3368,13 @@ function ReportScreen({ nav, prefill }) {
2829
3368
  sev
2830
3369
  )) })
2831
3370
  ] }),
2832
- isBugType && /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)("div", { style: styles2.section, children: [
2833
- /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("div", { style: styles2.label, children: "Category (optional)" }),
2834
- /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(CategoryDropdown, { value: category, onChange: setCategory, optional: true })
3371
+ isBugType && /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)("div", { style: styles2.section, children: [
3372
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("div", { style: styles2.label, children: "Category (optional)" }),
3373
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(CategoryDropdown, { value: category, onChange: setCategory, optional: true })
2835
3374
  ] }),
2836
- /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)("div", { style: styles2.section, children: [
2837
- /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("div", { style: styles2.label, children: "What happened?" }),
2838
- /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(
3375
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)("div", { style: styles2.section, children: [
3376
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("div", { style: styles2.label, children: "What happened?" }),
3377
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(
2839
3378
  "textarea",
2840
3379
  {
2841
3380
  style: styles2.descInput,
@@ -2846,9 +3385,9 @@ function ReportScreen({ nav, prefill }) {
2846
3385
  }
2847
3386
  )
2848
3387
  ] }),
2849
- isBugType && /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)("div", { style: styles2.section, children: [
2850
- /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("div", { style: styles2.label, children: "Where did it happen?" }),
2851
- /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(
3388
+ isBugType && /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)("div", { style: styles2.section, children: [
3389
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("div", { style: styles2.label, children: "Where did it happen?" }),
3390
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(
2852
3391
  "input",
2853
3392
  {
2854
3393
  style: styles2.routeInput,
@@ -2857,13 +3396,13 @@ function ReportScreen({ nav, prefill }) {
2857
3396
  placeholder: observedRoute.current
2858
3397
  }
2859
3398
  ),
2860
- /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)("div", { style: styles2.routeHint, children: [
3399
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)("div", { style: styles2.routeHint, children: [
2861
3400
  "Leave blank to use current page (",
2862
3401
  observedRoute.current,
2863
3402
  ")"
2864
3403
  ] })
2865
3404
  ] }),
2866
- /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(
3405
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(
2867
3406
  ImagePickerButtons,
2868
3407
  {
2869
3408
  images: images.images,
@@ -2874,8 +3413,8 @@ function ReportScreen({ nav, prefill }) {
2874
3413
  label: "Screenshots (optional)"
2875
3414
  }
2876
3415
  ),
2877
- error && /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("div", { style: styles2.errorBanner, children: error }),
2878
- /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(
3416
+ error && /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("div", { style: styles2.errorBanner, children: error }),
3417
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(
2879
3418
  "button",
2880
3419
  {
2881
3420
  style: {
@@ -3040,16 +3579,16 @@ var styles2 = {
3040
3579
 
3041
3580
  // src/widget/screens/ReportSuccessScreen.tsx
3042
3581
  var import_react9 = require("react");
3043
- var import_jsx_runtime10 = require("react/jsx-runtime");
3582
+ var import_jsx_runtime11 = require("react/jsx-runtime");
3044
3583
  function ReportSuccessScreen({ nav }) {
3045
3584
  (0, import_react9.useEffect)(() => {
3046
3585
  const timer = setTimeout(() => nav.reset(), 2e3);
3047
3586
  return () => clearTimeout(timer);
3048
3587
  }, [nav]);
3049
- return /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)("div", { style: styles3.container, children: [
3050
- /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("div", { style: styles3.emoji, children: "\u{1F389}" }),
3051
- /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("div", { style: styles3.title, children: "Report submitted!" }),
3052
- /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("div", { style: styles3.subtitle, children: "Thank you for your feedback" })
3588
+ return /* @__PURE__ */ (0, import_jsx_runtime11.jsxs)("div", { style: styles3.container, children: [
3589
+ /* @__PURE__ */ (0, import_jsx_runtime11.jsx)("div", { style: styles3.emoji, children: "\u{1F389}" }),
3590
+ /* @__PURE__ */ (0, import_jsx_runtime11.jsx)("div", { style: styles3.title, children: "Report submitted!" }),
3591
+ /* @__PURE__ */ (0, import_jsx_runtime11.jsx)("div", { style: styles3.subtitle, children: "Thank you for your feedback" })
3053
3592
  ] });
3054
3593
  }
3055
3594
  var styles3 = {
@@ -3078,11 +3617,12 @@ var styles3 = {
3078
3617
  };
3079
3618
 
3080
3619
  // src/widget/screens/MessageListScreen.tsx
3081
- var import_jsx_runtime11 = require("react/jsx-runtime");
3620
+ var import_jsx_runtime12 = require("react/jsx-runtime");
3082
3621
  function MessageListScreen({ nav }) {
3083
- const { threads, unreadCount, refreshThreads } = useBugBear();
3084
- return /* @__PURE__ */ (0, import_jsx_runtime11.jsxs)("div", { children: [
3085
- /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(
3622
+ const { threads, unreadCount, refreshThreads, dashboardUrl, isLoading } = useBugBear();
3623
+ if (isLoading) return /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(MessageListScreenSkeleton, {});
3624
+ return /* @__PURE__ */ (0, import_jsx_runtime12.jsxs)("div", { children: [
3625
+ /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(
3086
3626
  "button",
3087
3627
  {
3088
3628
  style: {
@@ -3101,7 +3641,7 @@ function MessageListScreen({ nav }) {
3101
3641
  children: "\u2709\uFE0F New Message"
3102
3642
  }
3103
3643
  ),
3104
- threads.length === 0 ? /* @__PURE__ */ (0, import_jsx_runtime11.jsxs)(
3644
+ threads.length === 0 ? /* @__PURE__ */ (0, import_jsx_runtime12.jsxs)(
3105
3645
  "div",
3106
3646
  {
3107
3647
  style: {
@@ -3112,8 +3652,8 @@ function MessageListScreen({ nav }) {
3112
3652
  paddingBottom: 40
3113
3653
  },
3114
3654
  children: [
3115
- /* @__PURE__ */ (0, import_jsx_runtime11.jsx)("span", { style: { fontSize: 36, marginBottom: 12 }, children: "\u{1F4AC}" }),
3116
- /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(
3655
+ /* @__PURE__ */ (0, import_jsx_runtime12.jsx)("span", { style: { fontSize: 36, marginBottom: 12 }, children: "\u{1F4AC}" }),
3656
+ /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(
3117
3657
  "span",
3118
3658
  {
3119
3659
  style: {
@@ -3125,7 +3665,7 @@ function MessageListScreen({ nav }) {
3125
3665
  children: "No messages yet"
3126
3666
  }
3127
3667
  ),
3128
- /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(
3668
+ /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(
3129
3669
  "span",
3130
3670
  {
3131
3671
  style: {
@@ -3138,7 +3678,7 @@ function MessageListScreen({ nav }) {
3138
3678
  )
3139
3679
  ]
3140
3680
  }
3141
- ) : /* @__PURE__ */ (0, import_jsx_runtime11.jsx)("div", { children: threads.map((thread) => /* @__PURE__ */ (0, import_jsx_runtime11.jsxs)(
3681
+ ) : /* @__PURE__ */ (0, import_jsx_runtime12.jsx)("div", { children: threads.map((thread) => /* @__PURE__ */ (0, import_jsx_runtime12.jsxs)(
3142
3682
  "button",
3143
3683
  {
3144
3684
  style: {
@@ -3156,8 +3696,8 @@ function MessageListScreen({ nav }) {
3156
3696
  },
3157
3697
  onClick: () => nav.push({ name: "THREAD_DETAIL", thread }),
3158
3698
  children: [
3159
- /* @__PURE__ */ (0, import_jsx_runtime11.jsxs)("div", { style: { display: "flex", flex: 1, minWidth: 0 }, children: [
3160
- /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(
3699
+ /* @__PURE__ */ (0, import_jsx_runtime12.jsxs)("div", { style: { display: "flex", flex: 1, minWidth: 0 }, children: [
3700
+ /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(
3161
3701
  "span",
3162
3702
  {
3163
3703
  style: {
@@ -3169,7 +3709,7 @@ function MessageListScreen({ nav }) {
3169
3709
  children: getThreadTypeIcon(thread.threadType)
3170
3710
  }
3171
3711
  ),
3172
- /* @__PURE__ */ (0, import_jsx_runtime11.jsxs)(
3712
+ /* @__PURE__ */ (0, import_jsx_runtime12.jsxs)(
3173
3713
  "div",
3174
3714
  {
3175
3715
  style: {
@@ -3177,7 +3717,7 @@ function MessageListScreen({ nav }) {
3177
3717
  minWidth: 0
3178
3718
  },
3179
3719
  children: [
3180
- /* @__PURE__ */ (0, import_jsx_runtime11.jsxs)(
3720
+ /* @__PURE__ */ (0, import_jsx_runtime12.jsxs)(
3181
3721
  "div",
3182
3722
  {
3183
3723
  style: {
@@ -3186,8 +3726,8 @@ function MessageListScreen({ nav }) {
3186
3726
  gap: 4
3187
3727
  },
3188
3728
  children: [
3189
- thread.isPinned && /* @__PURE__ */ (0, import_jsx_runtime11.jsx)("span", { style: { fontSize: 12, flexShrink: 0 }, children: "\u{1F4CC}" }),
3190
- /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(
3729
+ thread.isPinned && /* @__PURE__ */ (0, import_jsx_runtime12.jsx)("span", { style: { fontSize: 12, flexShrink: 0 }, children: "\u{1F4CC}" }),
3730
+ /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(
3191
3731
  "span",
3192
3732
  {
3193
3733
  style: {
@@ -3204,7 +3744,7 @@ function MessageListScreen({ nav }) {
3204
3744
  ]
3205
3745
  }
3206
3746
  ),
3207
- thread.lastMessage && /* @__PURE__ */ (0, import_jsx_runtime11.jsxs)(
3747
+ thread.lastMessage && /* @__PURE__ */ (0, import_jsx_runtime12.jsxs)(
3208
3748
  "span",
3209
3749
  {
3210
3750
  style: {
@@ -3228,7 +3768,7 @@ function MessageListScreen({ nav }) {
3228
3768
  }
3229
3769
  )
3230
3770
  ] }),
3231
- /* @__PURE__ */ (0, import_jsx_runtime11.jsxs)(
3771
+ /* @__PURE__ */ (0, import_jsx_runtime12.jsxs)(
3232
3772
  "div",
3233
3773
  {
3234
3774
  style: {
@@ -3240,8 +3780,8 @@ function MessageListScreen({ nav }) {
3240
3780
  flexShrink: 0
3241
3781
  },
3242
3782
  children: [
3243
- /* @__PURE__ */ (0, import_jsx_runtime11.jsx)("span", { style: { fontSize: 11, color: colors.textDim }, children: formatRelativeTime(thread.lastMessageAt) }),
3244
- thread.unreadCount > 0 && /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(
3783
+ /* @__PURE__ */ (0, import_jsx_runtime12.jsx)("span", { style: { fontSize: 11, color: colors.textDim }, children: formatRelativeTime(thread.lastMessageAt) }),
3784
+ thread.unreadCount > 0 && /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(
3245
3785
  "span",
3246
3786
  {
3247
3787
  style: {
@@ -3268,19 +3808,39 @@ function MessageListScreen({ nav }) {
3268
3808
  },
3269
3809
  thread.id
3270
3810
  )) }),
3271
- /* @__PURE__ */ (0, import_jsx_runtime11.jsxs)(
3811
+ dashboardUrl && /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(
3812
+ "a",
3813
+ {
3814
+ href: `${dashboardUrl}/discussions`,
3815
+ target: "_blank",
3816
+ rel: "noopener noreferrer",
3817
+ style: {
3818
+ display: "flex",
3819
+ alignItems: "center",
3820
+ justifyContent: "center",
3821
+ gap: 6,
3822
+ paddingTop: 12,
3823
+ fontSize: 13,
3824
+ fontWeight: 500,
3825
+ color: colors.blue,
3826
+ textDecoration: "none"
3827
+ },
3828
+ children: "\u{1F310} View on Dashboard \u2192"
3829
+ }
3830
+ ),
3831
+ /* @__PURE__ */ (0, import_jsx_runtime12.jsxs)(
3272
3832
  "div",
3273
3833
  {
3274
3834
  style: {
3275
3835
  display: "flex",
3276
3836
  justifyContent: "space-between",
3277
3837
  alignItems: "center",
3278
- paddingTop: 12,
3838
+ paddingTop: 8,
3279
3839
  paddingLeft: 4,
3280
3840
  paddingRight: 4
3281
3841
  },
3282
3842
  children: [
3283
- /* @__PURE__ */ (0, import_jsx_runtime11.jsxs)("span", { style: { fontSize: 12, color: colors.textMuted }, children: [
3843
+ /* @__PURE__ */ (0, import_jsx_runtime12.jsxs)("span", { style: { fontSize: 12, color: colors.textMuted }, children: [
3284
3844
  threads.length,
3285
3845
  " thread",
3286
3846
  threads.length !== 1 ? "s" : "",
@@ -3289,7 +3849,7 @@ function MessageListScreen({ nav }) {
3289
3849
  unreadCount,
3290
3850
  " unread"
3291
3851
  ] }),
3292
- /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(
3852
+ /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(
3293
3853
  "button",
3294
3854
  {
3295
3855
  style: {
@@ -3312,7 +3872,7 @@ function MessageListScreen({ nav }) {
3312
3872
 
3313
3873
  // src/widget/screens/ThreadDetailScreen.tsx
3314
3874
  var import_react10 = require("react");
3315
- var import_jsx_runtime12 = require("react/jsx-runtime");
3875
+ var import_jsx_runtime13 = require("react/jsx-runtime");
3316
3876
  var inputStyle = {
3317
3877
  backgroundColor: "#27272a",
3318
3878
  border: "1px solid #3f3f46",
@@ -3384,8 +3944,8 @@ function ThreadDetailScreen({
3384
3944
  handleSend();
3385
3945
  }
3386
3946
  };
3387
- return /* @__PURE__ */ (0, import_jsx_runtime12.jsxs)("div", { style: { display: "flex", flexDirection: "column", flex: 1 }, children: [
3388
- /* @__PURE__ */ (0, import_jsx_runtime12.jsxs)(
3947
+ return /* @__PURE__ */ (0, import_jsx_runtime13.jsxs)("div", { style: { display: "flex", flexDirection: "column", flex: 1 }, children: [
3948
+ /* @__PURE__ */ (0, import_jsx_runtime13.jsxs)(
3389
3949
  "div",
3390
3950
  {
3391
3951
  style: {
@@ -3397,8 +3957,8 @@ function ThreadDetailScreen({
3397
3957
  borderBottom: `1px solid ${colors.border}`
3398
3958
  },
3399
3959
  children: [
3400
- /* @__PURE__ */ (0, import_jsx_runtime12.jsx)("span", { style: { fontSize: 20 }, children: getThreadTypeIcon(thread.threadType) }),
3401
- /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(
3960
+ /* @__PURE__ */ (0, import_jsx_runtime13.jsx)("span", { style: { fontSize: 20 }, children: getThreadTypeIcon(thread.threadType) }),
3961
+ /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(
3402
3962
  "span",
3403
3963
  {
3404
3964
  style: {
@@ -3418,7 +3978,7 @@ function ThreadDetailScreen({
3418
3978
  ]
3419
3979
  }
3420
3980
  ),
3421
- loading ? /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(
3981
+ loading ? /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(
3422
3982
  "div",
3423
3983
  {
3424
3984
  style: {
@@ -3426,11 +3986,11 @@ function ThreadDetailScreen({
3426
3986
  paddingBottom: 40,
3427
3987
  textAlign: "center"
3428
3988
  },
3429
- children: /* @__PURE__ */ (0, import_jsx_runtime12.jsx)("span", { style: { fontSize: 14, color: colors.textMuted }, children: "Loading messages..." })
3989
+ children: /* @__PURE__ */ (0, import_jsx_runtime13.jsx)("span", { style: { fontSize: 14, color: colors.textMuted }, children: "Loading messages..." })
3430
3990
  }
3431
- ) : /* @__PURE__ */ (0, import_jsx_runtime12.jsx)("div", { style: { paddingBottom: 8, marginBottom: 8 }, children: messages.map((msg) => {
3991
+ ) : /* @__PURE__ */ (0, import_jsx_runtime13.jsx)("div", { style: { paddingBottom: 8, marginBottom: 8 }, children: messages.map((msg) => {
3432
3992
  const isTester = msg.senderType === "tester";
3433
- return /* @__PURE__ */ (0, import_jsx_runtime12.jsxs)(
3993
+ return /* @__PURE__ */ (0, import_jsx_runtime13.jsxs)(
3434
3994
  "div",
3435
3995
  {
3436
3996
  style: {
@@ -3446,7 +4006,7 @@ function ThreadDetailScreen({
3446
4006
  borderBottomRightRadius: isTester ? 4 : 16
3447
4007
  },
3448
4008
  children: [
3449
- /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(
4009
+ /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(
3450
4010
  "span",
3451
4011
  {
3452
4012
  style: {
@@ -3459,7 +4019,7 @@ function ThreadDetailScreen({
3459
4019
  children: isTester ? "You" : msg.senderName
3460
4020
  }
3461
4021
  ),
3462
- /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(
4022
+ /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(
3463
4023
  "span",
3464
4024
  {
3465
4025
  style: {
@@ -3473,7 +4033,7 @@ function ThreadDetailScreen({
3473
4033
  children: msg.content
3474
4034
  }
3475
4035
  ),
3476
- msg.attachments && msg.attachments.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime12.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_runtime12.jsx)(
4036
+ 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)(
3477
4037
  "img",
3478
4038
  {
3479
4039
  src: att.url,
@@ -3482,7 +4042,7 @@ function ThreadDetailScreen({
3482
4042
  },
3483
4043
  idx
3484
4044
  )) }),
3485
- /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(
4045
+ /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(
3486
4046
  "span",
3487
4047
  {
3488
4048
  style: {
@@ -3500,7 +4060,7 @@ function ThreadDetailScreen({
3500
4060
  msg.id
3501
4061
  );
3502
4062
  }) }),
3503
- sendError && /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(
4063
+ sendError && /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(
3504
4064
  "div",
3505
4065
  {
3506
4066
  style: {
@@ -3512,7 +4072,7 @@ function ThreadDetailScreen({
3512
4072
  borderRadius: 8,
3513
4073
  marginBottom: 8
3514
4074
  },
3515
- children: /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(
4075
+ children: /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(
3516
4076
  "span",
3517
4077
  {
3518
4078
  style: {
@@ -3526,8 +4086,8 @@ function ThreadDetailScreen({
3526
4086
  )
3527
4087
  }
3528
4088
  ),
3529
- replyImages.images.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime12.jsx)("div", { style: { paddingTop: 8 }, children: /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(ImagePreviewStrip, { images: replyImages.images, onRemove: replyImages.removeImage }) }),
3530
- /* @__PURE__ */ (0, import_jsx_runtime12.jsxs)(
4089
+ 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 }) }),
4090
+ /* @__PURE__ */ (0, import_jsx_runtime13.jsxs)(
3531
4091
  "div",
3532
4092
  {
3533
4093
  style: {
@@ -3538,7 +4098,7 @@ function ThreadDetailScreen({
3538
4098
  gap: 8
3539
4099
  },
3540
4100
  children: [
3541
- /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(
4101
+ /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(
3542
4102
  "button",
3543
4103
  {
3544
4104
  type: "button",
@@ -3557,7 +4117,7 @@ function ThreadDetailScreen({
3557
4117
  children: "\u{1F4CE}"
3558
4118
  }
3559
4119
  ),
3560
- /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(
4120
+ /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(
3561
4121
  "input",
3562
4122
  {
3563
4123
  type: "text",
@@ -3573,7 +4133,7 @@ function ThreadDetailScreen({
3573
4133
  }
3574
4134
  }
3575
4135
  ),
3576
- /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(
4136
+ /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(
3577
4137
  "button",
3578
4138
  {
3579
4139
  style: {
@@ -3601,7 +4161,7 @@ function ThreadDetailScreen({
3601
4161
 
3602
4162
  // src/widget/screens/ComposeMessageScreen.tsx
3603
4163
  var import_react11 = require("react");
3604
- var import_jsx_runtime13 = require("react/jsx-runtime");
4164
+ var import_jsx_runtime14 = require("react/jsx-runtime");
3605
4165
  var inputStyle2 = {
3606
4166
  backgroundColor: "#27272a",
3607
4167
  border: "1px solid #3f3f46",
@@ -3632,9 +4192,9 @@ function ComposeMessageScreen({ nav }) {
3632
4192
  nav.pop();
3633
4193
  }
3634
4194
  };
3635
- return /* @__PURE__ */ (0, import_jsx_runtime13.jsxs)("div", { children: [
3636
- /* @__PURE__ */ (0, import_jsx_runtime13.jsxs)("div", { style: { marginBottom: 20 }, children: [
3637
- /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(
4195
+ return /* @__PURE__ */ (0, import_jsx_runtime14.jsxs)("div", { children: [
4196
+ /* @__PURE__ */ (0, import_jsx_runtime14.jsxs)("div", { style: { marginBottom: 20 }, children: [
4197
+ /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(
3638
4198
  "div",
3639
4199
  {
3640
4200
  style: {
@@ -3646,9 +4206,9 @@ function ComposeMessageScreen({ nav }) {
3646
4206
  children: "New Message"
3647
4207
  }
3648
4208
  ),
3649
- /* @__PURE__ */ (0, import_jsx_runtime13.jsx)("div", { style: { fontSize: 14, color: colors.textMuted }, children: "Send a message to the QA team" })
4209
+ /* @__PURE__ */ (0, import_jsx_runtime14.jsx)("div", { style: { fontSize: 14, color: colors.textMuted }, children: "Send a message to the QA team" })
3650
4210
  ] }),
3651
- /* @__PURE__ */ (0, import_jsx_runtime13.jsxs)(
4211
+ /* @__PURE__ */ (0, import_jsx_runtime14.jsxs)(
3652
4212
  "div",
3653
4213
  {
3654
4214
  style: {
@@ -3658,7 +4218,7 @@ function ComposeMessageScreen({ nav }) {
3658
4218
  border: `1px solid ${colors.border}`
3659
4219
  },
3660
4220
  children: [
3661
- /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(
4221
+ /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(
3662
4222
  "label",
3663
4223
  {
3664
4224
  style: {
@@ -3671,7 +4231,7 @@ function ComposeMessageScreen({ nav }) {
3671
4231
  children: "Subject"
3672
4232
  }
3673
4233
  ),
3674
- /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(
4234
+ /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(
3675
4235
  "input",
3676
4236
  {
3677
4237
  type: "text",
@@ -3686,7 +4246,7 @@ function ComposeMessageScreen({ nav }) {
3686
4246
  }
3687
4247
  }
3688
4248
  ),
3689
- /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(
4249
+ /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(
3690
4250
  "label",
3691
4251
  {
3692
4252
  style: {
@@ -3700,7 +4260,7 @@ function ComposeMessageScreen({ nav }) {
3700
4260
  children: "Message"
3701
4261
  }
3702
4262
  ),
3703
- /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(
4263
+ /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(
3704
4264
  "textarea",
3705
4265
  {
3706
4266
  value: message,
@@ -3719,7 +4279,7 @@ function ComposeMessageScreen({ nav }) {
3719
4279
  }
3720
4280
  }
3721
4281
  ),
3722
- /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(
4282
+ /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(
3723
4283
  ImagePickerButtons,
3724
4284
  {
3725
4285
  images: images.images,
@@ -3730,7 +4290,7 @@ function ComposeMessageScreen({ nav }) {
3730
4290
  label: "Attachments (optional)"
3731
4291
  }
3732
4292
  ),
3733
- /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(
4293
+ /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(
3734
4294
  "button",
3735
4295
  {
3736
4296
  style: {
@@ -3759,7 +4319,7 @@ function ComposeMessageScreen({ nav }) {
3759
4319
 
3760
4320
  // src/widget/screens/ProfileScreen.tsx
3761
4321
  var import_react12 = require("react");
3762
- var import_jsx_runtime14 = require("react/jsx-runtime");
4322
+ var import_jsx_runtime15 = require("react/jsx-runtime");
3763
4323
  function ProfileScreen({ nav }) {
3764
4324
  const { testerInfo, assignments, updateTesterProfile, refreshTesterInfo } = useBugBear();
3765
4325
  const [editing, setEditing] = (0, import_react12.useState)(false);
@@ -3806,22 +4366,22 @@ function ProfileScreen({ nav }) {
3806
4366
  }
3807
4367
  };
3808
4368
  if (saved) {
3809
- return /* @__PURE__ */ (0, import_jsx_runtime14.jsxs)("div", { style: styles4.emptyState, children: [
3810
- /* @__PURE__ */ (0, import_jsx_runtime14.jsx)("span", { style: styles4.emptyEmoji, children: "\u2705" }),
3811
- /* @__PURE__ */ (0, import_jsx_runtime14.jsx)("span", { style: styles4.emptyTitle, children: "Profile saved!" })
4369
+ return /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)("div", { style: styles4.emptyState, children: [
4370
+ /* @__PURE__ */ (0, import_jsx_runtime15.jsx)("span", { style: styles4.emptyEmoji, children: "\u2705" }),
4371
+ /* @__PURE__ */ (0, import_jsx_runtime15.jsx)("span", { style: styles4.emptyTitle, children: "Profile saved!" })
3812
4372
  ] });
3813
4373
  }
3814
4374
  if (!testerInfo) {
3815
- return /* @__PURE__ */ (0, import_jsx_runtime14.jsxs)("div", { style: styles4.emptyState, children: [
3816
- /* @__PURE__ */ (0, import_jsx_runtime14.jsx)("span", { style: styles4.emptyEmoji, children: "\u{1F464}" }),
3817
- /* @__PURE__ */ (0, import_jsx_runtime14.jsx)("span", { style: styles4.emptyTitle, children: "No profile found" })
4375
+ return /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)("div", { style: styles4.emptyState, children: [
4376
+ /* @__PURE__ */ (0, import_jsx_runtime15.jsx)("span", { style: styles4.emptyEmoji, children: "\u{1F464}" }),
4377
+ /* @__PURE__ */ (0, import_jsx_runtime15.jsx)("span", { style: styles4.emptyTitle, children: "No profile found" })
3818
4378
  ] });
3819
4379
  }
3820
4380
  if (editing) {
3821
- return /* @__PURE__ */ (0, import_jsx_runtime14.jsxs)("div", { children: [
3822
- /* @__PURE__ */ (0, import_jsx_runtime14.jsxs)("div", { style: styles4.editHeader, children: [
3823
- /* @__PURE__ */ (0, import_jsx_runtime14.jsx)("span", { style: styles4.editTitle, children: "Edit Profile" }),
3824
- /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(
4381
+ return /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)("div", { children: [
4382
+ /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)("div", { style: styles4.editHeader, children: [
4383
+ /* @__PURE__ */ (0, import_jsx_runtime15.jsx)("span", { style: styles4.editTitle, children: "Edit Profile" }),
4384
+ /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(
3825
4385
  "button",
3826
4386
  {
3827
4387
  style: styles4.cancelButton,
@@ -3833,9 +4393,9 @@ function ProfileScreen({ nav }) {
3833
4393
  }
3834
4394
  )
3835
4395
  ] }),
3836
- /* @__PURE__ */ (0, import_jsx_runtime14.jsxs)("div", { style: styles4.field, children: [
3837
- /* @__PURE__ */ (0, import_jsx_runtime14.jsx)("label", { style: styles4.label, children: "Name" }),
3838
- /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(
4396
+ /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)("div", { style: styles4.field, children: [
4397
+ /* @__PURE__ */ (0, import_jsx_runtime15.jsx)("label", { style: styles4.label, children: "Name" }),
4398
+ /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(
3839
4399
  "input",
3840
4400
  {
3841
4401
  style: styles4.input,
@@ -3845,15 +4405,15 @@ function ProfileScreen({ nav }) {
3845
4405
  }
3846
4406
  )
3847
4407
  ] }),
3848
- /* @__PURE__ */ (0, import_jsx_runtime14.jsxs)("div", { style: styles4.field, children: [
3849
- /* @__PURE__ */ (0, import_jsx_runtime14.jsx)("label", { style: styles4.label, children: "Primary Email" }),
3850
- /* @__PURE__ */ (0, import_jsx_runtime14.jsx)("span", { style: styles4.emailFixed, children: testerInfo.email })
4408
+ /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)("div", { style: styles4.field, children: [
4409
+ /* @__PURE__ */ (0, import_jsx_runtime15.jsx)("label", { style: styles4.label, children: "Primary Email" }),
4410
+ /* @__PURE__ */ (0, import_jsx_runtime15.jsx)("span", { style: styles4.emailFixed, children: testerInfo.email })
3851
4411
  ] }),
3852
- /* @__PURE__ */ (0, import_jsx_runtime14.jsxs)("div", { style: styles4.field, children: [
3853
- /* @__PURE__ */ (0, import_jsx_runtime14.jsx)("label", { style: styles4.label, children: "Additional Emails" }),
3854
- additionalEmails.map((email) => /* @__PURE__ */ (0, import_jsx_runtime14.jsxs)("div", { style: styles4.emailRow, children: [
3855
- /* @__PURE__ */ (0, import_jsx_runtime14.jsx)("span", { style: styles4.emailText, children: email }),
3856
- /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(
4412
+ /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)("div", { style: styles4.field, children: [
4413
+ /* @__PURE__ */ (0, import_jsx_runtime15.jsx)("label", { style: styles4.label, children: "Additional Emails" }),
4414
+ additionalEmails.map((email) => /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)("div", { style: styles4.emailRow, children: [
4415
+ /* @__PURE__ */ (0, import_jsx_runtime15.jsx)("span", { style: styles4.emailText, children: email }),
4416
+ /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(
3857
4417
  "button",
3858
4418
  {
3859
4419
  style: styles4.removeEmailButton,
@@ -3862,8 +4422,8 @@ function ProfileScreen({ nav }) {
3862
4422
  }
3863
4423
  )
3864
4424
  ] }, email)),
3865
- /* @__PURE__ */ (0, import_jsx_runtime14.jsxs)("div", { style: styles4.addEmailRow, children: [
3866
- /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(
4425
+ /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)("div", { style: styles4.addEmailRow, children: [
4426
+ /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(
3867
4427
  "input",
3868
4428
  {
3869
4429
  style: { ...styles4.input, flex: 1, marginRight: 8 },
@@ -3876,18 +4436,18 @@ function ProfileScreen({ nav }) {
3876
4436
  }
3877
4437
  }
3878
4438
  ),
3879
- /* @__PURE__ */ (0, import_jsx_runtime14.jsx)("button", { style: styles4.addButton, onClick: handleAddEmail, children: "Add" })
4439
+ /* @__PURE__ */ (0, import_jsx_runtime15.jsx)("button", { style: styles4.addButton, onClick: handleAddEmail, children: "Add" })
3880
4440
  ] })
3881
4441
  ] }),
3882
- /* @__PURE__ */ (0, import_jsx_runtime14.jsxs)("div", { style: styles4.field, children: [
3883
- /* @__PURE__ */ (0, import_jsx_runtime14.jsx)("label", { style: styles4.label, children: "Testing Platforms" }),
3884
- /* @__PURE__ */ (0, import_jsx_runtime14.jsx)("div", { style: styles4.platformRow, children: [
4442
+ /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)("div", { style: styles4.field, children: [
4443
+ /* @__PURE__ */ (0, import_jsx_runtime15.jsx)("label", { style: styles4.label, children: "Testing Platforms" }),
4444
+ /* @__PURE__ */ (0, import_jsx_runtime15.jsx)("div", { style: styles4.platformRow, children: [
3885
4445
  { key: "ios", label: "\u{1F4F1} iOS" },
3886
4446
  { key: "android", label: "\u{1F916} Android" },
3887
4447
  { key: "web", label: "\u{1F310} Web" }
3888
4448
  ].map(({ key, label }) => {
3889
4449
  const isActive = platforms.includes(key);
3890
- return /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(
4450
+ return /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(
3891
4451
  "button",
3892
4452
  {
3893
4453
  style: {
@@ -3897,13 +4457,13 @@ function ProfileScreen({ nav }) {
3897
4457
  onClick: () => setPlatforms(
3898
4458
  (prev) => prev.includes(key) ? prev.filter((p) => p !== key) : [...prev, key]
3899
4459
  ),
3900
- children: /* @__PURE__ */ (0, import_jsx_runtime14.jsx)("span", { style: isActive ? styles4.platformTextActive : styles4.platformText, children: label })
4460
+ children: /* @__PURE__ */ (0, import_jsx_runtime15.jsx)("span", { style: isActive ? styles4.platformTextActive : styles4.platformText, children: label })
3901
4461
  },
3902
4462
  key
3903
4463
  );
3904
4464
  }) })
3905
4465
  ] }),
3906
- /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(
4466
+ /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(
3907
4467
  "button",
3908
4468
  {
3909
4469
  style: { ...styles4.primaryButton, marginTop: 20 },
@@ -3914,45 +4474,45 @@ function ProfileScreen({ nav }) {
3914
4474
  )
3915
4475
  ] });
3916
4476
  }
3917
- return /* @__PURE__ */ (0, import_jsx_runtime14.jsxs)("div", { children: [
3918
- /* @__PURE__ */ (0, import_jsx_runtime14.jsxs)("div", { style: styles4.profileCard, children: [
3919
- /* @__PURE__ */ (0, import_jsx_runtime14.jsx)("div", { style: styles4.avatar, children: /* @__PURE__ */ (0, import_jsx_runtime14.jsx)("span", { style: styles4.avatarText, children: testerInfo.name.charAt(0).toUpperCase() }) }),
3920
- /* @__PURE__ */ (0, import_jsx_runtime14.jsx)("span", { style: styles4.profileName, children: testerInfo.name }),
3921
- /* @__PURE__ */ (0, import_jsx_runtime14.jsx)("span", { style: styles4.profileEmail, children: testerInfo.email })
4477
+ return /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)("div", { children: [
4478
+ /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)("div", { style: styles4.profileCard, children: [
4479
+ /* @__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() }) }),
4480
+ /* @__PURE__ */ (0, import_jsx_runtime15.jsx)("span", { style: styles4.profileName, children: testerInfo.name }),
4481
+ /* @__PURE__ */ (0, import_jsx_runtime15.jsx)("span", { style: styles4.profileEmail, children: testerInfo.email })
3922
4482
  ] }),
3923
- /* @__PURE__ */ (0, import_jsx_runtime14.jsxs)("div", { style: styles4.statsRow, children: [
3924
- /* @__PURE__ */ (0, import_jsx_runtime14.jsxs)("div", { style: styles4.statItem, children: [
3925
- /* @__PURE__ */ (0, import_jsx_runtime14.jsx)("span", { style: styles4.statNumber, children: completedCount }),
3926
- /* @__PURE__ */ (0, import_jsx_runtime14.jsx)("span", { style: styles4.statLabel, children: "Completed" })
4483
+ /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)("div", { style: styles4.statsRow, children: [
4484
+ /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)("div", { style: styles4.statItem, children: [
4485
+ /* @__PURE__ */ (0, import_jsx_runtime15.jsx)("span", { style: styles4.statNumber, children: completedCount }),
4486
+ /* @__PURE__ */ (0, import_jsx_runtime15.jsx)("span", { style: styles4.statLabel, children: "Completed" })
3927
4487
  ] }),
3928
- /* @__PURE__ */ (0, import_jsx_runtime14.jsx)("div", { style: styles4.statDivider }),
3929
- /* @__PURE__ */ (0, import_jsx_runtime14.jsxs)("div", { style: styles4.statItem, children: [
3930
- /* @__PURE__ */ (0, import_jsx_runtime14.jsx)("span", { style: styles4.statNumber, children: assignments.length }),
3931
- /* @__PURE__ */ (0, import_jsx_runtime14.jsx)("span", { style: styles4.statLabel, children: "Total Assigned" })
4488
+ /* @__PURE__ */ (0, import_jsx_runtime15.jsx)("div", { style: styles4.statDivider }),
4489
+ /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)("div", { style: styles4.statItem, children: [
4490
+ /* @__PURE__ */ (0, import_jsx_runtime15.jsx)("span", { style: styles4.statNumber, children: assignments.length }),
4491
+ /* @__PURE__ */ (0, import_jsx_runtime15.jsx)("span", { style: styles4.statLabel, children: "Total Assigned" })
3932
4492
  ] })
3933
4493
  ] }),
3934
- /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(
4494
+ /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(
3935
4495
  "button",
3936
4496
  {
3937
4497
  style: styles4.detailsToggle,
3938
4498
  onClick: () => setShowDetails(!showDetails),
3939
- children: /* @__PURE__ */ (0, import_jsx_runtime14.jsxs)("span", { style: styles4.detailsToggleText, children: [
4499
+ children: /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)("span", { style: styles4.detailsToggleText, children: [
3940
4500
  showDetails ? "\u25BC" : "\u25B6",
3941
4501
  " Details"
3942
4502
  ] })
3943
4503
  }
3944
4504
  ),
3945
- showDetails && /* @__PURE__ */ (0, import_jsx_runtime14.jsxs)("div", { style: styles4.detailsSection, children: [
3946
- additionalEmails.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime14.jsxs)("div", { style: styles4.detailBlock, children: [
3947
- /* @__PURE__ */ (0, import_jsx_runtime14.jsx)("span", { style: styles4.detailLabel, children: "Additional Emails" }),
3948
- additionalEmails.map((e) => /* @__PURE__ */ (0, import_jsx_runtime14.jsx)("span", { style: styles4.detailValue, children: e }, e))
4505
+ showDetails && /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)("div", { style: styles4.detailsSection, children: [
4506
+ additionalEmails.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)("div", { style: styles4.detailBlock, children: [
4507
+ /* @__PURE__ */ (0, import_jsx_runtime15.jsx)("span", { style: styles4.detailLabel, children: "Additional Emails" }),
4508
+ additionalEmails.map((e) => /* @__PURE__ */ (0, import_jsx_runtime15.jsx)("span", { style: styles4.detailValue, children: e }, e))
3949
4509
  ] }),
3950
- platforms.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime14.jsxs)("div", { style: styles4.detailBlock, children: [
3951
- /* @__PURE__ */ (0, import_jsx_runtime14.jsx)("span", { style: styles4.detailLabel, children: "Platforms" }),
3952
- /* @__PURE__ */ (0, import_jsx_runtime14.jsx)("div", { style: styles4.platformTags, children: platforms.map((p) => /* @__PURE__ */ (0, import_jsx_runtime14.jsx)("span", { style: styles4.platformTag, children: /* @__PURE__ */ (0, import_jsx_runtime14.jsx)("span", { style: styles4.platformTagText, children: p === "ios" ? "\u{1F4F1} iOS" : p === "android" ? "\u{1F916} Android" : "\u{1F310} Web" }) }, p)) })
4510
+ platforms.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)("div", { style: styles4.detailBlock, children: [
4511
+ /* @__PURE__ */ (0, import_jsx_runtime15.jsx)("span", { style: styles4.detailLabel, children: "Platforms" }),
4512
+ /* @__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)) })
3953
4513
  ] })
3954
4514
  ] }),
3955
- /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(
4515
+ /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(
3956
4516
  "button",
3957
4517
  {
3958
4518
  style: { ...styles4.primaryButton, marginTop: 20 },
@@ -4236,7 +4796,7 @@ var styles4 = {
4236
4796
 
4237
4797
  // src/widget/screens/IssueListScreen.tsx
4238
4798
  var import_react13 = require("react");
4239
- var import_jsx_runtime15 = require("react/jsx-runtime");
4799
+ var import_jsx_runtime16 = require("react/jsx-runtime");
4240
4800
  var CATEGORY_CONFIG = {
4241
4801
  open: { label: "Open Issues", accent: "#f97316", emptyIcon: "\u2705", emptyText: "No open issues" },
4242
4802
  done: { label: "Done", accent: "#22c55e", emptyIcon: "\u{1F389}", emptyText: "No completed issues yet" },
@@ -4279,15 +4839,15 @@ function IssueListScreen({ nav, category }) {
4279
4839
  };
4280
4840
  }, [client, category]);
4281
4841
  if (loading) {
4282
- return /* @__PURE__ */ (0, import_jsx_runtime15.jsx)("div", { style: { padding: "40px 0", textAlign: "center" }, children: /* @__PURE__ */ (0, import_jsx_runtime15.jsx)("div", { style: { color: colors.textMuted, fontSize: 14 }, children: "Loading..." }) });
4842
+ return /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(IssueListScreenSkeleton, {});
4283
4843
  }
4284
4844
  if (issues.length === 0) {
4285
- return /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)("div", { style: { padding: "40px 0", textAlign: "center" }, children: [
4286
- /* @__PURE__ */ (0, import_jsx_runtime15.jsx)("div", { style: { fontSize: 36, marginBottom: 8 }, children: config.emptyIcon }),
4287
- /* @__PURE__ */ (0, import_jsx_runtime15.jsx)("div", { style: { color: colors.textMuted, fontSize: 14 }, children: config.emptyText })
4845
+ return /* @__PURE__ */ (0, import_jsx_runtime16.jsxs)("div", { style: { padding: "40px 0", textAlign: "center" }, children: [
4846
+ /* @__PURE__ */ (0, import_jsx_runtime16.jsx)("div", { style: { fontSize: 36, marginBottom: 8 }, children: config.emptyIcon }),
4847
+ /* @__PURE__ */ (0, import_jsx_runtime16.jsx)("div", { style: { color: colors.textMuted, fontSize: 14 }, children: config.emptyText })
4288
4848
  ] });
4289
4849
  }
4290
- return /* @__PURE__ */ (0, import_jsx_runtime15.jsx)("div", { children: issues.map((issue) => /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)(
4850
+ return /* @__PURE__ */ (0, import_jsx_runtime16.jsx)("div", { children: issues.map((issue) => /* @__PURE__ */ (0, import_jsx_runtime16.jsxs)(
4291
4851
  "div",
4292
4852
  {
4293
4853
  role: "button",
@@ -4306,8 +4866,8 @@ function IssueListScreen({ nav, category }) {
4306
4866
  userSelect: "none"
4307
4867
  },
4308
4868
  children: [
4309
- /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)("div", { style: { display: "flex", alignItems: "flex-start", gap: 8 }, children: [
4310
- issue.severity && /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(
4869
+ /* @__PURE__ */ (0, import_jsx_runtime16.jsxs)("div", { style: { display: "flex", alignItems: "flex-start", gap: 8 }, children: [
4870
+ issue.severity && /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(
4311
4871
  "span",
4312
4872
  {
4313
4873
  style: {
@@ -4320,7 +4880,7 @@ function IssueListScreen({ nav, category }) {
4320
4880
  }
4321
4881
  }
4322
4882
  ),
4323
- /* @__PURE__ */ (0, import_jsx_runtime15.jsx)("span", { style: {
4883
+ /* @__PURE__ */ (0, import_jsx_runtime16.jsx)("span", { style: {
4324
4884
  fontSize: 13,
4325
4885
  fontWeight: 600,
4326
4886
  color: colors.textPrimary,
@@ -4330,11 +4890,11 @@ function IssueListScreen({ nav, category }) {
4330
4890
  whiteSpace: "nowrap"
4331
4891
  }, children: issue.title })
4332
4892
  ] }),
4333
- /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)("div", { style: { display: "flex", justifyContent: "space-between", marginTop: 6 }, children: [
4334
- issue.route && /* @__PURE__ */ (0, import_jsx_runtime15.jsx)("span", { style: { fontSize: 11, color: colors.textDim, maxWidth: "60%", overflow: "hidden", textOverflow: "ellipsis", whiteSpace: "nowrap" }, children: issue.route }),
4335
- /* @__PURE__ */ (0, import_jsx_runtime15.jsx)("span", { style: { fontSize: 11, color: colors.textDim, marginLeft: "auto" }, children: formatRelativeTime(issue.updatedAt) })
4893
+ /* @__PURE__ */ (0, import_jsx_runtime16.jsxs)("div", { style: { display: "flex", justifyContent: "space-between", marginTop: 6 }, children: [
4894
+ 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 }),
4895
+ /* @__PURE__ */ (0, import_jsx_runtime16.jsx)("span", { style: { fontSize: 11, color: colors.textDim, marginLeft: "auto" }, children: formatRelativeTime(issue.updatedAt) })
4336
4896
  ] }),
4337
- category === "done" && issue.verifiedByName && /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)("div", { style: {
4897
+ category === "done" && issue.verifiedByName && /* @__PURE__ */ (0, import_jsx_runtime16.jsxs)("div", { style: {
4338
4898
  display: "inline-flex",
4339
4899
  alignItems: "center",
4340
4900
  gap: 4,
@@ -4350,7 +4910,7 @@ function IssueListScreen({ nav, category }) {
4350
4910
  "\u2714 Verified by ",
4351
4911
  issue.verifiedByName
4352
4912
  ] }),
4353
- category === "reopened" && issue.originalBugTitle && /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)("div", { style: {
4913
+ category === "reopened" && issue.originalBugTitle && /* @__PURE__ */ (0, import_jsx_runtime16.jsxs)("div", { style: {
4354
4914
  display: "inline-flex",
4355
4915
  alignItems: "center",
4356
4916
  gap: 4,
@@ -4377,7 +4937,7 @@ function IssueListScreen({ nav, category }) {
4377
4937
  }
4378
4938
 
4379
4939
  // src/widget/screens/IssueDetailScreen.tsx
4380
- var import_jsx_runtime16 = require("react/jsx-runtime");
4940
+ var import_jsx_runtime17 = require("react/jsx-runtime");
4381
4941
  var STATUS_LABELS = {
4382
4942
  new: { label: "New", bg: "#1e3a5f", color: "#60a5fa" },
4383
4943
  triaging: { label: "Triaging", bg: "#1e3a5f", color: "#60a5fa" },
@@ -4399,11 +4959,12 @@ var SEVERITY_CONFIG = {
4399
4959
  low: { label: "Low", color: "#71717a", bg: "#27272a" }
4400
4960
  };
4401
4961
  function IssueDetailScreen({ nav, issue }) {
4962
+ const { dashboardUrl } = useBugBear();
4402
4963
  const statusConfig = STATUS_LABELS[issue.status] || { label: issue.status, bg: "#27272a", color: "#a1a1aa" };
4403
4964
  const severityConfig = issue.severity ? SEVERITY_CONFIG[issue.severity] : null;
4404
- return /* @__PURE__ */ (0, import_jsx_runtime16.jsxs)("div", { children: [
4405
- /* @__PURE__ */ (0, import_jsx_runtime16.jsxs)("div", { style: { display: "flex", gap: 8, flexWrap: "wrap", marginBottom: 12 }, children: [
4406
- /* @__PURE__ */ (0, import_jsx_runtime16.jsx)("span", { style: {
4965
+ return /* @__PURE__ */ (0, import_jsx_runtime17.jsxs)("div", { children: [
4966
+ /* @__PURE__ */ (0, import_jsx_runtime17.jsxs)("div", { style: { display: "flex", gap: 8, flexWrap: "wrap", marginBottom: 12 }, children: [
4967
+ /* @__PURE__ */ (0, import_jsx_runtime17.jsx)("span", { style: {
4407
4968
  backgroundColor: statusConfig.bg,
4408
4969
  color: statusConfig.color,
4409
4970
  fontSize: 11,
@@ -4411,7 +4972,7 @@ function IssueDetailScreen({ nav, issue }) {
4411
4972
  padding: "3px 10px",
4412
4973
  borderRadius: 6
4413
4974
  }, children: statusConfig.label }),
4414
- severityConfig && /* @__PURE__ */ (0, import_jsx_runtime16.jsx)("span", { style: {
4975
+ severityConfig && /* @__PURE__ */ (0, import_jsx_runtime17.jsx)("span", { style: {
4415
4976
  backgroundColor: severityConfig.bg,
4416
4977
  color: severityConfig.color,
4417
4978
  fontSize: 11,
@@ -4420,9 +4981,9 @@ function IssueDetailScreen({ nav, issue }) {
4420
4981
  borderRadius: 6
4421
4982
  }, children: severityConfig.label })
4422
4983
  ] }),
4423
- /* @__PURE__ */ (0, import_jsx_runtime16.jsx)("h3", { style: { fontSize: 16, fontWeight: 700, color: colors.textPrimary, margin: "0 0 8px 0", lineHeight: 1.3 }, children: issue.title }),
4424
- issue.route && /* @__PURE__ */ (0, import_jsx_runtime16.jsx)("div", { style: { fontSize: 12, color: colors.textDim, marginBottom: 12 }, children: issue.route }),
4425
- issue.description && /* @__PURE__ */ (0, import_jsx_runtime16.jsx)("div", { style: {
4984
+ /* @__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 }),
4985
+ issue.route && /* @__PURE__ */ (0, import_jsx_runtime17.jsx)("div", { style: { fontSize: 12, color: colors.textDim, marginBottom: 12 }, children: issue.route }),
4986
+ issue.description && /* @__PURE__ */ (0, import_jsx_runtime17.jsx)("div", { style: {
4426
4987
  backgroundColor: colors.card,
4427
4988
  border: `1px solid ${colors.border}`,
4428
4989
  borderRadius: 8,
@@ -4434,56 +4995,56 @@ function IssueDetailScreen({ nav, issue }) {
4434
4995
  whiteSpace: "pre-wrap",
4435
4996
  wordBreak: "break-word"
4436
4997
  }, children: issue.description }),
4437
- issue.verifiedByName && /* @__PURE__ */ (0, import_jsx_runtime16.jsxs)("div", { style: {
4998
+ issue.verifiedByName && /* @__PURE__ */ (0, import_jsx_runtime17.jsxs)("div", { style: {
4438
4999
  backgroundColor: "#14532d",
4439
5000
  border: "1px solid #166534",
4440
5001
  borderRadius: 8,
4441
5002
  padding: 12,
4442
5003
  marginBottom: 12
4443
5004
  }, children: [
4444
- /* @__PURE__ */ (0, import_jsx_runtime16.jsxs)("div", { style: { display: "flex", alignItems: "center", gap: 8, marginBottom: 4 }, children: [
4445
- /* @__PURE__ */ (0, import_jsx_runtime16.jsx)("span", { style: { fontSize: 16 }, children: "\u2705" }),
4446
- /* @__PURE__ */ (0, import_jsx_runtime16.jsx)("span", { style: { fontSize: 13, fontWeight: 600, color: "#4ade80" }, children: "Retesting Proof" })
5005
+ /* @__PURE__ */ (0, import_jsx_runtime17.jsxs)("div", { style: { display: "flex", alignItems: "center", gap: 8, marginBottom: 4 }, children: [
5006
+ /* @__PURE__ */ (0, import_jsx_runtime17.jsx)("span", { style: { fontSize: 16 }, children: "\u2705" }),
5007
+ /* @__PURE__ */ (0, import_jsx_runtime17.jsx)("span", { style: { fontSize: 13, fontWeight: 600, color: "#4ade80" }, children: "Retesting Proof" })
4447
5008
  ] }),
4448
- /* @__PURE__ */ (0, import_jsx_runtime16.jsxs)("div", { style: { fontSize: 12, color: "#86efac" }, children: [
5009
+ /* @__PURE__ */ (0, import_jsx_runtime17.jsxs)("div", { style: { fontSize: 12, color: "#86efac" }, children: [
4449
5010
  "Verified by ",
4450
- /* @__PURE__ */ (0, import_jsx_runtime16.jsx)("strong", { children: issue.verifiedByName }),
4451
- issue.verifiedAt && /* @__PURE__ */ (0, import_jsx_runtime16.jsxs)("span", { children: [
5011
+ /* @__PURE__ */ (0, import_jsx_runtime17.jsx)("strong", { children: issue.verifiedByName }),
5012
+ issue.verifiedAt && /* @__PURE__ */ (0, import_jsx_runtime17.jsxs)("span", { children: [
4452
5013
  " on ",
4453
5014
  new Date(issue.verifiedAt).toLocaleDateString(void 0, { month: "short", day: "numeric", year: "numeric" })
4454
5015
  ] })
4455
5016
  ] })
4456
5017
  ] }),
4457
- issue.originalBugTitle && /* @__PURE__ */ (0, import_jsx_runtime16.jsxs)("div", { style: {
5018
+ issue.originalBugTitle && /* @__PURE__ */ (0, import_jsx_runtime17.jsxs)("div", { style: {
4458
5019
  backgroundColor: "#422006",
4459
5020
  border: "1px solid #854d0e",
4460
5021
  borderRadius: 8,
4461
5022
  padding: 12,
4462
5023
  marginBottom: 12
4463
5024
  }, children: [
4464
- /* @__PURE__ */ (0, import_jsx_runtime16.jsxs)("div", { style: { display: "flex", alignItems: "center", gap: 8, marginBottom: 4 }, children: [
4465
- /* @__PURE__ */ (0, import_jsx_runtime16.jsx)("span", { style: { fontSize: 16 }, children: "\u{1F504}" }),
4466
- /* @__PURE__ */ (0, import_jsx_runtime16.jsx)("span", { style: { fontSize: 13, fontWeight: 600, color: "#fbbf24" }, children: "Original Bug" })
5025
+ /* @__PURE__ */ (0, import_jsx_runtime17.jsxs)("div", { style: { display: "flex", alignItems: "center", gap: 8, marginBottom: 4 }, children: [
5026
+ /* @__PURE__ */ (0, import_jsx_runtime17.jsx)("span", { style: { fontSize: 16 }, children: "\u{1F504}" }),
5027
+ /* @__PURE__ */ (0, import_jsx_runtime17.jsx)("span", { style: { fontSize: 13, fontWeight: 600, color: "#fbbf24" }, children: "Original Bug" })
4467
5028
  ] }),
4468
- /* @__PURE__ */ (0, import_jsx_runtime16.jsxs)("div", { style: { fontSize: 12, color: "#fde68a" }, children: [
5029
+ /* @__PURE__ */ (0, import_jsx_runtime17.jsxs)("div", { style: { fontSize: 12, color: "#fde68a" }, children: [
4469
5030
  "Retest of: ",
4470
- /* @__PURE__ */ (0, import_jsx_runtime16.jsx)("strong", { children: issue.originalBugTitle })
5031
+ /* @__PURE__ */ (0, import_jsx_runtime17.jsx)("strong", { children: issue.originalBugTitle })
4471
5032
  ] })
4472
5033
  ] }),
4473
- issue.screenshotUrls && issue.screenshotUrls.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime16.jsxs)("div", { style: { marginBottom: 12 }, children: [
4474
- /* @__PURE__ */ (0, import_jsx_runtime16.jsxs)("div", { style: { fontSize: 12, fontWeight: 600, color: colors.textMuted, marginBottom: 8 }, children: [
5034
+ issue.screenshotUrls && issue.screenshotUrls.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime17.jsxs)("div", { style: { marginBottom: 12 }, children: [
5035
+ /* @__PURE__ */ (0, import_jsx_runtime17.jsxs)("div", { style: { fontSize: 12, fontWeight: 600, color: colors.textMuted, marginBottom: 8 }, children: [
4475
5036
  "Screenshots (",
4476
5037
  issue.screenshotUrls.length,
4477
5038
  ")"
4478
5039
  ] }),
4479
- /* @__PURE__ */ (0, import_jsx_runtime16.jsx)("div", { style: { display: "flex", gap: 8, overflowX: "auto" }, children: issue.screenshotUrls.map((url, i) => /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(
5040
+ /* @__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)(
4480
5041
  "a",
4481
5042
  {
4482
5043
  href: url,
4483
5044
  target: "_blank",
4484
5045
  rel: "noopener noreferrer",
4485
5046
  style: { flexShrink: 0 },
4486
- children: /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(
5047
+ children: /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(
4487
5048
  "img",
4488
5049
  {
4489
5050
  src: url,
@@ -4501,22 +5062,44 @@ function IssueDetailScreen({ nav, issue }) {
4501
5062
  i
4502
5063
  )) })
4503
5064
  ] }),
4504
- /* @__PURE__ */ (0, import_jsx_runtime16.jsxs)("div", { style: {
5065
+ /* @__PURE__ */ (0, import_jsx_runtime17.jsxs)("div", { style: {
4505
5066
  borderTop: `1px solid ${colors.border}`,
4506
5067
  paddingTop: 12,
4507
5068
  marginTop: 4
4508
5069
  }, children: [
4509
- issue.reporterName && /* @__PURE__ */ (0, import_jsx_runtime16.jsxs)("div", { style: { fontSize: 12, color: colors.textDim, marginBottom: 4 }, children: [
5070
+ issue.reporterName && /* @__PURE__ */ (0, import_jsx_runtime17.jsxs)("div", { style: { fontSize: 12, color: colors.textDim, marginBottom: 4 }, children: [
4510
5071
  "Reported by ",
4511
5072
  issue.reporterName
4512
5073
  ] }),
4513
- /* @__PURE__ */ (0, import_jsx_runtime16.jsxs)("div", { style: { fontSize: 11, color: colors.textDim }, children: [
5074
+ /* @__PURE__ */ (0, import_jsx_runtime17.jsxs)("div", { style: { fontSize: 11, color: colors.textDim }, children: [
4514
5075
  "Created ",
4515
5076
  formatRelativeTime(issue.createdAt),
4516
5077
  " \xB7 Updated ",
4517
5078
  formatRelativeTime(issue.updatedAt)
4518
5079
  ] })
4519
- ] })
5080
+ ] }),
5081
+ dashboardUrl && /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(
5082
+ "a",
5083
+ {
5084
+ href: `${dashboardUrl}/reports`,
5085
+ target: "_blank",
5086
+ rel: "noopener noreferrer",
5087
+ style: {
5088
+ display: "flex",
5089
+ alignItems: "center",
5090
+ justifyContent: "center",
5091
+ gap: 6,
5092
+ marginTop: 12,
5093
+ padding: "10px 0",
5094
+ fontSize: 13,
5095
+ fontWeight: 500,
5096
+ color: colors.blue,
5097
+ textDecoration: "none",
5098
+ borderTop: `1px solid ${colors.border}`
5099
+ },
5100
+ children: "\u{1F310} View on Dashboard \u2192"
5101
+ }
5102
+ )
4520
5103
  ] });
4521
5104
  }
4522
5105
 
@@ -4524,9 +5107,9 @@ function IssueDetailScreen({ nav, issue }) {
4524
5107
  var BUGBEAR_LOGO_BASE64 = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGAAAABgCAYAAADimHc4AAAAAXNSR0IArs4c6QAAAJhlWElmTU0AKgAAAAgABAEaAAUAAAABAAAAPgEbAAUAAAABAAAARgEoAAMAAAABAAIAAIdpAAQAAAABAAAATgAAAAAAAABIAAAAAQAAAEgAAAABAASQBAACAAAAFAAAAISgAQADAAAAAQABAACgAgAEAAAAAQAAAGCgAwAEAAAAAQAAAGAAAAAAMjAyNjowMToyNCAxNjoyMTozOABbbVCuAAAACXBIWXMAAAsTAAALEwEAmpwYAAACo2lUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iWE1QIENvcmUgNi4wLjAiPgogICA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPgogICAgICA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIgogICAgICAgICAgICB4bWxuczpJcHRjNHhtcEV4dD0iaHR0cDovL2lwdGMub3JnL3N0ZC9JcHRjNHhtcEV4dC8yMDA4LTAyLTI5LyIKICAgICAgICAgICAgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIj4KICAgICAgICAgPElwdGM0eG1wRXh0OkRpZ2l0YWxTb3VyY2VUeXBlPmh0dHA6Ly9jdi5pcHRjLm9yZy9uZXdzY29kZXMvZGlnaXRhbHNvdXJjZXR5cGUvdHJhaW5lZEFsZ29yaXRobWljTWVkaWE8L0lwdGM0eG1wRXh0OkRpZ2l0YWxTb3VyY2VUeXBlPgogICAgICAgICA8SXB0YzR4bXBFeHQ6RGlnSW1hZ2VHVUlEPmZjNzJlN2Q2LTYyYTEtNDE1ZS04MjY5LWM2NjA4MjY0OWRiMDwvSXB0YzR4bXBFeHQ6RGlnSW1hZ2VHVUlEPgogICAgICAgICA8eG1wOkNyZWF0ZURhdGU+MjAyNi0wMS0yNFQxNjoyMTozODwveG1wOkNyZWF0ZURhdGU+CiAgICAgIDwvcmRmOkRlc2NyaXB0aW9uPgogICA8L3JkZjpSREY+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";
4525
5108
 
4526
5109
  // src/BugBearPanel.tsx
4527
- var import_jsx_runtime17 = require("react/jsx-runtime");
5110
+ var import_jsx_runtime18 = require("react/jsx-runtime");
4528
5111
  function BugBearIcon({ size = 24 }) {
4529
- return /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(
5112
+ return /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(
4530
5113
  "img",
4531
5114
  {
4532
5115
  src: BUGBEAR_LOGO_BASE64,
@@ -4691,37 +5274,37 @@ function BugBearPanel({
4691
5274
  const renderScreen = () => {
4692
5275
  switch (currentScreen.name) {
4693
5276
  case "HOME":
4694
- return /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(HomeScreen, { nav });
5277
+ return /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(HomeScreen, { nav });
4695
5278
  case "TEST_DETAIL":
4696
- return /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(TestDetailScreen, { testId: currentScreen.testId, nav });
5279
+ return /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(TestDetailScreen, { testId: currentScreen.testId, nav });
4697
5280
  case "TEST_LIST":
4698
- return /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(TestListScreen, { nav });
5281
+ return /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(TestListScreen, { nav });
4699
5282
  case "TEST_FEEDBACK":
4700
- return /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(TestFeedbackScreen, { status: currentScreen.status, assignmentId: currentScreen.assignmentId, nav });
5283
+ return /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(TestFeedbackScreen, { status: currentScreen.status, assignmentId: currentScreen.assignmentId, nav });
4701
5284
  case "REPORT":
4702
- return /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(ReportScreen, { nav, prefill: currentScreen.prefill });
5285
+ return /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(ReportScreen, { nav, prefill: currentScreen.prefill });
4703
5286
  case "REPORT_SUCCESS":
4704
- return /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(ReportSuccessScreen, { nav });
5287
+ return /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(ReportSuccessScreen, { nav });
4705
5288
  case "MESSAGE_LIST":
4706
- return /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(MessageListScreen, { nav });
5289
+ return /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(MessageListScreen, { nav });
4707
5290
  case "THREAD_DETAIL":
4708
- return /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(ThreadDetailScreen, { thread: currentScreen.thread, nav });
5291
+ return /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(ThreadDetailScreen, { thread: currentScreen.thread, nav });
4709
5292
  case "COMPOSE_MESSAGE":
4710
- return /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(ComposeMessageScreen, { nav });
5293
+ return /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(ComposeMessageScreen, { nav });
4711
5294
  case "ISSUE_LIST":
4712
- return /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(IssueListScreen, { nav, category: currentScreen.category });
5295
+ return /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(IssueListScreen, { nav, category: currentScreen.category });
4713
5296
  case "ISSUE_DETAIL":
4714
- return /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(IssueDetailScreen, { nav, issue: currentScreen.issue });
5297
+ return /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(IssueDetailScreen, { nav, issue: currentScreen.issue });
4715
5298
  case "PROFILE":
4716
- return /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(ProfileScreen, { nav });
5299
+ return /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(ProfileScreen, { nav });
4717
5300
  default:
4718
- return /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(HomeScreen, { nav });
5301
+ return /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(HomeScreen, { nav });
4719
5302
  }
4720
5303
  };
4721
5304
  if (typeof document === "undefined") return null;
4722
5305
  const headerTitle = getHeaderTitle();
4723
5306
  return (0, import_react_dom.createPortal)(
4724
- /* @__PURE__ */ (0, import_jsx_runtime17.jsxs)(
5307
+ /* @__PURE__ */ (0, import_jsx_runtime18.jsxs)(
4725
5308
  "div",
4726
5309
  {
4727
5310
  ref: panelRef,
@@ -4740,7 +5323,7 @@ function BugBearPanel({
4740
5323
  },
4741
5324
  onMouseDown: handleMouseDown,
4742
5325
  children: [
4743
- collapsed && /* @__PURE__ */ (0, import_jsx_runtime17.jsxs)(
5326
+ collapsed && /* @__PURE__ */ (0, import_jsx_runtime18.jsxs)(
4744
5327
  "button",
4745
5328
  {
4746
5329
  onClick: () => setCollapsed(false),
@@ -4762,9 +5345,9 @@ function BugBearPanel({
4762
5345
  fontWeight: 500
4763
5346
  },
4764
5347
  children: [
4765
- /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(BugBearIcon, { size: 24 }),
4766
- /* @__PURE__ */ (0, import_jsx_runtime17.jsx)("span", { children: "BugBear" }),
4767
- badgeCount > 0 && /* @__PURE__ */ (0, import_jsx_runtime17.jsx)("span", { style: {
5348
+ /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(BugBearIcon, { size: 24 }),
5349
+ /* @__PURE__ */ (0, import_jsx_runtime18.jsx)("span", { children: "BugBear" }),
5350
+ badgeCount > 0 && /* @__PURE__ */ (0, import_jsx_runtime18.jsx)("span", { style: {
4768
5351
  backgroundColor: "#fff",
4769
5352
  color: colors.blue,
4770
5353
  fontSize: "0.75rem",
@@ -4775,7 +5358,7 @@ function BugBearPanel({
4775
5358
  ]
4776
5359
  }
4777
5360
  ),
4778
- !collapsed && /* @__PURE__ */ (0, import_jsx_runtime17.jsxs)("div", { style: {
5361
+ !collapsed && /* @__PURE__ */ (0, import_jsx_runtime18.jsxs)("div", { style: {
4779
5362
  width: PANEL_WIDTH,
4780
5363
  backgroundColor: colors.bg,
4781
5364
  borderRadius: 12,
@@ -4783,7 +5366,7 @@ function BugBearPanel({
4783
5366
  overflow: "hidden",
4784
5367
  boxShadow: "0 25px 50px -12px rgba(0,0,0,0.5)"
4785
5368
  }, children: [
4786
- /* @__PURE__ */ (0, import_jsx_runtime17.jsxs)(
5369
+ /* @__PURE__ */ (0, import_jsx_runtime18.jsxs)(
4787
5370
  "div",
4788
5371
  {
4789
5372
  "data-drag-handle": true,
@@ -4799,7 +5382,7 @@ function BugBearPanel({
4799
5382
  cursor: draggable ? isDragging ? "grabbing" : "grab" : "default"
4800
5383
  },
4801
5384
  children: [
4802
- /* @__PURE__ */ (0, import_jsx_runtime17.jsx)("div", { style: { display: "flex", alignItems: "center", gap: 8, flex: 1, minWidth: 0 }, children: canGoBack ? /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(
5385
+ /* @__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)(
4803
5386
  "button",
4804
5387
  {
4805
5388
  onClick: pop,
@@ -4815,14 +5398,14 @@ function BugBearPanel({
4815
5398
  },
4816
5399
  children: "\u2190 Back"
4817
5400
  }
4818
- ) : /* @__PURE__ */ (0, import_jsx_runtime17.jsxs)(import_jsx_runtime17.Fragment, { children: [
4819
- /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(BugBearIcon, { size: 28 }),
4820
- /* @__PURE__ */ (0, import_jsx_runtime17.jsxs)("div", { children: [
4821
- /* @__PURE__ */ (0, import_jsx_runtime17.jsxs)("div", { style: { display: "flex", alignItems: "center", gap: 8 }, children: [
4822
- /* @__PURE__ */ (0, import_jsx_runtime17.jsx)("span", { style: { fontWeight: 600, fontSize: "0.875rem" }, children: "BugBear" }),
4823
- draggable && /* @__PURE__ */ (0, import_jsx_runtime17.jsx)("span", { style: { color: colors.textMuted, fontSize: "0.75rem" }, title: "Drag to move, double-click to reset", children: "\u22EE\u22EE" })
5401
+ ) : /* @__PURE__ */ (0, import_jsx_runtime18.jsxs)(import_jsx_runtime18.Fragment, { children: [
5402
+ /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(BugBearIcon, { size: 28 }),
5403
+ /* @__PURE__ */ (0, import_jsx_runtime18.jsxs)("div", { children: [
5404
+ /* @__PURE__ */ (0, import_jsx_runtime18.jsxs)("div", { style: { display: "flex", alignItems: "center", gap: 8 }, children: [
5405
+ /* @__PURE__ */ (0, import_jsx_runtime18.jsx)("span", { style: { fontWeight: 600, fontSize: "0.875rem" }, children: "BugBear" }),
5406
+ 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" })
4824
5407
  ] }),
4825
- testerInfo && /* @__PURE__ */ (0, import_jsx_runtime17.jsxs)(
5408
+ testerInfo && /* @__PURE__ */ (0, import_jsx_runtime18.jsxs)(
4826
5409
  "button",
4827
5410
  {
4828
5411
  onClick: () => push({ name: "PROFILE" }),
@@ -4840,13 +5423,13 @@ function BugBearPanel({
4840
5423
  },
4841
5424
  children: [
4842
5425
  testerInfo.name,
4843
- /* @__PURE__ */ (0, import_jsx_runtime17.jsx)("span", { style: { fontSize: "0.625rem" }, children: "\u270E" })
5426
+ /* @__PURE__ */ (0, import_jsx_runtime18.jsx)("span", { style: { fontSize: "0.625rem" }, children: "\u270E" })
4844
5427
  ]
4845
5428
  }
4846
5429
  )
4847
5430
  ] })
4848
5431
  ] }) }),
4849
- headerTitle ? /* @__PURE__ */ (0, import_jsx_runtime17.jsx)("span", { style: {
5432
+ headerTitle ? /* @__PURE__ */ (0, import_jsx_runtime18.jsx)("span", { style: {
4850
5433
  fontSize: "0.8125rem",
4851
5434
  fontWeight: 600,
4852
5435
  color: colors.textSecondary,
@@ -4856,7 +5439,7 @@ function BugBearPanel({
4856
5439
  textOverflow: "ellipsis",
4857
5440
  whiteSpace: "nowrap"
4858
5441
  }, children: headerTitle }) : null,
4859
- /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(
5442
+ /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(
4860
5443
  "button",
4861
5444
  {
4862
5445
  onClick: handleClose,
@@ -4880,13 +5463,13 @@ function BugBearPanel({
4880
5463
  ]
4881
5464
  }
4882
5465
  ),
4883
- /* @__PURE__ */ (0, import_jsx_runtime17.jsx)("div", { style: {
5466
+ /* @__PURE__ */ (0, import_jsx_runtime18.jsx)("div", { style: {
4884
5467
  padding: 16,
4885
5468
  maxHeight: 400,
4886
5469
  overflowY: "auto",
4887
5470
  backgroundColor: colors.bg,
4888
5471
  color: colors.textSecondary
4889
- }, children: isLoading ? /* @__PURE__ */ (0, import_jsx_runtime17.jsx)("div", { style: { padding: "60px 0", textAlign: "center" }, children: /* @__PURE__ */ (0, import_jsx_runtime17.jsx)("div", { style: { color: colors.textMuted, fontSize: "0.875rem" }, children: "Loading..." }) }) : renderScreen() })
5472
+ }, 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() })
4890
5473
  ] })
4891
5474
  ]
4892
5475
  }
@@ -4898,7 +5481,7 @@ function BugBearPanel({
4898
5481
  // src/BugBearErrorBoundary.tsx
4899
5482
  var import_react15 = require("react");
4900
5483
  var import_core2 = require("@bbearai/core");
4901
- var import_jsx_runtime18 = require("react/jsx-runtime");
5484
+ var import_jsx_runtime19 = require("react/jsx-runtime");
4902
5485
  var BugBearErrorBoundary = class extends import_react15.Component {
4903
5486
  constructor(props) {
4904
5487
  super(props);
@@ -4943,7 +5526,7 @@ var BugBearErrorBoundary = class extends import_react15.Component {
4943
5526
  if (fallback) {
4944
5527
  return fallback;
4945
5528
  }
4946
- return /* @__PURE__ */ (0, import_jsx_runtime18.jsxs)(
5529
+ return /* @__PURE__ */ (0, import_jsx_runtime19.jsxs)(
4947
5530
  "div",
4948
5531
  {
4949
5532
  style: {
@@ -4955,13 +5538,13 @@ var BugBearErrorBoundary = class extends import_react15.Component {
4955
5538
  fontFamily: '-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif'
4956
5539
  },
4957
5540
  children: [
4958
- /* @__PURE__ */ (0, import_jsx_runtime18.jsxs)("div", { style: { display: "flex", alignItems: "center", gap: "8px", marginBottom: "12px" }, children: [
4959
- /* @__PURE__ */ (0, import_jsx_runtime18.jsx)("img", { src: BUGBEAR_LOGO_BASE64, alt: "BugBear", width: 28, height: 28, style: { objectFit: "contain" } }),
4960
- /* @__PURE__ */ (0, import_jsx_runtime18.jsx)("h3", { style: { margin: 0, color: "#991b1b", fontSize: "16px" }, children: "Something went wrong" })
5541
+ /* @__PURE__ */ (0, import_jsx_runtime19.jsxs)("div", { style: { display: "flex", alignItems: "center", gap: "8px", marginBottom: "12px" }, children: [
5542
+ /* @__PURE__ */ (0, import_jsx_runtime19.jsx)("img", { src: BUGBEAR_LOGO_BASE64, alt: "BugBear", width: 28, height: 28, style: { objectFit: "contain" } }),
5543
+ /* @__PURE__ */ (0, import_jsx_runtime19.jsx)("h3", { style: { margin: 0, color: "#991b1b", fontSize: "16px" }, children: "Something went wrong" })
4961
5544
  ] }),
4962
- /* @__PURE__ */ (0, import_jsx_runtime18.jsx)("p", { style: { color: "#7f1d1d", fontSize: "14px", margin: "0 0 12px 0" }, children: error.message }),
4963
- /* @__PURE__ */ (0, import_jsx_runtime18.jsxs)("div", { style: { display: "flex", gap: "8px" }, children: [
4964
- /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(
5545
+ /* @__PURE__ */ (0, import_jsx_runtime19.jsx)("p", { style: { color: "#7f1d1d", fontSize: "14px", margin: "0 0 12px 0" }, children: error.message }),
5546
+ /* @__PURE__ */ (0, import_jsx_runtime19.jsxs)("div", { style: { display: "flex", gap: "8px" }, children: [
5547
+ /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(
4965
5548
  "button",
4966
5549
  {
4967
5550
  onClick: this.reset,
@@ -4978,7 +5561,7 @@ var BugBearErrorBoundary = class extends import_react15.Component {
4978
5561
  children: "Try Again"
4979
5562
  }
4980
5563
  ),
4981
- /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(
5564
+ /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(
4982
5565
  "button",
4983
5566
  {
4984
5567
  onClick: () => window.location.reload(),
@@ -4996,7 +5579,7 @@ var BugBearErrorBoundary = class extends import_react15.Component {
4996
5579
  }
4997
5580
  )
4998
5581
  ] }),
4999
- /* @__PURE__ */ (0, import_jsx_runtime18.jsx)("p", { style: { color: "#9ca3af", fontSize: "12px", marginTop: "12px" }, children: "The error has been captured by BugBear" })
5582
+ /* @__PURE__ */ (0, import_jsx_runtime19.jsx)("p", { style: { color: "#9ca3af", fontSize: "12px", marginTop: "12px" }, children: "The error has been captured by BugBear" })
5000
5583
  ]
5001
5584
  }
5002
5585
  );