@bbearai/react 0.4.1 → 0.4.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +21 -1
- package/dist/index.d.mts +3 -1
- package/dist/index.d.ts +3 -1
- package/dist/index.js +467 -86
- package/dist/index.mjs +461 -80
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -70,6 +70,10 @@ var BugBearContext = (0, import_react.createContext)({
|
|
|
70
70
|
},
|
|
71
71
|
createThread: async () => ({ success: false }),
|
|
72
72
|
uploadImage: async () => null,
|
|
73
|
+
// Issue tracking
|
|
74
|
+
issueCounts: { open: 0, done: 0, reopened: 0 },
|
|
75
|
+
refreshIssueCounts: async () => {
|
|
76
|
+
},
|
|
73
77
|
onError: void 0
|
|
74
78
|
});
|
|
75
79
|
function useBugBear() {
|
|
@@ -87,6 +91,7 @@ function BugBearProvider({ config, children, enabled = true }) {
|
|
|
87
91
|
const [sessionFindings, setSessionFindings] = (0, import_react.useState)([]);
|
|
88
92
|
const [threads, setThreads] = (0, import_react.useState)([]);
|
|
89
93
|
const [unreadCount, setUnreadCount] = (0, import_react.useState)(0);
|
|
94
|
+
const [issueCounts, setIssueCounts] = (0, import_react.useState)({ open: 0, done: 0, reopened: 0 });
|
|
90
95
|
const refreshAssignments = (0, import_react.useCallback)(async () => {
|
|
91
96
|
if (!client) return;
|
|
92
97
|
const newAssignments = await client.getAssignedTests();
|
|
@@ -138,6 +143,11 @@ function BugBearProvider({ config, children, enabled = true }) {
|
|
|
138
143
|
const totalUnread = newThreads.reduce((sum, t) => sum + t.unreadCount, 0);
|
|
139
144
|
setUnreadCount(totalUnread);
|
|
140
145
|
}, [client]);
|
|
146
|
+
const refreshIssueCounts = (0, import_react.useCallback)(async () => {
|
|
147
|
+
if (!client) return;
|
|
148
|
+
const counts = await client.getIssueCounts();
|
|
149
|
+
setIssueCounts(counts);
|
|
150
|
+
}, [client]);
|
|
141
151
|
const getThreadMessages = (0, import_react.useCallback)(async (threadId) => {
|
|
142
152
|
if (!client) return [];
|
|
143
153
|
return client.getThreadMessages(threadId);
|
|
@@ -179,16 +189,18 @@ function BugBearProvider({ config, children, enabled = true }) {
|
|
|
179
189
|
setTesterInfo(info);
|
|
180
190
|
setIsTester(!!info);
|
|
181
191
|
if (info && qaEnabled) {
|
|
182
|
-
const [newAssignments, session, newThreads] = await Promise.all([
|
|
192
|
+
const [newAssignments, session, newThreads, counts] = await Promise.all([
|
|
183
193
|
bugBearClient.getAssignedTests(),
|
|
184
194
|
bugBearClient.getActiveSession(),
|
|
185
|
-
bugBearClient.getThreadsForTester()
|
|
195
|
+
bugBearClient.getThreadsForTester(),
|
|
196
|
+
bugBearClient.getIssueCounts()
|
|
186
197
|
]);
|
|
187
198
|
setAssignments(newAssignments);
|
|
188
199
|
setActiveSession(session);
|
|
189
200
|
setThreads(newThreads);
|
|
190
201
|
const totalUnread = newThreads.reduce((sum, t) => sum + t.unreadCount, 0);
|
|
191
202
|
setUnreadCount(totalUnread);
|
|
203
|
+
setIssueCounts(counts);
|
|
192
204
|
if (session) {
|
|
193
205
|
const findings = await bugBearClient.getSessionFindings(session.id);
|
|
194
206
|
setSessionFindings(findings);
|
|
@@ -231,6 +243,14 @@ function BugBearProvider({ config, children, enabled = true }) {
|
|
|
231
243
|
initializeBugBear(newClient);
|
|
232
244
|
}
|
|
233
245
|
}, [enabled, config, initializeBugBear]);
|
|
246
|
+
(0, import_react.useEffect)(() => {
|
|
247
|
+
if (!client || !isTester || !isQAEnabled) return;
|
|
248
|
+
const interval = setInterval(() => {
|
|
249
|
+
refreshThreads();
|
|
250
|
+
refreshIssueCounts();
|
|
251
|
+
}, 3e4);
|
|
252
|
+
return () => clearInterval(interval);
|
|
253
|
+
}, [client, isTester, isQAEnabled, refreshThreads, refreshIssueCounts]);
|
|
234
254
|
const currentAssignment = assignments.find(
|
|
235
255
|
(a) => a.status === "in_progress"
|
|
236
256
|
) || assignments.find(
|
|
@@ -270,6 +290,9 @@ function BugBearProvider({ config, children, enabled = true }) {
|
|
|
270
290
|
markAsRead,
|
|
271
291
|
createThread,
|
|
272
292
|
uploadImage,
|
|
293
|
+
// Issue tracking
|
|
294
|
+
issueCounts,
|
|
295
|
+
refreshIssueCounts,
|
|
273
296
|
onError: config.onError
|
|
274
297
|
},
|
|
275
298
|
children
|
|
@@ -278,7 +301,7 @@ function BugBearProvider({ config, children, enabled = true }) {
|
|
|
278
301
|
}
|
|
279
302
|
|
|
280
303
|
// src/BugBearPanel.tsx
|
|
281
|
-
var
|
|
304
|
+
var import_react14 = require("react");
|
|
282
305
|
var import_react_dom = require("react-dom");
|
|
283
306
|
|
|
284
307
|
// src/widget/navigation.ts
|
|
@@ -398,10 +421,11 @@ function getThreadTypeIcon(type) {
|
|
|
398
421
|
var import_react3 = require("react");
|
|
399
422
|
var import_jsx_runtime2 = require("react/jsx-runtime");
|
|
400
423
|
function HomeScreen({ nav }) {
|
|
401
|
-
const { assignments, unreadCount, threads, refreshAssignments, refreshThreads } = useBugBear();
|
|
424
|
+
const { assignments, unreadCount, threads, refreshAssignments, refreshThreads, issueCounts, refreshIssueCounts } = useBugBear();
|
|
402
425
|
(0, import_react3.useEffect)(() => {
|
|
403
426
|
refreshAssignments();
|
|
404
427
|
refreshThreads();
|
|
428
|
+
refreshIssueCounts();
|
|
405
429
|
}, []);
|
|
406
430
|
const pendingAssignments = assignments.filter((a) => a.status === "pending" || a.status === "in_progress");
|
|
407
431
|
const pendingCount = pendingAssignments.length;
|
|
@@ -686,6 +710,89 @@ function HomeScreen({ nav }) {
|
|
|
686
710
|
]
|
|
687
711
|
}
|
|
688
712
|
),
|
|
713
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { style: { display: "grid", gridTemplateColumns: "1fr 1fr 1fr", gap: 10, marginBottom: 20 }, children: [
|
|
714
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(
|
|
715
|
+
"div",
|
|
716
|
+
{
|
|
717
|
+
role: "button",
|
|
718
|
+
tabIndex: 0,
|
|
719
|
+
onClick: () => nav.push({ name: "ISSUE_LIST", category: "open" }),
|
|
720
|
+
onKeyDown: (e) => {
|
|
721
|
+
if (e.key === "Enter" || e.key === " ") nav.push({ name: "ISSUE_LIST", category: "open" });
|
|
722
|
+
},
|
|
723
|
+
style: {
|
|
724
|
+
backgroundColor: "#27272a",
|
|
725
|
+
border: "1px solid #3f3f46",
|
|
726
|
+
borderTop: "3px solid #f97316",
|
|
727
|
+
borderRadius: 10,
|
|
728
|
+
padding: "12px 8px",
|
|
729
|
+
display: "flex",
|
|
730
|
+
flexDirection: "column",
|
|
731
|
+
alignItems: "center",
|
|
732
|
+
cursor: "pointer",
|
|
733
|
+
userSelect: "none"
|
|
734
|
+
},
|
|
735
|
+
children: [
|
|
736
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)("span", { style: { fontSize: 22, fontWeight: 700, color: "#f97316" }, children: issueCounts.open }),
|
|
737
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)("span", { style: { fontSize: 11, fontWeight: 600, color: "#a1a1aa", marginTop: 2 }, children: "Open" })
|
|
738
|
+
]
|
|
739
|
+
}
|
|
740
|
+
),
|
|
741
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(
|
|
742
|
+
"div",
|
|
743
|
+
{
|
|
744
|
+
role: "button",
|
|
745
|
+
tabIndex: 0,
|
|
746
|
+
onClick: () => nav.push({ name: "ISSUE_LIST", category: "done" }),
|
|
747
|
+
onKeyDown: (e) => {
|
|
748
|
+
if (e.key === "Enter" || e.key === " ") nav.push({ name: "ISSUE_LIST", category: "done" });
|
|
749
|
+
},
|
|
750
|
+
style: {
|
|
751
|
+
backgroundColor: "#27272a",
|
|
752
|
+
border: "1px solid #3f3f46",
|
|
753
|
+
borderTop: "3px solid #22c55e",
|
|
754
|
+
borderRadius: 10,
|
|
755
|
+
padding: "12px 8px",
|
|
756
|
+
display: "flex",
|
|
757
|
+
flexDirection: "column",
|
|
758
|
+
alignItems: "center",
|
|
759
|
+
cursor: "pointer",
|
|
760
|
+
userSelect: "none"
|
|
761
|
+
},
|
|
762
|
+
children: [
|
|
763
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)("span", { style: { fontSize: 22, fontWeight: 700, color: "#22c55e" }, children: issueCounts.done }),
|
|
764
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)("span", { style: { fontSize: 11, fontWeight: 600, color: "#a1a1aa", marginTop: 2 }, children: "Done" })
|
|
765
|
+
]
|
|
766
|
+
}
|
|
767
|
+
),
|
|
768
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(
|
|
769
|
+
"div",
|
|
770
|
+
{
|
|
771
|
+
role: "button",
|
|
772
|
+
tabIndex: 0,
|
|
773
|
+
onClick: () => nav.push({ name: "ISSUE_LIST", category: "reopened" }),
|
|
774
|
+
onKeyDown: (e) => {
|
|
775
|
+
if (e.key === "Enter" || e.key === " ") nav.push({ name: "ISSUE_LIST", category: "reopened" });
|
|
776
|
+
},
|
|
777
|
+
style: {
|
|
778
|
+
backgroundColor: "#27272a",
|
|
779
|
+
border: "1px solid #3f3f46",
|
|
780
|
+
borderTop: "3px solid #ef4444",
|
|
781
|
+
borderRadius: 10,
|
|
782
|
+
padding: "12px 8px",
|
|
783
|
+
display: "flex",
|
|
784
|
+
flexDirection: "column",
|
|
785
|
+
alignItems: "center",
|
|
786
|
+
cursor: "pointer",
|
|
787
|
+
userSelect: "none"
|
|
788
|
+
},
|
|
789
|
+
children: [
|
|
790
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)("span", { style: { fontSize: 22, fontWeight: 700, color: "#ef4444" }, children: issueCounts.reopened }),
|
|
791
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)("span", { style: { fontSize: 11, fontWeight: 600, color: "#a1a1aa", marginTop: 2 }, children: "Reopened" })
|
|
792
|
+
]
|
|
793
|
+
}
|
|
794
|
+
)
|
|
795
|
+
] }),
|
|
689
796
|
totalTests > 0 && /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { style: { marginBottom: 16 }, children: [
|
|
690
797
|
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
|
|
691
798
|
"div",
|
|
@@ -725,6 +832,7 @@ function HomeScreen({ nav }) {
|
|
|
725
832
|
onClick: () => {
|
|
726
833
|
refreshAssignments();
|
|
727
834
|
refreshThreads();
|
|
835
|
+
refreshIssueCounts();
|
|
728
836
|
},
|
|
729
837
|
style: {
|
|
730
838
|
background: "none",
|
|
@@ -1608,36 +1716,21 @@ function TestListScreen({ nav }) {
|
|
|
1608
1716
|
const filterAssignment = (a) => {
|
|
1609
1717
|
if (roleFilter && a.testCase.role?.id !== roleFilter) return false;
|
|
1610
1718
|
if (filter === "pending") return a.status === "pending" || a.status === "in_progress";
|
|
1611
|
-
if (filter === "
|
|
1719
|
+
if (filter === "done") return a.status === "passed";
|
|
1720
|
+
if (filter === "reopened") return a.status === "failed";
|
|
1612
1721
|
return true;
|
|
1613
1722
|
};
|
|
1614
1723
|
const pendingCount = assignments.filter(
|
|
1615
1724
|
(a) => a.status === "pending" || a.status === "in_progress"
|
|
1616
1725
|
).length;
|
|
1617
|
-
const doneCount = assignments.filter(
|
|
1618
|
-
|
|
1619
|
-
).length;
|
|
1726
|
+
const doneCount = assignments.filter((a) => a.status === "passed").length;
|
|
1727
|
+
const reopenedCount = assignments.filter((a) => a.status === "failed").length;
|
|
1620
1728
|
const filters = [
|
|
1621
1729
|
{ key: "all", label: "All", count: assignments.length },
|
|
1622
1730
|
{ key: "pending", label: "To Do", count: pendingCount },
|
|
1623
|
-
{ key: "
|
|
1731
|
+
{ key: "done", label: "Done", count: doneCount },
|
|
1732
|
+
{ key: "reopened", label: "Re Opened", count: reopenedCount }
|
|
1624
1733
|
];
|
|
1625
|
-
const getStatusColor = (status) => {
|
|
1626
|
-
switch (status) {
|
|
1627
|
-
case "passed":
|
|
1628
|
-
return colors.green;
|
|
1629
|
-
case "failed":
|
|
1630
|
-
return colors.red;
|
|
1631
|
-
case "skipped":
|
|
1632
|
-
return colors.yellow;
|
|
1633
|
-
case "in_progress":
|
|
1634
|
-
return colors.blue;
|
|
1635
|
-
case "blocked":
|
|
1636
|
-
return colors.red;
|
|
1637
|
-
default:
|
|
1638
|
-
return colors.textMuted;
|
|
1639
|
-
}
|
|
1640
|
-
};
|
|
1641
1734
|
return /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)("div", { children: [
|
|
1642
1735
|
/* @__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)(
|
|
1643
1736
|
"button",
|
|
@@ -1938,10 +2031,14 @@ function TestListScreen({ nav }) {
|
|
|
1938
2031
|
{
|
|
1939
2032
|
style: {
|
|
1940
2033
|
fontSize: 10,
|
|
1941
|
-
|
|
1942
|
-
fontWeight: 500,
|
|
2034
|
+
fontWeight: 600,
|
|
1943
2035
|
marginLeft: 8,
|
|
1944
|
-
flexShrink: 0
|
|
2036
|
+
flexShrink: 0,
|
|
2037
|
+
padding: "3px 8px",
|
|
2038
|
+
borderRadius: 6,
|
|
2039
|
+
color: assignment.status === "passed" ? "#4ade80" : assignment.status === "failed" ? "#f87171" : assignment.status === "in_progress" ? "#60a5fa" : "#d4d4d8",
|
|
2040
|
+
backgroundColor: assignment.status === "passed" ? "#14532d" : assignment.status === "failed" ? "#450a0a" : assignment.status === "in_progress" ? "#172554" : "#27272a",
|
|
2041
|
+
border: assignment.status === "passed" ? "1px solid #166534" : assignment.status === "failed" ? "1px solid #7f1d1d" : assignment.status === "in_progress" ? "1px solid #1e3a5f" : "1px solid #3f3f46"
|
|
1945
2042
|
},
|
|
1946
2043
|
children: badge.label
|
|
1947
2044
|
}
|
|
@@ -1966,8 +2063,8 @@ function TestListScreen({ nav }) {
|
|
|
1966
2063
|
padding: 32
|
|
1967
2064
|
},
|
|
1968
2065
|
children: [
|
|
1969
|
-
/* @__PURE__ */ (0, import_jsx_runtime4.jsx)("span", { style: { fontSize: 32, marginBottom: 8 }, children: filter === "pending" ? "\u{1F389}" : "\u{1F4CB}" }),
|
|
1970
|
-
/* @__PURE__ */ (0, import_jsx_runtime4.jsx)("span", { style: { fontSize: 14, color: colors.textMuted }, children: filter === "pending" ? "All tests completed!" : filter === "
|
|
2066
|
+
/* @__PURE__ */ (0, import_jsx_runtime4.jsx)("span", { style: { fontSize: 32, marginBottom: 8 }, children: filter === "pending" ? "\u{1F389}" : filter === "reopened" ? "\u{1F44D}" : "\u{1F4CB}" }),
|
|
2067
|
+
/* @__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" })
|
|
1971
2068
|
]
|
|
1972
2069
|
}
|
|
1973
2070
|
),
|
|
@@ -4044,13 +4141,289 @@ var styles4 = {
|
|
|
4044
4141
|
}
|
|
4045
4142
|
};
|
|
4046
4143
|
|
|
4144
|
+
// src/widget/screens/IssueListScreen.tsx
|
|
4145
|
+
var import_react13 = require("react");
|
|
4146
|
+
var import_jsx_runtime14 = require("react/jsx-runtime");
|
|
4147
|
+
var CATEGORY_CONFIG = {
|
|
4148
|
+
open: { label: "Open Issues", accent: "#f97316", emptyIcon: "\u2705", emptyText: "No open issues" },
|
|
4149
|
+
done: { label: "Done", accent: "#22c55e", emptyIcon: "\u{1F389}", emptyText: "No completed issues yet" },
|
|
4150
|
+
reopened: { label: "Reopened", accent: "#ef4444", emptyIcon: "\u{1F44D}", emptyText: "No reopened issues" }
|
|
4151
|
+
};
|
|
4152
|
+
var SEVERITY_COLORS = {
|
|
4153
|
+
critical: "#ef4444",
|
|
4154
|
+
high: "#f97316",
|
|
4155
|
+
medium: "#eab308",
|
|
4156
|
+
low: "#71717a"
|
|
4157
|
+
};
|
|
4158
|
+
function IssueListScreen({ nav, category }) {
|
|
4159
|
+
const { client } = useBugBear();
|
|
4160
|
+
const [issues, setIssues] = (0, import_react13.useState)([]);
|
|
4161
|
+
const [loading, setLoading] = (0, import_react13.useState)(true);
|
|
4162
|
+
const config = CATEGORY_CONFIG[category];
|
|
4163
|
+
(0, import_react13.useEffect)(() => {
|
|
4164
|
+
let cancelled = false;
|
|
4165
|
+
setLoading(true);
|
|
4166
|
+
(async () => {
|
|
4167
|
+
if (!client) return;
|
|
4168
|
+
const data = await client.getIssues(category);
|
|
4169
|
+
if (!cancelled) {
|
|
4170
|
+
setIssues(data);
|
|
4171
|
+
setLoading(false);
|
|
4172
|
+
}
|
|
4173
|
+
})();
|
|
4174
|
+
return () => {
|
|
4175
|
+
cancelled = true;
|
|
4176
|
+
};
|
|
4177
|
+
}, [client, category]);
|
|
4178
|
+
if (loading) {
|
|
4179
|
+
return /* @__PURE__ */ (0, import_jsx_runtime14.jsx)("div", { style: { padding: "40px 0", textAlign: "center" }, children: /* @__PURE__ */ (0, import_jsx_runtime14.jsx)("div", { style: { color: colors.textMuted, fontSize: 14 }, children: "Loading..." }) });
|
|
4180
|
+
}
|
|
4181
|
+
if (issues.length === 0) {
|
|
4182
|
+
return /* @__PURE__ */ (0, import_jsx_runtime14.jsxs)("div", { style: { padding: "40px 0", textAlign: "center" }, children: [
|
|
4183
|
+
/* @__PURE__ */ (0, import_jsx_runtime14.jsx)("div", { style: { fontSize: 36, marginBottom: 8 }, children: config.emptyIcon }),
|
|
4184
|
+
/* @__PURE__ */ (0, import_jsx_runtime14.jsx)("div", { style: { color: colors.textMuted, fontSize: 14 }, children: config.emptyText })
|
|
4185
|
+
] });
|
|
4186
|
+
}
|
|
4187
|
+
return /* @__PURE__ */ (0, import_jsx_runtime14.jsx)("div", { children: issues.map((issue) => /* @__PURE__ */ (0, import_jsx_runtime14.jsxs)(
|
|
4188
|
+
"div",
|
|
4189
|
+
{
|
|
4190
|
+
role: "button",
|
|
4191
|
+
tabIndex: 0,
|
|
4192
|
+
onClick: () => nav.push({ name: "ISSUE_DETAIL", issue }),
|
|
4193
|
+
onKeyDown: (e) => {
|
|
4194
|
+
if (e.key === "Enter" || e.key === " ") nav.push({ name: "ISSUE_DETAIL", issue });
|
|
4195
|
+
},
|
|
4196
|
+
style: {
|
|
4197
|
+
backgroundColor: colors.card,
|
|
4198
|
+
border: `1px solid ${colors.border}`,
|
|
4199
|
+
borderRadius: 10,
|
|
4200
|
+
padding: "12px 14px",
|
|
4201
|
+
marginBottom: 8,
|
|
4202
|
+
cursor: "pointer",
|
|
4203
|
+
userSelect: "none"
|
|
4204
|
+
},
|
|
4205
|
+
children: [
|
|
4206
|
+
/* @__PURE__ */ (0, import_jsx_runtime14.jsxs)("div", { style: { display: "flex", alignItems: "flex-start", gap: 8 }, children: [
|
|
4207
|
+
issue.severity && /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(
|
|
4208
|
+
"span",
|
|
4209
|
+
{
|
|
4210
|
+
style: {
|
|
4211
|
+
width: 8,
|
|
4212
|
+
height: 8,
|
|
4213
|
+
borderRadius: 4,
|
|
4214
|
+
backgroundColor: SEVERITY_COLORS[issue.severity] || colors.textDim,
|
|
4215
|
+
flexShrink: 0,
|
|
4216
|
+
marginTop: 5
|
|
4217
|
+
}
|
|
4218
|
+
}
|
|
4219
|
+
),
|
|
4220
|
+
/* @__PURE__ */ (0, import_jsx_runtime14.jsx)("span", { style: {
|
|
4221
|
+
fontSize: 13,
|
|
4222
|
+
fontWeight: 600,
|
|
4223
|
+
color: colors.textPrimary,
|
|
4224
|
+
flex: 1,
|
|
4225
|
+
overflow: "hidden",
|
|
4226
|
+
textOverflow: "ellipsis",
|
|
4227
|
+
whiteSpace: "nowrap"
|
|
4228
|
+
}, children: issue.title })
|
|
4229
|
+
] }),
|
|
4230
|
+
/* @__PURE__ */ (0, import_jsx_runtime14.jsxs)("div", { style: { display: "flex", justifyContent: "space-between", marginTop: 6 }, children: [
|
|
4231
|
+
issue.route && /* @__PURE__ */ (0, import_jsx_runtime14.jsx)("span", { style: { fontSize: 11, color: colors.textDim, maxWidth: "60%", overflow: "hidden", textOverflow: "ellipsis", whiteSpace: "nowrap" }, children: issue.route }),
|
|
4232
|
+
/* @__PURE__ */ (0, import_jsx_runtime14.jsx)("span", { style: { fontSize: 11, color: colors.textDim, marginLeft: "auto" }, children: formatRelativeTime(issue.updatedAt) })
|
|
4233
|
+
] }),
|
|
4234
|
+
category === "done" && issue.verifiedByName && /* @__PURE__ */ (0, import_jsx_runtime14.jsxs)("div", { style: {
|
|
4235
|
+
display: "inline-flex",
|
|
4236
|
+
alignItems: "center",
|
|
4237
|
+
gap: 4,
|
|
4238
|
+
backgroundColor: "#14532d",
|
|
4239
|
+
border: "1px solid #166534",
|
|
4240
|
+
borderRadius: 6,
|
|
4241
|
+
padding: "2px 8px",
|
|
4242
|
+
marginTop: 6,
|
|
4243
|
+
fontSize: 10,
|
|
4244
|
+
fontWeight: 600,
|
|
4245
|
+
color: "#4ade80"
|
|
4246
|
+
}, children: [
|
|
4247
|
+
"\u2714 Verified by ",
|
|
4248
|
+
issue.verifiedByName
|
|
4249
|
+
] }),
|
|
4250
|
+
category === "reopened" && issue.originalBugTitle && /* @__PURE__ */ (0, import_jsx_runtime14.jsxs)("div", { style: {
|
|
4251
|
+
display: "inline-flex",
|
|
4252
|
+
alignItems: "center",
|
|
4253
|
+
gap: 4,
|
|
4254
|
+
backgroundColor: "#422006",
|
|
4255
|
+
border: "1px solid #854d0e",
|
|
4256
|
+
borderRadius: 6,
|
|
4257
|
+
padding: "2px 8px",
|
|
4258
|
+
marginTop: 6,
|
|
4259
|
+
fontSize: 10,
|
|
4260
|
+
fontWeight: 600,
|
|
4261
|
+
color: "#fbbf24",
|
|
4262
|
+
maxWidth: "100%",
|
|
4263
|
+
overflow: "hidden",
|
|
4264
|
+
textOverflow: "ellipsis",
|
|
4265
|
+
whiteSpace: "nowrap"
|
|
4266
|
+
}, children: [
|
|
4267
|
+
"\u{1F504} Retest of: ",
|
|
4268
|
+
issue.originalBugTitle
|
|
4269
|
+
] })
|
|
4270
|
+
]
|
|
4271
|
+
},
|
|
4272
|
+
issue.id
|
|
4273
|
+
)) });
|
|
4274
|
+
}
|
|
4275
|
+
|
|
4276
|
+
// src/widget/screens/IssueDetailScreen.tsx
|
|
4277
|
+
var import_jsx_runtime15 = require("react/jsx-runtime");
|
|
4278
|
+
var STATUS_LABELS = {
|
|
4279
|
+
new: { label: "New", bg: "#1e3a5f", color: "#60a5fa" },
|
|
4280
|
+
triaging: { label: "Triaging", bg: "#1e3a5f", color: "#60a5fa" },
|
|
4281
|
+
confirmed: { label: "Confirmed", bg: "#422006", color: "#fbbf24" },
|
|
4282
|
+
in_progress: { label: "In Progress", bg: "#1e3a5f", color: "#60a5fa" },
|
|
4283
|
+
fixed: { label: "Fixed", bg: "#14532d", color: "#4ade80" },
|
|
4284
|
+
ready_to_test: { label: "Ready to Test", bg: "#422006", color: "#fbbf24" },
|
|
4285
|
+
verified: { label: "Verified", bg: "#14532d", color: "#4ade80" },
|
|
4286
|
+
resolved: { label: "Resolved", bg: "#14532d", color: "#4ade80" },
|
|
4287
|
+
reviewed: { label: "Reviewed", bg: "#14532d", color: "#4ade80" },
|
|
4288
|
+
closed: { label: "Closed", bg: "#27272a", color: "#71717a" },
|
|
4289
|
+
wont_fix: { label: "Won't Fix", bg: "#27272a", color: "#71717a" },
|
|
4290
|
+
duplicate: { label: "Duplicate", bg: "#27272a", color: "#71717a" }
|
|
4291
|
+
};
|
|
4292
|
+
var SEVERITY_CONFIG = {
|
|
4293
|
+
critical: { label: "Critical", color: "#ef4444", bg: "#7f1d1d" },
|
|
4294
|
+
high: { label: "High", color: "#f97316", bg: "#431407" },
|
|
4295
|
+
medium: { label: "Medium", color: "#eab308", bg: "#422006" },
|
|
4296
|
+
low: { label: "Low", color: "#71717a", bg: "#27272a" }
|
|
4297
|
+
};
|
|
4298
|
+
function IssueDetailScreen({ nav, issue }) {
|
|
4299
|
+
const statusConfig = STATUS_LABELS[issue.status] || { label: issue.status, bg: "#27272a", color: "#a1a1aa" };
|
|
4300
|
+
const severityConfig = issue.severity ? SEVERITY_CONFIG[issue.severity] : null;
|
|
4301
|
+
return /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)("div", { children: [
|
|
4302
|
+
/* @__PURE__ */ (0, import_jsx_runtime15.jsxs)("div", { style: { display: "flex", gap: 8, flexWrap: "wrap", marginBottom: 12 }, children: [
|
|
4303
|
+
/* @__PURE__ */ (0, import_jsx_runtime15.jsx)("span", { style: {
|
|
4304
|
+
backgroundColor: statusConfig.bg,
|
|
4305
|
+
color: statusConfig.color,
|
|
4306
|
+
fontSize: 11,
|
|
4307
|
+
fontWeight: 600,
|
|
4308
|
+
padding: "3px 10px",
|
|
4309
|
+
borderRadius: 6
|
|
4310
|
+
}, children: statusConfig.label }),
|
|
4311
|
+
severityConfig && /* @__PURE__ */ (0, import_jsx_runtime15.jsx)("span", { style: {
|
|
4312
|
+
backgroundColor: severityConfig.bg,
|
|
4313
|
+
color: severityConfig.color,
|
|
4314
|
+
fontSize: 11,
|
|
4315
|
+
fontWeight: 600,
|
|
4316
|
+
padding: "3px 10px",
|
|
4317
|
+
borderRadius: 6
|
|
4318
|
+
}, children: severityConfig.label })
|
|
4319
|
+
] }),
|
|
4320
|
+
/* @__PURE__ */ (0, import_jsx_runtime15.jsx)("h3", { style: { fontSize: 16, fontWeight: 700, color: colors.textPrimary, margin: "0 0 8px 0", lineHeight: 1.3 }, children: issue.title }),
|
|
4321
|
+
issue.route && /* @__PURE__ */ (0, import_jsx_runtime15.jsx)("div", { style: { fontSize: 12, color: colors.textDim, marginBottom: 12 }, children: issue.route }),
|
|
4322
|
+
issue.description && /* @__PURE__ */ (0, import_jsx_runtime15.jsx)("div", { style: {
|
|
4323
|
+
backgroundColor: colors.card,
|
|
4324
|
+
border: `1px solid ${colors.border}`,
|
|
4325
|
+
borderRadius: 8,
|
|
4326
|
+
padding: 12,
|
|
4327
|
+
marginBottom: 12,
|
|
4328
|
+
fontSize: 13,
|
|
4329
|
+
color: colors.textSecondary,
|
|
4330
|
+
lineHeight: 1.5,
|
|
4331
|
+
whiteSpace: "pre-wrap",
|
|
4332
|
+
wordBreak: "break-word"
|
|
4333
|
+
}, children: issue.description }),
|
|
4334
|
+
issue.verifiedByName && /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)("div", { style: {
|
|
4335
|
+
backgroundColor: "#14532d",
|
|
4336
|
+
border: "1px solid #166534",
|
|
4337
|
+
borderRadius: 8,
|
|
4338
|
+
padding: 12,
|
|
4339
|
+
marginBottom: 12
|
|
4340
|
+
}, children: [
|
|
4341
|
+
/* @__PURE__ */ (0, import_jsx_runtime15.jsxs)("div", { style: { display: "flex", alignItems: "center", gap: 8, marginBottom: 4 }, children: [
|
|
4342
|
+
/* @__PURE__ */ (0, import_jsx_runtime15.jsx)("span", { style: { fontSize: 16 }, children: "\u2705" }),
|
|
4343
|
+
/* @__PURE__ */ (0, import_jsx_runtime15.jsx)("span", { style: { fontSize: 13, fontWeight: 600, color: "#4ade80" }, children: "Retesting Proof" })
|
|
4344
|
+
] }),
|
|
4345
|
+
/* @__PURE__ */ (0, import_jsx_runtime15.jsxs)("div", { style: { fontSize: 12, color: "#86efac" }, children: [
|
|
4346
|
+
"Verified by ",
|
|
4347
|
+
/* @__PURE__ */ (0, import_jsx_runtime15.jsx)("strong", { children: issue.verifiedByName }),
|
|
4348
|
+
issue.verifiedAt && /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)("span", { children: [
|
|
4349
|
+
" on ",
|
|
4350
|
+
new Date(issue.verifiedAt).toLocaleDateString(void 0, { month: "short", day: "numeric", year: "numeric" })
|
|
4351
|
+
] })
|
|
4352
|
+
] })
|
|
4353
|
+
] }),
|
|
4354
|
+
issue.originalBugTitle && /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)("div", { style: {
|
|
4355
|
+
backgroundColor: "#422006",
|
|
4356
|
+
border: "1px solid #854d0e",
|
|
4357
|
+
borderRadius: 8,
|
|
4358
|
+
padding: 12,
|
|
4359
|
+
marginBottom: 12
|
|
4360
|
+
}, children: [
|
|
4361
|
+
/* @__PURE__ */ (0, import_jsx_runtime15.jsxs)("div", { style: { display: "flex", alignItems: "center", gap: 8, marginBottom: 4 }, children: [
|
|
4362
|
+
/* @__PURE__ */ (0, import_jsx_runtime15.jsx)("span", { style: { fontSize: 16 }, children: "\u{1F504}" }),
|
|
4363
|
+
/* @__PURE__ */ (0, import_jsx_runtime15.jsx)("span", { style: { fontSize: 13, fontWeight: 600, color: "#fbbf24" }, children: "Original Bug" })
|
|
4364
|
+
] }),
|
|
4365
|
+
/* @__PURE__ */ (0, import_jsx_runtime15.jsxs)("div", { style: { fontSize: 12, color: "#fde68a" }, children: [
|
|
4366
|
+
"Retest of: ",
|
|
4367
|
+
/* @__PURE__ */ (0, import_jsx_runtime15.jsx)("strong", { children: issue.originalBugTitle })
|
|
4368
|
+
] })
|
|
4369
|
+
] }),
|
|
4370
|
+
issue.screenshotUrls && issue.screenshotUrls.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)("div", { style: { marginBottom: 12 }, children: [
|
|
4371
|
+
/* @__PURE__ */ (0, import_jsx_runtime15.jsxs)("div", { style: { fontSize: 12, fontWeight: 600, color: colors.textMuted, marginBottom: 8 }, children: [
|
|
4372
|
+
"Screenshots (",
|
|
4373
|
+
issue.screenshotUrls.length,
|
|
4374
|
+
")"
|
|
4375
|
+
] }),
|
|
4376
|
+
/* @__PURE__ */ (0, import_jsx_runtime15.jsx)("div", { style: { display: "flex", gap: 8, overflowX: "auto" }, children: issue.screenshotUrls.map((url, i) => /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(
|
|
4377
|
+
"a",
|
|
4378
|
+
{
|
|
4379
|
+
href: url,
|
|
4380
|
+
target: "_blank",
|
|
4381
|
+
rel: "noopener noreferrer",
|
|
4382
|
+
style: { flexShrink: 0 },
|
|
4383
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(
|
|
4384
|
+
"img",
|
|
4385
|
+
{
|
|
4386
|
+
src: url,
|
|
4387
|
+
alt: `Screenshot ${i + 1}`,
|
|
4388
|
+
style: {
|
|
4389
|
+
width: 80,
|
|
4390
|
+
height: 60,
|
|
4391
|
+
objectFit: "cover",
|
|
4392
|
+
borderRadius: 6,
|
|
4393
|
+
border: `1px solid ${colors.border}`
|
|
4394
|
+
}
|
|
4395
|
+
}
|
|
4396
|
+
)
|
|
4397
|
+
},
|
|
4398
|
+
i
|
|
4399
|
+
)) })
|
|
4400
|
+
] }),
|
|
4401
|
+
/* @__PURE__ */ (0, import_jsx_runtime15.jsxs)("div", { style: {
|
|
4402
|
+
borderTop: `1px solid ${colors.border}`,
|
|
4403
|
+
paddingTop: 12,
|
|
4404
|
+
marginTop: 4
|
|
4405
|
+
}, children: [
|
|
4406
|
+
issue.reporterName && /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)("div", { style: { fontSize: 12, color: colors.textDim, marginBottom: 4 }, children: [
|
|
4407
|
+
"Reported by ",
|
|
4408
|
+
issue.reporterName
|
|
4409
|
+
] }),
|
|
4410
|
+
/* @__PURE__ */ (0, import_jsx_runtime15.jsxs)("div", { style: { fontSize: 11, color: colors.textDim }, children: [
|
|
4411
|
+
"Created ",
|
|
4412
|
+
formatRelativeTime(issue.createdAt),
|
|
4413
|
+
" \xB7 Updated ",
|
|
4414
|
+
formatRelativeTime(issue.updatedAt)
|
|
4415
|
+
] })
|
|
4416
|
+
] })
|
|
4417
|
+
] });
|
|
4418
|
+
}
|
|
4419
|
+
|
|
4047
4420
|
// src/widget/logo.ts
|
|
4048
4421
|
var BUGBEAR_LOGO_BASE64 = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGAAAABgCAYAAADimHc4AAAAAXNSR0IArs4c6QAAAJhlWElmTU0AKgAAAAgABAEaAAUAAAABAAAAPgEbAAUAAAABAAAARgEoAAMAAAABAAIAAIdpAAQAAAABAAAATgAAAAAAAABIAAAAAQAAAEgAAAABAASQBAACAAAAFAAAAISgAQADAAAAAQABAACgAgAEAAAAAQAAAGCgAwAEAAAAAQAAAGAAAAAAMjAyNjowMToyNCAxNjoyMTozOABbbVCuAAAACXBIWXMAAAsTAAALEwEAmpwYAAACo2lUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iWE1QIENvcmUgNi4wLjAiPgogICA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPgogICAgICA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIgogICAgICAgICAgICB4bWxuczpJcHRjNHhtcEV4dD0iaHR0cDovL2lwdGMub3JnL3N0ZC9JcHRjNHhtcEV4dC8yMDA4LTAyLTI5LyIKICAgICAgICAgICAgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIj4KICAgICAgICAgPElwdGM0eG1wRXh0OkRpZ2l0YWxTb3VyY2VUeXBlPmh0dHA6Ly9jdi5pcHRjLm9yZy9uZXdzY29kZXMvZGlnaXRhbHNvdXJjZXR5cGUvdHJhaW5lZEFsZ29yaXRobWljTWVkaWE8L0lwdGM0eG1wRXh0OkRpZ2l0YWxTb3VyY2VUeXBlPgogICAgICAgICA8SXB0YzR4bXBFeHQ6RGlnSW1hZ2VHVUlEPmZjNzJlN2Q2LTYyYTEtNDE1ZS04MjY5LWM2NjA4MjY0OWRiMDwvSXB0YzR4bXBFeHQ6RGlnSW1hZ2VHVUlEPgogICAgICAgICA8eG1wOkNyZWF0ZURhdGU+MjAyNi0wMS0yNFQxNjoyMTozODwveG1wOkNyZWF0ZURhdGU+CiAgICAgIDwvcmRmOkRlc2NyaXB0aW9uPgogICA8L3JkZjpSREY+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";
|
|
4049
4422
|
|
|
4050
4423
|
// src/BugBearPanel.tsx
|
|
4051
|
-
var
|
|
4424
|
+
var import_jsx_runtime16 = require("react/jsx-runtime");
|
|
4052
4425
|
function BugBearIcon({ size = 24 }) {
|
|
4053
|
-
return /* @__PURE__ */ (0,
|
|
4426
|
+
return /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(
|
|
4054
4427
|
"img",
|
|
4055
4428
|
{
|
|
4056
4429
|
src: BUGBEAR_LOGO_BASE64,
|
|
@@ -4095,12 +4468,12 @@ function BugBearPanel({
|
|
|
4095
4468
|
}) {
|
|
4096
4469
|
const { shouldShowWidget, testerInfo, assignments, isLoading, unreadCount } = useBugBear();
|
|
4097
4470
|
const { currentScreen, canGoBack, push, pop, replace, reset } = useNavigation();
|
|
4098
|
-
const [collapsed, setCollapsed] = (0,
|
|
4099
|
-
const [panelPosition, setPanelPosition] = (0,
|
|
4100
|
-
const [isDragging, setIsDragging] = (0,
|
|
4101
|
-
const dragStartRef = (0,
|
|
4102
|
-
const panelRef = (0,
|
|
4103
|
-
(0,
|
|
4471
|
+
const [collapsed, setCollapsed] = (0, import_react14.useState)(defaultCollapsed);
|
|
4472
|
+
const [panelPosition, setPanelPosition] = (0, import_react14.useState)(null);
|
|
4473
|
+
const [isDragging, setIsDragging] = (0, import_react14.useState)(false);
|
|
4474
|
+
const dragStartRef = (0, import_react14.useRef)(null);
|
|
4475
|
+
const panelRef = (0, import_react14.useRef)(null);
|
|
4476
|
+
(0, import_react14.useEffect)(() => {
|
|
4104
4477
|
if (typeof window === "undefined") return;
|
|
4105
4478
|
try {
|
|
4106
4479
|
const saved = localStorage.getItem(STORAGE_KEY);
|
|
@@ -4114,7 +4487,7 @@ function BugBearPanel({
|
|
|
4114
4487
|
setPanelPosition(getDefaultPosition(position));
|
|
4115
4488
|
}
|
|
4116
4489
|
}, [position]);
|
|
4117
|
-
(0,
|
|
4490
|
+
(0, import_react14.useEffect)(() => {
|
|
4118
4491
|
if (panelPosition && typeof window !== "undefined") {
|
|
4119
4492
|
try {
|
|
4120
4493
|
localStorage.setItem(STORAGE_KEY, JSON.stringify(panelPosition));
|
|
@@ -4122,7 +4495,7 @@ function BugBearPanel({
|
|
|
4122
4495
|
}
|
|
4123
4496
|
}
|
|
4124
4497
|
}, [panelPosition]);
|
|
4125
|
-
(0,
|
|
4498
|
+
(0, import_react14.useEffect)(() => {
|
|
4126
4499
|
if (typeof window === "undefined") return;
|
|
4127
4500
|
const handleResize = () => {
|
|
4128
4501
|
setPanelPosition((prev) => prev ? clampPosition(prev) : getDefaultPosition(position));
|
|
@@ -4130,7 +4503,7 @@ function BugBearPanel({
|
|
|
4130
4503
|
window.addEventListener("resize", handleResize);
|
|
4131
4504
|
return () => window.removeEventListener("resize", handleResize);
|
|
4132
4505
|
}, [position]);
|
|
4133
|
-
const handleMouseDown = (0,
|
|
4506
|
+
const handleMouseDown = (0, import_react14.useCallback)((e) => {
|
|
4134
4507
|
if (!draggable || !panelPosition) return;
|
|
4135
4508
|
const target = e.target;
|
|
4136
4509
|
if (!target.closest("[data-drag-handle]")) return;
|
|
@@ -4143,7 +4516,7 @@ function BugBearPanel({
|
|
|
4143
4516
|
panelY: panelPosition.y
|
|
4144
4517
|
};
|
|
4145
4518
|
}, [draggable, panelPosition]);
|
|
4146
|
-
(0,
|
|
4519
|
+
(0, import_react14.useEffect)(() => {
|
|
4147
4520
|
if (!isDragging) return;
|
|
4148
4521
|
const handleMouseMove = (e) => {
|
|
4149
4522
|
if (!dragStartRef.current) return;
|
|
@@ -4165,7 +4538,7 @@ function BugBearPanel({
|
|
|
4165
4538
|
document.removeEventListener("mouseup", handleMouseUp);
|
|
4166
4539
|
};
|
|
4167
4540
|
}, [isDragging]);
|
|
4168
|
-
const handleDoubleClick = (0,
|
|
4541
|
+
const handleDoubleClick = (0, import_react14.useCallback)(() => {
|
|
4169
4542
|
if (!draggable) return;
|
|
4170
4543
|
setPanelPosition(getDefaultPosition(position));
|
|
4171
4544
|
try {
|
|
@@ -4197,6 +4570,10 @@ function BugBearPanel({
|
|
|
4197
4570
|
return currentScreen.thread.subject || "Thread";
|
|
4198
4571
|
case "COMPOSE_MESSAGE":
|
|
4199
4572
|
return "New Message";
|
|
4573
|
+
case "ISSUE_LIST":
|
|
4574
|
+
return currentScreen.category === "open" ? "Open Issues" : currentScreen.category === "done" ? "Done" : "Reopened";
|
|
4575
|
+
case "ISSUE_DETAIL":
|
|
4576
|
+
return "Issue Detail";
|
|
4200
4577
|
case "PROFILE":
|
|
4201
4578
|
return "Profile";
|
|
4202
4579
|
default:
|
|
@@ -4211,33 +4588,37 @@ function BugBearPanel({
|
|
|
4211
4588
|
const renderScreen = () => {
|
|
4212
4589
|
switch (currentScreen.name) {
|
|
4213
4590
|
case "HOME":
|
|
4214
|
-
return /* @__PURE__ */ (0,
|
|
4591
|
+
return /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(HomeScreen, { nav });
|
|
4215
4592
|
case "TEST_DETAIL":
|
|
4216
|
-
return /* @__PURE__ */ (0,
|
|
4593
|
+
return /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(TestDetailScreen, { testId: currentScreen.testId, nav });
|
|
4217
4594
|
case "TEST_LIST":
|
|
4218
|
-
return /* @__PURE__ */ (0,
|
|
4595
|
+
return /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(TestListScreen, { nav });
|
|
4219
4596
|
case "TEST_FEEDBACK":
|
|
4220
|
-
return /* @__PURE__ */ (0,
|
|
4597
|
+
return /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(TestFeedbackScreen, { status: currentScreen.status, assignmentId: currentScreen.assignmentId, nav });
|
|
4221
4598
|
case "REPORT":
|
|
4222
|
-
return /* @__PURE__ */ (0,
|
|
4599
|
+
return /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(ReportScreen, { nav, prefill: currentScreen.prefill });
|
|
4223
4600
|
case "REPORT_SUCCESS":
|
|
4224
|
-
return /* @__PURE__ */ (0,
|
|
4601
|
+
return /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(ReportSuccessScreen, { nav });
|
|
4225
4602
|
case "MESSAGE_LIST":
|
|
4226
|
-
return /* @__PURE__ */ (0,
|
|
4603
|
+
return /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(MessageListScreen, { nav });
|
|
4227
4604
|
case "THREAD_DETAIL":
|
|
4228
|
-
return /* @__PURE__ */ (0,
|
|
4605
|
+
return /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(ThreadDetailScreen, { thread: currentScreen.thread, nav });
|
|
4229
4606
|
case "COMPOSE_MESSAGE":
|
|
4230
|
-
return /* @__PURE__ */ (0,
|
|
4607
|
+
return /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(ComposeMessageScreen, { nav });
|
|
4608
|
+
case "ISSUE_LIST":
|
|
4609
|
+
return /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(IssueListScreen, { nav, category: currentScreen.category });
|
|
4610
|
+
case "ISSUE_DETAIL":
|
|
4611
|
+
return /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(IssueDetailScreen, { nav, issue: currentScreen.issue });
|
|
4231
4612
|
case "PROFILE":
|
|
4232
|
-
return /* @__PURE__ */ (0,
|
|
4613
|
+
return /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(ProfileScreen, { nav });
|
|
4233
4614
|
default:
|
|
4234
|
-
return /* @__PURE__ */ (0,
|
|
4615
|
+
return /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(HomeScreen, { nav });
|
|
4235
4616
|
}
|
|
4236
4617
|
};
|
|
4237
4618
|
if (typeof document === "undefined") return null;
|
|
4238
4619
|
const headerTitle = getHeaderTitle();
|
|
4239
4620
|
return (0, import_react_dom.createPortal)(
|
|
4240
|
-
/* @__PURE__ */ (0,
|
|
4621
|
+
/* @__PURE__ */ (0, import_jsx_runtime16.jsxs)(
|
|
4241
4622
|
"div",
|
|
4242
4623
|
{
|
|
4243
4624
|
ref: panelRef,
|
|
@@ -4256,7 +4637,7 @@ function BugBearPanel({
|
|
|
4256
4637
|
},
|
|
4257
4638
|
onMouseDown: handleMouseDown,
|
|
4258
4639
|
children: [
|
|
4259
|
-
collapsed && /* @__PURE__ */ (0,
|
|
4640
|
+
collapsed && /* @__PURE__ */ (0, import_jsx_runtime16.jsxs)(
|
|
4260
4641
|
"button",
|
|
4261
4642
|
{
|
|
4262
4643
|
onClick: () => setCollapsed(false),
|
|
@@ -4278,9 +4659,9 @@ function BugBearPanel({
|
|
|
4278
4659
|
fontWeight: 500
|
|
4279
4660
|
},
|
|
4280
4661
|
children: [
|
|
4281
|
-
/* @__PURE__ */ (0,
|
|
4282
|
-
/* @__PURE__ */ (0,
|
|
4283
|
-
badgeCount > 0 && /* @__PURE__ */ (0,
|
|
4662
|
+
/* @__PURE__ */ (0, import_jsx_runtime16.jsx)(BugBearIcon, { size: 24 }),
|
|
4663
|
+
/* @__PURE__ */ (0, import_jsx_runtime16.jsx)("span", { children: "BugBear" }),
|
|
4664
|
+
badgeCount > 0 && /* @__PURE__ */ (0, import_jsx_runtime16.jsx)("span", { style: {
|
|
4284
4665
|
backgroundColor: "#fff",
|
|
4285
4666
|
color: colors.blue,
|
|
4286
4667
|
fontSize: "0.75rem",
|
|
@@ -4291,7 +4672,7 @@ function BugBearPanel({
|
|
|
4291
4672
|
]
|
|
4292
4673
|
}
|
|
4293
4674
|
),
|
|
4294
|
-
!collapsed && /* @__PURE__ */ (0,
|
|
4675
|
+
!collapsed && /* @__PURE__ */ (0, import_jsx_runtime16.jsxs)("div", { style: {
|
|
4295
4676
|
width: PANEL_WIDTH,
|
|
4296
4677
|
backgroundColor: colors.bg,
|
|
4297
4678
|
borderRadius: 12,
|
|
@@ -4299,7 +4680,7 @@ function BugBearPanel({
|
|
|
4299
4680
|
overflow: "hidden",
|
|
4300
4681
|
boxShadow: "0 25px 50px -12px rgba(0,0,0,0.5)"
|
|
4301
4682
|
}, children: [
|
|
4302
|
-
/* @__PURE__ */ (0,
|
|
4683
|
+
/* @__PURE__ */ (0, import_jsx_runtime16.jsxs)(
|
|
4303
4684
|
"div",
|
|
4304
4685
|
{
|
|
4305
4686
|
"data-drag-handle": true,
|
|
@@ -4315,7 +4696,7 @@ function BugBearPanel({
|
|
|
4315
4696
|
cursor: draggable ? isDragging ? "grabbing" : "grab" : "default"
|
|
4316
4697
|
},
|
|
4317
4698
|
children: [
|
|
4318
|
-
/* @__PURE__ */ (0,
|
|
4699
|
+
/* @__PURE__ */ (0, import_jsx_runtime16.jsx)("div", { style: { display: "flex", alignItems: "center", gap: 8, flex: 1, minWidth: 0 }, children: canGoBack ? /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(
|
|
4319
4700
|
"button",
|
|
4320
4701
|
{
|
|
4321
4702
|
onClick: pop,
|
|
@@ -4331,14 +4712,14 @@ function BugBearPanel({
|
|
|
4331
4712
|
},
|
|
4332
4713
|
children: "\u2190 Back"
|
|
4333
4714
|
}
|
|
4334
|
-
) : /* @__PURE__ */ (0,
|
|
4335
|
-
/* @__PURE__ */ (0,
|
|
4336
|
-
/* @__PURE__ */ (0,
|
|
4337
|
-
/* @__PURE__ */ (0,
|
|
4338
|
-
/* @__PURE__ */ (0,
|
|
4339
|
-
draggable && /* @__PURE__ */ (0,
|
|
4715
|
+
) : /* @__PURE__ */ (0, import_jsx_runtime16.jsxs)(import_jsx_runtime16.Fragment, { children: [
|
|
4716
|
+
/* @__PURE__ */ (0, import_jsx_runtime16.jsx)(BugBearIcon, { size: 28 }),
|
|
4717
|
+
/* @__PURE__ */ (0, import_jsx_runtime16.jsxs)("div", { children: [
|
|
4718
|
+
/* @__PURE__ */ (0, import_jsx_runtime16.jsxs)("div", { style: { display: "flex", alignItems: "center", gap: 8 }, children: [
|
|
4719
|
+
/* @__PURE__ */ (0, import_jsx_runtime16.jsx)("span", { style: { fontWeight: 600, fontSize: "0.875rem" }, children: "BugBear" }),
|
|
4720
|
+
draggable && /* @__PURE__ */ (0, import_jsx_runtime16.jsx)("span", { style: { color: colors.textMuted, fontSize: "0.75rem" }, title: "Drag to move, double-click to reset", children: "\u22EE\u22EE" })
|
|
4340
4721
|
] }),
|
|
4341
|
-
testerInfo && /* @__PURE__ */ (0,
|
|
4722
|
+
testerInfo && /* @__PURE__ */ (0, import_jsx_runtime16.jsxs)(
|
|
4342
4723
|
"button",
|
|
4343
4724
|
{
|
|
4344
4725
|
onClick: () => push({ name: "PROFILE" }),
|
|
@@ -4356,13 +4737,13 @@ function BugBearPanel({
|
|
|
4356
4737
|
},
|
|
4357
4738
|
children: [
|
|
4358
4739
|
testerInfo.name,
|
|
4359
|
-
/* @__PURE__ */ (0,
|
|
4740
|
+
/* @__PURE__ */ (0, import_jsx_runtime16.jsx)("span", { style: { fontSize: "0.625rem" }, children: "\u270E" })
|
|
4360
4741
|
]
|
|
4361
4742
|
}
|
|
4362
4743
|
)
|
|
4363
4744
|
] })
|
|
4364
4745
|
] }) }),
|
|
4365
|
-
headerTitle ? /* @__PURE__ */ (0,
|
|
4746
|
+
headerTitle ? /* @__PURE__ */ (0, import_jsx_runtime16.jsx)("span", { style: {
|
|
4366
4747
|
fontSize: "0.8125rem",
|
|
4367
4748
|
fontWeight: 600,
|
|
4368
4749
|
color: colors.textSecondary,
|
|
@@ -4372,7 +4753,7 @@ function BugBearPanel({
|
|
|
4372
4753
|
textOverflow: "ellipsis",
|
|
4373
4754
|
whiteSpace: "nowrap"
|
|
4374
4755
|
}, children: headerTitle }) : null,
|
|
4375
|
-
/* @__PURE__ */ (0,
|
|
4756
|
+
/* @__PURE__ */ (0, import_jsx_runtime16.jsx)(
|
|
4376
4757
|
"button",
|
|
4377
4758
|
{
|
|
4378
4759
|
onClick: handleClose,
|
|
@@ -4396,13 +4777,13 @@ function BugBearPanel({
|
|
|
4396
4777
|
]
|
|
4397
4778
|
}
|
|
4398
4779
|
),
|
|
4399
|
-
/* @__PURE__ */ (0,
|
|
4780
|
+
/* @__PURE__ */ (0, import_jsx_runtime16.jsx)("div", { style: {
|
|
4400
4781
|
padding: 16,
|
|
4401
4782
|
maxHeight: 400,
|
|
4402
4783
|
overflowY: "auto",
|
|
4403
4784
|
backgroundColor: colors.bg,
|
|
4404
4785
|
color: colors.textSecondary
|
|
4405
|
-
}, children: isLoading ? /* @__PURE__ */ (0,
|
|
4786
|
+
}, children: isLoading ? /* @__PURE__ */ (0, import_jsx_runtime16.jsx)("div", { style: { padding: "60px 0", textAlign: "center" }, children: /* @__PURE__ */ (0, import_jsx_runtime16.jsx)("div", { style: { color: colors.textMuted, fontSize: "0.875rem" }, children: "Loading..." }) }) : renderScreen() })
|
|
4406
4787
|
] })
|
|
4407
4788
|
]
|
|
4408
4789
|
}
|
|
@@ -4412,10 +4793,10 @@ function BugBearPanel({
|
|
|
4412
4793
|
}
|
|
4413
4794
|
|
|
4414
4795
|
// src/BugBearErrorBoundary.tsx
|
|
4415
|
-
var
|
|
4796
|
+
var import_react15 = require("react");
|
|
4416
4797
|
var import_core2 = require("@bbearai/core");
|
|
4417
|
-
var
|
|
4418
|
-
var BugBearErrorBoundary = class extends
|
|
4798
|
+
var import_jsx_runtime17 = require("react/jsx-runtime");
|
|
4799
|
+
var BugBearErrorBoundary = class extends import_react15.Component {
|
|
4419
4800
|
constructor(props) {
|
|
4420
4801
|
super(props);
|
|
4421
4802
|
this.reset = () => {
|
|
@@ -4459,7 +4840,7 @@ var BugBearErrorBoundary = class extends import_react14.Component {
|
|
|
4459
4840
|
if (fallback) {
|
|
4460
4841
|
return fallback;
|
|
4461
4842
|
}
|
|
4462
|
-
return /* @__PURE__ */ (0,
|
|
4843
|
+
return /* @__PURE__ */ (0, import_jsx_runtime17.jsxs)(
|
|
4463
4844
|
"div",
|
|
4464
4845
|
{
|
|
4465
4846
|
style: {
|
|
@@ -4471,13 +4852,13 @@ var BugBearErrorBoundary = class extends import_react14.Component {
|
|
|
4471
4852
|
fontFamily: '-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif'
|
|
4472
4853
|
},
|
|
4473
4854
|
children: [
|
|
4474
|
-
/* @__PURE__ */ (0,
|
|
4475
|
-
/* @__PURE__ */ (0,
|
|
4476
|
-
/* @__PURE__ */ (0,
|
|
4855
|
+
/* @__PURE__ */ (0, import_jsx_runtime17.jsxs)("div", { style: { display: "flex", alignItems: "center", gap: "8px", marginBottom: "12px" }, children: [
|
|
4856
|
+
/* @__PURE__ */ (0, import_jsx_runtime17.jsx)("img", { src: BUGBEAR_LOGO_BASE64, alt: "BugBear", width: 28, height: 28, style: { objectFit: "contain" } }),
|
|
4857
|
+
/* @__PURE__ */ (0, import_jsx_runtime17.jsx)("h3", { style: { margin: 0, color: "#991b1b", fontSize: "16px" }, children: "Something went wrong" })
|
|
4477
4858
|
] }),
|
|
4478
|
-
/* @__PURE__ */ (0,
|
|
4479
|
-
/* @__PURE__ */ (0,
|
|
4480
|
-
/* @__PURE__ */ (0,
|
|
4859
|
+
/* @__PURE__ */ (0, import_jsx_runtime17.jsx)("p", { style: { color: "#7f1d1d", fontSize: "14px", margin: "0 0 12px 0" }, children: error.message }),
|
|
4860
|
+
/* @__PURE__ */ (0, import_jsx_runtime17.jsxs)("div", { style: { display: "flex", gap: "8px" }, children: [
|
|
4861
|
+
/* @__PURE__ */ (0, import_jsx_runtime17.jsx)(
|
|
4481
4862
|
"button",
|
|
4482
4863
|
{
|
|
4483
4864
|
onClick: this.reset,
|
|
@@ -4494,7 +4875,7 @@ var BugBearErrorBoundary = class extends import_react14.Component {
|
|
|
4494
4875
|
children: "Try Again"
|
|
4495
4876
|
}
|
|
4496
4877
|
),
|
|
4497
|
-
/* @__PURE__ */ (0,
|
|
4878
|
+
/* @__PURE__ */ (0, import_jsx_runtime17.jsx)(
|
|
4498
4879
|
"button",
|
|
4499
4880
|
{
|
|
4500
4881
|
onClick: () => window.location.reload(),
|
|
@@ -4512,7 +4893,7 @@ var BugBearErrorBoundary = class extends import_react14.Component {
|
|
|
4512
4893
|
}
|
|
4513
4894
|
)
|
|
4514
4895
|
] }),
|
|
4515
|
-
/* @__PURE__ */ (0,
|
|
4896
|
+
/* @__PURE__ */ (0, import_jsx_runtime17.jsx)("p", { style: { color: "#9ca3af", fontSize: "12px", marginTop: "12px" }, children: "The error has been captured by BugBear" })
|
|
4516
4897
|
]
|
|
4517
4898
|
}
|
|
4518
4899
|
);
|