@bbearai/react 0.4.0 → 0.4.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.mts +3 -1
- package/dist/index.d.ts +3 -1
- package/dist/index.js +465 -88
- package/dist/index.mjs +459 -82
- package/package.json +1 -1
package/dist/index.mjs
CHANGED
|
@@ -41,6 +41,10 @@ var BugBearContext = createContext({
|
|
|
41
41
|
},
|
|
42
42
|
createThread: async () => ({ success: false }),
|
|
43
43
|
uploadImage: async () => null,
|
|
44
|
+
// Issue tracking
|
|
45
|
+
issueCounts: { open: 0, done: 0, reopened: 0 },
|
|
46
|
+
refreshIssueCounts: async () => {
|
|
47
|
+
},
|
|
44
48
|
onError: void 0
|
|
45
49
|
});
|
|
46
50
|
function useBugBear() {
|
|
@@ -58,6 +62,7 @@ function BugBearProvider({ config, children, enabled = true }) {
|
|
|
58
62
|
const [sessionFindings, setSessionFindings] = useState([]);
|
|
59
63
|
const [threads, setThreads] = useState([]);
|
|
60
64
|
const [unreadCount, setUnreadCount] = useState(0);
|
|
65
|
+
const [issueCounts, setIssueCounts] = useState({ open: 0, done: 0, reopened: 0 });
|
|
61
66
|
const refreshAssignments = useCallback(async () => {
|
|
62
67
|
if (!client) return;
|
|
63
68
|
const newAssignments = await client.getAssignedTests();
|
|
@@ -109,6 +114,11 @@ function BugBearProvider({ config, children, enabled = true }) {
|
|
|
109
114
|
const totalUnread = newThreads.reduce((sum, t) => sum + t.unreadCount, 0);
|
|
110
115
|
setUnreadCount(totalUnread);
|
|
111
116
|
}, [client]);
|
|
117
|
+
const refreshIssueCounts = useCallback(async () => {
|
|
118
|
+
if (!client) return;
|
|
119
|
+
const counts = await client.getIssueCounts();
|
|
120
|
+
setIssueCounts(counts);
|
|
121
|
+
}, [client]);
|
|
112
122
|
const getThreadMessages = useCallback(async (threadId) => {
|
|
113
123
|
if (!client) return [];
|
|
114
124
|
return client.getThreadMessages(threadId);
|
|
@@ -150,16 +160,18 @@ function BugBearProvider({ config, children, enabled = true }) {
|
|
|
150
160
|
setTesterInfo(info);
|
|
151
161
|
setIsTester(!!info);
|
|
152
162
|
if (info && qaEnabled) {
|
|
153
|
-
const [newAssignments, session, newThreads] = await Promise.all([
|
|
163
|
+
const [newAssignments, session, newThreads, counts] = await Promise.all([
|
|
154
164
|
bugBearClient.getAssignedTests(),
|
|
155
165
|
bugBearClient.getActiveSession(),
|
|
156
|
-
bugBearClient.getThreadsForTester()
|
|
166
|
+
bugBearClient.getThreadsForTester(),
|
|
167
|
+
bugBearClient.getIssueCounts()
|
|
157
168
|
]);
|
|
158
169
|
setAssignments(newAssignments);
|
|
159
170
|
setActiveSession(session);
|
|
160
171
|
setThreads(newThreads);
|
|
161
172
|
const totalUnread = newThreads.reduce((sum, t) => sum + t.unreadCount, 0);
|
|
162
173
|
setUnreadCount(totalUnread);
|
|
174
|
+
setIssueCounts(counts);
|
|
163
175
|
if (session) {
|
|
164
176
|
const findings = await bugBearClient.getSessionFindings(session.id);
|
|
165
177
|
setSessionFindings(findings);
|
|
@@ -241,6 +253,9 @@ function BugBearProvider({ config, children, enabled = true }) {
|
|
|
241
253
|
markAsRead,
|
|
242
254
|
createThread,
|
|
243
255
|
uploadImage,
|
|
256
|
+
// Issue tracking
|
|
257
|
+
issueCounts,
|
|
258
|
+
refreshIssueCounts,
|
|
244
259
|
onError: config.onError
|
|
245
260
|
},
|
|
246
261
|
children
|
|
@@ -249,7 +264,7 @@ function BugBearProvider({ config, children, enabled = true }) {
|
|
|
249
264
|
}
|
|
250
265
|
|
|
251
266
|
// src/BugBearPanel.tsx
|
|
252
|
-
import { useState as
|
|
267
|
+
import { useState as useState11, useRef as useRef3, useEffect as useEffect8, useCallback as useCallback5 } from "react";
|
|
253
268
|
import { createPortal } from "react-dom";
|
|
254
269
|
|
|
255
270
|
// src/widget/navigation.ts
|
|
@@ -369,10 +384,11 @@ function getThreadTypeIcon(type) {
|
|
|
369
384
|
import { useEffect as useEffect2 } from "react";
|
|
370
385
|
import { jsx as jsx2, jsxs } from "react/jsx-runtime";
|
|
371
386
|
function HomeScreen({ nav }) {
|
|
372
|
-
const { assignments, unreadCount, threads, refreshAssignments, refreshThreads } = useBugBear();
|
|
387
|
+
const { assignments, unreadCount, threads, refreshAssignments, refreshThreads, issueCounts, refreshIssueCounts } = useBugBear();
|
|
373
388
|
useEffect2(() => {
|
|
374
389
|
refreshAssignments();
|
|
375
390
|
refreshThreads();
|
|
391
|
+
refreshIssueCounts();
|
|
376
392
|
}, []);
|
|
377
393
|
const pendingAssignments = assignments.filter((a) => a.status === "pending" || a.status === "in_progress");
|
|
378
394
|
const pendingCount = pendingAssignments.length;
|
|
@@ -657,6 +673,89 @@ function HomeScreen({ nav }) {
|
|
|
657
673
|
]
|
|
658
674
|
}
|
|
659
675
|
),
|
|
676
|
+
/* @__PURE__ */ jsxs("div", { style: { display: "grid", gridTemplateColumns: "1fr 1fr 1fr", gap: 10, marginBottom: 20 }, children: [
|
|
677
|
+
/* @__PURE__ */ jsxs(
|
|
678
|
+
"div",
|
|
679
|
+
{
|
|
680
|
+
role: "button",
|
|
681
|
+
tabIndex: 0,
|
|
682
|
+
onClick: () => nav.push({ name: "ISSUE_LIST", category: "open" }),
|
|
683
|
+
onKeyDown: (e) => {
|
|
684
|
+
if (e.key === "Enter" || e.key === " ") nav.push({ name: "ISSUE_LIST", category: "open" });
|
|
685
|
+
},
|
|
686
|
+
style: {
|
|
687
|
+
backgroundColor: "#27272a",
|
|
688
|
+
border: "1px solid #3f3f46",
|
|
689
|
+
borderTop: "3px solid #f97316",
|
|
690
|
+
borderRadius: 10,
|
|
691
|
+
padding: "12px 8px",
|
|
692
|
+
display: "flex",
|
|
693
|
+
flexDirection: "column",
|
|
694
|
+
alignItems: "center",
|
|
695
|
+
cursor: "pointer",
|
|
696
|
+
userSelect: "none"
|
|
697
|
+
},
|
|
698
|
+
children: [
|
|
699
|
+
/* @__PURE__ */ jsx2("span", { style: { fontSize: 22, fontWeight: 700, color: "#f97316" }, children: issueCounts.open }),
|
|
700
|
+
/* @__PURE__ */ jsx2("span", { style: { fontSize: 11, fontWeight: 600, color: "#a1a1aa", marginTop: 2 }, children: "Open" })
|
|
701
|
+
]
|
|
702
|
+
}
|
|
703
|
+
),
|
|
704
|
+
/* @__PURE__ */ jsxs(
|
|
705
|
+
"div",
|
|
706
|
+
{
|
|
707
|
+
role: "button",
|
|
708
|
+
tabIndex: 0,
|
|
709
|
+
onClick: () => nav.push({ name: "ISSUE_LIST", category: "done" }),
|
|
710
|
+
onKeyDown: (e) => {
|
|
711
|
+
if (e.key === "Enter" || e.key === " ") nav.push({ name: "ISSUE_LIST", category: "done" });
|
|
712
|
+
},
|
|
713
|
+
style: {
|
|
714
|
+
backgroundColor: "#27272a",
|
|
715
|
+
border: "1px solid #3f3f46",
|
|
716
|
+
borderTop: "3px solid #22c55e",
|
|
717
|
+
borderRadius: 10,
|
|
718
|
+
padding: "12px 8px",
|
|
719
|
+
display: "flex",
|
|
720
|
+
flexDirection: "column",
|
|
721
|
+
alignItems: "center",
|
|
722
|
+
cursor: "pointer",
|
|
723
|
+
userSelect: "none"
|
|
724
|
+
},
|
|
725
|
+
children: [
|
|
726
|
+
/* @__PURE__ */ jsx2("span", { style: { fontSize: 22, fontWeight: 700, color: "#22c55e" }, children: issueCounts.done }),
|
|
727
|
+
/* @__PURE__ */ jsx2("span", { style: { fontSize: 11, fontWeight: 600, color: "#a1a1aa", marginTop: 2 }, children: "Done" })
|
|
728
|
+
]
|
|
729
|
+
}
|
|
730
|
+
),
|
|
731
|
+
/* @__PURE__ */ jsxs(
|
|
732
|
+
"div",
|
|
733
|
+
{
|
|
734
|
+
role: "button",
|
|
735
|
+
tabIndex: 0,
|
|
736
|
+
onClick: () => nav.push({ name: "ISSUE_LIST", category: "reopened" }),
|
|
737
|
+
onKeyDown: (e) => {
|
|
738
|
+
if (e.key === "Enter" || e.key === " ") nav.push({ name: "ISSUE_LIST", category: "reopened" });
|
|
739
|
+
},
|
|
740
|
+
style: {
|
|
741
|
+
backgroundColor: "#27272a",
|
|
742
|
+
border: "1px solid #3f3f46",
|
|
743
|
+
borderTop: "3px solid #ef4444",
|
|
744
|
+
borderRadius: 10,
|
|
745
|
+
padding: "12px 8px",
|
|
746
|
+
display: "flex",
|
|
747
|
+
flexDirection: "column",
|
|
748
|
+
alignItems: "center",
|
|
749
|
+
cursor: "pointer",
|
|
750
|
+
userSelect: "none"
|
|
751
|
+
},
|
|
752
|
+
children: [
|
|
753
|
+
/* @__PURE__ */ jsx2("span", { style: { fontSize: 22, fontWeight: 700, color: "#ef4444" }, children: issueCounts.reopened }),
|
|
754
|
+
/* @__PURE__ */ jsx2("span", { style: { fontSize: 11, fontWeight: 600, color: "#a1a1aa", marginTop: 2 }, children: "Reopened" })
|
|
755
|
+
]
|
|
756
|
+
}
|
|
757
|
+
)
|
|
758
|
+
] }),
|
|
660
759
|
totalTests > 0 && /* @__PURE__ */ jsxs("div", { style: { marginBottom: 16 }, children: [
|
|
661
760
|
/* @__PURE__ */ jsx2(
|
|
662
761
|
"div",
|
|
@@ -696,6 +795,7 @@ function HomeScreen({ nav }) {
|
|
|
696
795
|
onClick: () => {
|
|
697
796
|
refreshAssignments();
|
|
698
797
|
refreshThreads();
|
|
798
|
+
refreshIssueCounts();
|
|
699
799
|
},
|
|
700
800
|
style: {
|
|
701
801
|
background: "none",
|
|
@@ -1579,36 +1679,21 @@ function TestListScreen({ nav }) {
|
|
|
1579
1679
|
const filterAssignment = (a) => {
|
|
1580
1680
|
if (roleFilter && a.testCase.role?.id !== roleFilter) return false;
|
|
1581
1681
|
if (filter === "pending") return a.status === "pending" || a.status === "in_progress";
|
|
1582
|
-
if (filter === "
|
|
1682
|
+
if (filter === "done") return a.status === "passed";
|
|
1683
|
+
if (filter === "reopened") return a.status === "failed";
|
|
1583
1684
|
return true;
|
|
1584
1685
|
};
|
|
1585
1686
|
const pendingCount = assignments.filter(
|
|
1586
1687
|
(a) => a.status === "pending" || a.status === "in_progress"
|
|
1587
1688
|
).length;
|
|
1588
|
-
const doneCount = assignments.filter(
|
|
1589
|
-
|
|
1590
|
-
).length;
|
|
1689
|
+
const doneCount = assignments.filter((a) => a.status === "passed").length;
|
|
1690
|
+
const reopenedCount = assignments.filter((a) => a.status === "failed").length;
|
|
1591
1691
|
const filters = [
|
|
1592
1692
|
{ key: "all", label: "All", count: assignments.length },
|
|
1593
1693
|
{ key: "pending", label: "To Do", count: pendingCount },
|
|
1594
|
-
{ key: "
|
|
1694
|
+
{ key: "done", label: "Done", count: doneCount },
|
|
1695
|
+
{ key: "reopened", label: "Re Opened", count: reopenedCount }
|
|
1595
1696
|
];
|
|
1596
|
-
const getStatusColor = (status) => {
|
|
1597
|
-
switch (status) {
|
|
1598
|
-
case "passed":
|
|
1599
|
-
return colors.green;
|
|
1600
|
-
case "failed":
|
|
1601
|
-
return colors.red;
|
|
1602
|
-
case "skipped":
|
|
1603
|
-
return colors.yellow;
|
|
1604
|
-
case "in_progress":
|
|
1605
|
-
return colors.blue;
|
|
1606
|
-
case "blocked":
|
|
1607
|
-
return colors.red;
|
|
1608
|
-
default:
|
|
1609
|
-
return colors.textMuted;
|
|
1610
|
-
}
|
|
1611
|
-
};
|
|
1612
1697
|
return /* @__PURE__ */ jsxs3("div", { children: [
|
|
1613
1698
|
/* @__PURE__ */ jsx4("div", { style: { display: "flex", gap: 8, marginBottom: availableRoles.length >= 2 ? 8 : 16 }, children: filters.map((f) => /* @__PURE__ */ jsxs3(
|
|
1614
1699
|
"button",
|
|
@@ -1909,10 +1994,14 @@ function TestListScreen({ nav }) {
|
|
|
1909
1994
|
{
|
|
1910
1995
|
style: {
|
|
1911
1996
|
fontSize: 10,
|
|
1912
|
-
|
|
1913
|
-
fontWeight: 500,
|
|
1997
|
+
fontWeight: 600,
|
|
1914
1998
|
marginLeft: 8,
|
|
1915
|
-
flexShrink: 0
|
|
1999
|
+
flexShrink: 0,
|
|
2000
|
+
padding: "3px 8px",
|
|
2001
|
+
borderRadius: 6,
|
|
2002
|
+
color: assignment.status === "passed" ? "#4ade80" : assignment.status === "failed" ? "#f87171" : assignment.status === "in_progress" ? "#60a5fa" : "#d4d4d8",
|
|
2003
|
+
backgroundColor: assignment.status === "passed" ? "#14532d" : assignment.status === "failed" ? "#450a0a" : assignment.status === "in_progress" ? "#172554" : "#27272a",
|
|
2004
|
+
border: assignment.status === "passed" ? "1px solid #166534" : assignment.status === "failed" ? "1px solid #7f1d1d" : assignment.status === "in_progress" ? "1px solid #1e3a5f" : "1px solid #3f3f46"
|
|
1916
2005
|
},
|
|
1917
2006
|
children: badge.label
|
|
1918
2007
|
}
|
|
@@ -1937,8 +2026,8 @@ function TestListScreen({ nav }) {
|
|
|
1937
2026
|
padding: 32
|
|
1938
2027
|
},
|
|
1939
2028
|
children: [
|
|
1940
|
-
/* @__PURE__ */ jsx4("span", { style: { fontSize: 32, marginBottom: 8 }, children: filter === "pending" ? "\u{1F389}" : "\u{1F4CB}" }),
|
|
1941
|
-
/* @__PURE__ */ jsx4("span", { style: { fontSize: 14, color: colors.textMuted }, children: filter === "pending" ? "All tests completed!" : filter === "
|
|
2029
|
+
/* @__PURE__ */ jsx4("span", { style: { fontSize: 32, marginBottom: 8 }, children: filter === "pending" ? "\u{1F389}" : filter === "reopened" ? "\u{1F44D}" : "\u{1F4CB}" }),
|
|
2030
|
+
/* @__PURE__ */ jsx4("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" })
|
|
1942
2031
|
]
|
|
1943
2032
|
}
|
|
1944
2033
|
),
|
|
@@ -2458,6 +2547,7 @@ function ReportScreen({ nav, prefill }) {
|
|
|
2458
2547
|
const [affectedRoute, setAffectedRoute] = useState6("");
|
|
2459
2548
|
const [submitting, setSubmitting] = useState6(false);
|
|
2460
2549
|
const [error, setError] = useState6(null);
|
|
2550
|
+
const submittingRef = useRef2(false);
|
|
2461
2551
|
const observedRoute = useRef2(
|
|
2462
2552
|
typeof window !== "undefined" ? window.location.pathname : "unknown"
|
|
2463
2553
|
);
|
|
@@ -2465,6 +2555,8 @@ function ReportScreen({ nav, prefill }) {
|
|
|
2465
2555
|
const isBugType = reportType === "bug" || reportType === "test_fail";
|
|
2466
2556
|
const handleSubmit = async () => {
|
|
2467
2557
|
if (!client || !description.trim() || images.isUploading) return;
|
|
2558
|
+
if (submittingRef.current) return;
|
|
2559
|
+
submittingRef.current = true;
|
|
2468
2560
|
setSubmitting(true);
|
|
2469
2561
|
setError(null);
|
|
2470
2562
|
try {
|
|
@@ -2486,17 +2578,18 @@ function ReportScreen({ nav, prefill }) {
|
|
|
2486
2578
|
if (!result.success) {
|
|
2487
2579
|
setError(result.error || "Failed to submit report. Please try again.");
|
|
2488
2580
|
setSubmitting(false);
|
|
2581
|
+
submittingRef.current = false;
|
|
2489
2582
|
return;
|
|
2490
2583
|
}
|
|
2491
2584
|
if (prefill?.assignmentId) {
|
|
2492
2585
|
await refreshAssignments();
|
|
2493
2586
|
}
|
|
2494
|
-
setSubmitting(false);
|
|
2495
2587
|
nav.replace({ name: "REPORT_SUCCESS" });
|
|
2496
2588
|
} catch (err) {
|
|
2497
2589
|
console.error("BugBear: Report submission error", err);
|
|
2498
2590
|
setError(err instanceof Error ? err.message : "An unexpected error occurred. Please try again.");
|
|
2499
2591
|
setSubmitting(false);
|
|
2592
|
+
submittingRef.current = false;
|
|
2500
2593
|
}
|
|
2501
2594
|
};
|
|
2502
2595
|
const typeOptions = [
|
|
@@ -3251,7 +3344,7 @@ function ThreadDetailScreen({
|
|
|
3251
3344
|
children: msg.content
|
|
3252
3345
|
}
|
|
3253
3346
|
),
|
|
3254
|
-
msg.attachments && msg.attachments.length > 0 && /* @__PURE__ */ jsx11("div", { style: { marginTop: 8, display: "flex", flexDirection: "column", gap: 6 }, children: msg.attachments.filter((a) => a.type === "image").map((att, idx) => /* @__PURE__ */ jsx11(
|
|
3347
|
+
msg.attachments && msg.attachments.length > 0 && /* @__PURE__ */ jsx11("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__ */ jsx11(
|
|
3255
3348
|
"img",
|
|
3256
3349
|
{
|
|
3257
3350
|
src: att.url,
|
|
@@ -4011,13 +4104,289 @@ var styles4 = {
|
|
|
4011
4104
|
}
|
|
4012
4105
|
};
|
|
4013
4106
|
|
|
4107
|
+
// src/widget/screens/IssueListScreen.tsx
|
|
4108
|
+
import { useState as useState10, useEffect as useEffect7 } from "react";
|
|
4109
|
+
import { jsx as jsx14, jsxs as jsxs13 } from "react/jsx-runtime";
|
|
4110
|
+
var CATEGORY_CONFIG = {
|
|
4111
|
+
open: { label: "Open Issues", accent: "#f97316", emptyIcon: "\u2705", emptyText: "No open issues" },
|
|
4112
|
+
done: { label: "Done", accent: "#22c55e", emptyIcon: "\u{1F389}", emptyText: "No completed issues yet" },
|
|
4113
|
+
reopened: { label: "Reopened", accent: "#ef4444", emptyIcon: "\u{1F44D}", emptyText: "No reopened issues" }
|
|
4114
|
+
};
|
|
4115
|
+
var SEVERITY_COLORS = {
|
|
4116
|
+
critical: "#ef4444",
|
|
4117
|
+
high: "#f97316",
|
|
4118
|
+
medium: "#eab308",
|
|
4119
|
+
low: "#71717a"
|
|
4120
|
+
};
|
|
4121
|
+
function IssueListScreen({ nav, category }) {
|
|
4122
|
+
const { client } = useBugBear();
|
|
4123
|
+
const [issues, setIssues] = useState10([]);
|
|
4124
|
+
const [loading, setLoading] = useState10(true);
|
|
4125
|
+
const config = CATEGORY_CONFIG[category];
|
|
4126
|
+
useEffect7(() => {
|
|
4127
|
+
let cancelled = false;
|
|
4128
|
+
setLoading(true);
|
|
4129
|
+
(async () => {
|
|
4130
|
+
if (!client) return;
|
|
4131
|
+
const data = await client.getIssues(category);
|
|
4132
|
+
if (!cancelled) {
|
|
4133
|
+
setIssues(data);
|
|
4134
|
+
setLoading(false);
|
|
4135
|
+
}
|
|
4136
|
+
})();
|
|
4137
|
+
return () => {
|
|
4138
|
+
cancelled = true;
|
|
4139
|
+
};
|
|
4140
|
+
}, [client, category]);
|
|
4141
|
+
if (loading) {
|
|
4142
|
+
return /* @__PURE__ */ jsx14("div", { style: { padding: "40px 0", textAlign: "center" }, children: /* @__PURE__ */ jsx14("div", { style: { color: colors.textMuted, fontSize: 14 }, children: "Loading..." }) });
|
|
4143
|
+
}
|
|
4144
|
+
if (issues.length === 0) {
|
|
4145
|
+
return /* @__PURE__ */ jsxs13("div", { style: { padding: "40px 0", textAlign: "center" }, children: [
|
|
4146
|
+
/* @__PURE__ */ jsx14("div", { style: { fontSize: 36, marginBottom: 8 }, children: config.emptyIcon }),
|
|
4147
|
+
/* @__PURE__ */ jsx14("div", { style: { color: colors.textMuted, fontSize: 14 }, children: config.emptyText })
|
|
4148
|
+
] });
|
|
4149
|
+
}
|
|
4150
|
+
return /* @__PURE__ */ jsx14("div", { children: issues.map((issue) => /* @__PURE__ */ jsxs13(
|
|
4151
|
+
"div",
|
|
4152
|
+
{
|
|
4153
|
+
role: "button",
|
|
4154
|
+
tabIndex: 0,
|
|
4155
|
+
onClick: () => nav.push({ name: "ISSUE_DETAIL", issue }),
|
|
4156
|
+
onKeyDown: (e) => {
|
|
4157
|
+
if (e.key === "Enter" || e.key === " ") nav.push({ name: "ISSUE_DETAIL", issue });
|
|
4158
|
+
},
|
|
4159
|
+
style: {
|
|
4160
|
+
backgroundColor: colors.card,
|
|
4161
|
+
border: `1px solid ${colors.border}`,
|
|
4162
|
+
borderRadius: 10,
|
|
4163
|
+
padding: "12px 14px",
|
|
4164
|
+
marginBottom: 8,
|
|
4165
|
+
cursor: "pointer",
|
|
4166
|
+
userSelect: "none"
|
|
4167
|
+
},
|
|
4168
|
+
children: [
|
|
4169
|
+
/* @__PURE__ */ jsxs13("div", { style: { display: "flex", alignItems: "flex-start", gap: 8 }, children: [
|
|
4170
|
+
issue.severity && /* @__PURE__ */ jsx14(
|
|
4171
|
+
"span",
|
|
4172
|
+
{
|
|
4173
|
+
style: {
|
|
4174
|
+
width: 8,
|
|
4175
|
+
height: 8,
|
|
4176
|
+
borderRadius: 4,
|
|
4177
|
+
backgroundColor: SEVERITY_COLORS[issue.severity] || colors.textDim,
|
|
4178
|
+
flexShrink: 0,
|
|
4179
|
+
marginTop: 5
|
|
4180
|
+
}
|
|
4181
|
+
}
|
|
4182
|
+
),
|
|
4183
|
+
/* @__PURE__ */ jsx14("span", { style: {
|
|
4184
|
+
fontSize: 13,
|
|
4185
|
+
fontWeight: 600,
|
|
4186
|
+
color: colors.textPrimary,
|
|
4187
|
+
flex: 1,
|
|
4188
|
+
overflow: "hidden",
|
|
4189
|
+
textOverflow: "ellipsis",
|
|
4190
|
+
whiteSpace: "nowrap"
|
|
4191
|
+
}, children: issue.title })
|
|
4192
|
+
] }),
|
|
4193
|
+
/* @__PURE__ */ jsxs13("div", { style: { display: "flex", justifyContent: "space-between", marginTop: 6 }, children: [
|
|
4194
|
+
issue.route && /* @__PURE__ */ jsx14("span", { style: { fontSize: 11, color: colors.textDim, maxWidth: "60%", overflow: "hidden", textOverflow: "ellipsis", whiteSpace: "nowrap" }, children: issue.route }),
|
|
4195
|
+
/* @__PURE__ */ jsx14("span", { style: { fontSize: 11, color: colors.textDim, marginLeft: "auto" }, children: formatRelativeTime(issue.updatedAt) })
|
|
4196
|
+
] }),
|
|
4197
|
+
category === "done" && issue.verifiedByName && /* @__PURE__ */ jsxs13("div", { style: {
|
|
4198
|
+
display: "inline-flex",
|
|
4199
|
+
alignItems: "center",
|
|
4200
|
+
gap: 4,
|
|
4201
|
+
backgroundColor: "#14532d",
|
|
4202
|
+
border: "1px solid #166534",
|
|
4203
|
+
borderRadius: 6,
|
|
4204
|
+
padding: "2px 8px",
|
|
4205
|
+
marginTop: 6,
|
|
4206
|
+
fontSize: 10,
|
|
4207
|
+
fontWeight: 600,
|
|
4208
|
+
color: "#4ade80"
|
|
4209
|
+
}, children: [
|
|
4210
|
+
"\u2714 Verified by ",
|
|
4211
|
+
issue.verifiedByName
|
|
4212
|
+
] }),
|
|
4213
|
+
category === "reopened" && issue.originalBugTitle && /* @__PURE__ */ jsxs13("div", { style: {
|
|
4214
|
+
display: "inline-flex",
|
|
4215
|
+
alignItems: "center",
|
|
4216
|
+
gap: 4,
|
|
4217
|
+
backgroundColor: "#422006",
|
|
4218
|
+
border: "1px solid #854d0e",
|
|
4219
|
+
borderRadius: 6,
|
|
4220
|
+
padding: "2px 8px",
|
|
4221
|
+
marginTop: 6,
|
|
4222
|
+
fontSize: 10,
|
|
4223
|
+
fontWeight: 600,
|
|
4224
|
+
color: "#fbbf24",
|
|
4225
|
+
maxWidth: "100%",
|
|
4226
|
+
overflow: "hidden",
|
|
4227
|
+
textOverflow: "ellipsis",
|
|
4228
|
+
whiteSpace: "nowrap"
|
|
4229
|
+
}, children: [
|
|
4230
|
+
"\u{1F504} Retest of: ",
|
|
4231
|
+
issue.originalBugTitle
|
|
4232
|
+
] })
|
|
4233
|
+
]
|
|
4234
|
+
},
|
|
4235
|
+
issue.id
|
|
4236
|
+
)) });
|
|
4237
|
+
}
|
|
4238
|
+
|
|
4239
|
+
// src/widget/screens/IssueDetailScreen.tsx
|
|
4240
|
+
import { jsx as jsx15, jsxs as jsxs14 } from "react/jsx-runtime";
|
|
4241
|
+
var STATUS_LABELS = {
|
|
4242
|
+
new: { label: "New", bg: "#1e3a5f", color: "#60a5fa" },
|
|
4243
|
+
triaging: { label: "Triaging", bg: "#1e3a5f", color: "#60a5fa" },
|
|
4244
|
+
confirmed: { label: "Confirmed", bg: "#422006", color: "#fbbf24" },
|
|
4245
|
+
in_progress: { label: "In Progress", bg: "#1e3a5f", color: "#60a5fa" },
|
|
4246
|
+
fixed: { label: "Fixed", bg: "#14532d", color: "#4ade80" },
|
|
4247
|
+
ready_to_test: { label: "Ready to Test", bg: "#422006", color: "#fbbf24" },
|
|
4248
|
+
verified: { label: "Verified", bg: "#14532d", color: "#4ade80" },
|
|
4249
|
+
resolved: { label: "Resolved", bg: "#14532d", color: "#4ade80" },
|
|
4250
|
+
reviewed: { label: "Reviewed", bg: "#14532d", color: "#4ade80" },
|
|
4251
|
+
closed: { label: "Closed", bg: "#27272a", color: "#71717a" },
|
|
4252
|
+
wont_fix: { label: "Won't Fix", bg: "#27272a", color: "#71717a" },
|
|
4253
|
+
duplicate: { label: "Duplicate", bg: "#27272a", color: "#71717a" }
|
|
4254
|
+
};
|
|
4255
|
+
var SEVERITY_CONFIG = {
|
|
4256
|
+
critical: { label: "Critical", color: "#ef4444", bg: "#7f1d1d" },
|
|
4257
|
+
high: { label: "High", color: "#f97316", bg: "#431407" },
|
|
4258
|
+
medium: { label: "Medium", color: "#eab308", bg: "#422006" },
|
|
4259
|
+
low: { label: "Low", color: "#71717a", bg: "#27272a" }
|
|
4260
|
+
};
|
|
4261
|
+
function IssueDetailScreen({ nav, issue }) {
|
|
4262
|
+
const statusConfig = STATUS_LABELS[issue.status] || { label: issue.status, bg: "#27272a", color: "#a1a1aa" };
|
|
4263
|
+
const severityConfig = issue.severity ? SEVERITY_CONFIG[issue.severity] : null;
|
|
4264
|
+
return /* @__PURE__ */ jsxs14("div", { children: [
|
|
4265
|
+
/* @__PURE__ */ jsxs14("div", { style: { display: "flex", gap: 8, flexWrap: "wrap", marginBottom: 12 }, children: [
|
|
4266
|
+
/* @__PURE__ */ jsx15("span", { style: {
|
|
4267
|
+
backgroundColor: statusConfig.bg,
|
|
4268
|
+
color: statusConfig.color,
|
|
4269
|
+
fontSize: 11,
|
|
4270
|
+
fontWeight: 600,
|
|
4271
|
+
padding: "3px 10px",
|
|
4272
|
+
borderRadius: 6
|
|
4273
|
+
}, children: statusConfig.label }),
|
|
4274
|
+
severityConfig && /* @__PURE__ */ jsx15("span", { style: {
|
|
4275
|
+
backgroundColor: severityConfig.bg,
|
|
4276
|
+
color: severityConfig.color,
|
|
4277
|
+
fontSize: 11,
|
|
4278
|
+
fontWeight: 600,
|
|
4279
|
+
padding: "3px 10px",
|
|
4280
|
+
borderRadius: 6
|
|
4281
|
+
}, children: severityConfig.label })
|
|
4282
|
+
] }),
|
|
4283
|
+
/* @__PURE__ */ jsx15("h3", { style: { fontSize: 16, fontWeight: 700, color: colors.textPrimary, margin: "0 0 8px 0", lineHeight: 1.3 }, children: issue.title }),
|
|
4284
|
+
issue.route && /* @__PURE__ */ jsx15("div", { style: { fontSize: 12, color: colors.textDim, marginBottom: 12 }, children: issue.route }),
|
|
4285
|
+
issue.description && /* @__PURE__ */ jsx15("div", { style: {
|
|
4286
|
+
backgroundColor: colors.card,
|
|
4287
|
+
border: `1px solid ${colors.border}`,
|
|
4288
|
+
borderRadius: 8,
|
|
4289
|
+
padding: 12,
|
|
4290
|
+
marginBottom: 12,
|
|
4291
|
+
fontSize: 13,
|
|
4292
|
+
color: colors.textSecondary,
|
|
4293
|
+
lineHeight: 1.5,
|
|
4294
|
+
whiteSpace: "pre-wrap",
|
|
4295
|
+
wordBreak: "break-word"
|
|
4296
|
+
}, children: issue.description }),
|
|
4297
|
+
issue.verifiedByName && /* @__PURE__ */ jsxs14("div", { style: {
|
|
4298
|
+
backgroundColor: "#14532d",
|
|
4299
|
+
border: "1px solid #166534",
|
|
4300
|
+
borderRadius: 8,
|
|
4301
|
+
padding: 12,
|
|
4302
|
+
marginBottom: 12
|
|
4303
|
+
}, children: [
|
|
4304
|
+
/* @__PURE__ */ jsxs14("div", { style: { display: "flex", alignItems: "center", gap: 8, marginBottom: 4 }, children: [
|
|
4305
|
+
/* @__PURE__ */ jsx15("span", { style: { fontSize: 16 }, children: "\u2705" }),
|
|
4306
|
+
/* @__PURE__ */ jsx15("span", { style: { fontSize: 13, fontWeight: 600, color: "#4ade80" }, children: "Retesting Proof" })
|
|
4307
|
+
] }),
|
|
4308
|
+
/* @__PURE__ */ jsxs14("div", { style: { fontSize: 12, color: "#86efac" }, children: [
|
|
4309
|
+
"Verified by ",
|
|
4310
|
+
/* @__PURE__ */ jsx15("strong", { children: issue.verifiedByName }),
|
|
4311
|
+
issue.verifiedAt && /* @__PURE__ */ jsxs14("span", { children: [
|
|
4312
|
+
" on ",
|
|
4313
|
+
new Date(issue.verifiedAt).toLocaleDateString(void 0, { month: "short", day: "numeric", year: "numeric" })
|
|
4314
|
+
] })
|
|
4315
|
+
] })
|
|
4316
|
+
] }),
|
|
4317
|
+
issue.originalBugTitle && /* @__PURE__ */ jsxs14("div", { style: {
|
|
4318
|
+
backgroundColor: "#422006",
|
|
4319
|
+
border: "1px solid #854d0e",
|
|
4320
|
+
borderRadius: 8,
|
|
4321
|
+
padding: 12,
|
|
4322
|
+
marginBottom: 12
|
|
4323
|
+
}, children: [
|
|
4324
|
+
/* @__PURE__ */ jsxs14("div", { style: { display: "flex", alignItems: "center", gap: 8, marginBottom: 4 }, children: [
|
|
4325
|
+
/* @__PURE__ */ jsx15("span", { style: { fontSize: 16 }, children: "\u{1F504}" }),
|
|
4326
|
+
/* @__PURE__ */ jsx15("span", { style: { fontSize: 13, fontWeight: 600, color: "#fbbf24" }, children: "Original Bug" })
|
|
4327
|
+
] }),
|
|
4328
|
+
/* @__PURE__ */ jsxs14("div", { style: { fontSize: 12, color: "#fde68a" }, children: [
|
|
4329
|
+
"Retest of: ",
|
|
4330
|
+
/* @__PURE__ */ jsx15("strong", { children: issue.originalBugTitle })
|
|
4331
|
+
] })
|
|
4332
|
+
] }),
|
|
4333
|
+
issue.screenshotUrls && issue.screenshotUrls.length > 0 && /* @__PURE__ */ jsxs14("div", { style: { marginBottom: 12 }, children: [
|
|
4334
|
+
/* @__PURE__ */ jsxs14("div", { style: { fontSize: 12, fontWeight: 600, color: colors.textMuted, marginBottom: 8 }, children: [
|
|
4335
|
+
"Screenshots (",
|
|
4336
|
+
issue.screenshotUrls.length,
|
|
4337
|
+
")"
|
|
4338
|
+
] }),
|
|
4339
|
+
/* @__PURE__ */ jsx15("div", { style: { display: "flex", gap: 8, overflowX: "auto" }, children: issue.screenshotUrls.map((url, i) => /* @__PURE__ */ jsx15(
|
|
4340
|
+
"a",
|
|
4341
|
+
{
|
|
4342
|
+
href: url,
|
|
4343
|
+
target: "_blank",
|
|
4344
|
+
rel: "noopener noreferrer",
|
|
4345
|
+
style: { flexShrink: 0 },
|
|
4346
|
+
children: /* @__PURE__ */ jsx15(
|
|
4347
|
+
"img",
|
|
4348
|
+
{
|
|
4349
|
+
src: url,
|
|
4350
|
+
alt: `Screenshot ${i + 1}`,
|
|
4351
|
+
style: {
|
|
4352
|
+
width: 80,
|
|
4353
|
+
height: 60,
|
|
4354
|
+
objectFit: "cover",
|
|
4355
|
+
borderRadius: 6,
|
|
4356
|
+
border: `1px solid ${colors.border}`
|
|
4357
|
+
}
|
|
4358
|
+
}
|
|
4359
|
+
)
|
|
4360
|
+
},
|
|
4361
|
+
i
|
|
4362
|
+
)) })
|
|
4363
|
+
] }),
|
|
4364
|
+
/* @__PURE__ */ jsxs14("div", { style: {
|
|
4365
|
+
borderTop: `1px solid ${colors.border}`,
|
|
4366
|
+
paddingTop: 12,
|
|
4367
|
+
marginTop: 4
|
|
4368
|
+
}, children: [
|
|
4369
|
+
issue.reporterName && /* @__PURE__ */ jsxs14("div", { style: { fontSize: 12, color: colors.textDim, marginBottom: 4 }, children: [
|
|
4370
|
+
"Reported by ",
|
|
4371
|
+
issue.reporterName
|
|
4372
|
+
] }),
|
|
4373
|
+
/* @__PURE__ */ jsxs14("div", { style: { fontSize: 11, color: colors.textDim }, children: [
|
|
4374
|
+
"Created ",
|
|
4375
|
+
formatRelativeTime(issue.createdAt),
|
|
4376
|
+
" \xB7 Updated ",
|
|
4377
|
+
formatRelativeTime(issue.updatedAt)
|
|
4378
|
+
] })
|
|
4379
|
+
] })
|
|
4380
|
+
] });
|
|
4381
|
+
}
|
|
4382
|
+
|
|
4014
4383
|
// src/widget/logo.ts
|
|
4015
4384
|
var BUGBEAR_LOGO_BASE64 = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGAAAABgCAYAAADimHc4AAAAAXNSR0IArs4c6QAAAJhlWElmTU0AKgAAAAgABAEaAAUAAAABAAAAPgEbAAUAAAABAAAARgEoAAMAAAABAAIAAIdpAAQAAAABAAAATgAAAAAAAABIAAAAAQAAAEgAAAABAASQBAACAAAAFAAAAISgAQADAAAAAQABAACgAgAEAAAAAQAAAGCgAwAEAAAAAQAAAGAAAAAAMjAyNjowMToyNCAxNjoyMTozOABbbVCuAAAACXBIWXMAAAsTAAALEwEAmpwYAAACo2lUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iWE1QIENvcmUgNi4wLjAiPgogICA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPgogICAgICA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIgogICAgICAgICAgICB4bWxuczpJcHRjNHhtcEV4dD0iaHR0cDovL2lwdGMub3JnL3N0ZC9JcHRjNHhtcEV4dC8yMDA4LTAyLTI5LyIKICAgICAgICAgICAgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIj4KICAgICAgICAgPElwdGM0eG1wRXh0OkRpZ2l0YWxTb3VyY2VUeXBlPmh0dHA6Ly9jdi5pcHRjLm9yZy9uZXdzY29kZXMvZGlnaXRhbHNvdXJjZXR5cGUvdHJhaW5lZEFsZ29yaXRobWljTWVkaWE8L0lwdGM0eG1wRXh0OkRpZ2l0YWxTb3VyY2VUeXBlPgogICAgICAgICA8SXB0YzR4bXBFeHQ6RGlnSW1hZ2VHVUlEPmZjNzJlN2Q2LTYyYTEtNDE1ZS04MjY5LWM2NjA4MjY0OWRiMDwvSXB0YzR4bXBFeHQ6RGlnSW1hZ2VHVUlEPgogICAgICAgICA8eG1wOkNyZWF0ZURhdGU+MjAyNi0wMS0yNFQxNjoyMTozODwveG1wOkNyZWF0ZURhdGU+CiAgICAgIDwvcmRmOkRlc2NyaXB0aW9uPgogICA8L3JkZjpSREY+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";
|
|
4016
4385
|
|
|
4017
4386
|
// src/BugBearPanel.tsx
|
|
4018
|
-
import { Fragment as Fragment4, jsx as
|
|
4387
|
+
import { Fragment as Fragment4, jsx as jsx16, jsxs as jsxs15 } from "react/jsx-runtime";
|
|
4019
4388
|
function BugBearIcon({ size = 24 }) {
|
|
4020
|
-
return /* @__PURE__ */
|
|
4389
|
+
return /* @__PURE__ */ jsx16(
|
|
4021
4390
|
"img",
|
|
4022
4391
|
{
|
|
4023
4392
|
src: BUGBEAR_LOGO_BASE64,
|
|
@@ -4062,12 +4431,12 @@ function BugBearPanel({
|
|
|
4062
4431
|
}) {
|
|
4063
4432
|
const { shouldShowWidget, testerInfo, assignments, isLoading, unreadCount } = useBugBear();
|
|
4064
4433
|
const { currentScreen, canGoBack, push, pop, replace, reset } = useNavigation();
|
|
4065
|
-
const [collapsed, setCollapsed] =
|
|
4066
|
-
const [panelPosition, setPanelPosition] =
|
|
4067
|
-
const [isDragging, setIsDragging] =
|
|
4434
|
+
const [collapsed, setCollapsed] = useState11(defaultCollapsed);
|
|
4435
|
+
const [panelPosition, setPanelPosition] = useState11(null);
|
|
4436
|
+
const [isDragging, setIsDragging] = useState11(false);
|
|
4068
4437
|
const dragStartRef = useRef3(null);
|
|
4069
4438
|
const panelRef = useRef3(null);
|
|
4070
|
-
|
|
4439
|
+
useEffect8(() => {
|
|
4071
4440
|
if (typeof window === "undefined") return;
|
|
4072
4441
|
try {
|
|
4073
4442
|
const saved = localStorage.getItem(STORAGE_KEY);
|
|
@@ -4081,7 +4450,7 @@ function BugBearPanel({
|
|
|
4081
4450
|
setPanelPosition(getDefaultPosition(position));
|
|
4082
4451
|
}
|
|
4083
4452
|
}, [position]);
|
|
4084
|
-
|
|
4453
|
+
useEffect8(() => {
|
|
4085
4454
|
if (panelPosition && typeof window !== "undefined") {
|
|
4086
4455
|
try {
|
|
4087
4456
|
localStorage.setItem(STORAGE_KEY, JSON.stringify(panelPosition));
|
|
@@ -4089,7 +4458,7 @@ function BugBearPanel({
|
|
|
4089
4458
|
}
|
|
4090
4459
|
}
|
|
4091
4460
|
}, [panelPosition]);
|
|
4092
|
-
|
|
4461
|
+
useEffect8(() => {
|
|
4093
4462
|
if (typeof window === "undefined") return;
|
|
4094
4463
|
const handleResize = () => {
|
|
4095
4464
|
setPanelPosition((prev) => prev ? clampPosition(prev) : getDefaultPosition(position));
|
|
@@ -4110,7 +4479,7 @@ function BugBearPanel({
|
|
|
4110
4479
|
panelY: panelPosition.y
|
|
4111
4480
|
};
|
|
4112
4481
|
}, [draggable, panelPosition]);
|
|
4113
|
-
|
|
4482
|
+
useEffect8(() => {
|
|
4114
4483
|
if (!isDragging) return;
|
|
4115
4484
|
const handleMouseMove = (e) => {
|
|
4116
4485
|
if (!dragStartRef.current) return;
|
|
@@ -4164,6 +4533,10 @@ function BugBearPanel({
|
|
|
4164
4533
|
return currentScreen.thread.subject || "Thread";
|
|
4165
4534
|
case "COMPOSE_MESSAGE":
|
|
4166
4535
|
return "New Message";
|
|
4536
|
+
case "ISSUE_LIST":
|
|
4537
|
+
return currentScreen.category === "open" ? "Open Issues" : currentScreen.category === "done" ? "Done" : "Reopened";
|
|
4538
|
+
case "ISSUE_DETAIL":
|
|
4539
|
+
return "Issue Detail";
|
|
4167
4540
|
case "PROFILE":
|
|
4168
4541
|
return "Profile";
|
|
4169
4542
|
default:
|
|
@@ -4178,33 +4551,37 @@ function BugBearPanel({
|
|
|
4178
4551
|
const renderScreen = () => {
|
|
4179
4552
|
switch (currentScreen.name) {
|
|
4180
4553
|
case "HOME":
|
|
4181
|
-
return /* @__PURE__ */
|
|
4554
|
+
return /* @__PURE__ */ jsx16(HomeScreen, { nav });
|
|
4182
4555
|
case "TEST_DETAIL":
|
|
4183
|
-
return /* @__PURE__ */
|
|
4556
|
+
return /* @__PURE__ */ jsx16(TestDetailScreen, { testId: currentScreen.testId, nav });
|
|
4184
4557
|
case "TEST_LIST":
|
|
4185
|
-
return /* @__PURE__ */
|
|
4558
|
+
return /* @__PURE__ */ jsx16(TestListScreen, { nav });
|
|
4186
4559
|
case "TEST_FEEDBACK":
|
|
4187
|
-
return /* @__PURE__ */
|
|
4560
|
+
return /* @__PURE__ */ jsx16(TestFeedbackScreen, { status: currentScreen.status, assignmentId: currentScreen.assignmentId, nav });
|
|
4188
4561
|
case "REPORT":
|
|
4189
|
-
return /* @__PURE__ */
|
|
4562
|
+
return /* @__PURE__ */ jsx16(ReportScreen, { nav, prefill: currentScreen.prefill });
|
|
4190
4563
|
case "REPORT_SUCCESS":
|
|
4191
|
-
return /* @__PURE__ */
|
|
4564
|
+
return /* @__PURE__ */ jsx16(ReportSuccessScreen, { nav });
|
|
4192
4565
|
case "MESSAGE_LIST":
|
|
4193
|
-
return /* @__PURE__ */
|
|
4566
|
+
return /* @__PURE__ */ jsx16(MessageListScreen, { nav });
|
|
4194
4567
|
case "THREAD_DETAIL":
|
|
4195
|
-
return /* @__PURE__ */
|
|
4568
|
+
return /* @__PURE__ */ jsx16(ThreadDetailScreen, { thread: currentScreen.thread, nav });
|
|
4196
4569
|
case "COMPOSE_MESSAGE":
|
|
4197
|
-
return /* @__PURE__ */
|
|
4570
|
+
return /* @__PURE__ */ jsx16(ComposeMessageScreen, { nav });
|
|
4571
|
+
case "ISSUE_LIST":
|
|
4572
|
+
return /* @__PURE__ */ jsx16(IssueListScreen, { nav, category: currentScreen.category });
|
|
4573
|
+
case "ISSUE_DETAIL":
|
|
4574
|
+
return /* @__PURE__ */ jsx16(IssueDetailScreen, { nav, issue: currentScreen.issue });
|
|
4198
4575
|
case "PROFILE":
|
|
4199
|
-
return /* @__PURE__ */
|
|
4576
|
+
return /* @__PURE__ */ jsx16(ProfileScreen, { nav });
|
|
4200
4577
|
default:
|
|
4201
|
-
return /* @__PURE__ */
|
|
4578
|
+
return /* @__PURE__ */ jsx16(HomeScreen, { nav });
|
|
4202
4579
|
}
|
|
4203
4580
|
};
|
|
4204
4581
|
if (typeof document === "undefined") return null;
|
|
4205
4582
|
const headerTitle = getHeaderTitle();
|
|
4206
4583
|
return createPortal(
|
|
4207
|
-
/* @__PURE__ */
|
|
4584
|
+
/* @__PURE__ */ jsxs15(
|
|
4208
4585
|
"div",
|
|
4209
4586
|
{
|
|
4210
4587
|
ref: panelRef,
|
|
@@ -4223,7 +4600,7 @@ function BugBearPanel({
|
|
|
4223
4600
|
},
|
|
4224
4601
|
onMouseDown: handleMouseDown,
|
|
4225
4602
|
children: [
|
|
4226
|
-
collapsed && /* @__PURE__ */
|
|
4603
|
+
collapsed && /* @__PURE__ */ jsxs15(
|
|
4227
4604
|
"button",
|
|
4228
4605
|
{
|
|
4229
4606
|
onClick: () => setCollapsed(false),
|
|
@@ -4245,9 +4622,9 @@ function BugBearPanel({
|
|
|
4245
4622
|
fontWeight: 500
|
|
4246
4623
|
},
|
|
4247
4624
|
children: [
|
|
4248
|
-
/* @__PURE__ */
|
|
4249
|
-
/* @__PURE__ */
|
|
4250
|
-
badgeCount > 0 && /* @__PURE__ */
|
|
4625
|
+
/* @__PURE__ */ jsx16(BugBearIcon, { size: 24 }),
|
|
4626
|
+
/* @__PURE__ */ jsx16("span", { children: "BugBear" }),
|
|
4627
|
+
badgeCount > 0 && /* @__PURE__ */ jsx16("span", { style: {
|
|
4251
4628
|
backgroundColor: "#fff",
|
|
4252
4629
|
color: colors.blue,
|
|
4253
4630
|
fontSize: "0.75rem",
|
|
@@ -4258,7 +4635,7 @@ function BugBearPanel({
|
|
|
4258
4635
|
]
|
|
4259
4636
|
}
|
|
4260
4637
|
),
|
|
4261
|
-
!collapsed && /* @__PURE__ */
|
|
4638
|
+
!collapsed && /* @__PURE__ */ jsxs15("div", { style: {
|
|
4262
4639
|
width: PANEL_WIDTH,
|
|
4263
4640
|
backgroundColor: colors.bg,
|
|
4264
4641
|
borderRadius: 12,
|
|
@@ -4266,7 +4643,7 @@ function BugBearPanel({
|
|
|
4266
4643
|
overflow: "hidden",
|
|
4267
4644
|
boxShadow: "0 25px 50px -12px rgba(0,0,0,0.5)"
|
|
4268
4645
|
}, children: [
|
|
4269
|
-
/* @__PURE__ */
|
|
4646
|
+
/* @__PURE__ */ jsxs15(
|
|
4270
4647
|
"div",
|
|
4271
4648
|
{
|
|
4272
4649
|
"data-drag-handle": true,
|
|
@@ -4282,7 +4659,7 @@ function BugBearPanel({
|
|
|
4282
4659
|
cursor: draggable ? isDragging ? "grabbing" : "grab" : "default"
|
|
4283
4660
|
},
|
|
4284
4661
|
children: [
|
|
4285
|
-
/* @__PURE__ */
|
|
4662
|
+
/* @__PURE__ */ jsx16("div", { style: { display: "flex", alignItems: "center", gap: 8, flex: 1, minWidth: 0 }, children: canGoBack ? /* @__PURE__ */ jsx16(
|
|
4286
4663
|
"button",
|
|
4287
4664
|
{
|
|
4288
4665
|
onClick: pop,
|
|
@@ -4298,14 +4675,14 @@ function BugBearPanel({
|
|
|
4298
4675
|
},
|
|
4299
4676
|
children: "\u2190 Back"
|
|
4300
4677
|
}
|
|
4301
|
-
) : /* @__PURE__ */
|
|
4302
|
-
/* @__PURE__ */
|
|
4303
|
-
/* @__PURE__ */
|
|
4304
|
-
/* @__PURE__ */
|
|
4305
|
-
/* @__PURE__ */
|
|
4306
|
-
draggable && /* @__PURE__ */
|
|
4678
|
+
) : /* @__PURE__ */ jsxs15(Fragment4, { children: [
|
|
4679
|
+
/* @__PURE__ */ jsx16(BugBearIcon, { size: 28 }),
|
|
4680
|
+
/* @__PURE__ */ jsxs15("div", { children: [
|
|
4681
|
+
/* @__PURE__ */ jsxs15("div", { style: { display: "flex", alignItems: "center", gap: 8 }, children: [
|
|
4682
|
+
/* @__PURE__ */ jsx16("span", { style: { fontWeight: 600, fontSize: "0.875rem" }, children: "BugBear" }),
|
|
4683
|
+
draggable && /* @__PURE__ */ jsx16("span", { style: { color: colors.textMuted, fontSize: "0.75rem" }, title: "Drag to move, double-click to reset", children: "\u22EE\u22EE" })
|
|
4307
4684
|
] }),
|
|
4308
|
-
testerInfo && /* @__PURE__ */
|
|
4685
|
+
testerInfo && /* @__PURE__ */ jsxs15(
|
|
4309
4686
|
"button",
|
|
4310
4687
|
{
|
|
4311
4688
|
onClick: () => push({ name: "PROFILE" }),
|
|
@@ -4323,13 +4700,13 @@ function BugBearPanel({
|
|
|
4323
4700
|
},
|
|
4324
4701
|
children: [
|
|
4325
4702
|
testerInfo.name,
|
|
4326
|
-
/* @__PURE__ */
|
|
4703
|
+
/* @__PURE__ */ jsx16("span", { style: { fontSize: "0.625rem" }, children: "\u270E" })
|
|
4327
4704
|
]
|
|
4328
4705
|
}
|
|
4329
4706
|
)
|
|
4330
4707
|
] })
|
|
4331
4708
|
] }) }),
|
|
4332
|
-
headerTitle ? /* @__PURE__ */
|
|
4709
|
+
headerTitle ? /* @__PURE__ */ jsx16("span", { style: {
|
|
4333
4710
|
fontSize: "0.8125rem",
|
|
4334
4711
|
fontWeight: 600,
|
|
4335
4712
|
color: colors.textSecondary,
|
|
@@ -4339,7 +4716,7 @@ function BugBearPanel({
|
|
|
4339
4716
|
textOverflow: "ellipsis",
|
|
4340
4717
|
whiteSpace: "nowrap"
|
|
4341
4718
|
}, children: headerTitle }) : null,
|
|
4342
|
-
/* @__PURE__ */
|
|
4719
|
+
/* @__PURE__ */ jsx16(
|
|
4343
4720
|
"button",
|
|
4344
4721
|
{
|
|
4345
4722
|
onClick: handleClose,
|
|
@@ -4363,13 +4740,13 @@ function BugBearPanel({
|
|
|
4363
4740
|
]
|
|
4364
4741
|
}
|
|
4365
4742
|
),
|
|
4366
|
-
/* @__PURE__ */
|
|
4743
|
+
/* @__PURE__ */ jsx16("div", { style: {
|
|
4367
4744
|
padding: 16,
|
|
4368
4745
|
maxHeight: 400,
|
|
4369
4746
|
overflowY: "auto",
|
|
4370
4747
|
backgroundColor: colors.bg,
|
|
4371
4748
|
color: colors.textSecondary
|
|
4372
|
-
}, children: isLoading ? /* @__PURE__ */
|
|
4749
|
+
}, children: isLoading ? /* @__PURE__ */ jsx16("div", { style: { padding: "60px 0", textAlign: "center" }, children: /* @__PURE__ */ jsx16("div", { style: { color: colors.textMuted, fontSize: "0.875rem" }, children: "Loading..." }) }) : renderScreen() })
|
|
4373
4750
|
] })
|
|
4374
4751
|
]
|
|
4375
4752
|
}
|
|
@@ -4381,7 +4758,7 @@ function BugBearPanel({
|
|
|
4381
4758
|
// src/BugBearErrorBoundary.tsx
|
|
4382
4759
|
import { Component } from "react";
|
|
4383
4760
|
import { captureError, contextCapture as contextCapture2 } from "@bbearai/core";
|
|
4384
|
-
import { jsx as
|
|
4761
|
+
import { jsx as jsx17, jsxs as jsxs16 } from "react/jsx-runtime";
|
|
4385
4762
|
var BugBearErrorBoundary = class extends Component {
|
|
4386
4763
|
constructor(props) {
|
|
4387
4764
|
super(props);
|
|
@@ -4426,7 +4803,7 @@ var BugBearErrorBoundary = class extends Component {
|
|
|
4426
4803
|
if (fallback) {
|
|
4427
4804
|
return fallback;
|
|
4428
4805
|
}
|
|
4429
|
-
return /* @__PURE__ */
|
|
4806
|
+
return /* @__PURE__ */ jsxs16(
|
|
4430
4807
|
"div",
|
|
4431
4808
|
{
|
|
4432
4809
|
style: {
|
|
@@ -4438,13 +4815,13 @@ var BugBearErrorBoundary = class extends Component {
|
|
|
4438
4815
|
fontFamily: '-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif'
|
|
4439
4816
|
},
|
|
4440
4817
|
children: [
|
|
4441
|
-
/* @__PURE__ */
|
|
4442
|
-
/* @__PURE__ */
|
|
4443
|
-
/* @__PURE__ */
|
|
4818
|
+
/* @__PURE__ */ jsxs16("div", { style: { display: "flex", alignItems: "center", gap: "8px", marginBottom: "12px" }, children: [
|
|
4819
|
+
/* @__PURE__ */ jsx17("img", { src: BUGBEAR_LOGO_BASE64, alt: "BugBear", width: 28, height: 28, style: { objectFit: "contain" } }),
|
|
4820
|
+
/* @__PURE__ */ jsx17("h3", { style: { margin: 0, color: "#991b1b", fontSize: "16px" }, children: "Something went wrong" })
|
|
4444
4821
|
] }),
|
|
4445
|
-
/* @__PURE__ */
|
|
4446
|
-
/* @__PURE__ */
|
|
4447
|
-
/* @__PURE__ */
|
|
4822
|
+
/* @__PURE__ */ jsx17("p", { style: { color: "#7f1d1d", fontSize: "14px", margin: "0 0 12px 0" }, children: error.message }),
|
|
4823
|
+
/* @__PURE__ */ jsxs16("div", { style: { display: "flex", gap: "8px" }, children: [
|
|
4824
|
+
/* @__PURE__ */ jsx17(
|
|
4448
4825
|
"button",
|
|
4449
4826
|
{
|
|
4450
4827
|
onClick: this.reset,
|
|
@@ -4461,7 +4838,7 @@ var BugBearErrorBoundary = class extends Component {
|
|
|
4461
4838
|
children: "Try Again"
|
|
4462
4839
|
}
|
|
4463
4840
|
),
|
|
4464
|
-
/* @__PURE__ */
|
|
4841
|
+
/* @__PURE__ */ jsx17(
|
|
4465
4842
|
"button",
|
|
4466
4843
|
{
|
|
4467
4844
|
onClick: () => window.location.reload(),
|
|
@@ -4479,7 +4856,7 @@ var BugBearErrorBoundary = class extends Component {
|
|
|
4479
4856
|
}
|
|
4480
4857
|
)
|
|
4481
4858
|
] }),
|
|
4482
|
-
/* @__PURE__ */
|
|
4859
|
+
/* @__PURE__ */ jsx17("p", { style: { color: "#9ca3af", fontSize: "12px", marginTop: "12px" }, children: "The error has been captured by BugBear" })
|
|
4483
4860
|
]
|
|
4484
4861
|
}
|
|
4485
4862
|
);
|