@bbearai/react-native 0.9.1 → 0.9.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.js +766 -371
- package/dist/index.mjs +766 -371
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -15195,8 +15195,8 @@ function BugBearProvider({ config, children, appVersion, enabled = true }) {
|
|
|
15195
15195
|
}
|
|
15196
15196
|
|
|
15197
15197
|
// src/BugBearButton.tsx
|
|
15198
|
-
var
|
|
15199
|
-
var
|
|
15198
|
+
var import_react24 = __toESM(require("react"));
|
|
15199
|
+
var import_react_native23 = require("react-native");
|
|
15200
15200
|
|
|
15201
15201
|
// src/widget/logo.ts
|
|
15202
15202
|
var BUGBEAR_LOGO_BASE64 = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGAAAABgCAYAAADimHc4AAAAAXNSR0IArs4c6QAAAJhlWElmTU0AKgAAAAgABAEaAAUAAAABAAAAPgEbAAUAAAABAAAARgEoAAMAAAABAAIAAIdpAAQAAAABAAAATgAAAAAAAABIAAAAAQAAAEgAAAABAASQBAACAAAAFAAAAISgAQADAAAAAQABAACgAgAEAAAAAQAAAGCgAwAEAAAAAQAAAGAAAAAAMjAyNjowMToyNCAxNjoyMTozOABbbVCuAAAACXBIWXMAAAsTAAALEwEAmpwYAAACo2lUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iWE1QIENvcmUgNi4wLjAiPgogICA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPgogICAgICA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIgogICAgICAgICAgICB4bWxuczpJcHRjNHhtcEV4dD0iaHR0cDovL2lwdGMub3JnL3N0ZC9JcHRjNHhtcEV4dC8yMDA4LTAyLTI5LyIKICAgICAgICAgICAgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIj4KICAgICAgICAgPElwdGM0eG1wRXh0OkRpZ2l0YWxTb3VyY2VUeXBlPmh0dHA6Ly9jdi5pcHRjLm9yZy9uZXdzY29kZXMvZGlnaXRhbHNvdXJjZXR5cGUvdHJhaW5lZEFsZ29yaXRobWljTWVkaWE8L0lwdGM0eG1wRXh0OkRpZ2l0YWxTb3VyY2VUeXBlPgogICAgICAgICA8SXB0YzR4bXBFeHQ6RGlnSW1hZ2VHVUlEPmZjNzJlN2Q2LTYyYTEtNDE1ZS04MjY5LWM2NjA4MjY0OWRiMDwvSXB0YzR4bXBFeHQ6RGlnSW1hZ2VHVUlEPgogICAgICAgICA8eG1wOkNyZWF0ZURhdGU+MjAyNi0wMS0yNFQxNjoyMTozODwveG1wOkNyZWF0ZURhdGU+CiAgICAgIDwvcmRmOkRlc2NyaXB0aW9uPgogICA8L3JkZjpSREY+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";
|
|
@@ -15251,6 +15251,11 @@ async function captureAppScreen() {
|
|
|
15251
15251
|
}
|
|
15252
15252
|
}
|
|
15253
15253
|
|
|
15254
|
+
// src/widget/animatedUtils.ts
|
|
15255
|
+
function getAnimatedValue(value) {
|
|
15256
|
+
return value._value;
|
|
15257
|
+
}
|
|
15258
|
+
|
|
15254
15259
|
// src/widget/screens/HomeScreen.tsx
|
|
15255
15260
|
var import_react4 = __toESM(require("react"));
|
|
15256
15261
|
var import_react_native4 = require("react-native");
|
|
@@ -15335,7 +15340,7 @@ var s = import_react_native3.StyleSheet.create({
|
|
|
15335
15340
|
// src/widget/screens/HomeScreen.tsx
|
|
15336
15341
|
function HomeScreen({ nav }) {
|
|
15337
15342
|
const { assignments, unreadCount, threads, refreshAssignments, refreshThreads, issueCounts, refreshIssueCounts, dashboardUrl, isLoading, activeSession, sessionFindings, refreshSession, widgetMode, widgetColorScheme } = useBugBear();
|
|
15338
|
-
const
|
|
15343
|
+
const styles6 = (0, import_react4.useMemo)(() => createStyles(), [widgetColorScheme]);
|
|
15339
15344
|
const [sessionElapsed, setSessionElapsed] = (0, import_react4.useState)(0);
|
|
15340
15345
|
const timerRef = (0, import_react4.useRef)(null);
|
|
15341
15346
|
(0, import_react4.useEffect)(() => {
|
|
@@ -15364,98 +15369,98 @@ function HomeScreen({ nav }) {
|
|
|
15364
15369
|
return /* @__PURE__ */ import_react4.default.createElement(import_react_native4.View, null, unreadCount > 0 ? /* @__PURE__ */ import_react4.default.createElement(
|
|
15365
15370
|
import_react_native4.TouchableOpacity,
|
|
15366
15371
|
{
|
|
15367
|
-
style: [
|
|
15372
|
+
style: [styles6.heroBanner, styles6.heroBannerMessages],
|
|
15368
15373
|
onPress: () => nav.push({ name: "MESSAGE_LIST" }),
|
|
15369
15374
|
activeOpacity: 0.8
|
|
15370
15375
|
},
|
|
15371
|
-
/* @__PURE__ */ import_react4.default.createElement(import_react_native4.Text, { style:
|
|
15372
|
-
/* @__PURE__ */ import_react4.default.createElement(import_react_native4.Text, { style:
|
|
15373
|
-
/* @__PURE__ */ import_react4.default.createElement(import_react_native4.Text, { style:
|
|
15374
|
-
) : /* @__PURE__ */ import_react4.default.createElement(import_react_native4.View, { style: [
|
|
15376
|
+
/* @__PURE__ */ import_react4.default.createElement(import_react_native4.Text, { style: styles6.heroCount }, unreadCount),
|
|
15377
|
+
/* @__PURE__ */ import_react4.default.createElement(import_react_native4.Text, { style: styles6.heroLabel }, "unread message", unreadCount !== 1 ? "s" : ""),
|
|
15378
|
+
/* @__PURE__ */ import_react4.default.createElement(import_react_native4.Text, { style: styles6.heroAction }, "View Messages \u2192")
|
|
15379
|
+
) : /* @__PURE__ */ import_react4.default.createElement(import_react_native4.View, { style: [styles6.heroBanner, styles6.heroBannerClear] }, /* @__PURE__ */ import_react4.default.createElement(import_react_native4.Text, { style: styles6.heroClearEmoji }, "\u{1F4AC}"), /* @__PURE__ */ import_react4.default.createElement(import_react_native4.Text, { style: styles6.heroClearTitle }, "Help us improve"), /* @__PURE__ */ import_react4.default.createElement(import_react_native4.Text, { style: styles6.heroClearSub }, "Report bugs, share ideas, and track your submissions")), /* @__PURE__ */ import_react4.default.createElement(import_react_native4.View, { style: styles6.actionGrid }, /* @__PURE__ */ import_react4.default.createElement(
|
|
15375
15380
|
import_react_native4.TouchableOpacity,
|
|
15376
15381
|
{
|
|
15377
|
-
style:
|
|
15382
|
+
style: styles6.actionCard,
|
|
15378
15383
|
onPress: () => nav.push({ name: "REPORT", prefill: { type: "bug" } }),
|
|
15379
15384
|
activeOpacity: 0.7
|
|
15380
15385
|
},
|
|
15381
|
-
/* @__PURE__ */ import_react4.default.createElement(import_react_native4.Text, { style:
|
|
15382
|
-
/* @__PURE__ */ import_react4.default.createElement(import_react_native4.Text, { style:
|
|
15386
|
+
/* @__PURE__ */ import_react4.default.createElement(import_react_native4.Text, { style: styles6.actionIcon }, "\u{1F41B}"),
|
|
15387
|
+
/* @__PURE__ */ import_react4.default.createElement(import_react_native4.Text, { style: styles6.actionLabel }, "Report Bug")
|
|
15383
15388
|
), /* @__PURE__ */ import_react4.default.createElement(
|
|
15384
15389
|
import_react_native4.TouchableOpacity,
|
|
15385
15390
|
{
|
|
15386
|
-
style:
|
|
15391
|
+
style: styles6.actionCard,
|
|
15387
15392
|
onPress: () => nav.push({ name: "REPORT", prefill: { type: "feedback" } }),
|
|
15388
15393
|
activeOpacity: 0.7
|
|
15389
15394
|
},
|
|
15390
|
-
/* @__PURE__ */ import_react4.default.createElement(import_react_native4.Text, { style:
|
|
15391
|
-
/* @__PURE__ */ import_react4.default.createElement(import_react_native4.Text, { style:
|
|
15395
|
+
/* @__PURE__ */ import_react4.default.createElement(import_react_native4.Text, { style: styles6.actionIcon }, "\u{1F4A1}"),
|
|
15396
|
+
/* @__PURE__ */ import_react4.default.createElement(import_react_native4.Text, { style: styles6.actionLabel }, "Share Feedback")
|
|
15392
15397
|
), /* @__PURE__ */ import_react4.default.createElement(
|
|
15393
15398
|
import_react_native4.TouchableOpacity,
|
|
15394
15399
|
{
|
|
15395
|
-
style:
|
|
15400
|
+
style: styles6.actionCard,
|
|
15396
15401
|
onPress: () => nav.push({ name: "MESSAGE_LIST" }),
|
|
15397
15402
|
activeOpacity: 0.7
|
|
15398
15403
|
},
|
|
15399
|
-
/* @__PURE__ */ import_react4.default.createElement(import_react_native4.Text, { style:
|
|
15400
|
-
/* @__PURE__ */ import_react4.default.createElement(import_react_native4.Text, { style:
|
|
15401
|
-
unreadCount > 0 && /* @__PURE__ */ import_react4.default.createElement(import_react_native4.View, { style: [
|
|
15404
|
+
/* @__PURE__ */ import_react4.default.createElement(import_react_native4.Text, { style: styles6.actionIcon }, "\u{1F4AC}"),
|
|
15405
|
+
/* @__PURE__ */ import_react4.default.createElement(import_react_native4.Text, { style: styles6.actionLabel }, "Messages"),
|
|
15406
|
+
unreadCount > 0 && /* @__PURE__ */ import_react4.default.createElement(import_react_native4.View, { style: [styles6.actionBadge, styles6.actionBadgeMsg] }, /* @__PURE__ */ import_react4.default.createElement(import_react_native4.Text, { style: styles6.actionBadgeText }, unreadCount))
|
|
15402
15407
|
), /* @__PURE__ */ import_react4.default.createElement(
|
|
15403
15408
|
import_react_native4.TouchableOpacity,
|
|
15404
15409
|
{
|
|
15405
|
-
style:
|
|
15410
|
+
style: styles6.actionCard,
|
|
15406
15411
|
onPress: () => nav.push({ name: "ISSUE_LIST", category: "open" }),
|
|
15407
15412
|
activeOpacity: 0.7
|
|
15408
15413
|
},
|
|
15409
|
-
/* @__PURE__ */ import_react4.default.createElement(import_react_native4.Text, { style:
|
|
15410
|
-
/* @__PURE__ */ import_react4.default.createElement(import_react_native4.Text, { style:
|
|
15411
|
-
issueCounts.open > 0 && /* @__PURE__ */ import_react4.default.createElement(import_react_native4.View, { style: [
|
|
15412
|
-
)), /* @__PURE__ */ import_react4.default.createElement(import_react_native4.View, { style:
|
|
15414
|
+
/* @__PURE__ */ import_react4.default.createElement(import_react_native4.Text, { style: styles6.actionIcon }, "\u{1F4CB}"),
|
|
15415
|
+
/* @__PURE__ */ import_react4.default.createElement(import_react_native4.Text, { style: styles6.actionLabel }, "My Issues"),
|
|
15416
|
+
issueCounts.open > 0 && /* @__PURE__ */ import_react4.default.createElement(import_react_native4.View, { style: [styles6.actionBadge, styles6.actionBadgeIssue] }, /* @__PURE__ */ import_react4.default.createElement(import_react_native4.Text, { style: styles6.actionBadgeText }, issueCounts.open))
|
|
15417
|
+
)), /* @__PURE__ */ import_react4.default.createElement(import_react_native4.View, { style: styles6.issueGrid }, /* @__PURE__ */ import_react4.default.createElement(
|
|
15413
15418
|
import_react_native4.TouchableOpacity,
|
|
15414
15419
|
{
|
|
15415
|
-
style: [
|
|
15420
|
+
style: [styles6.issueCard, styles6.issueCardOpen],
|
|
15416
15421
|
onPress: () => nav.push({ name: "ISSUE_LIST", category: "open" }),
|
|
15417
15422
|
activeOpacity: 0.7
|
|
15418
15423
|
},
|
|
15419
|
-
/* @__PURE__ */ import_react4.default.createElement(import_react_native4.Text, { style:
|
|
15420
|
-
/* @__PURE__ */ import_react4.default.createElement(import_react_native4.Text, { style:
|
|
15424
|
+
/* @__PURE__ */ import_react4.default.createElement(import_react_native4.Text, { style: styles6.issueCountOpen }, issueCounts.open),
|
|
15425
|
+
/* @__PURE__ */ import_react4.default.createElement(import_react_native4.Text, { style: styles6.issueLabel }, "Open")
|
|
15421
15426
|
), /* @__PURE__ */ import_react4.default.createElement(
|
|
15422
15427
|
import_react_native4.TouchableOpacity,
|
|
15423
15428
|
{
|
|
15424
|
-
style: [
|
|
15429
|
+
style: [styles6.issueCard, styles6.issueCardDone],
|
|
15425
15430
|
onPress: () => nav.push({ name: "ISSUE_LIST", category: "done" }),
|
|
15426
15431
|
activeOpacity: 0.7
|
|
15427
15432
|
},
|
|
15428
|
-
/* @__PURE__ */ import_react4.default.createElement(import_react_native4.Text, { style:
|
|
15429
|
-
/* @__PURE__ */ import_react4.default.createElement(import_react_native4.Text, { style:
|
|
15433
|
+
/* @__PURE__ */ import_react4.default.createElement(import_react_native4.Text, { style: styles6.issueCountDone }, issueCounts.done),
|
|
15434
|
+
/* @__PURE__ */ import_react4.default.createElement(import_react_native4.Text, { style: styles6.issueLabel }, "Done")
|
|
15430
15435
|
), /* @__PURE__ */ import_react4.default.createElement(
|
|
15431
15436
|
import_react_native4.TouchableOpacity,
|
|
15432
15437
|
{
|
|
15433
|
-
style: [
|
|
15438
|
+
style: [styles6.issueCard, styles6.issueCardReopened],
|
|
15434
15439
|
onPress: () => nav.push({ name: "ISSUE_LIST", category: "reopened" }),
|
|
15435
15440
|
activeOpacity: 0.7
|
|
15436
15441
|
},
|
|
15437
|
-
/* @__PURE__ */ import_react4.default.createElement(import_react_native4.Text, { style:
|
|
15438
|
-
/* @__PURE__ */ import_react4.default.createElement(import_react_native4.Text, { style:
|
|
15442
|
+
/* @__PURE__ */ import_react4.default.createElement(import_react_native4.Text, { style: styles6.issueCountReopened }, issueCounts.reopened),
|
|
15443
|
+
/* @__PURE__ */ import_react4.default.createElement(import_react_native4.Text, { style: styles6.issueLabel }, "Reopened")
|
|
15439
15444
|
)), dashboardUrl && /* @__PURE__ */ import_react4.default.createElement(
|
|
15440
15445
|
import_react_native4.TouchableOpacity,
|
|
15441
15446
|
{
|
|
15442
|
-
style:
|
|
15447
|
+
style: styles6.webAppLink,
|
|
15443
15448
|
onPress: () => import_react_native4.Linking.openURL(dashboardUrl),
|
|
15444
15449
|
activeOpacity: 0.7
|
|
15445
15450
|
},
|
|
15446
|
-
/* @__PURE__ */ import_react4.default.createElement(import_react_native4.Text, { style:
|
|
15447
|
-
/* @__PURE__ */ import_react4.default.createElement(import_react_native4.View, { style:
|
|
15448
|
-
/* @__PURE__ */ import_react4.default.createElement(import_react_native4.Text, { style:
|
|
15451
|
+
/* @__PURE__ */ import_react4.default.createElement(import_react_native4.Text, { style: styles6.webAppIcon }, "\u{1F310}"),
|
|
15452
|
+
/* @__PURE__ */ import_react4.default.createElement(import_react_native4.View, { style: styles6.webAppTextWrap }, /* @__PURE__ */ import_react4.default.createElement(import_react_native4.Text, { style: styles6.webAppTitle }, "Open Web Dashboard"), /* @__PURE__ */ import_react4.default.createElement(import_react_native4.Text, { style: styles6.webAppSub }, "View your submissions & updates")),
|
|
15453
|
+
/* @__PURE__ */ import_react4.default.createElement(import_react_native4.Text, { style: styles6.webAppArrow }, "\u2192")
|
|
15449
15454
|
), /* @__PURE__ */ import_react4.default.createElement(
|
|
15450
15455
|
import_react_native4.TouchableOpacity,
|
|
15451
15456
|
{
|
|
15452
|
-
style:
|
|
15457
|
+
style: styles6.refreshButton,
|
|
15453
15458
|
onPress: () => {
|
|
15454
15459
|
refreshThreads();
|
|
15455
15460
|
refreshIssueCounts();
|
|
15456
15461
|
}
|
|
15457
15462
|
},
|
|
15458
|
-
/* @__PURE__ */ import_react4.default.createElement(import_react_native4.Text, { style:
|
|
15463
|
+
/* @__PURE__ */ import_react4.default.createElement(import_react_native4.Text, { style: styles6.refreshText }, "\u21BB Refresh")
|
|
15459
15464
|
));
|
|
15460
15465
|
}
|
|
15461
15466
|
const formatTimer = (s2) => {
|
|
@@ -15472,130 +15477,130 @@ function HomeScreen({ nav }) {
|
|
|
15472
15477
|
return /* @__PURE__ */ import_react4.default.createElement(import_react_native4.View, null, pendingCount > 0 ? /* @__PURE__ */ import_react4.default.createElement(
|
|
15473
15478
|
import_react_native4.TouchableOpacity,
|
|
15474
15479
|
{
|
|
15475
|
-
style: [
|
|
15480
|
+
style: [styles6.heroBanner, styles6.heroBannerTests],
|
|
15476
15481
|
onPress: () => nav.push({ name: "TEST_DETAIL" }),
|
|
15477
15482
|
activeOpacity: 0.8
|
|
15478
15483
|
},
|
|
15479
|
-
/* @__PURE__ */ import_react4.default.createElement(import_react_native4.Text, { style:
|
|
15480
|
-
/* @__PURE__ */ import_react4.default.createElement(import_react_native4.Text, { style:
|
|
15481
|
-
retestCount > 0 && /* @__PURE__ */ import_react4.default.createElement(import_react_native4.View, { style:
|
|
15482
|
-
/* @__PURE__ */ import_react4.default.createElement(import_react_native4.Text, { style:
|
|
15484
|
+
/* @__PURE__ */ import_react4.default.createElement(import_react_native4.Text, { style: styles6.heroCount }, pendingCount),
|
|
15485
|
+
/* @__PURE__ */ import_react4.default.createElement(import_react_native4.Text, { style: styles6.heroLabel }, "test", pendingCount !== 1 ? "s" : "", " waiting"),
|
|
15486
|
+
retestCount > 0 && /* @__PURE__ */ import_react4.default.createElement(import_react_native4.View, { style: styles6.retestPill }, /* @__PURE__ */ import_react4.default.createElement(import_react_native4.Text, { style: styles6.retestPillText }, "\u{1F504} ", retestCount, " retest", retestCount !== 1 ? "s" : "")),
|
|
15487
|
+
/* @__PURE__ */ import_react4.default.createElement(import_react_native4.Text, { style: styles6.heroAction }, "Start Testing \u2192")
|
|
15483
15488
|
) : unreadCount > 0 ? /* @__PURE__ */ import_react4.default.createElement(
|
|
15484
15489
|
import_react_native4.TouchableOpacity,
|
|
15485
15490
|
{
|
|
15486
|
-
style: [
|
|
15491
|
+
style: [styles6.heroBanner, styles6.heroBannerMessages],
|
|
15487
15492
|
onPress: () => nav.push({ name: "MESSAGE_LIST" }),
|
|
15488
15493
|
activeOpacity: 0.8
|
|
15489
15494
|
},
|
|
15490
|
-
/* @__PURE__ */ import_react4.default.createElement(import_react_native4.Text, { style:
|
|
15491
|
-
/* @__PURE__ */ import_react4.default.createElement(import_react_native4.Text, { style:
|
|
15492
|
-
/* @__PURE__ */ import_react4.default.createElement(import_react_native4.Text, { style:
|
|
15493
|
-
) : /* @__PURE__ */ import_react4.default.createElement(import_react_native4.View, { style: [
|
|
15495
|
+
/* @__PURE__ */ import_react4.default.createElement(import_react_native4.Text, { style: styles6.heroCount }, unreadCount),
|
|
15496
|
+
/* @__PURE__ */ import_react4.default.createElement(import_react_native4.Text, { style: styles6.heroLabel }, "unread message", unreadCount !== 1 ? "s" : ""),
|
|
15497
|
+
/* @__PURE__ */ import_react4.default.createElement(import_react_native4.Text, { style: styles6.heroAction }, "View Messages \u2192")
|
|
15498
|
+
) : /* @__PURE__ */ import_react4.default.createElement(import_react_native4.View, { style: [styles6.heroBanner, styles6.heroBannerClear] }, /* @__PURE__ */ import_react4.default.createElement(import_react_native4.Text, { style: styles6.heroClearEmoji }, "\u2705"), /* @__PURE__ */ import_react4.default.createElement(import_react_native4.Text, { style: styles6.heroClearTitle }, "All caught up!"), totalTests > 0 && /* @__PURE__ */ import_react4.default.createElement(import_react_native4.Text, { style: styles6.heroClearSub }, completedCount, "/", totalTests, " tests completed")), activeSession && activeSession.status === "active" ? /* @__PURE__ */ import_react4.default.createElement(
|
|
15494
15499
|
import_react_native4.TouchableOpacity,
|
|
15495
15500
|
{
|
|
15496
|
-
style:
|
|
15501
|
+
style: styles6.sessionCardActive,
|
|
15497
15502
|
onPress: () => nav.push({ name: "SESSION_ACTIVE" }),
|
|
15498
15503
|
activeOpacity: 0.8
|
|
15499
15504
|
},
|
|
15500
|
-
/* @__PURE__ */ import_react4.default.createElement(import_react_native4.View, { style:
|
|
15501
|
-
/* @__PURE__ */ import_react4.default.createElement(import_react_native4.View, { style:
|
|
15502
|
-
/* @__PURE__ */ import_react4.default.createElement(import_react_native4.Text, { style:
|
|
15505
|
+
/* @__PURE__ */ import_react4.default.createElement(import_react_native4.View, { style: styles6.sessionDot }),
|
|
15506
|
+
/* @__PURE__ */ import_react4.default.createElement(import_react_native4.View, { style: styles6.sessionCardContent }, /* @__PURE__ */ import_react4.default.createElement(import_react_native4.Text, { style: styles6.sessionCardTitle, numberOfLines: 1 }, activeSession.focusArea || "QA Session"), /* @__PURE__ */ import_react4.default.createElement(import_react_native4.Text, { style: styles6.sessionCardMeta }, formatTimer(sessionElapsed), " \xB7 ", sessionFindings.length, " finding", sessionFindings.length !== 1 ? "s" : "")),
|
|
15507
|
+
/* @__PURE__ */ import_react4.default.createElement(import_react_native4.Text, { style: styles6.sessionCardAction }, "Resume \u2192")
|
|
15503
15508
|
) : /* @__PURE__ */ import_react4.default.createElement(
|
|
15504
15509
|
import_react_native4.TouchableOpacity,
|
|
15505
15510
|
{
|
|
15506
|
-
style:
|
|
15511
|
+
style: styles6.sessionCardInactive,
|
|
15507
15512
|
onPress: () => nav.push({ name: "SESSION_START" }),
|
|
15508
15513
|
activeOpacity: 0.7
|
|
15509
15514
|
},
|
|
15510
|
-
/* @__PURE__ */ import_react4.default.createElement(import_react_native4.Text, { style:
|
|
15511
|
-
/* @__PURE__ */ import_react4.default.createElement(import_react_native4.Text, { style:
|
|
15512
|
-
/* @__PURE__ */ import_react4.default.createElement(import_react_native4.Text, { style:
|
|
15513
|
-
), /* @__PURE__ */ import_react4.default.createElement(import_react_native4.View, { style:
|
|
15515
|
+
/* @__PURE__ */ import_react4.default.createElement(import_react_native4.Text, { style: styles6.sessionCardIcon }, "\u{1F50D}"),
|
|
15516
|
+
/* @__PURE__ */ import_react4.default.createElement(import_react_native4.Text, { style: styles6.sessionCardLabel }, "Start QA Session"),
|
|
15517
|
+
/* @__PURE__ */ import_react4.default.createElement(import_react_native4.Text, { style: styles6.sessionCardArrow }, "\u2192")
|
|
15518
|
+
), /* @__PURE__ */ import_react4.default.createElement(import_react_native4.View, { style: styles6.actionGrid }, /* @__PURE__ */ import_react4.default.createElement(
|
|
15514
15519
|
import_react_native4.TouchableOpacity,
|
|
15515
15520
|
{
|
|
15516
|
-
style:
|
|
15521
|
+
style: styles6.actionCard,
|
|
15517
15522
|
onPress: () => nav.push({ name: "TEST_LIST" }),
|
|
15518
15523
|
activeOpacity: 0.7
|
|
15519
15524
|
},
|
|
15520
|
-
/* @__PURE__ */ import_react4.default.createElement(import_react_native4.Text, { style:
|
|
15521
|
-
/* @__PURE__ */ import_react4.default.createElement(import_react_native4.Text, { style:
|
|
15522
|
-
pendingCount > 0 && /* @__PURE__ */ import_react4.default.createElement(import_react_native4.View, { style:
|
|
15525
|
+
/* @__PURE__ */ import_react4.default.createElement(import_react_native4.Text, { style: styles6.actionIcon }, "\u2705"),
|
|
15526
|
+
/* @__PURE__ */ import_react4.default.createElement(import_react_native4.Text, { style: styles6.actionLabel }, "Tests"),
|
|
15527
|
+
pendingCount > 0 && /* @__PURE__ */ import_react4.default.createElement(import_react_native4.View, { style: styles6.actionBadge }, /* @__PURE__ */ import_react4.default.createElement(import_react_native4.Text, { style: styles6.actionBadgeText }, pendingCount))
|
|
15523
15528
|
), /* @__PURE__ */ import_react4.default.createElement(
|
|
15524
15529
|
import_react_native4.TouchableOpacity,
|
|
15525
15530
|
{
|
|
15526
|
-
style:
|
|
15531
|
+
style: styles6.actionCard,
|
|
15527
15532
|
onPress: () => nav.push({ name: "REPORT", prefill: { type: "bug" } }),
|
|
15528
15533
|
activeOpacity: 0.7
|
|
15529
15534
|
},
|
|
15530
|
-
/* @__PURE__ */ import_react4.default.createElement(import_react_native4.Text, { style:
|
|
15531
|
-
/* @__PURE__ */ import_react4.default.createElement(import_react_native4.Text, { style:
|
|
15535
|
+
/* @__PURE__ */ import_react4.default.createElement(import_react_native4.Text, { style: styles6.actionIcon }, "\u{1F41B}"),
|
|
15536
|
+
/* @__PURE__ */ import_react4.default.createElement(import_react_native4.Text, { style: styles6.actionLabel }, "Report Bug")
|
|
15532
15537
|
), /* @__PURE__ */ import_react4.default.createElement(
|
|
15533
15538
|
import_react_native4.TouchableOpacity,
|
|
15534
15539
|
{
|
|
15535
|
-
style:
|
|
15540
|
+
style: styles6.actionCard,
|
|
15536
15541
|
onPress: () => nav.push({ name: "REPORT", prefill: { type: "feedback" } }),
|
|
15537
15542
|
activeOpacity: 0.7
|
|
15538
15543
|
},
|
|
15539
|
-
/* @__PURE__ */ import_react4.default.createElement(import_react_native4.Text, { style:
|
|
15540
|
-
/* @__PURE__ */ import_react4.default.createElement(import_react_native4.Text, { style:
|
|
15544
|
+
/* @__PURE__ */ import_react4.default.createElement(import_react_native4.Text, { style: styles6.actionIcon }, "\u{1F4A1}"),
|
|
15545
|
+
/* @__PURE__ */ import_react4.default.createElement(import_react_native4.Text, { style: styles6.actionLabel }, "Feedback")
|
|
15541
15546
|
), /* @__PURE__ */ import_react4.default.createElement(
|
|
15542
15547
|
import_react_native4.TouchableOpacity,
|
|
15543
15548
|
{
|
|
15544
|
-
style:
|
|
15549
|
+
style: styles6.actionCard,
|
|
15545
15550
|
onPress: () => nav.push({ name: "MESSAGE_LIST" }),
|
|
15546
15551
|
activeOpacity: 0.7
|
|
15547
15552
|
},
|
|
15548
|
-
/* @__PURE__ */ import_react4.default.createElement(import_react_native4.Text, { style:
|
|
15549
|
-
/* @__PURE__ */ import_react4.default.createElement(import_react_native4.Text, { style:
|
|
15550
|
-
unreadCount > 0 && /* @__PURE__ */ import_react4.default.createElement(import_react_native4.View, { style: [
|
|
15551
|
-
)), /* @__PURE__ */ import_react4.default.createElement(import_react_native4.View, { style:
|
|
15553
|
+
/* @__PURE__ */ import_react4.default.createElement(import_react_native4.Text, { style: styles6.actionIcon }, "\u{1F4AC}"),
|
|
15554
|
+
/* @__PURE__ */ import_react4.default.createElement(import_react_native4.Text, { style: styles6.actionLabel }, "Messages"),
|
|
15555
|
+
unreadCount > 0 && /* @__PURE__ */ import_react4.default.createElement(import_react_native4.View, { style: [styles6.actionBadge, styles6.actionBadgeMsg] }, /* @__PURE__ */ import_react4.default.createElement(import_react_native4.Text, { style: styles6.actionBadgeText }, unreadCount))
|
|
15556
|
+
)), /* @__PURE__ */ import_react4.default.createElement(import_react_native4.View, { style: styles6.issueGrid }, /* @__PURE__ */ import_react4.default.createElement(
|
|
15552
15557
|
import_react_native4.TouchableOpacity,
|
|
15553
15558
|
{
|
|
15554
|
-
style: [
|
|
15559
|
+
style: [styles6.issueCard, styles6.issueCardOpen],
|
|
15555
15560
|
onPress: () => nav.push({ name: "ISSUE_LIST", category: "open" }),
|
|
15556
15561
|
activeOpacity: 0.7
|
|
15557
15562
|
},
|
|
15558
|
-
/* @__PURE__ */ import_react4.default.createElement(import_react_native4.Text, { style:
|
|
15559
|
-
/* @__PURE__ */ import_react4.default.createElement(import_react_native4.Text, { style:
|
|
15563
|
+
/* @__PURE__ */ import_react4.default.createElement(import_react_native4.Text, { style: styles6.issueCountOpen }, issueCounts.open),
|
|
15564
|
+
/* @__PURE__ */ import_react4.default.createElement(import_react_native4.Text, { style: styles6.issueLabel }, "Open")
|
|
15560
15565
|
), /* @__PURE__ */ import_react4.default.createElement(
|
|
15561
15566
|
import_react_native4.TouchableOpacity,
|
|
15562
15567
|
{
|
|
15563
|
-
style: [
|
|
15568
|
+
style: [styles6.issueCard, styles6.issueCardDone],
|
|
15564
15569
|
onPress: () => nav.push({ name: "ISSUE_LIST", category: "done" }),
|
|
15565
15570
|
activeOpacity: 0.7
|
|
15566
15571
|
},
|
|
15567
|
-
/* @__PURE__ */ import_react4.default.createElement(import_react_native4.Text, { style:
|
|
15568
|
-
/* @__PURE__ */ import_react4.default.createElement(import_react_native4.Text, { style:
|
|
15572
|
+
/* @__PURE__ */ import_react4.default.createElement(import_react_native4.Text, { style: styles6.issueCountDone }, issueCounts.done),
|
|
15573
|
+
/* @__PURE__ */ import_react4.default.createElement(import_react_native4.Text, { style: styles6.issueLabel }, "Done")
|
|
15569
15574
|
), /* @__PURE__ */ import_react4.default.createElement(
|
|
15570
15575
|
import_react_native4.TouchableOpacity,
|
|
15571
15576
|
{
|
|
15572
|
-
style: [
|
|
15577
|
+
style: [styles6.issueCard, styles6.issueCardReopened],
|
|
15573
15578
|
onPress: () => nav.push({ name: "ISSUE_LIST", category: "reopened" }),
|
|
15574
15579
|
activeOpacity: 0.7
|
|
15575
15580
|
},
|
|
15576
|
-
/* @__PURE__ */ import_react4.default.createElement(import_react_native4.Text, { style:
|
|
15577
|
-
/* @__PURE__ */ import_react4.default.createElement(import_react_native4.Text, { style:
|
|
15578
|
-
)), totalTests > 0 && /* @__PURE__ */ import_react4.default.createElement(import_react_native4.View, { style:
|
|
15581
|
+
/* @__PURE__ */ import_react4.default.createElement(import_react_native4.Text, { style: styles6.issueCountReopened }, issueCounts.reopened),
|
|
15582
|
+
/* @__PURE__ */ import_react4.default.createElement(import_react_native4.Text, { style: styles6.issueLabel }, "Reopened")
|
|
15583
|
+
)), totalTests > 0 && /* @__PURE__ */ import_react4.default.createElement(import_react_native4.View, { style: styles6.progressSection }, /* @__PURE__ */ import_react4.default.createElement(import_react_native4.View, { style: styles6.progressBar }, /* @__PURE__ */ import_react4.default.createElement(import_react_native4.View, { style: [styles6.progressFill, { width: `${Math.round(completedCount / totalTests * 100)}%` }] })), /* @__PURE__ */ import_react4.default.createElement(import_react_native4.Text, { style: styles6.progressText }, completedCount, "/", totalTests, " tests completed")), dashboardUrl && /* @__PURE__ */ import_react4.default.createElement(
|
|
15579
15584
|
import_react_native4.TouchableOpacity,
|
|
15580
15585
|
{
|
|
15581
|
-
style:
|
|
15586
|
+
style: styles6.webAppLink,
|
|
15582
15587
|
onPress: () => import_react_native4.Linking.openURL(dashboardUrl),
|
|
15583
15588
|
activeOpacity: 0.7
|
|
15584
15589
|
},
|
|
15585
|
-
/* @__PURE__ */ import_react4.default.createElement(import_react_native4.Text, { style:
|
|
15586
|
-
/* @__PURE__ */ import_react4.default.createElement(import_react_native4.View, { style:
|
|
15587
|
-
/* @__PURE__ */ import_react4.default.createElement(import_react_native4.Text, { style:
|
|
15590
|
+
/* @__PURE__ */ import_react4.default.createElement(import_react_native4.Text, { style: styles6.webAppIcon }, "\u{1F310}"),
|
|
15591
|
+
/* @__PURE__ */ import_react4.default.createElement(import_react_native4.View, { style: styles6.webAppTextWrap }, /* @__PURE__ */ import_react4.default.createElement(import_react_native4.Text, { style: styles6.webAppTitle }, "Open Web Dashboard"), /* @__PURE__ */ import_react4.default.createElement(import_react_native4.Text, { style: styles6.webAppSub }, "View analytics, history & more")),
|
|
15592
|
+
/* @__PURE__ */ import_react4.default.createElement(import_react_native4.Text, { style: styles6.webAppArrow }, "\u2192")
|
|
15588
15593
|
), /* @__PURE__ */ import_react4.default.createElement(
|
|
15589
15594
|
import_react_native4.TouchableOpacity,
|
|
15590
15595
|
{
|
|
15591
|
-
style:
|
|
15596
|
+
style: styles6.refreshButton,
|
|
15592
15597
|
onPress: () => {
|
|
15593
15598
|
refreshAssignments();
|
|
15594
15599
|
refreshThreads();
|
|
15595
15600
|
refreshIssueCounts();
|
|
15596
15601
|
}
|
|
15597
15602
|
},
|
|
15598
|
-
/* @__PURE__ */ import_react4.default.createElement(import_react_native4.Text, { style:
|
|
15603
|
+
/* @__PURE__ */ import_react4.default.createElement(import_react_native4.Text, { style: styles6.refreshText }, "\u21BB Refresh")
|
|
15599
15604
|
));
|
|
15600
15605
|
}
|
|
15601
15606
|
function createStyles() {
|
|
@@ -15893,7 +15898,7 @@ var import_react5 = __toESM(require("react"));
|
|
|
15893
15898
|
var import_react_native5 = require("react-native");
|
|
15894
15899
|
function TestDetailScreen({ testId, nav }) {
|
|
15895
15900
|
const { client, assignments, currentAssignment, refreshAssignments, getDeviceInfo, onNavigate, widgetColorScheme } = useBugBear();
|
|
15896
|
-
const
|
|
15901
|
+
const styles6 = (0, import_react5.useMemo)(() => createStyles2(), [widgetColorScheme]);
|
|
15897
15902
|
const displayedAssignment = testId ? assignments.find((a) => a.id === testId) || currentAssignment : currentAssignment;
|
|
15898
15903
|
const [showSteps, setShowSteps] = (0, import_react5.useState)(true);
|
|
15899
15904
|
const [showDetails, setShowDetails] = (0, import_react5.useState)(false);
|
|
@@ -15904,6 +15909,20 @@ function TestDetailScreen({ testId, nav }) {
|
|
|
15904
15909
|
const [skipNotes, setSkipNotes] = (0, import_react5.useState)("");
|
|
15905
15910
|
const [skipping, setSkipping] = (0, import_react5.useState)(false);
|
|
15906
15911
|
const [isSubmitting, setIsSubmitting] = (0, import_react5.useState)(false);
|
|
15912
|
+
const [feedbackToastAssignmentId, setFeedbackToastAssignmentId] = (0, import_react5.useState)(null);
|
|
15913
|
+
const toastTimerRef = (0, import_react5.useRef)(null);
|
|
15914
|
+
const toastSlideAnim = (0, import_react5.useRef)(new import_react_native5.Animated.Value(80)).current;
|
|
15915
|
+
(0, import_react5.useEffect)(() => {
|
|
15916
|
+
return () => {
|
|
15917
|
+
if (toastTimerRef.current) clearTimeout(toastTimerRef.current);
|
|
15918
|
+
};
|
|
15919
|
+
}, []);
|
|
15920
|
+
(0, import_react5.useEffect)(() => {
|
|
15921
|
+
if (feedbackToastAssignmentId) {
|
|
15922
|
+
toastSlideAnim.setValue(80);
|
|
15923
|
+
import_react_native5.Animated.spring(toastSlideAnim, { toValue: 0, useNativeDriver: true, tension: 80, friction: 10 }).start();
|
|
15924
|
+
}
|
|
15925
|
+
}, [feedbackToastAssignmentId]);
|
|
15907
15926
|
(0, import_react5.useEffect)(() => {
|
|
15908
15927
|
setCriteriaResults({});
|
|
15909
15928
|
setShowSteps(true);
|
|
@@ -15941,13 +15960,34 @@ function TestDetailScreen({ testId, nav }) {
|
|
|
15941
15960
|
import_react_native5.Keyboard.dismiss();
|
|
15942
15961
|
setIsSubmitting(true);
|
|
15943
15962
|
try {
|
|
15944
|
-
|
|
15963
|
+
const passedId = displayedAssignment.id;
|
|
15964
|
+
const testCaseId = displayedAssignment.testCase.id;
|
|
15965
|
+
await client.passAssignment(passedId);
|
|
15966
|
+
client.submitTestFeedback({
|
|
15967
|
+
testCaseId,
|
|
15968
|
+
assignmentId: passedId,
|
|
15969
|
+
feedback: { rating: 5 }
|
|
15970
|
+
}).catch(() => {
|
|
15971
|
+
});
|
|
15945
15972
|
await refreshAssignments();
|
|
15946
|
-
|
|
15973
|
+
setFeedbackToastAssignmentId(passedId);
|
|
15974
|
+
if (toastTimerRef.current) clearTimeout(toastTimerRef.current);
|
|
15975
|
+
toastTimerRef.current = setTimeout(() => setFeedbackToastAssignmentId(null), 4e3);
|
|
15976
|
+
const currentIdx = assignments.indexOf(displayedAssignment);
|
|
15977
|
+
const remaining = assignments.filter(
|
|
15978
|
+
(a) => (a.status === "pending" || a.status === "in_progress") && a.id !== passedId
|
|
15979
|
+
);
|
|
15980
|
+
if (remaining.length > 0) {
|
|
15981
|
+
const nextAfterCurrent = remaining.find((a) => assignments.indexOf(a) > currentIdx);
|
|
15982
|
+
const nextTest = nextAfterCurrent || remaining[0];
|
|
15983
|
+
nav.replace({ name: "TEST_DETAIL", testId: nextTest.id });
|
|
15984
|
+
} else {
|
|
15985
|
+
nav.reset();
|
|
15986
|
+
}
|
|
15947
15987
|
} finally {
|
|
15948
15988
|
setIsSubmitting(false);
|
|
15949
15989
|
}
|
|
15950
|
-
}, [client, displayedAssignment, refreshAssignments, nav, isSubmitting]);
|
|
15990
|
+
}, [client, displayedAssignment, refreshAssignments, nav, isSubmitting, assignments]);
|
|
15951
15991
|
const handleFail = (0, import_react5.useCallback)(async () => {
|
|
15952
15992
|
if (!client || !displayedAssignment || isSubmitting) return;
|
|
15953
15993
|
import_react_native5.Keyboard.dismiss();
|
|
@@ -16036,7 +16076,7 @@ function TestDetailScreen({ testId, nav }) {
|
|
|
16036
16076
|
const steps = testCase.steps;
|
|
16037
16077
|
const info = templateInfo[template] || templateInfo.steps;
|
|
16038
16078
|
const rubricMode = testCase.track?.rubricMode || "pass_fail";
|
|
16039
|
-
return /* @__PURE__ */ import_react5.default.createElement(import_react_native5.View, { style:
|
|
16079
|
+
return /* @__PURE__ */ import_react5.default.createElement(import_react_native5.View, { style: styles6.container }, /* @__PURE__ */ import_react5.default.createElement(import_react_native5.View, { style: styles6.topRow }, /* @__PURE__ */ import_react5.default.createElement(import_react_native5.View, { style: styles6.positionInfo }, /* @__PURE__ */ import_react5.default.createElement(import_react_native5.Text, { style: styles6.positionText }, "Test ", currentIndex + 1, " of ", allTests.length), displayedAssignment.status === "in_progress" && assignmentElapsedTime > 0 && /* @__PURE__ */ import_react5.default.createElement(import_react_native5.View, { style: styles6.timerBadge }, /* @__PURE__ */ import_react5.default.createElement(import_react_native5.Text, { style: styles6.timerText }, formatElapsedTime(assignmentElapsedTime)))), /* @__PURE__ */ import_react5.default.createElement(import_react_native5.TouchableOpacity, { onPress: () => nav.push({ name: "TEST_LIST" }) }, /* @__PURE__ */ import_react5.default.createElement(import_react_native5.Text, { style: styles6.viewAllLink }, "View All \u2192"))), displayedAssignment.isVerification && /* @__PURE__ */ import_react5.default.createElement(import_react_native5.View, { style: styles6.retestBanner }, /* @__PURE__ */ import_react5.default.createElement(import_react_native5.Text, { style: styles6.retestIcon }, "\u{1F504}"), /* @__PURE__ */ import_react5.default.createElement(import_react_native5.Text, { style: styles6.retestLabel }, "Retest"), /* @__PURE__ */ import_react5.default.createElement(import_react_native5.Text, { style: styles6.retestSub }, "\u2014 Verify bug fix")), /* @__PURE__ */ import_react5.default.createElement(import_react_native5.Text, { style: styles6.testTitle }, testCase.title), testCase.key && /* @__PURE__ */ import_react5.default.createElement(import_react_native5.Text, { style: styles6.testKey }, testCase.key), /* @__PURE__ */ import_react5.default.createElement(import_react_native5.TouchableOpacity, { onPress: () => setShowSteps(!showSteps), style: styles6.sectionHeader }, /* @__PURE__ */ import_react5.default.createElement(import_react_native5.Text, { style: styles6.sectionHeaderText }, showSteps ? "\u25BC" : "\u25B6", " ", info.icon, " ", template === "freeform" ? "Instructions" : `${steps.length} ${template === "checklist" ? "items" : template === "rubric" ? "criteria" : "steps"}`)), showSteps && /* @__PURE__ */ import_react5.default.createElement(import_react_native5.View, { style: styles6.templateContent }, template === "steps" && steps.map((step, idx) => /* @__PURE__ */ import_react5.default.createElement(import_react_native5.View, { key: idx, style: styles6.step }, /* @__PURE__ */ import_react5.default.createElement(import_react_native5.View, { style: styles6.stepNumber }, /* @__PURE__ */ import_react5.default.createElement(import_react_native5.Text, { style: styles6.stepNumberText }, step.stepNumber)), /* @__PURE__ */ import_react5.default.createElement(import_react_native5.View, { style: styles6.stepBody }, /* @__PURE__ */ import_react5.default.createElement(import_react_native5.Text, { style: styles6.stepAction }, step.action), step.expectedResult && /* @__PURE__ */ import_react5.default.createElement(import_react_native5.Text, { style: styles6.stepExpected }, "\u2192 ", step.expectedResult)))), template === "checklist" && /* @__PURE__ */ import_react5.default.createElement(import_react5.default.Fragment, null, steps.map((step, idx) => /* @__PURE__ */ import_react5.default.createElement(
|
|
16040
16080
|
import_react_native5.TouchableOpacity,
|
|
16041
16081
|
{
|
|
16042
16082
|
key: idx,
|
|
@@ -16046,76 +16086,95 @@ function TestDetailScreen({ testId, nav }) {
|
|
|
16046
16086
|
else next[idx] = true;
|
|
16047
16087
|
return next;
|
|
16048
16088
|
}),
|
|
16049
|
-
style: [
|
|
16089
|
+
style: [styles6.checklistItem, criteriaResults[idx] === true && styles6.checklistItemChecked]
|
|
16050
16090
|
},
|
|
16051
|
-
/* @__PURE__ */ import_react5.default.createElement(import_react_native5.View, { style: [
|
|
16052
|
-
/* @__PURE__ */ import_react5.default.createElement(import_react_native5.Text, { style: [
|
|
16053
|
-
)), Object.keys(criteriaResults).length > 0 && /* @__PURE__ */ import_react5.default.createElement(import_react_native5.TouchableOpacity, { onPress: () => setCriteriaResults({}), style:
|
|
16091
|
+
/* @__PURE__ */ import_react5.default.createElement(import_react_native5.View, { style: [styles6.checkbox, criteriaResults[idx] === true && styles6.checkboxChecked] }, criteriaResults[idx] === true && /* @__PURE__ */ import_react5.default.createElement(import_react_native5.Text, { style: styles6.checkmark }, "\u2713")),
|
|
16092
|
+
/* @__PURE__ */ import_react5.default.createElement(import_react_native5.Text, { style: [styles6.checklistText, criteriaResults[idx] === true && styles6.checklistTextDone] }, step.action)
|
|
16093
|
+
)), Object.keys(criteriaResults).length > 0 && /* @__PURE__ */ import_react5.default.createElement(import_react_native5.TouchableOpacity, { onPress: () => setCriteriaResults({}), style: styles6.resetRow }, /* @__PURE__ */ import_react5.default.createElement(import_react_native5.Text, { style: styles6.resetText }, "\u21BA Reset"))), template === "rubric" && steps.map((step, idx) => /* @__PURE__ */ import_react5.default.createElement(import_react_native5.View, { key: idx, style: styles6.rubricItem }, /* @__PURE__ */ import_react5.default.createElement(import_react_native5.Text, { style: styles6.rubricTitle }, idx + 1, ". ", step.action), step.expectedResult && /* @__PURE__ */ import_react5.default.createElement(import_react_native5.Text, { style: styles6.rubricExpected }, step.expectedResult), rubricMode === "pass_fail" ? /* @__PURE__ */ import_react5.default.createElement(import_react_native5.View, { style: styles6.passFailRow }, /* @__PURE__ */ import_react5.default.createElement(
|
|
16054
16094
|
import_react_native5.TouchableOpacity,
|
|
16055
16095
|
{
|
|
16056
16096
|
onPress: () => setCriteriaResults((prev) => ({ ...prev, [idx]: true })),
|
|
16057
|
-
style: [
|
|
16097
|
+
style: [styles6.pfButton, criteriaResults[idx] === true && styles6.pfButtonPass]
|
|
16058
16098
|
},
|
|
16059
|
-
/* @__PURE__ */ import_react5.default.createElement(import_react_native5.Text, { style: [
|
|
16099
|
+
/* @__PURE__ */ import_react5.default.createElement(import_react_native5.Text, { style: [styles6.pfButtonText, criteriaResults[idx] === true && styles6.pfButtonTextActive] }, "\u2713 Pass")
|
|
16060
16100
|
), /* @__PURE__ */ import_react5.default.createElement(
|
|
16061
16101
|
import_react_native5.TouchableOpacity,
|
|
16062
16102
|
{
|
|
16063
16103
|
onPress: () => setCriteriaResults((prev) => ({ ...prev, [idx]: false })),
|
|
16064
|
-
style: [
|
|
16104
|
+
style: [styles6.pfButton, criteriaResults[idx] === false && styles6.pfButtonFail]
|
|
16065
16105
|
},
|
|
16066
|
-
/* @__PURE__ */ import_react5.default.createElement(import_react_native5.Text, { style: [
|
|
16067
|
-
)) : /* @__PURE__ */ import_react5.default.createElement(import_react_native5.View, { style:
|
|
16106
|
+
/* @__PURE__ */ import_react5.default.createElement(import_react_native5.Text, { style: [styles6.pfButtonText, criteriaResults[idx] === false && styles6.pfButtonTextActive] }, "\u2717 Fail")
|
|
16107
|
+
)) : /* @__PURE__ */ import_react5.default.createElement(import_react_native5.View, { style: styles6.ratingRow }, [1, 2, 3, 4, 5].map((n) => /* @__PURE__ */ import_react5.default.createElement(
|
|
16068
16108
|
import_react_native5.TouchableOpacity,
|
|
16069
16109
|
{
|
|
16070
16110
|
key: n,
|
|
16071
16111
|
onPress: () => setCriteriaResults((prev) => ({ ...prev, [idx]: n })),
|
|
16072
|
-
style: [
|
|
16112
|
+
style: [styles6.ratingBtn, criteriaResults[idx] === n && styles6.ratingBtnActive]
|
|
16073
16113
|
},
|
|
16074
|
-
/* @__PURE__ */ import_react5.default.createElement(import_react_native5.Text, { style: [
|
|
16075
|
-
))))), template === "freeform" && /* @__PURE__ */ import_react5.default.createElement(import_react_native5.View, { style:
|
|
16114
|
+
/* @__PURE__ */ import_react5.default.createElement(import_react_native5.Text, { style: [styles6.ratingBtnText, criteriaResults[idx] === n && styles6.ratingBtnTextActive] }, n)
|
|
16115
|
+
))))), template === "freeform" && /* @__PURE__ */ import_react5.default.createElement(import_react_native5.View, { style: styles6.freeformBox }, /* @__PURE__ */ import_react5.default.createElement(import_react_native5.Text, { style: styles6.freeformText }, "Review the area and note:"), /* @__PURE__ */ import_react5.default.createElement(import_react_native5.Text, { style: styles6.freeformBullet }, "\u2022 What works well"), /* @__PURE__ */ import_react5.default.createElement(import_react_native5.Text, { style: styles6.freeformBullet }, "\u2022 Issues or concerns"), /* @__PURE__ */ import_react5.default.createElement(import_react_native5.Text, { style: styles6.freeformBullet }, "\u2022 Suggestions"))), testCase.expectedResult && /* @__PURE__ */ import_react5.default.createElement(import_react_native5.View, { style: styles6.expectedBox }, /* @__PURE__ */ import_react5.default.createElement(import_react_native5.Text, { style: styles6.expectedLabel }, "\u2705 Expected Result"), /* @__PURE__ */ import_react5.default.createElement(import_react_native5.Text, { style: styles6.expectedText }, testCase.expectedResult)), testCase.targetRoute && onNavigate && /* @__PURE__ */ import_react5.default.createElement(
|
|
16076
16116
|
import_react_native5.TouchableOpacity,
|
|
16077
16117
|
{
|
|
16078
|
-
style:
|
|
16118
|
+
style: styles6.navigateButton,
|
|
16079
16119
|
onPress: () => {
|
|
16080
16120
|
import_react_native5.Keyboard.dismiss();
|
|
16081
16121
|
onNavigate(testCase.targetRoute);
|
|
16082
16122
|
nav.closeWidget?.();
|
|
16083
16123
|
}
|
|
16084
16124
|
},
|
|
16085
|
-
/* @__PURE__ */ import_react5.default.createElement(import_react_native5.Text, { style:
|
|
16086
|
-
), /* @__PURE__ */ import_react5.default.createElement(import_react_native5.TouchableOpacity, { onPress: () => setShowDetails(!showDetails), style:
|
|
16087
|
-
|
|
16088
|
-
|
|
16089
|
-
|
|
16090
|
-
|
|
16091
|
-
|
|
16125
|
+
/* @__PURE__ */ import_react5.default.createElement(import_react_native5.Text, { style: styles6.navigateText }, "\u{1F9ED} Go to test location")
|
|
16126
|
+
), /* @__PURE__ */ import_react5.default.createElement(import_react_native5.TouchableOpacity, { onPress: () => setShowDetails(!showDetails), style: styles6.detailsToggle }, /* @__PURE__ */ import_react5.default.createElement(import_react_native5.Text, { style: styles6.detailsToggleText }, showDetails ? "\u25BC" : "\u25B6", " Details")), showDetails && /* @__PURE__ */ import_react5.default.createElement(import_react_native5.View, { style: styles6.detailsSection }, testCase.key && /* @__PURE__ */ import_react5.default.createElement(import_react_native5.Text, { style: styles6.detailMeta }, testCase.key, " \xB7 ", testCase.priority, " \xB7 ", info.name), testCase.track && /* @__PURE__ */ import_react5.default.createElement(import_react_native5.Text, { style: styles6.detailMeta }, testCase.track.icon, " ", testCase.track.name), testCase.description && /* @__PURE__ */ import_react5.default.createElement(import_react_native5.Text, { style: styles6.detailDesc }, testCase.description), testCase.group && /* @__PURE__ */ import_react5.default.createElement(import_react_native5.View, { style: styles6.folderProgress }, /* @__PURE__ */ import_react5.default.createElement(import_react_native5.Text, { style: styles6.folderName }, "\u{1F4C1} ", testCase.group.name))), displayedAssignment.status === "in_progress" && nav.startMiniRunner && /* @__PURE__ */ import_react5.default.createElement(
|
|
16127
|
+
import_react_native5.TouchableOpacity,
|
|
16128
|
+
{
|
|
16129
|
+
style: styles6.startTestBtn,
|
|
16130
|
+
onPress: () => nav.startMiniRunner(displayedAssignment.id)
|
|
16131
|
+
},
|
|
16132
|
+
/* @__PURE__ */ import_react5.default.createElement(import_react_native5.Text, { style: styles6.startTestText }, "\u25B6 Start Test")
|
|
16133
|
+
), displayedAssignment.status === "passed" || displayedAssignment.status === "failed" || displayedAssignment.status === "skipped" || displayedAssignment.status === "blocked" ? /* @__PURE__ */ import_react5.default.createElement(import_react5.default.Fragment, null, /* @__PURE__ */ import_react5.default.createElement(import_react_native5.View, { style: [
|
|
16134
|
+
styles6.completedBanner,
|
|
16135
|
+
displayedAssignment.status === "passed" && styles6.completedBannerPass,
|
|
16136
|
+
displayedAssignment.status === "failed" && styles6.completedBannerFail
|
|
16137
|
+
] }, /* @__PURE__ */ import_react5.default.createElement(import_react_native5.Text, { style: styles6.completedIcon }, displayedAssignment.status === "passed" ? "\u2705" : displayedAssignment.status === "failed" ? "\u274C" : displayedAssignment.status === "skipped" ? "\u23ED" : "\u{1F6AB}"), /* @__PURE__ */ import_react5.default.createElement(import_react_native5.Text, { style: [
|
|
16138
|
+
styles6.completedLabel,
|
|
16092
16139
|
displayedAssignment.status === "passed" && { color: colors.green },
|
|
16093
16140
|
displayedAssignment.status === "failed" && { color: colors.redLight }
|
|
16094
|
-
] }, "Marked as ", displayedAssignment.status.charAt(0).toUpperCase() + displayedAssignment.status.slice(1))), !(displayedAssignment.isVerification && (displayedAssignment.status === "passed" || displayedAssignment.status === "failed")) && /* @__PURE__ */ import_react5.default.createElement(import_react_native5.View, { style: [
|
|
16141
|
+
] }, "Marked as ", displayedAssignment.status.charAt(0).toUpperCase() + displayedAssignment.status.slice(1))), !(displayedAssignment.isVerification && (displayedAssignment.status === "passed" || displayedAssignment.status === "failed")) && /* @__PURE__ */ import_react5.default.createElement(import_react_native5.View, { style: [styles6.actionButtons, { marginTop: 4 }] }, /* @__PURE__ */ import_react5.default.createElement(
|
|
16095
16142
|
import_react_native5.TouchableOpacity,
|
|
16096
16143
|
{
|
|
16097
|
-
style: [
|
|
16144
|
+
style: [styles6.actionBtn, styles6.reopenBtn, isSubmitting && { opacity: 0.5 }],
|
|
16098
16145
|
onPress: handleReopen,
|
|
16099
16146
|
disabled: isSubmitting
|
|
16100
16147
|
},
|
|
16101
|
-
/* @__PURE__ */ import_react5.default.createElement(import_react_native5.Text, { style:
|
|
16148
|
+
/* @__PURE__ */ import_react5.default.createElement(import_react_native5.Text, { style: styles6.reopenBtnText }, isSubmitting ? "Reopening..." : "\u{1F504} Reopen Test")
|
|
16102
16149
|
), displayedAssignment.status === "passed" && /* @__PURE__ */ import_react5.default.createElement(
|
|
16103
16150
|
import_react_native5.TouchableOpacity,
|
|
16104
16151
|
{
|
|
16105
|
-
style: [
|
|
16152
|
+
style: [styles6.actionBtn, styles6.failBtn, isSubmitting && { opacity: 0.5 }],
|
|
16106
16153
|
onPress: () => handleChangeResult("failed"),
|
|
16107
16154
|
disabled: isSubmitting
|
|
16108
16155
|
},
|
|
16109
|
-
/* @__PURE__ */ import_react5.default.createElement(import_react_native5.Text, { style:
|
|
16156
|
+
/* @__PURE__ */ import_react5.default.createElement(import_react_native5.Text, { style: styles6.failBtnText }, "Change to Fail")
|
|
16110
16157
|
), displayedAssignment.status === "failed" && /* @__PURE__ */ import_react5.default.createElement(
|
|
16111
16158
|
import_react_native5.TouchableOpacity,
|
|
16112
16159
|
{
|
|
16113
|
-
style: [
|
|
16160
|
+
style: [styles6.actionBtn, styles6.passBtn, isSubmitting && { opacity: 0.5 }],
|
|
16114
16161
|
onPress: () => handleChangeResult("passed"),
|
|
16115
16162
|
disabled: isSubmitting
|
|
16116
16163
|
},
|
|
16117
|
-
/* @__PURE__ */ import_react5.default.createElement(import_react_native5.Text, { style:
|
|
16118
|
-
))) : /* @__PURE__ */ import_react5.default.createElement(import_react_native5.View, { style:
|
|
16164
|
+
/* @__PURE__ */ import_react5.default.createElement(import_react_native5.Text, { style: styles6.passBtnText }, "Change to Pass")
|
|
16165
|
+
))) : /* @__PURE__ */ import_react5.default.createElement(import_react_native5.View, { style: styles6.actionButtons }, /* @__PURE__ */ import_react5.default.createElement(import_react_native5.TouchableOpacity, { style: [styles6.actionBtn, styles6.failBtn, isSubmitting && { opacity: 0.5 }], onPress: handleFail, disabled: isSubmitting }, /* @__PURE__ */ import_react5.default.createElement(import_react_native5.Text, { style: styles6.failBtnText }, isSubmitting ? displayedAssignment.isVerification ? "Reporting..." : "Failing..." : displayedAssignment.isVerification ? "\u2717 Still Broken" : "Fail")), /* @__PURE__ */ import_react5.default.createElement(import_react_native5.TouchableOpacity, { style: [styles6.actionBtn, styles6.skipBtn, isSubmitting && { opacity: 0.5 }], onPress: () => setShowSkipModal(true), disabled: isSubmitting }, /* @__PURE__ */ import_react5.default.createElement(import_react_native5.Text, { style: styles6.skipBtnText }, "Skip")), /* @__PURE__ */ import_react5.default.createElement(import_react_native5.TouchableOpacity, { style: [styles6.actionBtn, styles6.passBtn, isSubmitting && { opacity: 0.5 }], onPress: handlePass, disabled: isSubmitting }, /* @__PURE__ */ import_react5.default.createElement(import_react_native5.Text, { style: styles6.passBtnText }, isSubmitting ? displayedAssignment.isVerification ? "Verifying..." : "Passing..." : displayedAssignment.isVerification ? "\u2713 Fix Verified" : "Pass"))), feedbackToastAssignmentId && /* @__PURE__ */ import_react5.default.createElement(import_react_native5.Animated.View, { style: [styles6.passToast, { transform: [{ translateY: toastSlideAnim }] }] }, /* @__PURE__ */ import_react5.default.createElement(import_react_native5.View, { style: styles6.passToastContent }, /* @__PURE__ */ import_react5.default.createElement(import_react_native5.Text, { style: styles6.passToastIcon }, "\u2705"), /* @__PURE__ */ import_react5.default.createElement(import_react_native5.Text, { style: styles6.passToastText }, "Test passed!")), /* @__PURE__ */ import_react5.default.createElement(
|
|
16166
|
+
import_react_native5.TouchableOpacity,
|
|
16167
|
+
{
|
|
16168
|
+
style: styles6.passToastButton,
|
|
16169
|
+
onPress: () => {
|
|
16170
|
+
if (toastTimerRef.current) clearTimeout(toastTimerRef.current);
|
|
16171
|
+
const toastId = feedbackToastAssignmentId;
|
|
16172
|
+
setFeedbackToastAssignmentId(null);
|
|
16173
|
+
nav.push({ name: "TEST_FEEDBACK", status: "passed", assignmentId: toastId });
|
|
16174
|
+
}
|
|
16175
|
+
},
|
|
16176
|
+
/* @__PURE__ */ import_react5.default.createElement(import_react_native5.Text, { style: styles6.passToastButtonText }, "Rate this test")
|
|
16177
|
+
)), /* @__PURE__ */ import_react5.default.createElement(import_react_native5.Modal, { visible: showSkipModal, transparent: true, animationType: "fade" }, /* @__PURE__ */ import_react5.default.createElement(import_react_native5.View, { style: styles6.modalOverlay }, /* @__PURE__ */ import_react5.default.createElement(import_react_native5.View, { style: styles6.modalContent }, /* @__PURE__ */ import_react5.default.createElement(import_react_native5.Text, { style: styles6.modalTitle }, "Skip this test?"), /* @__PURE__ */ import_react5.default.createElement(import_react_native5.Text, { style: styles6.modalSubtitle }, "Select a reason:"), [
|
|
16119
16178
|
{ reason: "blocked", label: "\u{1F6AB} Blocked by a bug" },
|
|
16120
16179
|
{ reason: "not_ready", label: "\u{1F6A7} Feature not ready" },
|
|
16121
16180
|
{ reason: "dependency", label: "\u{1F517} Needs another test first" },
|
|
@@ -16124,32 +16183,32 @@ function TestDetailScreen({ testId, nav }) {
|
|
|
16124
16183
|
import_react_native5.TouchableOpacity,
|
|
16125
16184
|
{
|
|
16126
16185
|
key: reason,
|
|
16127
|
-
style: [
|
|
16186
|
+
style: [styles6.skipOption, selectedSkipReason === reason && styles6.skipOptionActive],
|
|
16128
16187
|
onPress: () => setSelectedSkipReason(reason)
|
|
16129
16188
|
},
|
|
16130
|
-
/* @__PURE__ */ import_react5.default.createElement(import_react_native5.Text, { style: [
|
|
16189
|
+
/* @__PURE__ */ import_react5.default.createElement(import_react_native5.Text, { style: [styles6.skipOptionText, selectedSkipReason === reason && styles6.skipOptionTextActive] }, label)
|
|
16131
16190
|
)), /* @__PURE__ */ import_react5.default.createElement(
|
|
16132
16191
|
import_react_native5.TextInput,
|
|
16133
16192
|
{
|
|
16134
|
-
style:
|
|
16193
|
+
style: styles6.skipNotes,
|
|
16135
16194
|
value: skipNotes,
|
|
16136
16195
|
onChangeText: setSkipNotes,
|
|
16137
16196
|
placeholder: "Additional notes (optional)",
|
|
16138
16197
|
placeholderTextColor: colors.textMuted,
|
|
16139
16198
|
multiline: true
|
|
16140
16199
|
}
|
|
16141
|
-
), /* @__PURE__ */ import_react5.default.createElement(import_react_native5.View, { style:
|
|
16200
|
+
), /* @__PURE__ */ import_react5.default.createElement(import_react_native5.View, { style: styles6.skipActions }, /* @__PURE__ */ import_react5.default.createElement(import_react_native5.TouchableOpacity, { style: styles6.skipCancel, onPress: () => {
|
|
16142
16201
|
setShowSkipModal(false);
|
|
16143
16202
|
setSelectedSkipReason(null);
|
|
16144
16203
|
setSkipNotes("");
|
|
16145
|
-
} }, /* @__PURE__ */ import_react5.default.createElement(import_react_native5.Text, { style:
|
|
16204
|
+
} }, /* @__PURE__ */ import_react5.default.createElement(import_react_native5.Text, { style: styles6.skipCancelText }, "Cancel")), /* @__PURE__ */ import_react5.default.createElement(
|
|
16146
16205
|
import_react_native5.TouchableOpacity,
|
|
16147
16206
|
{
|
|
16148
|
-
style: [
|
|
16207
|
+
style: [styles6.skipConfirm, !selectedSkipReason && { opacity: 0.4 }],
|
|
16149
16208
|
onPress: handleSkip,
|
|
16150
16209
|
disabled: !selectedSkipReason || skipping
|
|
16151
16210
|
},
|
|
16152
|
-
/* @__PURE__ */ import_react5.default.createElement(import_react_native5.Text, { style:
|
|
16211
|
+
/* @__PURE__ */ import_react5.default.createElement(import_react_native5.Text, { style: styles6.skipConfirmText }, skipping ? "Skipping..." : "Skip Test")
|
|
16153
16212
|
))))));
|
|
16154
16213
|
}
|
|
16155
16214
|
function createStyles2() {
|
|
@@ -16252,7 +16311,17 @@ function createStyles2() {
|
|
|
16252
16311
|
skipCancel: { flex: 1, paddingVertical: 12, borderRadius: 10, alignItems: "center", backgroundColor: colors.card },
|
|
16253
16312
|
skipCancelText: { fontSize: 14, color: colors.textSecondary },
|
|
16254
16313
|
skipConfirm: { flex: 1, paddingVertical: 12, borderRadius: 10, alignItems: "center", backgroundColor: colors.yellow },
|
|
16255
|
-
skipConfirmText: { fontSize: 14, fontWeight: "600", color: colors.onBright }
|
|
16314
|
+
skipConfirmText: { fontSize: 14, fontWeight: "600", color: colors.onBright },
|
|
16315
|
+
// Start test button
|
|
16316
|
+
startTestBtn: { backgroundColor: colors.blueDark, borderRadius: 10, padding: 12, borderWidth: 1, borderColor: colors.blue, alignItems: "center", marginBottom: 8 },
|
|
16317
|
+
startTestText: { fontSize: 14, fontWeight: "600", color: colors.blueLight },
|
|
16318
|
+
// Instant pass toast
|
|
16319
|
+
passToast: { position: "absolute", bottom: 16, left: 16, right: 16, flexDirection: "row", alignItems: "center", justifyContent: "space-between", backgroundColor: colors.greenDark, borderWidth: 1, borderColor: colors.green, borderRadius: 10, paddingVertical: 10, paddingHorizontal: 14, zIndex: 1e4 },
|
|
16320
|
+
passToastContent: { flexDirection: "row", alignItems: "center", gap: 8 },
|
|
16321
|
+
passToastIcon: { fontSize: 14 },
|
|
16322
|
+
passToastText: { fontSize: 13, fontWeight: "600", color: colors.green },
|
|
16323
|
+
passToastButton: { borderWidth: 1, borderColor: colors.green, borderRadius: 8, paddingVertical: 4, paddingHorizontal: 10 },
|
|
16324
|
+
passToastButtonText: { fontSize: 12, fontWeight: "500", color: colors.green }
|
|
16256
16325
|
});
|
|
16257
16326
|
}
|
|
16258
16327
|
|
|
@@ -16261,7 +16330,7 @@ var import_react6 = __toESM(require("react"));
|
|
|
16261
16330
|
var import_react_native6 = require("react-native");
|
|
16262
16331
|
function TestListScreen({ nav }) {
|
|
16263
16332
|
const { assignments, currentAssignment, refreshAssignments, dashboardUrl, isLoading, widgetColorScheme } = useBugBear();
|
|
16264
|
-
const
|
|
16333
|
+
const styles6 = (0, import_react6.useMemo)(() => createStyles3(), [widgetColorScheme]);
|
|
16265
16334
|
const [filter, setFilter] = (0, import_react6.useState)("all");
|
|
16266
16335
|
const [roleFilter, setRoleFilter] = (0, import_react6.useState)(null);
|
|
16267
16336
|
const [trackFilter, setTrackFilter] = (0, import_react6.useState)(null);
|
|
@@ -16353,18 +16422,18 @@ function TestListScreen({ nav }) {
|
|
|
16353
16422
|
return true;
|
|
16354
16423
|
}, [platformFilter, roleFilter, trackFilter, searchQuery, filter]);
|
|
16355
16424
|
if (isLoading) return /* @__PURE__ */ import_react6.default.createElement(TestListScreenSkeleton, null);
|
|
16356
|
-
return /* @__PURE__ */ import_react6.default.createElement(import_react_native6.View, null, /* @__PURE__ */ import_react6.default.createElement(import_react_native6.View, { style:
|
|
16425
|
+
return /* @__PURE__ */ import_react6.default.createElement(import_react_native6.View, null, /* @__PURE__ */ import_react6.default.createElement(import_react_native6.View, { style: styles6.filterBar }, [
|
|
16357
16426
|
{ key: "all", label: "All", count: assignments.length },
|
|
16358
16427
|
{ key: "todo", label: "To Do", count: assignments.filter((a) => !a.isVerification && (a.status === "pending" || a.status === "in_progress" || a.status === "failed")).length },
|
|
16359
16428
|
{ key: "retest", label: "Retest", count: assignments.filter((a) => !!a.isVerification && (a.status === "pending" || a.status === "in_progress")).length },
|
|
16360
16429
|
{ key: "done", label: "Done", count: assignments.filter((a) => a.status === "passed" || a.status === "skipped" || a.status === "blocked").length }
|
|
16361
|
-
].map((f) => /* @__PURE__ */ import_react6.default.createElement(import_react_native6.TouchableOpacity, { key: f.key, style: [
|
|
16430
|
+
].map((f) => /* @__PURE__ */ import_react6.default.createElement(import_react_native6.TouchableOpacity, { key: f.key, style: [styles6.filterBtn, filter === f.key && styles6.filterBtnActive], onPress: () => setFilter(f.key) }, /* @__PURE__ */ import_react6.default.createElement(import_react_native6.Text, { style: [styles6.filterBtnText, filter === f.key && styles6.filterBtnTextActive] }, f.label, " (", f.count, ")")))), availableRoles.length >= 2 && /* @__PURE__ */ import_react6.default.createElement(import_react_native6.View, { style: styles6.roleSection }, /* @__PURE__ */ import_react6.default.createElement(import_react_native6.ScrollView, { horizontal: true, showsHorizontalScrollIndicator: false, style: styles6.roleBar }, /* @__PURE__ */ import_react6.default.createElement(
|
|
16362
16431
|
import_react_native6.TouchableOpacity,
|
|
16363
16432
|
{
|
|
16364
|
-
style: [
|
|
16433
|
+
style: [styles6.roleBtn, !roleFilter && styles6.roleBtnActive],
|
|
16365
16434
|
onPress: () => setRoleFilter(null)
|
|
16366
16435
|
},
|
|
16367
|
-
/* @__PURE__ */ import_react6.default.createElement(import_react_native6.Text, { style: [
|
|
16436
|
+
/* @__PURE__ */ import_react6.default.createElement(import_react_native6.Text, { style: [styles6.roleBtnText, !roleFilter && styles6.roleBtnTextActive] }, "All Roles")
|
|
16368
16437
|
), availableRoles.map((role) => {
|
|
16369
16438
|
const isActive = roleFilter === role.id;
|
|
16370
16439
|
return /* @__PURE__ */ import_react6.default.createElement(
|
|
@@ -16372,30 +16441,30 @@ function TestListScreen({ nav }) {
|
|
|
16372
16441
|
{
|
|
16373
16442
|
key: role.id,
|
|
16374
16443
|
style: [
|
|
16375
|
-
|
|
16444
|
+
styles6.roleBtn,
|
|
16376
16445
|
isActive && { backgroundColor: role.color + "20", borderColor: role.color + "60", borderWidth: 1 }
|
|
16377
16446
|
],
|
|
16378
16447
|
onPress: () => setRoleFilter(isActive ? null : role.id)
|
|
16379
16448
|
},
|
|
16380
|
-
/* @__PURE__ */ import_react6.default.createElement(import_react_native6.View, { style: [
|
|
16381
|
-
/* @__PURE__ */ import_react6.default.createElement(import_react_native6.Text, { style: [
|
|
16449
|
+
/* @__PURE__ */ import_react6.default.createElement(import_react_native6.View, { style: [styles6.roleDot, { backgroundColor: role.color }] }),
|
|
16450
|
+
/* @__PURE__ */ import_react6.default.createElement(import_react_native6.Text, { style: [styles6.roleBtnText, isActive && { color: role.color, fontWeight: "600" }] }, role.name)
|
|
16382
16451
|
);
|
|
16383
|
-
})), selectedRole?.loginHint && /* @__PURE__ */ import_react6.default.createElement(import_react_native6.View, { style: [
|
|
16452
|
+
})), selectedRole?.loginHint && /* @__PURE__ */ import_react6.default.createElement(import_react_native6.View, { style: [styles6.loginHint, { backgroundColor: selectedRole.color + "10", borderColor: selectedRole.color + "30" }] }, /* @__PURE__ */ import_react6.default.createElement(import_react_native6.Text, { style: styles6.loginHintText }, "Log in as: ", selectedRole.loginHint))), /* @__PURE__ */ import_react6.default.createElement(import_react_native6.View, { style: styles6.searchContainer }, /* @__PURE__ */ import_react6.default.createElement(
|
|
16384
16453
|
import_react_native6.TextInput,
|
|
16385
16454
|
{
|
|
16386
16455
|
value: searchQuery,
|
|
16387
16456
|
onChangeText: setSearchQuery,
|
|
16388
16457
|
placeholder: "Search tests...",
|
|
16389
16458
|
placeholderTextColor: colors.textMuted,
|
|
16390
|
-
style:
|
|
16459
|
+
style: styles6.searchInput
|
|
16391
16460
|
}
|
|
16392
|
-
)), /* @__PURE__ */ import_react6.default.createElement(import_react_native6.ScrollView, { horizontal: true, showsHorizontalScrollIndicator: false, style:
|
|
16461
|
+
)), /* @__PURE__ */ import_react6.default.createElement(import_react_native6.ScrollView, { horizontal: true, showsHorizontalScrollIndicator: false, style: styles6.platformBar }, /* @__PURE__ */ import_react6.default.createElement(
|
|
16393
16462
|
import_react_native6.TouchableOpacity,
|
|
16394
16463
|
{
|
|
16395
|
-
style: [
|
|
16464
|
+
style: [styles6.platformBtn, !platformFilter && styles6.platformBtnActive],
|
|
16396
16465
|
onPress: () => setPlatformFilter(null)
|
|
16397
16466
|
},
|
|
16398
|
-
/* @__PURE__ */ import_react6.default.createElement(import_react_native6.Text, { style: [
|
|
16467
|
+
/* @__PURE__ */ import_react6.default.createElement(import_react_native6.Text, { style: [styles6.platformBtnText, !platformFilter && styles6.platformBtnTextActive] }, "All")
|
|
16399
16468
|
), [
|
|
16400
16469
|
{ key: "web", label: "Web", icon: "\u{1F310}" },
|
|
16401
16470
|
{ key: "ios", label: "iOS", icon: "\u{1F4F1}" },
|
|
@@ -16407,32 +16476,32 @@ function TestListScreen({ nav }) {
|
|
|
16407
16476
|
{
|
|
16408
16477
|
key: p.key,
|
|
16409
16478
|
style: [
|
|
16410
|
-
|
|
16479
|
+
styles6.platformBtn,
|
|
16411
16480
|
isActive && { backgroundColor: colors.blue + "20", borderColor: colors.blue + "60", borderWidth: 1 }
|
|
16412
16481
|
],
|
|
16413
16482
|
onPress: () => setPlatformFilter(isActive ? null : p.key)
|
|
16414
16483
|
},
|
|
16415
|
-
/* @__PURE__ */ import_react6.default.createElement(import_react_native6.Text, { style: [
|
|
16484
|
+
/* @__PURE__ */ import_react6.default.createElement(import_react_native6.Text, { style: [styles6.platformBtnText, isActive && { color: colors.blue, fontWeight: "600" }] }, p.icon, " ", p.label)
|
|
16416
16485
|
);
|
|
16417
|
-
})), /* @__PURE__ */ import_react6.default.createElement(import_react_native6.View, { style:
|
|
16486
|
+
})), /* @__PURE__ */ import_react6.default.createElement(import_react_native6.View, { style: styles6.trackSortRow }, availableTracks.length >= 2 && /* @__PURE__ */ import_react6.default.createElement(import_react_native6.ScrollView, { horizontal: true, showsHorizontalScrollIndicator: false, style: { flex: 1 } }, /* @__PURE__ */ import_react6.default.createElement(
|
|
16418
16487
|
import_react_native6.TouchableOpacity,
|
|
16419
16488
|
{
|
|
16420
|
-
style: [
|
|
16489
|
+
style: [styles6.trackBtn, !trackFilter && styles6.trackBtnActive],
|
|
16421
16490
|
onPress: () => setTrackFilter(null)
|
|
16422
16491
|
},
|
|
16423
|
-
/* @__PURE__ */ import_react6.default.createElement(import_react_native6.Text, { style: [
|
|
16492
|
+
/* @__PURE__ */ import_react6.default.createElement(import_react_native6.Text, { style: [styles6.trackBtnText, !trackFilter && styles6.trackBtnTextActive] }, "All Tracks")
|
|
16424
16493
|
), availableTracks.map((track) => {
|
|
16425
16494
|
const isActive = trackFilter === track.id;
|
|
16426
16495
|
return /* @__PURE__ */ import_react6.default.createElement(
|
|
16427
16496
|
import_react_native6.TouchableOpacity,
|
|
16428
16497
|
{
|
|
16429
16498
|
key: track.id,
|
|
16430
|
-
style: [
|
|
16499
|
+
style: [styles6.trackBtn, isActive && { backgroundColor: track.color + "20", borderColor: track.color + "60", borderWidth: 1 }],
|
|
16431
16500
|
onPress: () => setTrackFilter(isActive ? null : track.id)
|
|
16432
16501
|
},
|
|
16433
|
-
/* @__PURE__ */ import_react6.default.createElement(import_react_native6.Text, { style: [
|
|
16502
|
+
/* @__PURE__ */ import_react6.default.createElement(import_react_native6.Text, { style: [styles6.trackBtnText, isActive && { color: track.color, fontWeight: "600" }] }, track.icon, " ", track.name)
|
|
16434
16503
|
);
|
|
16435
|
-
})), /* @__PURE__ */ import_react6.default.createElement(import_react_native6.View, { style:
|
|
16504
|
+
})), /* @__PURE__ */ import_react6.default.createElement(import_react_native6.View, { style: styles6.sortGroup }, [
|
|
16436
16505
|
{ key: "priority", label: "\u2195 Priority" },
|
|
16437
16506
|
{ key: "recent", label: "\u{1F550} Recent" },
|
|
16438
16507
|
{ key: "alpha", label: "A-Z" }
|
|
@@ -16440,41 +16509,41 @@ function TestListScreen({ nav }) {
|
|
|
16440
16509
|
import_react_native6.TouchableOpacity,
|
|
16441
16510
|
{
|
|
16442
16511
|
key: s2.key,
|
|
16443
|
-
style: [
|
|
16512
|
+
style: [styles6.sortBtn, sortMode === s2.key && styles6.sortBtnActive],
|
|
16444
16513
|
onPress: () => setSortMode(s2.key)
|
|
16445
16514
|
},
|
|
16446
|
-
/* @__PURE__ */ import_react6.default.createElement(import_react_native6.Text, { style: [
|
|
16515
|
+
/* @__PURE__ */ import_react6.default.createElement(import_react_native6.Text, { style: [styles6.sortBtnText, sortMode === s2.key && styles6.sortBtnTextActive] }, s2.label)
|
|
16447
16516
|
)))), groupedAssignments.map((folder) => {
|
|
16448
16517
|
const folderId = folder.group?.id || "ungrouped";
|
|
16449
16518
|
const isCollapsed = collapsedFolders.has(folderId);
|
|
16450
16519
|
const filtered = folder.assignments.filter(filterAssignment);
|
|
16451
16520
|
if (filtered.length === 0 && filter !== "all") return null;
|
|
16452
|
-
return /* @__PURE__ */ import_react6.default.createElement(import_react_native6.View, { key: folderId, style:
|
|
16521
|
+
return /* @__PURE__ */ import_react6.default.createElement(import_react_native6.View, { key: folderId, style: styles6.folder }, /* @__PURE__ */ import_react6.default.createElement(import_react_native6.TouchableOpacity, { style: styles6.folderHeader, onPress: () => toggleFolder(folderId) }, /* @__PURE__ */ import_react6.default.createElement(import_react_native6.Text, { style: styles6.folderToggle }, isCollapsed ? "\u25B6" : "\u25BC"), /* @__PURE__ */ import_react6.default.createElement(import_react_native6.Text, { style: styles6.folderName, numberOfLines: 1 }, folder.group?.name || "Ungrouped"), /* @__PURE__ */ import_react6.default.createElement(import_react_native6.View, { style: styles6.folderProgress }, /* @__PURE__ */ import_react6.default.createElement(import_react_native6.View, { style: [styles6.folderProgressFill, { width: `${folder.stats.total > 0 ? Math.round((folder.stats.passed + folder.stats.failed) / folder.stats.total * 100) : 0}%` }] })), /* @__PURE__ */ import_react6.default.createElement(import_react_native6.Text, { style: styles6.folderCount }, folder.stats.passed + folder.stats.failed, "/", folder.stats.total)), !isCollapsed && filtered.map((assignment) => {
|
|
16453
16522
|
const badge = getStatusBadge(assignment.status);
|
|
16454
16523
|
const isCurrent = currentAssignment?.id === assignment.id;
|
|
16455
16524
|
return /* @__PURE__ */ import_react6.default.createElement(
|
|
16456
16525
|
import_react_native6.TouchableOpacity,
|
|
16457
16526
|
{
|
|
16458
16527
|
key: assignment.id,
|
|
16459
|
-
style: [
|
|
16528
|
+
style: [styles6.testItem, isCurrent && styles6.testItemCurrent],
|
|
16460
16529
|
onPress: () => nav.push({ name: "TEST_DETAIL", testId: assignment.id })
|
|
16461
16530
|
},
|
|
16462
|
-
/* @__PURE__ */ import_react6.default.createElement(import_react_native6.Text, { style:
|
|
16463
|
-
/* @__PURE__ */ import_react6.default.createElement(import_react_native6.View, { style:
|
|
16464
|
-
|
|
16531
|
+
/* @__PURE__ */ import_react6.default.createElement(import_react_native6.Text, { style: styles6.testBadge }, badge.icon),
|
|
16532
|
+
/* @__PURE__ */ import_react6.default.createElement(import_react_native6.View, { style: styles6.testInfo }, /* @__PURE__ */ import_react6.default.createElement(import_react_native6.Text, { style: styles6.testTitle, numberOfLines: 1 }, assignment.testCase.title), /* @__PURE__ */ import_react6.default.createElement(import_react_native6.View, { style: styles6.testMetaRow }, assignment.isVerification && /* @__PURE__ */ import_react6.default.createElement(import_react_native6.View, { style: [
|
|
16533
|
+
styles6.retestTag,
|
|
16465
16534
|
assignment.status === "passed" && { backgroundColor: colors.greenDark, borderColor: colors.greenBorder }
|
|
16466
16535
|
] }, /* @__PURE__ */ import_react6.default.createElement(import_react_native6.Text, { style: [
|
|
16467
|
-
|
|
16536
|
+
styles6.retestTagText,
|
|
16468
16537
|
assignment.status === "passed" && { color: colors.greenLight }
|
|
16469
|
-
] }, assignment.status === "passed" ? "Verified" : "Retest")), /* @__PURE__ */ import_react6.default.createElement(import_react_native6.Text, { style:
|
|
16538
|
+
] }, assignment.status === "passed" ? "Verified" : "Retest")), /* @__PURE__ */ import_react6.default.createElement(import_react_native6.Text, { style: styles6.testMeta }, assignment.testCase.testKey, " \xB7 ", assignment.testCase.priority), assignment.testCase.role && /* @__PURE__ */ import_react6.default.createElement(import_react_native6.View, { style: styles6.roleBadgeRow }, /* @__PURE__ */ import_react6.default.createElement(import_react_native6.Text, { style: styles6.testMeta }, " \xB7 "), /* @__PURE__ */ import_react6.default.createElement(import_react_native6.View, { style: [styles6.roleBadgeDot, { backgroundColor: assignment.testCase.role.color }] }), /* @__PURE__ */ import_react6.default.createElement(import_react_native6.Text, { style: [styles6.testMeta, { color: assignment.testCase.role.color, fontWeight: "500" }] }, assignment.testCase.role.name)))),
|
|
16470
16539
|
/* @__PURE__ */ import_react6.default.createElement(import_react_native6.View, { style: [
|
|
16471
|
-
|
|
16540
|
+
styles6.statusPill,
|
|
16472
16541
|
{
|
|
16473
16542
|
backgroundColor: assignment.status === "passed" ? colors.greenDark : assignment.status === "failed" ? colors.redSurface : assignment.status === "in_progress" ? colors.blueSurface : colors.card,
|
|
16474
16543
|
borderColor: assignment.status === "passed" ? colors.greenBorder : assignment.status === "failed" ? colors.redDark : assignment.status === "in_progress" ? colors.blueDark : colors.border
|
|
16475
16544
|
}
|
|
16476
16545
|
] }, /* @__PURE__ */ import_react6.default.createElement(import_react_native6.Text, { style: [
|
|
16477
|
-
|
|
16546
|
+
styles6.statusPillText,
|
|
16478
16547
|
{
|
|
16479
16548
|
color: assignment.status === "passed" ? colors.greenMed : assignment.status === "failed" ? colors.redMed : assignment.status === "in_progress" ? colors.blueLight : colors.zincLight
|
|
16480
16549
|
}
|
|
@@ -16484,12 +16553,12 @@ function TestListScreen({ nav }) {
|
|
|
16484
16553
|
}), dashboardUrl && /* @__PURE__ */ import_react6.default.createElement(
|
|
16485
16554
|
import_react_native6.TouchableOpacity,
|
|
16486
16555
|
{
|
|
16487
|
-
style:
|
|
16556
|
+
style: styles6.dashboardLink,
|
|
16488
16557
|
onPress: () => import_react_native6.Linking.openURL(`${dashboardUrl}/test-cases`),
|
|
16489
16558
|
activeOpacity: 0.7
|
|
16490
16559
|
},
|
|
16491
|
-
/* @__PURE__ */ import_react6.default.createElement(import_react_native6.Text, { style:
|
|
16492
|
-
), /* @__PURE__ */ import_react6.default.createElement(import_react_native6.TouchableOpacity, { style:
|
|
16560
|
+
/* @__PURE__ */ import_react6.default.createElement(import_react_native6.Text, { style: styles6.dashboardLinkText }, "\u{1F310}", " Manage on Dashboard ", "\u2192")
|
|
16561
|
+
), /* @__PURE__ */ import_react6.default.createElement(import_react_native6.TouchableOpacity, { style: styles6.refreshBtn, onPress: refreshAssignments }, /* @__PURE__ */ import_react6.default.createElement(import_react_native6.Text, { style: styles6.refreshText }, "\u21BB", " Refresh")));
|
|
16493
16562
|
}
|
|
16494
16563
|
function createStyles3() {
|
|
16495
16564
|
return import_react_native6.StyleSheet.create({
|
|
@@ -16809,7 +16878,7 @@ var styles2 = import_react_native8.StyleSheet.create({
|
|
|
16809
16878
|
// src/widget/screens/TestFeedbackScreen.tsx
|
|
16810
16879
|
function TestFeedbackScreen({ status, assignmentId, nav }) {
|
|
16811
16880
|
const { client, assignments, refreshAssignments, uploadImage, widgetColorScheme } = useBugBear();
|
|
16812
|
-
const
|
|
16881
|
+
const styles6 = (0, import_react10.useMemo)(() => createStyles4(), [widgetColorScheme]);
|
|
16813
16882
|
const images = useImageAttachments(uploadImage, 3, "screenshots");
|
|
16814
16883
|
const [rating, setRating] = (0, import_react10.useState)(5);
|
|
16815
16884
|
const [note, setNote] = (0, import_react10.useState)("");
|
|
@@ -16869,7 +16938,7 @@ function TestFeedbackScreen({ status, assignmentId, nav }) {
|
|
|
16869
16938
|
}
|
|
16870
16939
|
}
|
|
16871
16940
|
};
|
|
16872
|
-
return /* @__PURE__ */ import_react10.default.createElement(import_react_native9.View, { style:
|
|
16941
|
+
return /* @__PURE__ */ import_react10.default.createElement(import_react_native9.View, { style: styles6.container }, /* @__PURE__ */ import_react10.default.createElement(import_react_native9.Text, { style: styles6.header }, status === "passed" ? "\u2705 Test Passed!" : "\u274C Test Failed"), /* @__PURE__ */ import_react10.default.createElement(import_react_native9.Text, { style: styles6.subheader }, "Rate this test case"), /* @__PURE__ */ import_react10.default.createElement(import_react_native9.View, { style: styles6.starRow }, [1, 2, 3, 4, 5].map((n) => /* @__PURE__ */ import_react10.default.createElement(import_react_native9.TouchableOpacity, { key: n, onPress: () => setRating(n), style: styles6.starButton }, /* @__PURE__ */ import_react10.default.createElement(import_react_native9.Text, { style: [styles6.star, n <= rating && styles6.starActive] }, n <= rating ? "\u2605" : "\u2606")))), showFlags && /* @__PURE__ */ import_react10.default.createElement(import_react_native9.View, { style: styles6.flagsSection }, /* @__PURE__ */ import_react10.default.createElement(import_react_native9.Text, { style: styles6.flagsLabel }, "What could be improved?"), [
|
|
16873
16942
|
{ key: "isOutdated", label: "Test is outdated" },
|
|
16874
16943
|
{ key: "needsMoreDetail", label: "Needs more detail" },
|
|
16875
16944
|
{ key: "stepsUnclear", label: "Steps are unclear" },
|
|
@@ -16878,15 +16947,15 @@ function TestFeedbackScreen({ status, assignmentId, nav }) {
|
|
|
16878
16947
|
import_react_native9.TouchableOpacity,
|
|
16879
16948
|
{
|
|
16880
16949
|
key,
|
|
16881
|
-
style: [
|
|
16950
|
+
style: [styles6.flagItem, flags[key] && styles6.flagItemActive],
|
|
16882
16951
|
onPress: () => setFlags((prev) => ({ ...prev, [key]: !prev[key] }))
|
|
16883
16952
|
},
|
|
16884
|
-
/* @__PURE__ */ import_react10.default.createElement(import_react_native9.View, { style: [
|
|
16885
|
-
/* @__PURE__ */ import_react10.default.createElement(import_react_native9.Text, { style: [
|
|
16953
|
+
/* @__PURE__ */ import_react10.default.createElement(import_react_native9.View, { style: [styles6.flagCheck, flags[key] && styles6.flagCheckActive] }, flags[key] && /* @__PURE__ */ import_react10.default.createElement(import_react_native9.Text, { style: styles6.flagCheckmark }, "\u2713")),
|
|
16954
|
+
/* @__PURE__ */ import_react10.default.createElement(import_react_native9.Text, { style: [styles6.flagText, flags[key] && styles6.flagTextActive] }, label)
|
|
16886
16955
|
))), /* @__PURE__ */ import_react10.default.createElement(
|
|
16887
16956
|
import_react_native9.TextInput,
|
|
16888
16957
|
{
|
|
16889
|
-
style:
|
|
16958
|
+
style: styles6.noteInput,
|
|
16890
16959
|
value: note,
|
|
16891
16960
|
onChangeText: setNote,
|
|
16892
16961
|
placeholder: "Add a note (optional)",
|
|
@@ -16903,7 +16972,7 @@ function TestFeedbackScreen({ status, assignmentId, nav }) {
|
|
|
16903
16972
|
onRemove: images.removeImage,
|
|
16904
16973
|
label: "Screenshots (optional)"
|
|
16905
16974
|
}
|
|
16906
|
-
), /* @__PURE__ */ import_react10.default.createElement(import_react_native9.View, { style:
|
|
16975
|
+
), /* @__PURE__ */ import_react10.default.createElement(import_react_native9.View, { style: styles6.actions }, /* @__PURE__ */ import_react10.default.createElement(import_react_native9.TouchableOpacity, { style: styles6.skipButton, onPress: handleSkip }, /* @__PURE__ */ import_react10.default.createElement(import_react_native9.Text, { style: styles6.skipText }, "Skip")), /* @__PURE__ */ import_react10.default.createElement(import_react_native9.TouchableOpacity, { style: [shared.primaryButton, { flex: 2, opacity: submitting || images.isUploading ? 0.5 : 1 }], onPress: handleSubmit, disabled: submitting || images.isUploading }, /* @__PURE__ */ import_react10.default.createElement(import_react_native9.Text, { style: shared.primaryButtonText }, images.isUploading ? "Uploading..." : submitting ? "Submitting..." : "Submit"))));
|
|
16907
16976
|
}
|
|
16908
16977
|
function createStyles4() {
|
|
16909
16978
|
return import_react_native9.StyleSheet.create({
|
|
@@ -17092,7 +17161,7 @@ var styles3 = import_react_native10.StyleSheet.create({
|
|
|
17092
17161
|
// src/widget/screens/ReportScreen.tsx
|
|
17093
17162
|
function ReportScreen({ nav, prefill, autoCaptureUri, onAutoCaptureConsumed }) {
|
|
17094
17163
|
const { client, getDeviceInfo, uploadImage, refreshAssignments, widgetColorScheme } = useBugBear();
|
|
17095
|
-
const
|
|
17164
|
+
const styles6 = (0, import_react12.useMemo)(() => createStyles5(), [widgetColorScheme]);
|
|
17096
17165
|
const [reportType, setReportType] = (0, import_react12.useState)(prefill?.type || "bug");
|
|
17097
17166
|
const [severity, setSeverity] = (0, import_react12.useState)("medium");
|
|
17098
17167
|
const [category, setCategory] = (0, import_react12.useState)(null);
|
|
@@ -17198,7 +17267,7 @@ function ReportScreen({ nav, prefill, autoCaptureUri, onAutoCaptureConsumed }) {
|
|
|
17198
17267
|
submittingRef.current = false;
|
|
17199
17268
|
}
|
|
17200
17269
|
};
|
|
17201
|
-
return /* @__PURE__ */ import_react12.default.createElement(import_react_native11.View, null, isRetestFailure ? /* @__PURE__ */ import_react12.default.createElement(import_react12.default.Fragment, null, /* @__PURE__ */ import_react12.default.createElement(import_react_native11.View, { style:
|
|
17270
|
+
return /* @__PURE__ */ import_react12.default.createElement(import_react_native11.View, null, isRetestFailure ? /* @__PURE__ */ import_react12.default.createElement(import_react12.default.Fragment, null, /* @__PURE__ */ import_react12.default.createElement(import_react_native11.View, { style: styles6.retestBanner }, /* @__PURE__ */ import_react12.default.createElement(import_react_native11.Text, { style: styles6.retestIcon }, "\u{1F504}"), /* @__PURE__ */ import_react12.default.createElement(import_react_native11.View, null, /* @__PURE__ */ import_react12.default.createElement(import_react_native11.Text, { style: styles6.retestTitle }, "Bug Still Present"), /* @__PURE__ */ import_react12.default.createElement(import_react_native11.Text, { style: styles6.retestSubtitle }, "The fix did not resolve this issue"))), /* @__PURE__ */ import_react12.default.createElement(import_react_native11.View, { style: styles6.section }, /* @__PURE__ */ import_react12.default.createElement(import_react_native11.Text, { style: shared.label }, "Severity"), /* @__PURE__ */ import_react12.default.createElement(import_react_native11.View, { style: styles6.severityRow }, [
|
|
17202
17271
|
{ sev: "critical", color: colors.red },
|
|
17203
17272
|
{ sev: "high", color: colors.orange },
|
|
17204
17273
|
{ sev: "medium", color: colors.yellow },
|
|
@@ -17207,14 +17276,14 @@ function ReportScreen({ nav, prefill, autoCaptureUri, onAutoCaptureConsumed }) {
|
|
|
17207
17276
|
import_react_native11.TouchableOpacity,
|
|
17208
17277
|
{
|
|
17209
17278
|
key: sev,
|
|
17210
|
-
style: [
|
|
17279
|
+
style: [styles6.sevButton, severity === sev && { backgroundColor: `${color}30`, borderColor: color }],
|
|
17211
17280
|
onPress: () => setSeverity(sev)
|
|
17212
17281
|
},
|
|
17213
|
-
/* @__PURE__ */ import_react12.default.createElement(import_react_native11.Text, { style: [
|
|
17214
|
-
)))), /* @__PURE__ */ import_react12.default.createElement(import_react_native11.View, { style:
|
|
17282
|
+
/* @__PURE__ */ import_react12.default.createElement(import_react_native11.Text, { style: [styles6.sevText, severity === sev && { color }] }, sev)
|
|
17283
|
+
)))), /* @__PURE__ */ import_react12.default.createElement(import_react_native11.View, { style: styles6.section }, /* @__PURE__ */ import_react12.default.createElement(import_react_native11.Text, { style: shared.label }, "Category (optional)"), /* @__PURE__ */ import_react12.default.createElement(CategoryPicker, { value: category, onChange: setCategory, optional: true })), /* @__PURE__ */ import_react12.default.createElement(import_react_native11.View, { style: styles6.section }, /* @__PURE__ */ import_react12.default.createElement(import_react_native11.Text, { style: shared.label }, "What went wrong?"), /* @__PURE__ */ import_react12.default.createElement(
|
|
17215
17284
|
import_react_native11.TextInput,
|
|
17216
17285
|
{
|
|
17217
|
-
style:
|
|
17286
|
+
style: styles6.descInput,
|
|
17218
17287
|
value: description,
|
|
17219
17288
|
onChangeText: setDescription,
|
|
17220
17289
|
placeholder: "Describe what you observed. What still doesn't work?",
|
|
@@ -17267,15 +17336,15 @@ function ReportScreen({ nav, prefill, autoCaptureUri, onAutoCaptureConsumed }) {
|
|
|
17267
17336
|
onRemove: images.removeImage,
|
|
17268
17337
|
label: "Attachments (optional)"
|
|
17269
17338
|
}
|
|
17270
|
-
), error && /* @__PURE__ */ import_react12.default.createElement(import_react_native11.View, { style:
|
|
17339
|
+
), error && /* @__PURE__ */ import_react12.default.createElement(import_react_native11.View, { style: styles6.errorBanner }, /* @__PURE__ */ import_react12.default.createElement(import_react_native11.Text, { style: styles6.errorText }, error)), /* @__PURE__ */ import_react12.default.createElement(
|
|
17271
17340
|
import_react_native11.TouchableOpacity,
|
|
17272
17341
|
{
|
|
17273
|
-
style: [shared.primaryButton,
|
|
17342
|
+
style: [shared.primaryButton, styles6.retestSubmitButton, (!description.trim() || submitting || images.isUploading) && shared.primaryButtonDisabled, { marginTop: 20 }],
|
|
17274
17343
|
onPress: handleSubmit,
|
|
17275
17344
|
disabled: !description.trim() || submitting || images.isUploading
|
|
17276
17345
|
},
|
|
17277
17346
|
/* @__PURE__ */ import_react12.default.createElement(import_react_native11.Text, { style: shared.primaryButtonText }, images.isUploading ? "Uploading images..." : submitting ? "Submitting..." : error ? "Retry" : "Submit Failed Retest")
|
|
17278
|
-
)) : /* @__PURE__ */ import_react12.default.createElement(import_react12.default.Fragment, null, /* @__PURE__ */ import_react12.default.createElement(import_react_native11.Text, { style: shared.label }, "What are you reporting?"), /* @__PURE__ */ import_react12.default.createElement(import_react_native11.View, { style:
|
|
17347
|
+
)) : /* @__PURE__ */ import_react12.default.createElement(import_react12.default.Fragment, null, /* @__PURE__ */ import_react12.default.createElement(import_react_native11.Text, { style: shared.label }, "What are you reporting?"), /* @__PURE__ */ import_react12.default.createElement(import_react_native11.View, { style: styles6.typeRow }, [
|
|
17279
17348
|
{ type: "bug", label: "Bug", icon: "\u{1F41B}" },
|
|
17280
17349
|
{ type: "feedback", label: "Feedback", icon: "\u{1F4A1}" },
|
|
17281
17350
|
{ type: "suggestion", label: "Idea", icon: "\u2728" }
|
|
@@ -17283,12 +17352,12 @@ function ReportScreen({ nav, prefill, autoCaptureUri, onAutoCaptureConsumed }) {
|
|
|
17283
17352
|
import_react_native11.TouchableOpacity,
|
|
17284
17353
|
{
|
|
17285
17354
|
key: type,
|
|
17286
|
-
style: [
|
|
17355
|
+
style: [styles6.typeCard, reportType === type && styles6.typeCardActive],
|
|
17287
17356
|
onPress: () => setReportType(type)
|
|
17288
17357
|
},
|
|
17289
|
-
/* @__PURE__ */ import_react12.default.createElement(import_react_native11.Text, { style:
|
|
17290
|
-
/* @__PURE__ */ import_react12.default.createElement(import_react_native11.Text, { style: [
|
|
17291
|
-
))), isBugType && /* @__PURE__ */ import_react12.default.createElement(import_react_native11.View, { style:
|
|
17358
|
+
/* @__PURE__ */ import_react12.default.createElement(import_react_native11.Text, { style: styles6.typeIcon }, icon),
|
|
17359
|
+
/* @__PURE__ */ import_react12.default.createElement(import_react_native11.Text, { style: [styles6.typeLabel, reportType === type && styles6.typeLabelActive] }, label)
|
|
17360
|
+
))), isBugType && /* @__PURE__ */ import_react12.default.createElement(import_react_native11.View, { style: styles6.section }, /* @__PURE__ */ import_react12.default.createElement(import_react_native11.Text, { style: shared.label }, "Severity"), /* @__PURE__ */ import_react12.default.createElement(import_react_native11.View, { style: styles6.severityRow }, [
|
|
17292
17361
|
{ sev: "critical", color: colors.red },
|
|
17293
17362
|
{ sev: "high", color: colors.orange },
|
|
17294
17363
|
{ sev: "medium", color: colors.yellow },
|
|
@@ -17297,14 +17366,14 @@ function ReportScreen({ nav, prefill, autoCaptureUri, onAutoCaptureConsumed }) {
|
|
|
17297
17366
|
import_react_native11.TouchableOpacity,
|
|
17298
17367
|
{
|
|
17299
17368
|
key: sev,
|
|
17300
|
-
style: [
|
|
17369
|
+
style: [styles6.sevButton, severity === sev && { backgroundColor: `${color}30`, borderColor: color }],
|
|
17301
17370
|
onPress: () => setSeverity(sev)
|
|
17302
17371
|
},
|
|
17303
|
-
/* @__PURE__ */ import_react12.default.createElement(import_react_native11.Text, { style: [
|
|
17304
|
-
)))), isBugType && /* @__PURE__ */ import_react12.default.createElement(import_react_native11.View, { style:
|
|
17372
|
+
/* @__PURE__ */ import_react12.default.createElement(import_react_native11.Text, { style: [styles6.sevText, severity === sev && { color }] }, sev)
|
|
17373
|
+
)))), isBugType && /* @__PURE__ */ import_react12.default.createElement(import_react_native11.View, { style: styles6.section }, /* @__PURE__ */ import_react12.default.createElement(import_react_native11.Text, { style: shared.label }, "Category (optional)"), /* @__PURE__ */ import_react12.default.createElement(CategoryPicker, { value: category, onChange: setCategory, optional: true })), /* @__PURE__ */ import_react12.default.createElement(import_react_native11.View, { style: styles6.section }, /* @__PURE__ */ import_react12.default.createElement(import_react_native11.Text, { style: shared.label }, "What happened?"), /* @__PURE__ */ import_react12.default.createElement(
|
|
17305
17374
|
import_react_native11.TextInput,
|
|
17306
17375
|
{
|
|
17307
|
-
style:
|
|
17376
|
+
style: styles6.descInput,
|
|
17308
17377
|
value: description,
|
|
17309
17378
|
onChangeText: setDescription,
|
|
17310
17379
|
placeholder: "Describe the issue...",
|
|
@@ -17347,16 +17416,16 @@ function ReportScreen({ nav, prefill, autoCaptureUri, onAutoCaptureConsumed }) {
|
|
|
17347
17416
|
issue.title
|
|
17348
17417
|
),
|
|
17349
17418
|
/* @__PURE__ */ import_react12.default.createElement(import_react_native11.Text, { style: { fontSize: 11, color: colors.textMuted } }, issue.status)
|
|
17350
|
-
)))), isBugType && /* @__PURE__ */ import_react12.default.createElement(import_react_native11.View, { style:
|
|
17419
|
+
)))), isBugType && /* @__PURE__ */ import_react12.default.createElement(import_react_native11.View, { style: styles6.section }, /* @__PURE__ */ import_react12.default.createElement(import_react_native11.Text, { style: shared.label }, "Which screen?"), /* @__PURE__ */ import_react12.default.createElement(
|
|
17351
17420
|
import_react_native11.TextInput,
|
|
17352
17421
|
{
|
|
17353
|
-
style:
|
|
17422
|
+
style: styles6.screenInput,
|
|
17354
17423
|
value: affectedScreen,
|
|
17355
17424
|
onChangeText: setAffectedScreen,
|
|
17356
17425
|
placeholder: "e.g. Reservations, Settings...",
|
|
17357
17426
|
placeholderTextColor: colors.textMuted
|
|
17358
17427
|
}
|
|
17359
|
-
), /* @__PURE__ */ import_react12.default.createElement(import_react_native11.Text, { style:
|
|
17428
|
+
), /* @__PURE__ */ import_react12.default.createElement(import_react_native11.Text, { style: styles6.screenHint }, "Which screen or area was the bug on? (optional)")), /* @__PURE__ */ import_react12.default.createElement(
|
|
17360
17429
|
ImagePickerButtons,
|
|
17361
17430
|
{
|
|
17362
17431
|
images: images.images,
|
|
@@ -17366,7 +17435,7 @@ function ReportScreen({ nav, prefill, autoCaptureUri, onAutoCaptureConsumed }) {
|
|
|
17366
17435
|
onRemove: images.removeImage,
|
|
17367
17436
|
label: "Screenshots (optional)"
|
|
17368
17437
|
}
|
|
17369
|
-
), error && /* @__PURE__ */ import_react12.default.createElement(import_react_native11.View, { style:
|
|
17438
|
+
), error && /* @__PURE__ */ import_react12.default.createElement(import_react_native11.View, { style: styles6.errorBanner }, /* @__PURE__ */ import_react12.default.createElement(import_react_native11.Text, { style: styles6.errorText }, error)), /* @__PURE__ */ import_react12.default.createElement(
|
|
17370
17439
|
import_react_native11.TouchableOpacity,
|
|
17371
17440
|
{
|
|
17372
17441
|
style: [shared.primaryButton, (!description.trim() || submitting || images.isUploading) && shared.primaryButtonDisabled, { marginTop: 20 }],
|
|
@@ -17406,12 +17475,12 @@ var import_react13 = __toESM(require("react"));
|
|
|
17406
17475
|
var import_react_native12 = require("react-native");
|
|
17407
17476
|
function ReportSuccessScreen({ nav }) {
|
|
17408
17477
|
const { widgetColorScheme } = useBugBear();
|
|
17409
|
-
const
|
|
17478
|
+
const styles6 = (0, import_react13.useMemo)(() => createStyles6(), [widgetColorScheme]);
|
|
17410
17479
|
(0, import_react13.useEffect)(() => {
|
|
17411
17480
|
const timer = setTimeout(() => nav.reset(), 2e3);
|
|
17412
17481
|
return () => clearTimeout(timer);
|
|
17413
17482
|
}, [nav]);
|
|
17414
|
-
return /* @__PURE__ */ import_react13.default.createElement(import_react_native12.View, { style:
|
|
17483
|
+
return /* @__PURE__ */ import_react13.default.createElement(import_react_native12.View, { style: styles6.container }, /* @__PURE__ */ import_react13.default.createElement(import_react_native12.Text, { style: styles6.emoji }, "\u{1F389}"), /* @__PURE__ */ import_react13.default.createElement(import_react_native12.Text, { style: styles6.title }, "Report submitted!"), /* @__PURE__ */ import_react13.default.createElement(import_react_native12.Text, { style: styles6.subtitle }, "Thank you for your feedback"));
|
|
17415
17484
|
}
|
|
17416
17485
|
function createStyles6() {
|
|
17417
17486
|
return import_react_native12.StyleSheet.create({
|
|
@@ -17427,7 +17496,7 @@ var import_react14 = __toESM(require("react"));
|
|
|
17427
17496
|
var import_react_native13 = require("react-native");
|
|
17428
17497
|
function MessageListScreen({ nav }) {
|
|
17429
17498
|
const { threads, unreadCount, refreshThreads, dashboardUrl, isLoading, widgetColorScheme } = useBugBear();
|
|
17430
|
-
const
|
|
17499
|
+
const styles6 = (0, import_react14.useMemo)(() => createStyles7(), [widgetColorScheme]);
|
|
17431
17500
|
const [activeFilter, setActiveFilter] = (0, import_react14.useState)("all");
|
|
17432
17501
|
const filteredThreads = threads.filter((thread) => {
|
|
17433
17502
|
if (activeFilter === "all") return true;
|
|
@@ -17445,10 +17514,10 @@ function MessageListScreen({ nav }) {
|
|
|
17445
17514
|
return /* @__PURE__ */ import_react14.default.createElement(import_react_native13.View, null, /* @__PURE__ */ import_react14.default.createElement(
|
|
17446
17515
|
import_react_native13.TouchableOpacity,
|
|
17447
17516
|
{
|
|
17448
|
-
style:
|
|
17517
|
+
style: styles6.newMsgButton,
|
|
17449
17518
|
onPress: () => nav.push({ name: "COMPOSE_MESSAGE" })
|
|
17450
17519
|
},
|
|
17451
|
-
/* @__PURE__ */ import_react14.default.createElement(import_react_native13.Text, { style:
|
|
17520
|
+
/* @__PURE__ */ import_react14.default.createElement(import_react_native13.Text, { style: styles6.newMsgText }, "\u2709\uFE0F New Message")
|
|
17452
17521
|
), /* @__PURE__ */ import_react14.default.createElement(
|
|
17453
17522
|
import_react_native13.ScrollView,
|
|
17454
17523
|
{
|
|
@@ -17493,20 +17562,20 @@ function MessageListScreen({ nav }) {
|
|
|
17493
17562
|
import_react_native13.TouchableOpacity,
|
|
17494
17563
|
{
|
|
17495
17564
|
key: thread.id,
|
|
17496
|
-
style: [
|
|
17565
|
+
style: [styles6.threadItem, thread.unreadCount > 0 && styles6.threadItemUnread],
|
|
17497
17566
|
onPress: () => nav.push({ name: "THREAD_DETAIL", thread })
|
|
17498
17567
|
},
|
|
17499
|
-
/* @__PURE__ */ import_react14.default.createElement(import_react_native13.View, { style:
|
|
17500
|
-
/* @__PURE__ */ import_react14.default.createElement(import_react_native13.View, { style:
|
|
17568
|
+
/* @__PURE__ */ import_react14.default.createElement(import_react_native13.View, { style: styles6.threadLeft }, /* @__PURE__ */ import_react14.default.createElement(import_react_native13.Text, { style: styles6.threadIcon }, getThreadTypeIcon(thread.threadType)), /* @__PURE__ */ import_react14.default.createElement(import_react_native13.View, { style: styles6.threadInfo }, /* @__PURE__ */ import_react14.default.createElement(import_react_native13.View, { style: styles6.threadTitleRow }, thread.isPinned && /* @__PURE__ */ import_react14.default.createElement(import_react_native13.Text, { style: styles6.pinIcon }, "\u{1F4CC}"), /* @__PURE__ */ import_react14.default.createElement(import_react_native13.Text, { style: styles6.threadSubject, numberOfLines: 1 }, thread.subject || "No subject")), thread.threadType === "report" && thread.reporterName && /* @__PURE__ */ import_react14.default.createElement(import_react_native13.Text, { style: { fontSize: 11, color: colors.textMuted } }, "Reported by: ", thread.reporterName), thread.lastMessage && /* @__PURE__ */ import_react14.default.createElement(import_react_native13.Text, { style: styles6.threadPreview, numberOfLines: 1 }, thread.lastMessage.senderName, ": ", thread.lastMessage.content))),
|
|
17569
|
+
/* @__PURE__ */ import_react14.default.createElement(import_react_native13.View, { style: styles6.threadRight }, /* @__PURE__ */ import_react14.default.createElement(import_react_native13.Text, { style: styles6.threadTime }, formatRelativeTime(thread.lastMessageAt)), thread.unreadCount > 0 && /* @__PURE__ */ import_react14.default.createElement(import_react_native13.View, { style: styles6.unreadBadge }, /* @__PURE__ */ import_react14.default.createElement(import_react_native13.Text, { style: styles6.unreadText }, thread.unreadCount)), thread.priority !== "normal" && /* @__PURE__ */ import_react14.default.createElement(import_react_native13.View, { style: [styles6.priorityDot, { backgroundColor: getPriorityColor(thread.priority) }] }))
|
|
17501
17570
|
))), dashboardUrl && /* @__PURE__ */ import_react14.default.createElement(
|
|
17502
17571
|
import_react_native13.TouchableOpacity,
|
|
17503
17572
|
{
|
|
17504
|
-
style:
|
|
17573
|
+
style: styles6.dashboardLink,
|
|
17505
17574
|
onPress: () => import_react_native13.Linking.openURL(`${dashboardUrl}/discussions`),
|
|
17506
17575
|
activeOpacity: 0.7
|
|
17507
17576
|
},
|
|
17508
|
-
/* @__PURE__ */ import_react14.default.createElement(import_react_native13.Text, { style:
|
|
17509
|
-
), /* @__PURE__ */ import_react14.default.createElement(import_react_native13.View, { style:
|
|
17577
|
+
/* @__PURE__ */ import_react14.default.createElement(import_react_native13.Text, { style: styles6.dashboardLinkText }, "\u{1F310}", " View on Dashboard ", "\u2192")
|
|
17578
|
+
), /* @__PURE__ */ import_react14.default.createElement(import_react_native13.View, { style: styles6.footer }, /* @__PURE__ */ import_react14.default.createElement(import_react_native13.Text, { style: styles6.footerText }, filteredThreads.length, " thread", filteredThreads.length !== 1 ? "s" : "", " \xB7 ", unreadCount, " unread"), /* @__PURE__ */ import_react14.default.createElement(import_react_native13.TouchableOpacity, { onPress: refreshThreads }, /* @__PURE__ */ import_react14.default.createElement(import_react_native13.Text, { style: styles6.refreshText }, "\u21BB Refresh"))));
|
|
17510
17579
|
}
|
|
17511
17580
|
function createStyles7() {
|
|
17512
17581
|
return import_react_native13.StyleSheet.create({
|
|
@@ -17539,7 +17608,7 @@ var import_react15 = __toESM(require("react"));
|
|
|
17539
17608
|
var import_react_native14 = require("react-native");
|
|
17540
17609
|
function ThreadDetailScreen({ thread, nav }) {
|
|
17541
17610
|
const { getThreadMessages, sendMessage, markAsRead, uploadImage, widgetColorScheme } = useBugBear();
|
|
17542
|
-
const
|
|
17611
|
+
const styles6 = (0, import_react15.useMemo)(() => createStyles8(), [widgetColorScheme]);
|
|
17543
17612
|
const [messages, setMessages] = (0, import_react15.useState)([]);
|
|
17544
17613
|
const [loading, setLoading] = (0, import_react15.useState)(true);
|
|
17545
17614
|
const [replyText, setReplyText] = (0, import_react15.useState)("");
|
|
@@ -17591,20 +17660,20 @@ function ThreadDetailScreen({ thread, nav }) {
|
|
|
17591
17660
|
}
|
|
17592
17661
|
setSending(false);
|
|
17593
17662
|
};
|
|
17594
|
-
return /* @__PURE__ */ import_react15.default.createElement(import_react_native14.View, { style:
|
|
17663
|
+
return /* @__PURE__ */ import_react15.default.createElement(import_react_native14.View, { style: styles6.container }, /* @__PURE__ */ import_react15.default.createElement(import_react_native14.View, { style: styles6.header }, /* @__PURE__ */ import_react15.default.createElement(import_react_native14.Text, { style: styles6.headerIcon }, getThreadTypeIcon(thread.threadType)), /* @__PURE__ */ import_react15.default.createElement(import_react_native14.Text, { style: styles6.headerSubject, numberOfLines: 2 }, thread.subject || "No subject")), loading ? /* @__PURE__ */ import_react15.default.createElement(import_react_native14.View, { style: styles6.loadingContainer }, /* @__PURE__ */ import_react15.default.createElement(import_react_native14.Text, { style: styles6.loadingText }, "Loading messages...")) : /* @__PURE__ */ import_react15.default.createElement(import_react_native14.View, { style: styles6.messagesContainer }, messages.map((msg) => /* @__PURE__ */ import_react15.default.createElement(
|
|
17595
17664
|
import_react_native14.View,
|
|
17596
17665
|
{
|
|
17597
17666
|
key: msg.id,
|
|
17598
|
-
style: [
|
|
17667
|
+
style: [styles6.bubble, msg.senderType === "tester" ? styles6.bubbleTester : styles6.bubbleAdmin]
|
|
17599
17668
|
},
|
|
17600
|
-
/* @__PURE__ */ import_react15.default.createElement(import_react_native14.Text, { style: [
|
|
17601
|
-
/* @__PURE__ */ import_react15.default.createElement(import_react_native14.Text, { style: [
|
|
17602
|
-
msg.attachments && msg.attachments.length > 0 && /* @__PURE__ */ import_react15.default.createElement(import_react_native14.View, { style:
|
|
17603
|
-
/* @__PURE__ */ import_react15.default.createElement(import_react_native14.Text, { style: [
|
|
17604
|
-
))), sendError && /* @__PURE__ */ import_react15.default.createElement(import_react_native14.View, { style:
|
|
17669
|
+
/* @__PURE__ */ import_react15.default.createElement(import_react_native14.Text, { style: [styles6.sender, msg.senderType === "tester" && styles6.senderTester] }, msg.senderType === "tester" ? "You" : msg.senderName),
|
|
17670
|
+
/* @__PURE__ */ import_react15.default.createElement(import_react_native14.Text, { style: [styles6.content, msg.senderType === "tester" && styles6.contentTester] }, msg.content),
|
|
17671
|
+
msg.attachments && msg.attachments.length > 0 && /* @__PURE__ */ import_react15.default.createElement(import_react_native14.View, { style: styles6.attachments }, msg.attachments.filter((a) => a.type === "image").map((att, idx) => /* @__PURE__ */ import_react15.default.createElement(import_react_native14.Image, { key: idx, source: { uri: att.url }, style: styles6.attachmentImage, resizeMode: "cover" }))),
|
|
17672
|
+
/* @__PURE__ */ import_react15.default.createElement(import_react_native14.Text, { style: [styles6.time, msg.senderType === "tester" && styles6.timeTester] }, formatMessageTime(msg.createdAt))
|
|
17673
|
+
))), sendError && /* @__PURE__ */ import_react15.default.createElement(import_react_native14.View, { style: styles6.errorBar }, /* @__PURE__ */ import_react15.default.createElement(import_react_native14.Text, { style: styles6.errorText }, "Failed to send. Tap Send to retry.")), replyImages.images.length > 0 && /* @__PURE__ */ import_react15.default.createElement(import_react_native14.View, { style: styles6.replyPreview }, /* @__PURE__ */ import_react15.default.createElement(ImagePreviewStrip, { images: replyImages.images, onRemove: replyImages.removeImage })), /* @__PURE__ */ import_react15.default.createElement(import_react_native14.View, { style: styles6.composer }, IMAGE_PICKER_AVAILABLE && /* @__PURE__ */ import_react15.default.createElement(import_react_native14.TouchableOpacity, { style: styles6.attachBtn, onPress: replyImages.pickFromGallery, disabled: replyImages.images.length >= 3 }, /* @__PURE__ */ import_react15.default.createElement(import_react_native14.Text, { style: styles6.attachBtnText }, "\u{1F4CE}")), /* @__PURE__ */ import_react15.default.createElement(
|
|
17605
17674
|
import_react_native14.TextInput,
|
|
17606
17675
|
{
|
|
17607
|
-
style:
|
|
17676
|
+
style: styles6.replyInput,
|
|
17608
17677
|
value: replyText,
|
|
17609
17678
|
onChangeText: setReplyText,
|
|
17610
17679
|
placeholder: "Type a reply...",
|
|
@@ -17615,11 +17684,11 @@ function ThreadDetailScreen({ thread, nav }) {
|
|
|
17615
17684
|
), /* @__PURE__ */ import_react15.default.createElement(
|
|
17616
17685
|
import_react_native14.TouchableOpacity,
|
|
17617
17686
|
{
|
|
17618
|
-
style: [
|
|
17687
|
+
style: [styles6.sendBtn, (!replyText.trim() && replyImages.images.length === 0 || sending || replyImages.isUploading) && styles6.sendBtnDisabled],
|
|
17619
17688
|
onPress: handleSend,
|
|
17620
17689
|
disabled: !replyText.trim() && replyImages.images.length === 0 || sending || replyImages.isUploading
|
|
17621
17690
|
},
|
|
17622
|
-
/* @__PURE__ */ import_react15.default.createElement(import_react_native14.Text, { style:
|
|
17691
|
+
/* @__PURE__ */ import_react15.default.createElement(import_react_native14.Text, { style: styles6.sendBtnText }, sending ? "..." : "Send")
|
|
17623
17692
|
)));
|
|
17624
17693
|
}
|
|
17625
17694
|
function createStyles8() {
|
|
@@ -17660,7 +17729,7 @@ var import_react16 = __toESM(require("react"));
|
|
|
17660
17729
|
var import_react_native15 = require("react-native");
|
|
17661
17730
|
function ComposeMessageScreen({ nav }) {
|
|
17662
17731
|
const { createThread, uploadImage, widgetColorScheme } = useBugBear();
|
|
17663
|
-
const
|
|
17732
|
+
const styles6 = (0, import_react16.useMemo)(() => createStyles9(), [widgetColorScheme]);
|
|
17664
17733
|
const [subject, setSubject] = (0, import_react16.useState)("");
|
|
17665
17734
|
const [message, setMessage] = (0, import_react16.useState)("");
|
|
17666
17735
|
const [sending, setSending] = (0, import_react16.useState)(false);
|
|
@@ -17679,10 +17748,10 @@ function ComposeMessageScreen({ nav }) {
|
|
|
17679
17748
|
nav.pop();
|
|
17680
17749
|
}
|
|
17681
17750
|
};
|
|
17682
|
-
return /* @__PURE__ */ import_react16.default.createElement(import_react_native15.View, null, /* @__PURE__ */ import_react16.default.createElement(import_react_native15.View, { style:
|
|
17751
|
+
return /* @__PURE__ */ import_react16.default.createElement(import_react_native15.View, null, /* @__PURE__ */ import_react16.default.createElement(import_react_native15.View, { style: styles6.header }, /* @__PURE__ */ import_react16.default.createElement(import_react_native15.Text, { style: styles6.title }, "New Message"), /* @__PURE__ */ import_react16.default.createElement(import_react_native15.Text, { style: styles6.subtitle }, "Send a message to the QA team")), /* @__PURE__ */ import_react16.default.createElement(import_react_native15.View, { style: styles6.form }, /* @__PURE__ */ import_react16.default.createElement(import_react_native15.Text, { style: shared.label }, "Subject"), /* @__PURE__ */ import_react16.default.createElement(
|
|
17683
17752
|
import_react_native15.TextInput,
|
|
17684
17753
|
{
|
|
17685
|
-
style:
|
|
17754
|
+
style: styles6.subjectInput,
|
|
17686
17755
|
value: subject,
|
|
17687
17756
|
onChangeText: setSubject,
|
|
17688
17757
|
placeholder: "What's this about?",
|
|
@@ -17692,7 +17761,7 @@ function ComposeMessageScreen({ nav }) {
|
|
|
17692
17761
|
), /* @__PURE__ */ import_react16.default.createElement(import_react_native15.Text, { style: [shared.label, { marginTop: 16 }] }, "Message"), /* @__PURE__ */ import_react16.default.createElement(
|
|
17693
17762
|
import_react_native15.TextInput,
|
|
17694
17763
|
{
|
|
17695
|
-
style:
|
|
17764
|
+
style: styles6.messageInput,
|
|
17696
17765
|
value: message,
|
|
17697
17766
|
onChangeText: setMessage,
|
|
17698
17767
|
placeholder: "Write your message...",
|
|
@@ -17737,7 +17806,7 @@ var import_react17 = __toESM(require("react"));
|
|
|
17737
17806
|
var import_react_native16 = require("react-native");
|
|
17738
17807
|
function ProfileScreen({ nav }) {
|
|
17739
17808
|
const { testerInfo, assignments, updateTesterProfile, refreshTesterInfo, widgetColorScheme } = useBugBear();
|
|
17740
|
-
const
|
|
17809
|
+
const styles6 = (0, import_react17.useMemo)(() => createStyles10(), [widgetColorScheme]);
|
|
17741
17810
|
const [editing, setEditing] = (0, import_react17.useState)(false);
|
|
17742
17811
|
const [name, setName] = (0, import_react17.useState)(testerInfo?.name || "");
|
|
17743
17812
|
const [additionalEmails, setAdditionalEmails] = (0, import_react17.useState)(testerInfo?.additionalEmails || []);
|
|
@@ -17788,13 +17857,13 @@ function ProfileScreen({ nav }) {
|
|
|
17788
17857
|
return /* @__PURE__ */ import_react17.default.createElement(import_react_native16.View, { style: shared.emptyState }, /* @__PURE__ */ import_react17.default.createElement(import_react_native16.Text, { style: shared.emptyEmoji }, "\u{1F464}"), /* @__PURE__ */ import_react17.default.createElement(import_react_native16.Text, { style: shared.emptyTitle }, "No profile found"));
|
|
17789
17858
|
}
|
|
17790
17859
|
if (editing) {
|
|
17791
|
-
return /* @__PURE__ */ import_react17.default.createElement(import_react_native16.View, null, /* @__PURE__ */ import_react17.default.createElement(import_react_native16.View, { style:
|
|
17860
|
+
return /* @__PURE__ */ import_react17.default.createElement(import_react_native16.View, null, /* @__PURE__ */ import_react17.default.createElement(import_react_native16.View, { style: styles6.editHeader }, /* @__PURE__ */ import_react17.default.createElement(import_react_native16.Text, { style: styles6.editTitle }, "Edit Profile"), /* @__PURE__ */ import_react17.default.createElement(import_react_native16.TouchableOpacity, { onPress: () => {
|
|
17792
17861
|
setEditing(false);
|
|
17793
17862
|
setNewEmailInput("");
|
|
17794
|
-
} }, /* @__PURE__ */ import_react17.default.createElement(import_react_native16.Text, { style:
|
|
17863
|
+
} }, /* @__PURE__ */ import_react17.default.createElement(import_react_native16.Text, { style: styles6.cancelText }, "Cancel"))), /* @__PURE__ */ import_react17.default.createElement(import_react_native16.View, { style: styles6.field }, /* @__PURE__ */ import_react17.default.createElement(import_react_native16.Text, { style: shared.label }, "Name"), /* @__PURE__ */ import_react17.default.createElement(import_react_native16.TextInput, { style: styles6.input, value: name, onChangeText: setName, placeholder: "Your name", placeholderTextColor: colors.textMuted })), /* @__PURE__ */ import_react17.default.createElement(import_react_native16.View, { style: styles6.field }, /* @__PURE__ */ import_react17.default.createElement(import_react_native16.Text, { style: shared.label }, "Primary Email"), /* @__PURE__ */ import_react17.default.createElement(import_react_native16.Text, { style: styles6.emailFixed }, testerInfo.email)), /* @__PURE__ */ import_react17.default.createElement(import_react_native16.View, { style: styles6.field }, /* @__PURE__ */ import_react17.default.createElement(import_react_native16.Text, { style: shared.label }, "Additional Emails"), additionalEmails.map((email) => /* @__PURE__ */ import_react17.default.createElement(import_react_native16.View, { key: email, style: styles6.emailRow }, /* @__PURE__ */ import_react17.default.createElement(import_react_native16.Text, { style: styles6.emailText }, email), /* @__PURE__ */ import_react17.default.createElement(import_react_native16.TouchableOpacity, { onPress: () => setAdditionalEmails(additionalEmails.filter((e) => e !== email)) }, /* @__PURE__ */ import_react17.default.createElement(import_react_native16.Text, { style: styles6.removeEmail }, "\u2715")))), /* @__PURE__ */ import_react17.default.createElement(import_react_native16.View, { style: styles6.addEmailRow }, /* @__PURE__ */ import_react17.default.createElement(
|
|
17795
17864
|
import_react_native16.TextInput,
|
|
17796
17865
|
{
|
|
17797
|
-
style: [
|
|
17866
|
+
style: [styles6.input, { flex: 1, marginRight: 8 }],
|
|
17798
17867
|
value: newEmailInput,
|
|
17799
17868
|
onChangeText: setNewEmailInput,
|
|
17800
17869
|
placeholder: "Add email",
|
|
@@ -17802,17 +17871,17 @@ function ProfileScreen({ nav }) {
|
|
|
17802
17871
|
keyboardType: "email-address",
|
|
17803
17872
|
autoCapitalize: "none"
|
|
17804
17873
|
}
|
|
17805
|
-
), /* @__PURE__ */ import_react17.default.createElement(import_react_native16.TouchableOpacity, { style:
|
|
17874
|
+
), /* @__PURE__ */ import_react17.default.createElement(import_react_native16.TouchableOpacity, { style: styles6.addButton, onPress: handleAddEmail }, /* @__PURE__ */ import_react17.default.createElement(import_react_native16.Text, { style: styles6.addButtonText }, "Add")))), /* @__PURE__ */ import_react17.default.createElement(import_react_native16.View, { style: styles6.field }, /* @__PURE__ */ import_react17.default.createElement(import_react_native16.Text, { style: shared.label }, "Testing Platforms"), /* @__PURE__ */ import_react17.default.createElement(import_react_native16.View, { style: styles6.platformRow }, [{ key: "ios", label: "\u{1F4F1} iOS" }, { key: "android", label: "\u{1F916} Android" }, { key: "web", label: "\u{1F310} Web" }].map(({ key, label }) => /* @__PURE__ */ import_react17.default.createElement(
|
|
17806
17875
|
import_react_native16.TouchableOpacity,
|
|
17807
17876
|
{
|
|
17808
17877
|
key,
|
|
17809
|
-
style: [
|
|
17878
|
+
style: [styles6.platformBtn, platforms.includes(key) && styles6.platformBtnActive],
|
|
17810
17879
|
onPress: () => setPlatforms((prev) => prev.includes(key) ? prev.filter((p) => p !== key) : [...prev, key])
|
|
17811
17880
|
},
|
|
17812
|
-
/* @__PURE__ */ import_react17.default.createElement(import_react_native16.Text, { style: [
|
|
17881
|
+
/* @__PURE__ */ import_react17.default.createElement(import_react_native16.Text, { style: [styles6.platformText, platforms.includes(key) && styles6.platformTextActive] }, label)
|
|
17813
17882
|
)))), /* @__PURE__ */ import_react17.default.createElement(import_react_native16.TouchableOpacity, { style: [shared.primaryButton, { marginTop: 20 }], onPress: handleSave, disabled: saving }, /* @__PURE__ */ import_react17.default.createElement(import_react_native16.Text, { style: shared.primaryButtonText }, saving ? "Saving..." : "Save Profile")));
|
|
17814
17883
|
}
|
|
17815
|
-
return /* @__PURE__ */ import_react17.default.createElement(import_react_native16.View, null, /* @__PURE__ */ import_react17.default.createElement(import_react_native16.View, { style:
|
|
17884
|
+
return /* @__PURE__ */ import_react17.default.createElement(import_react_native16.View, null, /* @__PURE__ */ import_react17.default.createElement(import_react_native16.View, { style: styles6.profileCard }, /* @__PURE__ */ import_react17.default.createElement(import_react_native16.View, { style: styles6.avatar }, /* @__PURE__ */ import_react17.default.createElement(import_react_native16.Text, { style: styles6.avatarText }, testerInfo.name.charAt(0).toUpperCase())), /* @__PURE__ */ import_react17.default.createElement(import_react_native16.Text, { style: styles6.profileName }, testerInfo.name), /* @__PURE__ */ import_react17.default.createElement(import_react_native16.Text, { style: styles6.profileEmail }, testerInfo.email)), /* @__PURE__ */ import_react17.default.createElement(import_react_native16.View, { style: styles6.statsRow }, /* @__PURE__ */ import_react17.default.createElement(import_react_native16.View, { style: styles6.statItem }, /* @__PURE__ */ import_react17.default.createElement(import_react_native16.Text, { style: styles6.statNumber }, completedCount), /* @__PURE__ */ import_react17.default.createElement(import_react_native16.Text, { style: styles6.statLabel }, "Completed")), /* @__PURE__ */ import_react17.default.createElement(import_react_native16.View, { style: styles6.statDivider }), /* @__PURE__ */ import_react17.default.createElement(import_react_native16.View, { style: styles6.statItem }, /* @__PURE__ */ import_react17.default.createElement(import_react_native16.Text, { style: styles6.statNumber }, assignments.length), /* @__PURE__ */ import_react17.default.createElement(import_react_native16.Text, { style: styles6.statLabel }, "Total Assigned"))), /* @__PURE__ */ import_react17.default.createElement(import_react_native16.TouchableOpacity, { onPress: () => setShowDetails(!showDetails), style: styles6.detailsToggle }, /* @__PURE__ */ import_react17.default.createElement(import_react_native16.Text, { style: styles6.detailsToggleText }, showDetails ? "\u25BC" : "\u25B6", " Details")), showDetails && /* @__PURE__ */ import_react17.default.createElement(import_react_native16.View, { style: styles6.detailsSection }, additionalEmails.length > 0 && /* @__PURE__ */ import_react17.default.createElement(import_react_native16.View, { style: styles6.detailBlock }, /* @__PURE__ */ import_react17.default.createElement(import_react_native16.Text, { style: styles6.detailLabel }, "Additional Emails"), additionalEmails.map((e) => /* @__PURE__ */ import_react17.default.createElement(import_react_native16.Text, { key: e, style: styles6.detailValue }, e))), platforms.length > 0 && /* @__PURE__ */ import_react17.default.createElement(import_react_native16.View, { style: styles6.detailBlock }, /* @__PURE__ */ import_react17.default.createElement(import_react_native16.Text, { style: styles6.detailLabel }, "Platforms"), /* @__PURE__ */ import_react17.default.createElement(import_react_native16.View, { style: styles6.platformTags }, platforms.map((p) => /* @__PURE__ */ import_react17.default.createElement(import_react_native16.View, { key: p, style: styles6.platformTag }, /* @__PURE__ */ import_react17.default.createElement(import_react_native16.Text, { style: styles6.platformTagText }, p === "ios" ? "\u{1F4F1} iOS" : p === "android" ? "\u{1F916} Android" : "\u{1F310} Web")))))), /* @__PURE__ */ import_react17.default.createElement(
|
|
17816
17885
|
import_react_native16.TouchableOpacity,
|
|
17817
17886
|
{
|
|
17818
17887
|
style: [shared.primaryButton, { marginTop: 20 }],
|
|
@@ -17870,7 +17939,7 @@ var CATEGORIES = ["open", "done", "reopened"];
|
|
|
17870
17939
|
var SEVERITY_ORDER2 = { critical: 0, high: 1, medium: 2, low: 3 };
|
|
17871
17940
|
function IssueListScreen({ nav, category }) {
|
|
17872
17941
|
const { client, widgetColorScheme } = useBugBear();
|
|
17873
|
-
const
|
|
17942
|
+
const styles6 = (0, import_react18.useMemo)(() => createStyles11(), [widgetColorScheme]);
|
|
17874
17943
|
const CATEGORY_CONFIG = (0, import_react18.useMemo)(() => ({
|
|
17875
17944
|
open: { label: "Open", accent: colors.orange, emptyIcon: "\u2705", emptyText: "No open issues" },
|
|
17876
17945
|
done: { label: "Done", accent: colors.green, emptyIcon: "\u{1F389}", emptyText: "No completed issues yet" },
|
|
@@ -17940,7 +18009,7 @@ function IssueListScreen({ nav, category }) {
|
|
|
17940
18009
|
const searchFilteredIssues = debouncedQuery ? sortedIssues.filter(
|
|
17941
18010
|
(issue) => (issue.title || "").toLowerCase().includes(debouncedQuery.toLowerCase()) || (issue.description || "").toLowerCase().includes(debouncedQuery.toLowerCase())
|
|
17942
18011
|
) : sortedIssues;
|
|
17943
|
-
return /* @__PURE__ */ import_react18.default.createElement(import_react_native17.View, null, /* @__PURE__ */ import_react18.default.createElement(import_react_native17.View, { style:
|
|
18012
|
+
return /* @__PURE__ */ import_react18.default.createElement(import_react_native17.View, null, /* @__PURE__ */ import_react18.default.createElement(import_react_native17.View, { style: styles6.tabBar }, CATEGORIES.map((cat) => {
|
|
17944
18013
|
const catConfig = CATEGORY_CONFIG[cat];
|
|
17945
18014
|
const isActive = activeCategory === cat;
|
|
17946
18015
|
const count = counts?.[cat];
|
|
@@ -17949,7 +18018,7 @@ function IssueListScreen({ nav, category }) {
|
|
|
17949
18018
|
{
|
|
17950
18019
|
key: cat,
|
|
17951
18020
|
style: [
|
|
17952
|
-
|
|
18021
|
+
styles6.tab,
|
|
17953
18022
|
{ borderBottomColor: isActive ? catConfig.accent : "transparent" }
|
|
17954
18023
|
],
|
|
17955
18024
|
onPress: () => {
|
|
@@ -17959,20 +18028,20 @@ function IssueListScreen({ nav, category }) {
|
|
|
17959
18028
|
activeOpacity: 0.7
|
|
17960
18029
|
},
|
|
17961
18030
|
/* @__PURE__ */ import_react18.default.createElement(import_react_native17.Text, { style: [
|
|
17962
|
-
|
|
18031
|
+
styles6.tabLabel,
|
|
17963
18032
|
isActive && { fontWeight: "600", color: colors.textPrimary }
|
|
17964
18033
|
] }, catConfig.label),
|
|
17965
18034
|
count !== void 0 && /* @__PURE__ */ import_react18.default.createElement(import_react_native17.View, { style: [
|
|
17966
|
-
|
|
18035
|
+
styles6.countBadge,
|
|
17967
18036
|
{
|
|
17968
18037
|
backgroundColor: isActive ? catConfig.accent + "18" : colors.card
|
|
17969
18038
|
}
|
|
17970
18039
|
] }, /* @__PURE__ */ import_react18.default.createElement(import_react_native17.Text, { style: [
|
|
17971
|
-
|
|
18040
|
+
styles6.countText,
|
|
17972
18041
|
{ color: isActive ? catConfig.accent : colors.textDim }
|
|
17973
18042
|
] }, count))
|
|
17974
18043
|
);
|
|
17975
|
-
})), /* @__PURE__ */ import_react18.default.createElement(import_react_native17.View, { style:
|
|
18044
|
+
})), /* @__PURE__ */ import_react18.default.createElement(import_react_native17.View, { style: styles6.sortRow }, [
|
|
17976
18045
|
{ key: "severity", label: "Severity" },
|
|
17977
18046
|
{ key: "recent", label: "Recent" }
|
|
17978
18047
|
].map((s2) => /* @__PURE__ */ import_react18.default.createElement(
|
|
@@ -17980,14 +18049,14 @@ function IssueListScreen({ nav, category }) {
|
|
|
17980
18049
|
{
|
|
17981
18050
|
key: s2.key,
|
|
17982
18051
|
style: [
|
|
17983
|
-
|
|
17984
|
-
sortMode === s2.key &&
|
|
18052
|
+
styles6.sortBtn,
|
|
18053
|
+
sortMode === s2.key && styles6.sortBtnActive
|
|
17985
18054
|
],
|
|
17986
18055
|
onPress: () => setSortMode(s2.key)
|
|
17987
18056
|
},
|
|
17988
18057
|
/* @__PURE__ */ import_react18.default.createElement(import_react_native17.Text, { style: [
|
|
17989
|
-
|
|
17990
|
-
sortMode === s2.key &&
|
|
18058
|
+
styles6.sortBtnText,
|
|
18059
|
+
sortMode === s2.key && styles6.sortBtnTextActive
|
|
17991
18060
|
] }, s2.label)
|
|
17992
18061
|
))), /* @__PURE__ */ import_react18.default.createElement(import_react_native17.View, { style: { paddingHorizontal: 16, paddingBottom: 12 } }, /* @__PURE__ */ import_react18.default.createElement(
|
|
17993
18062
|
import_react_native17.TextInput,
|
|
@@ -18007,18 +18076,18 @@ function IssueListScreen({ nav, category }) {
|
|
|
18007
18076
|
fontSize: 13
|
|
18008
18077
|
}
|
|
18009
18078
|
}
|
|
18010
|
-
)), loading ? /* @__PURE__ */ import_react18.default.createElement(IssueListScreenSkeleton, null) : searchFilteredIssues.length === 0 ? /* @__PURE__ */ import_react18.default.createElement(import_react_native17.View, { style:
|
|
18079
|
+
)), loading ? /* @__PURE__ */ import_react18.default.createElement(IssueListScreenSkeleton, null) : searchFilteredIssues.length === 0 ? /* @__PURE__ */ import_react18.default.createElement(import_react_native17.View, { style: styles6.emptyContainer }, /* @__PURE__ */ import_react18.default.createElement(import_react_native17.Text, { style: styles6.emptyIcon }, debouncedQuery ? "\u{1F50D}" : config.emptyIcon), /* @__PURE__ */ import_react18.default.createElement(import_react_native17.Text, { style: styles6.emptyText }, debouncedQuery ? "No matching issues" : config.emptyText)) : searchFilteredIssues.map((issue) => /* @__PURE__ */ import_react18.default.createElement(
|
|
18011
18080
|
import_react_native17.TouchableOpacity,
|
|
18012
18081
|
{
|
|
18013
18082
|
key: issue.id,
|
|
18014
|
-
style:
|
|
18083
|
+
style: styles6.issueCard,
|
|
18015
18084
|
onPress: () => nav.push({ name: "ISSUE_DETAIL", issue }),
|
|
18016
18085
|
activeOpacity: 0.7
|
|
18017
18086
|
},
|
|
18018
|
-
/* @__PURE__ */ import_react18.default.createElement(import_react_native17.View, { style:
|
|
18019
|
-
/* @__PURE__ */ import_react18.default.createElement(import_react_native17.View, { style:
|
|
18020
|
-
activeCategory === "done" && issue.verifiedByName && /* @__PURE__ */ import_react18.default.createElement(import_react_native17.View, { style:
|
|
18021
|
-
activeCategory === "reopened" && issue.originalBugTitle && /* @__PURE__ */ import_react18.default.createElement(import_react_native17.View, { style:
|
|
18087
|
+
/* @__PURE__ */ import_react18.default.createElement(import_react_native17.View, { style: styles6.topRow }, issue.severity && /* @__PURE__ */ import_react18.default.createElement(import_react_native17.View, { style: [styles6.severityDot, { backgroundColor: SEVERITY_COLORS[issue.severity] || colors.textDim }] }), /* @__PURE__ */ import_react18.default.createElement(import_react_native17.Text, { style: styles6.issueTitle, numberOfLines: 1 }, issue.title)),
|
|
18088
|
+
/* @__PURE__ */ import_react18.default.createElement(import_react_native17.View, { style: styles6.bottomRow }, issue.route && /* @__PURE__ */ import_react18.default.createElement(import_react_native17.Text, { style: styles6.routeText, numberOfLines: 1 }, issue.route), /* @__PURE__ */ import_react18.default.createElement(import_react_native17.Text, { style: styles6.timeText }, formatRelativeTime(issue.updatedAt))),
|
|
18089
|
+
activeCategory === "done" && issue.verifiedByName && /* @__PURE__ */ import_react18.default.createElement(import_react_native17.View, { style: styles6.verifiedBadge }, /* @__PURE__ */ import_react18.default.createElement(import_react_native17.Text, { style: styles6.verifiedBadgeText }, "\u2714", " Verified by ", issue.verifiedByName)),
|
|
18090
|
+
activeCategory === "reopened" && issue.originalBugTitle && /* @__PURE__ */ import_react18.default.createElement(import_react_native17.View, { style: styles6.reopenedBadge }, /* @__PURE__ */ import_react18.default.createElement(import_react_native17.Text, { style: styles6.reopenedBadgeText, numberOfLines: 1 }, "\u{1F504}", " Retest of: ", issue.originalBugTitle))
|
|
18022
18091
|
)));
|
|
18023
18092
|
}
|
|
18024
18093
|
function createStyles11() {
|
|
@@ -18177,7 +18246,7 @@ var import_react_native18 = require("react-native");
|
|
|
18177
18246
|
var DONE_STATUSES = ["verified", "resolved", "closed", "reviewed"];
|
|
18178
18247
|
function IssueDetailScreen({ nav, issue }) {
|
|
18179
18248
|
const { dashboardUrl, widgetColorScheme, reopenReport } = useBugBear();
|
|
18180
|
-
const
|
|
18249
|
+
const styles6 = (0, import_react19.useMemo)(() => createStyles12(), [widgetColorScheme]);
|
|
18181
18250
|
const [showReopenForm, setShowReopenForm] = (0, import_react19.useState)(false);
|
|
18182
18251
|
const [reopenReason, setReopenReason] = (0, import_react19.useState)("");
|
|
18183
18252
|
const [isSubmitting, setIsSubmitting] = (0, import_react19.useState)(false);
|
|
@@ -18219,44 +18288,44 @@ function IssueDetailScreen({ nav, issue }) {
|
|
|
18219
18288
|
setReopenError(result.error || "Failed to reopen");
|
|
18220
18289
|
}
|
|
18221
18290
|
}, [reopenReason, reopenReport, issue.id]);
|
|
18222
|
-
return /* @__PURE__ */ import_react19.default.createElement(import_react_native18.View, null, /* @__PURE__ */ import_react19.default.createElement(import_react_native18.View, { style:
|
|
18291
|
+
return /* @__PURE__ */ import_react19.default.createElement(import_react_native18.View, null, /* @__PURE__ */ import_react19.default.createElement(import_react_native18.View, { style: styles6.badgeRow }, /* @__PURE__ */ import_react19.default.createElement(import_react_native18.View, { style: [styles6.badge, { backgroundColor: wasReopened ? colors.yellowDark : statusConfig.bg }] }, /* @__PURE__ */ import_react19.default.createElement(import_react_native18.Text, { style: [styles6.badgeText, { color: wasReopened ? colors.yellowLight : statusConfig.color }] }, wasReopened ? "Reopened" : statusConfig.label)), severityConfig && /* @__PURE__ */ import_react19.default.createElement(import_react_native18.View, { style: [styles6.badge, { backgroundColor: severityConfig.bg }] }, /* @__PURE__ */ import_react19.default.createElement(import_react_native18.Text, { style: [styles6.badgeText, { color: severityConfig.color }] }, severityConfig.label))), /* @__PURE__ */ import_react19.default.createElement(import_react_native18.Text, { style: styles6.title }, issue.title), issue.route && /* @__PURE__ */ import_react19.default.createElement(import_react_native18.Text, { style: styles6.route }, issue.route), issue.description && /* @__PURE__ */ import_react19.default.createElement(import_react_native18.View, { style: styles6.descriptionCard }, /* @__PURE__ */ import_react19.default.createElement(import_react_native18.Text, { style: styles6.descriptionText }, issue.description)), wasReopened && /* @__PURE__ */ import_react19.default.createElement(import_react_native18.View, { style: styles6.reopenedCard }, /* @__PURE__ */ import_react19.default.createElement(import_react_native18.View, { style: styles6.reopenedRow }, /* @__PURE__ */ import_react19.default.createElement(import_react_native18.Text, { style: styles6.reopenedIcon }, "\u{1F504}"), /* @__PURE__ */ import_react19.default.createElement(import_react_native18.Text, { style: styles6.reopenedText }, "Issue reopened \u2014 your team has been notified"))), issue.verifiedByName && !wasReopened && /* @__PURE__ */ import_react19.default.createElement(import_react_native18.View, { style: styles6.verifiedCard }, /* @__PURE__ */ import_react19.default.createElement(import_react_native18.View, { style: styles6.verifiedHeader }, /* @__PURE__ */ import_react19.default.createElement(import_react_native18.Text, { style: styles6.verifiedIcon }, "\u2705"), /* @__PURE__ */ import_react19.default.createElement(import_react_native18.Text, { style: styles6.verifiedTitle }, "Retesting Proof")), /* @__PURE__ */ import_react19.default.createElement(import_react_native18.Text, { style: styles6.verifiedBody }, "Verified by ", issue.verifiedByName, issue.verifiedAt && ` on ${new Date(issue.verifiedAt).toLocaleDateString(void 0, { month: "short", day: "numeric", year: "numeric" })}`)), issue.originalBugTitle && /* @__PURE__ */ import_react19.default.createElement(import_react_native18.View, { style: styles6.originalBugCard }, /* @__PURE__ */ import_react19.default.createElement(import_react_native18.View, { style: styles6.originalBugHeader }, /* @__PURE__ */ import_react19.default.createElement(import_react_native18.Text, { style: styles6.originalBugIcon }, "\u{1F504}"), /* @__PURE__ */ import_react19.default.createElement(import_react_native18.Text, { style: styles6.originalBugTitleText }, "Original Bug")), /* @__PURE__ */ import_react19.default.createElement(import_react_native18.Text, { style: styles6.originalBugBody }, "Retest of: ", issue.originalBugTitle)), isDone && !wasReopened && !showReopenForm && /* @__PURE__ */ import_react19.default.createElement(
|
|
18223
18292
|
import_react_native18.TouchableOpacity,
|
|
18224
18293
|
{
|
|
18225
|
-
style:
|
|
18294
|
+
style: styles6.reopenButton,
|
|
18226
18295
|
onPress: () => setShowReopenForm(true),
|
|
18227
18296
|
activeOpacity: 0.7
|
|
18228
18297
|
},
|
|
18229
|
-
/* @__PURE__ */ import_react19.default.createElement(import_react_native18.Text, { style:
|
|
18230
|
-
), showReopenForm && !wasReopened && /* @__PURE__ */ import_react19.default.createElement(import_react_native18.View, { style:
|
|
18298
|
+
/* @__PURE__ */ import_react19.default.createElement(import_react_native18.Text, { style: styles6.reopenButtonText }, "\u{1F504}", " Not Fixed \u2014 Reopen Issue")
|
|
18299
|
+
), showReopenForm && !wasReopened && /* @__PURE__ */ import_react19.default.createElement(import_react_native18.View, { style: styles6.reopenForm }, /* @__PURE__ */ import_react19.default.createElement(import_react_native18.Text, { style: styles6.reopenFormTitle }, "Why isn't this fixed?"), /* @__PURE__ */ import_react19.default.createElement(
|
|
18231
18300
|
import_react_native18.TextInput,
|
|
18232
18301
|
{
|
|
18233
18302
|
value: reopenReason,
|
|
18234
18303
|
onChangeText: setReopenReason,
|
|
18235
18304
|
placeholder: "Describe what you're still seeing...",
|
|
18236
18305
|
placeholderTextColor: colors.textMuted,
|
|
18237
|
-
style:
|
|
18306
|
+
style: styles6.reopenInput,
|
|
18238
18307
|
multiline: true,
|
|
18239
18308
|
autoFocus: true
|
|
18240
18309
|
}
|
|
18241
|
-
), reopenError && /* @__PURE__ */ import_react19.default.createElement(import_react_native18.Text, { style:
|
|
18310
|
+
), reopenError && /* @__PURE__ */ import_react19.default.createElement(import_react_native18.Text, { style: styles6.reopenErrorText }, reopenError), /* @__PURE__ */ import_react19.default.createElement(import_react_native18.View, { style: styles6.reopenActions }, /* @__PURE__ */ import_react19.default.createElement(
|
|
18242
18311
|
import_react_native18.TouchableOpacity,
|
|
18243
18312
|
{
|
|
18244
18313
|
style: [
|
|
18245
|
-
|
|
18246
|
-
(!reopenReason.trim() || isSubmitting) &&
|
|
18314
|
+
styles6.reopenSubmitButton,
|
|
18315
|
+
(!reopenReason.trim() || isSubmitting) && styles6.reopenSubmitDisabled
|
|
18247
18316
|
],
|
|
18248
18317
|
onPress: handleReopen,
|
|
18249
18318
|
disabled: isSubmitting || !reopenReason.trim(),
|
|
18250
18319
|
activeOpacity: 0.7
|
|
18251
18320
|
},
|
|
18252
18321
|
isSubmitting ? /* @__PURE__ */ import_react19.default.createElement(import_react_native18.ActivityIndicator, { size: "small", color: "#fff" }) : /* @__PURE__ */ import_react19.default.createElement(import_react_native18.Text, { style: [
|
|
18253
|
-
|
|
18254
|
-
!reopenReason.trim() &&
|
|
18322
|
+
styles6.reopenSubmitText,
|
|
18323
|
+
!reopenReason.trim() && styles6.reopenSubmitTextDisabled
|
|
18255
18324
|
] }, "Reopen Issue")
|
|
18256
18325
|
), /* @__PURE__ */ import_react19.default.createElement(
|
|
18257
18326
|
import_react_native18.TouchableOpacity,
|
|
18258
18327
|
{
|
|
18259
|
-
style:
|
|
18328
|
+
style: styles6.reopenCancelButton,
|
|
18260
18329
|
onPress: () => {
|
|
18261
18330
|
setShowReopenForm(false);
|
|
18262
18331
|
setReopenReason("");
|
|
@@ -18265,7 +18334,7 @@ function IssueDetailScreen({ nav, issue }) {
|
|
|
18265
18334
|
disabled: isSubmitting,
|
|
18266
18335
|
activeOpacity: 0.7
|
|
18267
18336
|
},
|
|
18268
|
-
/* @__PURE__ */ import_react19.default.createElement(import_react_native18.Text, { style:
|
|
18337
|
+
/* @__PURE__ */ import_react19.default.createElement(import_react_native18.Text, { style: styles6.reopenCancelText }, "Cancel")
|
|
18269
18338
|
))), issue.status === "ready_to_test" && (issue.fixCommitSha || issue.resolutionNotes) && /* @__PURE__ */ import_react19.default.createElement(import_react_native18.View, { style: {
|
|
18270
18339
|
backgroundColor: "rgba(59, 130, 246, 0.1)",
|
|
18271
18340
|
borderWidth: 1,
|
|
@@ -18273,14 +18342,14 @@ function IssueDetailScreen({ nav, issue }) {
|
|
|
18273
18342
|
borderRadius: 8,
|
|
18274
18343
|
padding: 12,
|
|
18275
18344
|
marginBottom: 12
|
|
18276
|
-
} }, /* @__PURE__ */ import_react19.default.createElement(import_react_native18.View, { style: { flexDirection: "row", alignItems: "center", gap: 6, marginBottom: 8 } }, /* @__PURE__ */ import_react19.default.createElement(import_react_native18.Text, { style: { fontSize: 13 } }, "\u{1F527}"), /* @__PURE__ */ import_react19.default.createElement(import_react_native18.Text, { style: { fontSize: 12, fontWeight: "600", color: "#60a5fa" } }, "Fix Details")), issue.resolutionNotes ? /* @__PURE__ */ import_react19.default.createElement(import_react_native18.Text, { style: { fontSize: 12, color: colors.textSecondary, marginBottom: 6, lineHeight: 17 } }, issue.resolutionNotes) : null, issue.fixCommitSha ? /* @__PURE__ */ import_react19.default.createElement(import_react_native18.Text, { style: { fontSize: 11, color: colors.textDim, fontFamily: "monospace" } }, "Commit: ", issue.fixCommitSha.slice(0, 7), issue.fixCommitMessage && ` \u2014 ${issue.fixCommitMessage}`) : null, issue.fixFilesChanged && issue.fixFilesChanged.length > 0 ? /* @__PURE__ */ import_react19.default.createElement(import_react_native18.Text, { style: { fontSize: 11, color: colors.textDim, marginTop: 4 } }, issue.fixFilesChanged.length, " file", issue.fixFilesChanged.length > 1 ? "s" : "", " changed") : null), issue.screenshotUrls && issue.screenshotUrls.length > 0 && /* @__PURE__ */ import_react19.default.createElement(import_react_native18.View, { style:
|
|
18345
|
+
} }, /* @__PURE__ */ import_react19.default.createElement(import_react_native18.View, { style: { flexDirection: "row", alignItems: "center", gap: 6, marginBottom: 8 } }, /* @__PURE__ */ import_react19.default.createElement(import_react_native18.Text, { style: { fontSize: 13 } }, "\u{1F527}"), /* @__PURE__ */ import_react19.default.createElement(import_react_native18.Text, { style: { fontSize: 12, fontWeight: "600", color: "#60a5fa" } }, "Fix Details")), issue.resolutionNotes ? /* @__PURE__ */ import_react19.default.createElement(import_react_native18.Text, { style: { fontSize: 12, color: colors.textSecondary, marginBottom: 6, lineHeight: 17 } }, issue.resolutionNotes) : null, issue.fixCommitSha ? /* @__PURE__ */ import_react19.default.createElement(import_react_native18.Text, { style: { fontSize: 11, color: colors.textDim, fontFamily: "monospace" } }, "Commit: ", issue.fixCommitSha.slice(0, 7), issue.fixCommitMessage && ` \u2014 ${issue.fixCommitMessage}`) : null, issue.fixFilesChanged && issue.fixFilesChanged.length > 0 ? /* @__PURE__ */ import_react19.default.createElement(import_react_native18.Text, { style: { fontSize: 11, color: colors.textDim, marginTop: 4 } }, issue.fixFilesChanged.length, " file", issue.fixFilesChanged.length > 1 ? "s" : "", " changed") : null), issue.screenshotUrls && issue.screenshotUrls.length > 0 && /* @__PURE__ */ import_react19.default.createElement(import_react_native18.View, { style: styles6.screenshotSection }, /* @__PURE__ */ import_react19.default.createElement(import_react_native18.Text, { style: styles6.screenshotLabel }, "Screenshots (", issue.screenshotUrls.length, ")"), /* @__PURE__ */ import_react19.default.createElement(import_react_native18.View, { style: styles6.screenshotRow }, issue.screenshotUrls.map((url, i) => /* @__PURE__ */ import_react19.default.createElement(import_react_native18.TouchableOpacity, { key: i, onPress: () => import_react_native18.Linking.openURL(url), activeOpacity: 0.7 }, /* @__PURE__ */ import_react19.default.createElement(import_react_native18.Image, { source: { uri: url }, style: styles6.screenshotThumb }))))), /* @__PURE__ */ import_react19.default.createElement(import_react_native18.View, { style: styles6.metaSection }, issue.reporterName && /* @__PURE__ */ import_react19.default.createElement(import_react_native18.Text, { style: styles6.metaText }, "Reported by ", issue.reporterName), /* @__PURE__ */ import_react19.default.createElement(import_react_native18.Text, { style: styles6.metaTextSmall }, "Created ", formatRelativeTime(issue.createdAt), " ", "\xB7", " Updated ", formatRelativeTime(issue.updatedAt))), dashboardUrl && /* @__PURE__ */ import_react19.default.createElement(
|
|
18277
18346
|
import_react_native18.TouchableOpacity,
|
|
18278
18347
|
{
|
|
18279
|
-
style:
|
|
18348
|
+
style: styles6.dashboardLink,
|
|
18280
18349
|
onPress: () => import_react_native18.Linking.openURL(`${dashboardUrl}/reports`),
|
|
18281
18350
|
activeOpacity: 0.7
|
|
18282
18351
|
},
|
|
18283
|
-
/* @__PURE__ */ import_react19.default.createElement(import_react_native18.Text, { style:
|
|
18352
|
+
/* @__PURE__ */ import_react19.default.createElement(import_react_native18.Text, { style: styles6.dashboardLinkText }, "\u{1F310}", " View on Dashboard ", "\u2192")
|
|
18284
18353
|
));
|
|
18285
18354
|
}
|
|
18286
18355
|
function createStyles12() {
|
|
@@ -18537,7 +18606,7 @@ var import_react20 = __toESM(require("react"));
|
|
|
18537
18606
|
var import_react_native19 = require("react-native");
|
|
18538
18607
|
function SessionStartScreen({ nav }) {
|
|
18539
18608
|
const { startSession, assignments, widgetColorScheme } = useBugBear();
|
|
18540
|
-
const
|
|
18609
|
+
const styles6 = (0, import_react20.useMemo)(() => createStyles13(), [widgetColorScheme]);
|
|
18541
18610
|
const [focusArea, setFocusArea] = (0, import_react20.useState)("");
|
|
18542
18611
|
const [isStarting, setIsStarting] = (0, import_react20.useState)(false);
|
|
18543
18612
|
const [error, setError] = (0, import_react20.useState)(null);
|
|
@@ -18564,35 +18633,35 @@ function SessionStartScreen({ nav }) {
|
|
|
18564
18633
|
setIsStarting(false);
|
|
18565
18634
|
}
|
|
18566
18635
|
};
|
|
18567
|
-
return /* @__PURE__ */ import_react20.default.createElement(import_react_native19.View, null, /* @__PURE__ */ import_react20.default.createElement(import_react_native19.View, { style:
|
|
18636
|
+
return /* @__PURE__ */ import_react20.default.createElement(import_react_native19.View, null, /* @__PURE__ */ import_react20.default.createElement(import_react_native19.View, { style: styles6.header }, /* @__PURE__ */ import_react20.default.createElement(import_react_native19.Text, { style: styles6.headerIcon }, "\u{1F50D}"), /* @__PURE__ */ import_react20.default.createElement(import_react_native19.Text, { style: styles6.headerDesc }, "Start an exploratory QA session. Log findings as you go \u2014 bugs, concerns, suggestions, or questions.")), /* @__PURE__ */ import_react20.default.createElement(import_react_native19.View, { style: styles6.inputSection }, /* @__PURE__ */ import_react20.default.createElement(import_react_native19.Text, { style: styles6.label }, "What are you testing?"), /* @__PURE__ */ import_react20.default.createElement(
|
|
18568
18637
|
import_react_native19.TextInput,
|
|
18569
18638
|
{
|
|
18570
18639
|
value: focusArea,
|
|
18571
18640
|
onChangeText: setFocusArea,
|
|
18572
18641
|
placeholder: "e.g. Checkout flow, Settings page...",
|
|
18573
18642
|
placeholderTextColor: colors.textMuted,
|
|
18574
|
-
style:
|
|
18643
|
+
style: styles6.input,
|
|
18575
18644
|
returnKeyType: "done",
|
|
18576
18645
|
onSubmitEditing: handleStart
|
|
18577
18646
|
}
|
|
18578
|
-
)), trackNames.length > 0 && /* @__PURE__ */ import_react20.default.createElement(import_react_native19.View, { style:
|
|
18647
|
+
)), trackNames.length > 0 && /* @__PURE__ */ import_react20.default.createElement(import_react_native19.View, { style: styles6.chipsSection }, /* @__PURE__ */ import_react20.default.createElement(import_react_native19.Text, { style: styles6.chipsLabel }, "Quick pick:"), /* @__PURE__ */ import_react20.default.createElement(import_react_native19.View, { style: styles6.chipsRow }, trackNames.map((name) => /* @__PURE__ */ import_react20.default.createElement(
|
|
18579
18648
|
import_react_native19.TouchableOpacity,
|
|
18580
18649
|
{
|
|
18581
18650
|
key: name,
|
|
18582
|
-
style: [
|
|
18651
|
+
style: [styles6.chip, focusArea === name && styles6.chipActive],
|
|
18583
18652
|
onPress: () => setFocusArea(name),
|
|
18584
18653
|
activeOpacity: 0.7
|
|
18585
18654
|
},
|
|
18586
|
-
/* @__PURE__ */ import_react20.default.createElement(import_react_native19.Text, { style: [
|
|
18587
|
-
)))), error && /* @__PURE__ */ import_react20.default.createElement(import_react_native19.View, { style:
|
|
18655
|
+
/* @__PURE__ */ import_react20.default.createElement(import_react_native19.Text, { style: [styles6.chipText, focusArea === name && styles6.chipTextActive] }, name)
|
|
18656
|
+
)))), error && /* @__PURE__ */ import_react20.default.createElement(import_react_native19.View, { style: styles6.errorBox }, /* @__PURE__ */ import_react20.default.createElement(import_react_native19.Text, { style: styles6.errorText }, error)), /* @__PURE__ */ import_react20.default.createElement(
|
|
18588
18657
|
import_react_native19.TouchableOpacity,
|
|
18589
18658
|
{
|
|
18590
|
-
style: [
|
|
18659
|
+
style: [styles6.startBtn, isStarting && styles6.startBtnDisabled],
|
|
18591
18660
|
onPress: handleStart,
|
|
18592
18661
|
disabled: isStarting,
|
|
18593
18662
|
activeOpacity: 0.8
|
|
18594
18663
|
},
|
|
18595
|
-
/* @__PURE__ */ import_react20.default.createElement(import_react_native19.Text, { style:
|
|
18664
|
+
/* @__PURE__ */ import_react20.default.createElement(import_react_native19.Text, { style: styles6.startBtnText }, isStarting ? "Starting..." : "\u25B6 Start Session")
|
|
18596
18665
|
));
|
|
18597
18666
|
}
|
|
18598
18667
|
function createStyles13() {
|
|
@@ -18701,7 +18770,7 @@ var import_react21 = __toESM(require("react"));
|
|
|
18701
18770
|
var import_react_native20 = require("react-native");
|
|
18702
18771
|
function SessionActiveScreen({ nav }) {
|
|
18703
18772
|
const { activeSession, sessionFindings, endSession, refreshSession, widgetColorScheme } = useBugBear();
|
|
18704
|
-
const
|
|
18773
|
+
const styles6 = (0, import_react21.useMemo)(() => createStyles14(), [widgetColorScheme]);
|
|
18705
18774
|
const FINDING_TYPE_CONFIG = (0, import_react21.useMemo)(() => ({
|
|
18706
18775
|
bug: { icon: "\u{1F41B}", label: "Bug", color: colors.red },
|
|
18707
18776
|
concern: { icon: "\u26A0\uFE0F", label: "Concern", color: colors.amber },
|
|
@@ -18743,30 +18812,30 @@ function SessionActiveScreen({ nav }) {
|
|
|
18743
18812
|
}
|
|
18744
18813
|
};
|
|
18745
18814
|
if (!activeSession) {
|
|
18746
|
-
return /* @__PURE__ */ import_react21.default.createElement(import_react_native20.View, { style:
|
|
18815
|
+
return /* @__PURE__ */ import_react21.default.createElement(import_react_native20.View, { style: styles6.emptyContainer }, /* @__PURE__ */ import_react21.default.createElement(import_react_native20.Text, { style: styles6.emptyText }, "No active session"), /* @__PURE__ */ import_react21.default.createElement(import_react_native20.TouchableOpacity, { onPress: () => nav.replace({ name: "SESSION_START" }) }, /* @__PURE__ */ import_react21.default.createElement(import_react_native20.Text, { style: styles6.emptyLink }, "Start a new session")));
|
|
18747
18816
|
}
|
|
18748
18817
|
const renderFinding = (finding) => {
|
|
18749
18818
|
const config = FINDING_TYPE_CONFIG[finding.type] || FINDING_TYPE_CONFIG.bug;
|
|
18750
|
-
return /* @__PURE__ */ import_react21.default.createElement(import_react_native20.View, { key: finding.id, style:
|
|
18819
|
+
return /* @__PURE__ */ import_react21.default.createElement(import_react_native20.View, { key: finding.id, style: styles6.findingRow }, /* @__PURE__ */ import_react21.default.createElement(import_react_native20.Text, { style: styles6.findingIcon }, config.icon), /* @__PURE__ */ import_react21.default.createElement(import_react_native20.View, { style: styles6.findingContent }, /* @__PURE__ */ import_react21.default.createElement(import_react_native20.Text, { style: styles6.findingTitle, numberOfLines: 1 }, finding.title), /* @__PURE__ */ import_react21.default.createElement(import_react_native20.View, { style: styles6.findingMeta }, /* @__PURE__ */ import_react21.default.createElement(import_react_native20.Text, { style: [styles6.findingType, { color: config.color }] }, config.label), /* @__PURE__ */ import_react21.default.createElement(import_react_native20.Text, { style: styles6.findingSeverity }, finding.severity), finding.convertedToBugId && /* @__PURE__ */ import_react21.default.createElement(import_react_native20.Text, { style: styles6.findingConverted }, "\u2192 Bug filed"))));
|
|
18751
18820
|
};
|
|
18752
|
-
return /* @__PURE__ */ import_react21.default.createElement(import_react_native20.View, null, /* @__PURE__ */ import_react21.default.createElement(import_react_native20.View, { style:
|
|
18821
|
+
return /* @__PURE__ */ import_react21.default.createElement(import_react_native20.View, null, /* @__PURE__ */ import_react21.default.createElement(import_react_native20.View, { style: styles6.timerCard }, /* @__PURE__ */ import_react21.default.createElement(import_react_native20.View, { style: styles6.recordingRow }, /* @__PURE__ */ import_react21.default.createElement(import_react_native20.View, { style: styles6.recordingDot }), /* @__PURE__ */ import_react21.default.createElement(import_react_native20.Text, { style: styles6.recordingLabel }, "Recording")), /* @__PURE__ */ import_react21.default.createElement(import_react_native20.Text, { style: styles6.timerText }, formatTimer(elapsed)), activeSession.focusArea ? /* @__PURE__ */ import_react21.default.createElement(import_react_native20.Text, { style: styles6.focusArea }, activeSession.focusArea) : null), /* @__PURE__ */ import_react21.default.createElement(import_react_native20.View, { style: styles6.actionRow }, /* @__PURE__ */ import_react21.default.createElement(
|
|
18753
18822
|
import_react_native20.TouchableOpacity,
|
|
18754
18823
|
{
|
|
18755
|
-
style:
|
|
18824
|
+
style: styles6.addFindingBtn,
|
|
18756
18825
|
onPress: () => nav.push({ name: "SESSION_FINDING" }),
|
|
18757
18826
|
activeOpacity: 0.8
|
|
18758
18827
|
},
|
|
18759
|
-
/* @__PURE__ */ import_react21.default.createElement(import_react_native20.Text, { style:
|
|
18828
|
+
/* @__PURE__ */ import_react21.default.createElement(import_react_native20.Text, { style: styles6.addFindingText }, "+ Add Finding")
|
|
18760
18829
|
), /* @__PURE__ */ import_react21.default.createElement(
|
|
18761
18830
|
import_react_native20.TouchableOpacity,
|
|
18762
18831
|
{
|
|
18763
|
-
style: [
|
|
18832
|
+
style: [styles6.endBtn, isEnding && styles6.endBtnDisabled],
|
|
18764
18833
|
onPress: handleEnd,
|
|
18765
18834
|
disabled: isEnding,
|
|
18766
18835
|
activeOpacity: 0.8
|
|
18767
18836
|
},
|
|
18768
|
-
/* @__PURE__ */ import_react21.default.createElement(import_react_native20.Text, { style:
|
|
18769
|
-
)), /* @__PURE__ */ import_react21.default.createElement(import_react_native20.Text, { style:
|
|
18837
|
+
/* @__PURE__ */ import_react21.default.createElement(import_react_native20.Text, { style: styles6.endBtnText }, isEnding ? "..." : "End")
|
|
18838
|
+
)), /* @__PURE__ */ import_react21.default.createElement(import_react_native20.Text, { style: styles6.sectionTitle }, "Findings (", sessionFindings.length, ")"), sessionFindings.length === 0 ? /* @__PURE__ */ import_react21.default.createElement(import_react_native20.View, { style: styles6.emptyFindings }, /* @__PURE__ */ import_react21.default.createElement(import_react_native20.Text, { style: styles6.emptyFindingsIcon }, "\u{1F4CB}"), /* @__PURE__ */ import_react21.default.createElement(import_react_native20.Text, { style: styles6.emptyFindingsText }, 'No findings yet. Tap "Add Finding" to log something.')) : /* @__PURE__ */ import_react21.default.createElement(import_react_native20.View, { style: styles6.findingsList }, sessionFindings.map(renderFinding)));
|
|
18770
18839
|
}
|
|
18771
18840
|
function createStyles14() {
|
|
18772
18841
|
return import_react_native20.StyleSheet.create({
|
|
@@ -18944,7 +19013,7 @@ var FINDING_TYPES = [
|
|
|
18944
19013
|
];
|
|
18945
19014
|
function SessionFindingScreen({ nav }) {
|
|
18946
19015
|
const { addFinding, widgetColorScheme } = useBugBear();
|
|
18947
|
-
const
|
|
19016
|
+
const styles6 = (0, import_react22.useMemo)(() => createStyles15(), [widgetColorScheme]);
|
|
18948
19017
|
const SEVERITIES = (0, import_react22.useMemo)(() => [
|
|
18949
19018
|
{ value: "critical", label: "Critical", color: colors.red },
|
|
18950
19019
|
{ value: "high", label: "High", color: colors.orange },
|
|
@@ -18976,46 +19045,46 @@ function SessionFindingScreen({ nav }) {
|
|
|
18976
19045
|
}
|
|
18977
19046
|
};
|
|
18978
19047
|
const canSubmit = title.trim().length > 0 && !isSubmitting;
|
|
18979
|
-
return /* @__PURE__ */ import_react22.default.createElement(import_react_native21.View, null, /* @__PURE__ */ import_react22.default.createElement(import_react_native21.View, { style:
|
|
19048
|
+
return /* @__PURE__ */ import_react22.default.createElement(import_react_native21.View, null, /* @__PURE__ */ import_react22.default.createElement(import_react_native21.View, { style: styles6.section }, /* @__PURE__ */ import_react22.default.createElement(import_react_native21.Text, { style: styles6.sectionLabel }, "Type"), /* @__PURE__ */ import_react22.default.createElement(import_react_native21.View, { style: styles6.typeRow }, FINDING_TYPES.map((ft) => /* @__PURE__ */ import_react22.default.createElement(
|
|
18980
19049
|
import_react_native21.TouchableOpacity,
|
|
18981
19050
|
{
|
|
18982
19051
|
key: ft.value,
|
|
18983
|
-
style: [
|
|
19052
|
+
style: [styles6.typePill, type === ft.value && styles6.typePillActive],
|
|
18984
19053
|
onPress: () => setType(ft.value),
|
|
18985
19054
|
activeOpacity: 0.7
|
|
18986
19055
|
},
|
|
18987
|
-
/* @__PURE__ */ import_react22.default.createElement(import_react_native21.Text, { style:
|
|
18988
|
-
/* @__PURE__ */ import_react22.default.createElement(import_react_native21.Text, { style: [
|
|
18989
|
-
)))), /* @__PURE__ */ import_react22.default.createElement(import_react_native21.View, { style:
|
|
19056
|
+
/* @__PURE__ */ import_react22.default.createElement(import_react_native21.Text, { style: styles6.typePillIcon }, ft.icon),
|
|
19057
|
+
/* @__PURE__ */ import_react22.default.createElement(import_react_native21.Text, { style: [styles6.typePillLabel, type === ft.value && styles6.typePillLabelActive] }, ft.label)
|
|
19058
|
+
)))), /* @__PURE__ */ import_react22.default.createElement(import_react_native21.View, { style: styles6.section }, /* @__PURE__ */ import_react22.default.createElement(import_react_native21.Text, { style: styles6.sectionLabel }, "Severity"), /* @__PURE__ */ import_react22.default.createElement(import_react_native21.View, { style: styles6.severityRow }, SEVERITIES.map((s2) => /* @__PURE__ */ import_react22.default.createElement(
|
|
18990
19059
|
import_react_native21.TouchableOpacity,
|
|
18991
19060
|
{
|
|
18992
19061
|
key: s2.value,
|
|
18993
19062
|
style: [
|
|
18994
|
-
|
|
19063
|
+
styles6.severityPill,
|
|
18995
19064
|
severity === s2.value && { backgroundColor: `${s2.color}20`, borderColor: s2.color }
|
|
18996
19065
|
],
|
|
18997
19066
|
onPress: () => setSeverity(s2.value),
|
|
18998
19067
|
activeOpacity: 0.7
|
|
18999
19068
|
},
|
|
19000
|
-
/* @__PURE__ */ import_react22.default.createElement(import_react_native21.Text, { style: [
|
|
19001
|
-
)))), /* @__PURE__ */ import_react22.default.createElement(import_react_native21.View, { style:
|
|
19069
|
+
/* @__PURE__ */ import_react22.default.createElement(import_react_native21.Text, { style: [styles6.severityText, severity === s2.value && { color: s2.color }] }, s2.label)
|
|
19070
|
+
)))), /* @__PURE__ */ import_react22.default.createElement(import_react_native21.View, { style: styles6.inputSection }, /* @__PURE__ */ import_react22.default.createElement(
|
|
19002
19071
|
import_react_native21.TextInput,
|
|
19003
19072
|
{
|
|
19004
19073
|
value: title,
|
|
19005
19074
|
onChangeText: setTitle,
|
|
19006
19075
|
placeholder: "What did you find?",
|
|
19007
19076
|
placeholderTextColor: colors.textMuted,
|
|
19008
|
-
style:
|
|
19077
|
+
style: styles6.titleInput,
|
|
19009
19078
|
returnKeyType: "next"
|
|
19010
19079
|
}
|
|
19011
|
-
)), /* @__PURE__ */ import_react22.default.createElement(import_react_native21.View, { style:
|
|
19080
|
+
)), /* @__PURE__ */ import_react22.default.createElement(import_react_native21.View, { style: styles6.inputSection }, /* @__PURE__ */ import_react22.default.createElement(
|
|
19012
19081
|
import_react_native21.TextInput,
|
|
19013
19082
|
{
|
|
19014
19083
|
value: description,
|
|
19015
19084
|
onChangeText: setDescription,
|
|
19016
19085
|
placeholder: "Details (optional)",
|
|
19017
19086
|
placeholderTextColor: colors.textMuted,
|
|
19018
|
-
style:
|
|
19087
|
+
style: styles6.descInput,
|
|
19019
19088
|
multiline: true,
|
|
19020
19089
|
numberOfLines: 3,
|
|
19021
19090
|
textAlignVertical: "top"
|
|
@@ -19023,12 +19092,12 @@ function SessionFindingScreen({ nav }) {
|
|
|
19023
19092
|
)), /* @__PURE__ */ import_react22.default.createElement(
|
|
19024
19093
|
import_react_native21.TouchableOpacity,
|
|
19025
19094
|
{
|
|
19026
|
-
style: [
|
|
19095
|
+
style: [styles6.submitBtn, !canSubmit && styles6.submitBtnDisabled],
|
|
19027
19096
|
onPress: handleSubmit,
|
|
19028
19097
|
disabled: !canSubmit,
|
|
19029
19098
|
activeOpacity: 0.8
|
|
19030
19099
|
},
|
|
19031
|
-
/* @__PURE__ */ import_react22.default.createElement(import_react_native21.Text, { style: [
|
|
19100
|
+
/* @__PURE__ */ import_react22.default.createElement(import_react_native21.Text, { style: [styles6.submitBtnText, !canSubmit && styles6.submitBtnTextDisabled] }, isSubmitting ? "Saving..." : "Save Finding")
|
|
19032
19101
|
));
|
|
19033
19102
|
}
|
|
19034
19103
|
function createStyles15() {
|
|
@@ -19140,9 +19209,278 @@ function createStyles15() {
|
|
|
19140
19209
|
});
|
|
19141
19210
|
}
|
|
19142
19211
|
|
|
19143
|
-
// src/
|
|
19212
|
+
// src/widget/MiniTestRunner.tsx
|
|
19213
|
+
var import_react23 = __toESM(require("react"));
|
|
19214
|
+
var import_react_native22 = require("react-native");
|
|
19144
19215
|
var screenWidth = import_react_native22.Dimensions.get("window").width;
|
|
19145
19216
|
var screenHeight = import_react_native22.Dimensions.get("window").height;
|
|
19217
|
+
var RUNNER_WIDTH = 280;
|
|
19218
|
+
function MiniTestRunner({ assignmentId, onExpand, onComplete, onAdvance, onNavigateToReport }) {
|
|
19219
|
+
const { client, assignments, refreshAssignments } = useBugBear();
|
|
19220
|
+
const assignment = assignments.find((a) => a.id === assignmentId);
|
|
19221
|
+
const [currentStepIndex, setCurrentStepIndex] = (0, import_react23.useState)(0);
|
|
19222
|
+
const [isSubmitting, setIsSubmitting] = (0, import_react23.useState)(false);
|
|
19223
|
+
const [elapsedTime, setElapsedTime] = (0, import_react23.useState)(0);
|
|
19224
|
+
const mountAnim = (0, import_react23.useRef)(new import_react_native22.Animated.Value(0)).current;
|
|
19225
|
+
(0, import_react23.useEffect)(() => {
|
|
19226
|
+
import_react_native22.Animated.spring(mountAnim, { toValue: 1, useNativeDriver: true, tension: 80, friction: 10 }).start();
|
|
19227
|
+
}, []);
|
|
19228
|
+
(0, import_react23.useEffect)(() => {
|
|
19229
|
+
setCurrentStepIndex(0);
|
|
19230
|
+
}, [assignmentId]);
|
|
19231
|
+
const pan = (0, import_react23.useRef)(new import_react_native22.Animated.ValueXY({
|
|
19232
|
+
x: screenWidth - RUNNER_WIDTH - 16,
|
|
19233
|
+
y: screenHeight - 220
|
|
19234
|
+
})).current;
|
|
19235
|
+
const panResponder = (0, import_react23.useRef)(
|
|
19236
|
+
import_react_native22.PanResponder.create({
|
|
19237
|
+
onStartShouldSetPanResponder: () => true,
|
|
19238
|
+
onMoveShouldSetPanResponder: (_, gs) => Math.abs(gs.dx) > 5 || Math.abs(gs.dy) > 5,
|
|
19239
|
+
onPanResponderGrant: () => {
|
|
19240
|
+
pan.setOffset({
|
|
19241
|
+
x: getAnimatedValue(pan.x),
|
|
19242
|
+
y: getAnimatedValue(pan.y)
|
|
19243
|
+
});
|
|
19244
|
+
pan.setValue({ x: 0, y: 0 });
|
|
19245
|
+
},
|
|
19246
|
+
onPanResponderMove: import_react_native22.Animated.event(
|
|
19247
|
+
[null, { dx: pan.x, dy: pan.y }],
|
|
19248
|
+
{ useNativeDriver: false }
|
|
19249
|
+
),
|
|
19250
|
+
onPanResponderRelease: () => {
|
|
19251
|
+
pan.flattenOffset();
|
|
19252
|
+
const currentX = getAnimatedValue(pan.x);
|
|
19253
|
+
const currentY = getAnimatedValue(pan.y);
|
|
19254
|
+
const snapX = currentX < screenWidth / 2 ? 16 : screenWidth - RUNNER_WIDTH - 16;
|
|
19255
|
+
const snapY = Math.max(80, Math.min(currentY, screenHeight - 200));
|
|
19256
|
+
import_react_native22.Animated.spring(pan, {
|
|
19257
|
+
toValue: { x: snapX, y: snapY },
|
|
19258
|
+
useNativeDriver: false,
|
|
19259
|
+
friction: 7,
|
|
19260
|
+
tension: 40
|
|
19261
|
+
}).start();
|
|
19262
|
+
}
|
|
19263
|
+
})
|
|
19264
|
+
).current;
|
|
19265
|
+
(0, import_react23.useEffect)(() => {
|
|
19266
|
+
if (!assignment?.startedAt) return;
|
|
19267
|
+
const startTime = new Date(assignment.startedAt).getTime();
|
|
19268
|
+
setElapsedTime(Math.floor((Date.now() - startTime) / 1e3));
|
|
19269
|
+
const interval = setInterval(() => {
|
|
19270
|
+
setElapsedTime(Math.floor((Date.now() - startTime) / 1e3));
|
|
19271
|
+
}, 1e3);
|
|
19272
|
+
return () => clearInterval(interval);
|
|
19273
|
+
}, [assignment?.startedAt]);
|
|
19274
|
+
const handlePass = (0, import_react23.useCallback)(async () => {
|
|
19275
|
+
if (!client || !assignment || isSubmitting) return;
|
|
19276
|
+
setIsSubmitting(true);
|
|
19277
|
+
try {
|
|
19278
|
+
const passedId = assignment.id;
|
|
19279
|
+
await client.passAssignment(passedId);
|
|
19280
|
+
client.submitTestFeedback({
|
|
19281
|
+
testCaseId: assignment.testCase.id,
|
|
19282
|
+
assignmentId: passedId,
|
|
19283
|
+
feedback: { rating: 5 }
|
|
19284
|
+
}).catch(() => {
|
|
19285
|
+
});
|
|
19286
|
+
await refreshAssignments();
|
|
19287
|
+
const remaining = assignments.filter(
|
|
19288
|
+
(a) => (a.status === "pending" || a.status === "in_progress") && a.id !== passedId
|
|
19289
|
+
);
|
|
19290
|
+
if (remaining.length > 0) {
|
|
19291
|
+
onAdvance(remaining[0].id);
|
|
19292
|
+
} else {
|
|
19293
|
+
onComplete();
|
|
19294
|
+
}
|
|
19295
|
+
} finally {
|
|
19296
|
+
setIsSubmitting(false);
|
|
19297
|
+
}
|
|
19298
|
+
}, [client, assignment, isSubmitting, refreshAssignments, assignments, onAdvance, onComplete]);
|
|
19299
|
+
const handleFail = (0, import_react23.useCallback)(async () => {
|
|
19300
|
+
if (!client || !assignment || isSubmitting) return;
|
|
19301
|
+
setIsSubmitting(true);
|
|
19302
|
+
try {
|
|
19303
|
+
await client.failAssignment(assignment.id);
|
|
19304
|
+
await refreshAssignments();
|
|
19305
|
+
onNavigateToReport(assignment.id, assignment.testCase.id);
|
|
19306
|
+
} finally {
|
|
19307
|
+
setIsSubmitting(false);
|
|
19308
|
+
}
|
|
19309
|
+
}, [client, assignment, isSubmitting, refreshAssignments, onNavigateToReport]);
|
|
19310
|
+
if (!assignment) return null;
|
|
19311
|
+
const testCase = assignment.testCase;
|
|
19312
|
+
const steps = testCase.steps;
|
|
19313
|
+
const totalSteps = steps.length;
|
|
19314
|
+
const currentStep = steps[currentStepIndex];
|
|
19315
|
+
return /* @__PURE__ */ import_react23.default.createElement(
|
|
19316
|
+
import_react_native22.Animated.View,
|
|
19317
|
+
{
|
|
19318
|
+
style: [
|
|
19319
|
+
styles4.container,
|
|
19320
|
+
{ transform: pan.getTranslateTransform() },
|
|
19321
|
+
{ opacity: mountAnim, transform: [...pan.getTranslateTransform(), { scale: mountAnim.interpolate({ inputRange: [0, 1], outputRange: [0.8, 1] }) }] }
|
|
19322
|
+
],
|
|
19323
|
+
...panResponder.panHandlers
|
|
19324
|
+
},
|
|
19325
|
+
/* @__PURE__ */ import_react23.default.createElement(import_react_native22.View, { style: styles4.header }, /* @__PURE__ */ import_react23.default.createElement(import_react_native22.View, { style: styles4.headerLeft }, /* @__PURE__ */ import_react23.default.createElement(import_react_native22.Text, { style: styles4.stepCounter }, "Step ", currentStepIndex + 1, " of ", totalSteps), elapsedTime > 0 && /* @__PURE__ */ import_react23.default.createElement(import_react_native22.Text, { style: styles4.timer }, formatElapsedTime(elapsedTime))), /* @__PURE__ */ import_react23.default.createElement(import_react_native22.TouchableOpacity, { onPress: onExpand, style: styles4.expandButton }, /* @__PURE__ */ import_react23.default.createElement(import_react_native22.Text, { style: styles4.expandText }, "\u2197 Expand"))),
|
|
19326
|
+
/* @__PURE__ */ import_react23.default.createElement(import_react_native22.View, { style: styles4.stepContent }, /* @__PURE__ */ import_react23.default.createElement(import_react_native22.Text, { style: styles4.stepAction, numberOfLines: 3 }, currentStep?.action || testCase.title), currentStep?.expectedResult && /* @__PURE__ */ import_react23.default.createElement(import_react_native22.Text, { style: styles4.stepExpected, numberOfLines: 1 }, "\u2192 ", currentStep.expectedResult)),
|
|
19327
|
+
totalSteps > 1 && /* @__PURE__ */ import_react23.default.createElement(import_react_native22.View, { style: styles4.stepNav }, /* @__PURE__ */ import_react23.default.createElement(
|
|
19328
|
+
import_react_native22.TouchableOpacity,
|
|
19329
|
+
{
|
|
19330
|
+
disabled: currentStepIndex === 0,
|
|
19331
|
+
onPress: () => setCurrentStepIndex((i) => i - 1)
|
|
19332
|
+
},
|
|
19333
|
+
/* @__PURE__ */ import_react23.default.createElement(import_react_native22.Text, { style: [styles4.stepNavText, currentStepIndex === 0 && styles4.stepNavDisabled] }, "\u25C0 Prev")
|
|
19334
|
+
), /* @__PURE__ */ import_react23.default.createElement(
|
|
19335
|
+
import_react_native22.TouchableOpacity,
|
|
19336
|
+
{
|
|
19337
|
+
disabled: currentStepIndex >= totalSteps - 1,
|
|
19338
|
+
onPress: () => setCurrentStepIndex((i) => i + 1)
|
|
19339
|
+
},
|
|
19340
|
+
/* @__PURE__ */ import_react23.default.createElement(import_react_native22.Text, { style: [styles4.stepNavText, currentStepIndex >= totalSteps - 1 && styles4.stepNavDisabled] }, "Next \u25B6")
|
|
19341
|
+
)),
|
|
19342
|
+
/* @__PURE__ */ import_react23.default.createElement(import_react_native22.View, { style: styles4.actions }, /* @__PURE__ */ import_react23.default.createElement(
|
|
19343
|
+
import_react_native22.TouchableOpacity,
|
|
19344
|
+
{
|
|
19345
|
+
style: [styles4.failBtn, isSubmitting && { opacity: 0.5 }],
|
|
19346
|
+
onPress: handleFail,
|
|
19347
|
+
disabled: isSubmitting
|
|
19348
|
+
},
|
|
19349
|
+
/* @__PURE__ */ import_react23.default.createElement(import_react_native22.Text, { style: styles4.failText }, "Fail")
|
|
19350
|
+
), /* @__PURE__ */ import_react23.default.createElement(
|
|
19351
|
+
import_react_native22.TouchableOpacity,
|
|
19352
|
+
{
|
|
19353
|
+
style: [styles4.passBtn, isSubmitting && { opacity: 0.5 }],
|
|
19354
|
+
onPress: handlePass,
|
|
19355
|
+
disabled: isSubmitting
|
|
19356
|
+
},
|
|
19357
|
+
/* @__PURE__ */ import_react23.default.createElement(import_react_native22.Text, { style: styles4.passText }, isSubmitting ? "Passing..." : "\u2713 Pass")
|
|
19358
|
+
))
|
|
19359
|
+
);
|
|
19360
|
+
}
|
|
19361
|
+
var styles4 = import_react_native22.StyleSheet.create({
|
|
19362
|
+
container: {
|
|
19363
|
+
position: "absolute",
|
|
19364
|
+
width: RUNNER_WIDTH,
|
|
19365
|
+
zIndex: 9999,
|
|
19366
|
+
backgroundColor: colors.bg,
|
|
19367
|
+
borderRadius: 12,
|
|
19368
|
+
borderWidth: 1,
|
|
19369
|
+
borderColor: colors.border,
|
|
19370
|
+
shadowColor: "#000",
|
|
19371
|
+
shadowOffset: { width: 0, height: 8 },
|
|
19372
|
+
shadowOpacity: 0.4,
|
|
19373
|
+
shadowRadius: 16,
|
|
19374
|
+
elevation: 20,
|
|
19375
|
+
overflow: "hidden"
|
|
19376
|
+
},
|
|
19377
|
+
header: {
|
|
19378
|
+
backgroundColor: colors.bgDarker,
|
|
19379
|
+
paddingVertical: 6,
|
|
19380
|
+
paddingHorizontal: 12,
|
|
19381
|
+
flexDirection: "row",
|
|
19382
|
+
alignItems: "center",
|
|
19383
|
+
justifyContent: "space-between",
|
|
19384
|
+
borderBottomWidth: 1,
|
|
19385
|
+
borderBottomColor: colors.border
|
|
19386
|
+
},
|
|
19387
|
+
headerLeft: {
|
|
19388
|
+
flexDirection: "row",
|
|
19389
|
+
alignItems: "center",
|
|
19390
|
+
gap: 6
|
|
19391
|
+
},
|
|
19392
|
+
stepCounter: {
|
|
19393
|
+
fontSize: 11,
|
|
19394
|
+
color: colors.textMuted
|
|
19395
|
+
},
|
|
19396
|
+
timer: {
|
|
19397
|
+
fontSize: 10,
|
|
19398
|
+
color: colors.green,
|
|
19399
|
+
fontWeight: "600",
|
|
19400
|
+
fontVariant: ["tabular-nums"]
|
|
19401
|
+
},
|
|
19402
|
+
expandButton: {
|
|
19403
|
+
paddingVertical: 2,
|
|
19404
|
+
paddingHorizontal: 4
|
|
19405
|
+
},
|
|
19406
|
+
expandText: {
|
|
19407
|
+
fontSize: 12,
|
|
19408
|
+
color: colors.blue,
|
|
19409
|
+
fontWeight: "500"
|
|
19410
|
+
},
|
|
19411
|
+
stepContent: {
|
|
19412
|
+
paddingVertical: 8,
|
|
19413
|
+
paddingHorizontal: 12
|
|
19414
|
+
},
|
|
19415
|
+
stepAction: {
|
|
19416
|
+
fontSize: 13,
|
|
19417
|
+
color: colors.textPrimary,
|
|
19418
|
+
lineHeight: 18
|
|
19419
|
+
},
|
|
19420
|
+
stepExpected: {
|
|
19421
|
+
fontSize: 11,
|
|
19422
|
+
color: colors.textMuted,
|
|
19423
|
+
fontStyle: "italic",
|
|
19424
|
+
marginTop: 2
|
|
19425
|
+
},
|
|
19426
|
+
stepNav: {
|
|
19427
|
+
flexDirection: "row",
|
|
19428
|
+
justifyContent: "center",
|
|
19429
|
+
gap: 16,
|
|
19430
|
+
paddingBottom: 6,
|
|
19431
|
+
paddingHorizontal: 12
|
|
19432
|
+
},
|
|
19433
|
+
stepNavText: {
|
|
19434
|
+
fontSize: 12,
|
|
19435
|
+
color: colors.blue,
|
|
19436
|
+
paddingVertical: 2,
|
|
19437
|
+
paddingHorizontal: 6
|
|
19438
|
+
},
|
|
19439
|
+
stepNavDisabled: {
|
|
19440
|
+
color: colors.textDim
|
|
19441
|
+
},
|
|
19442
|
+
actions: {
|
|
19443
|
+
flexDirection: "row",
|
|
19444
|
+
gap: 6,
|
|
19445
|
+
paddingVertical: 6,
|
|
19446
|
+
paddingHorizontal: 10,
|
|
19447
|
+
paddingBottom: 10,
|
|
19448
|
+
borderTopWidth: 1,
|
|
19449
|
+
borderTopColor: colors.border
|
|
19450
|
+
},
|
|
19451
|
+
failBtn: {
|
|
19452
|
+
flex: 1,
|
|
19453
|
+
paddingVertical: 8,
|
|
19454
|
+
borderRadius: 8,
|
|
19455
|
+
backgroundColor: colors.redDark,
|
|
19456
|
+
borderWidth: 1,
|
|
19457
|
+
borderColor: colors.red,
|
|
19458
|
+
alignItems: "center"
|
|
19459
|
+
},
|
|
19460
|
+
failText: {
|
|
19461
|
+
fontSize: 12,
|
|
19462
|
+
fontWeight: "600",
|
|
19463
|
+
color: colors.redLight
|
|
19464
|
+
},
|
|
19465
|
+
passBtn: {
|
|
19466
|
+
flex: 2,
|
|
19467
|
+
paddingVertical: 8,
|
|
19468
|
+
borderRadius: 8,
|
|
19469
|
+
backgroundColor: colors.greenDark,
|
|
19470
|
+
borderWidth: 1,
|
|
19471
|
+
borderColor: colors.green,
|
|
19472
|
+
alignItems: "center"
|
|
19473
|
+
},
|
|
19474
|
+
passText: {
|
|
19475
|
+
fontSize: 12,
|
|
19476
|
+
fontWeight: "600",
|
|
19477
|
+
color: colors.greenLight
|
|
19478
|
+
}
|
|
19479
|
+
});
|
|
19480
|
+
|
|
19481
|
+
// src/BugBearButton.tsx
|
|
19482
|
+
var screenWidth2 = import_react_native23.Dimensions.get("window").width;
|
|
19483
|
+
var screenHeight2 = import_react_native23.Dimensions.get("window").height;
|
|
19146
19484
|
function BugBearButton({
|
|
19147
19485
|
position = "bottom-right",
|
|
19148
19486
|
buttonStyle,
|
|
@@ -19154,16 +19492,18 @@ function BugBearButton({
|
|
|
19154
19492
|
}) {
|
|
19155
19493
|
const { shouldShowWidget, testerInfo, isLoading, unreadCount, assignments, widgetMode, widgetColorScheme } = useBugBear();
|
|
19156
19494
|
const { currentScreen, canGoBack, push, pop, replace, reset } = useNavigation();
|
|
19157
|
-
const [
|
|
19158
|
-
const
|
|
19159
|
-
const
|
|
19160
|
-
const
|
|
19495
|
+
const [viewMode, setViewMode] = (0, import_react24.useState)("closed");
|
|
19496
|
+
const [miniRunnerAssignmentId, setMiniRunnerAssignmentId] = (0, import_react24.useState)(null);
|
|
19497
|
+
const panelAnim = (0, import_react24.useRef)(new import_react_native23.Animated.Value(0)).current;
|
|
19498
|
+
const styles6 = (0, import_react24.useMemo)(() => createStyles16(), [widgetColorScheme]);
|
|
19499
|
+
const panelVisible = viewMode === "panel";
|
|
19500
|
+
const screenCaptureRef = (0, import_react24.useRef)(null);
|
|
19161
19501
|
const openPanel = () => {
|
|
19162
19502
|
captureAppScreen().then((uri) => {
|
|
19163
19503
|
screenCaptureRef.current = uri;
|
|
19164
19504
|
});
|
|
19165
|
-
|
|
19166
|
-
|
|
19505
|
+
setViewMode("panel");
|
|
19506
|
+
import_react_native23.Animated.spring(panelAnim, {
|
|
19167
19507
|
toValue: 1,
|
|
19168
19508
|
useNativeDriver: true,
|
|
19169
19509
|
friction: 8,
|
|
@@ -19171,13 +19511,13 @@ function BugBearButton({
|
|
|
19171
19511
|
}).start();
|
|
19172
19512
|
};
|
|
19173
19513
|
const closePanel = () => {
|
|
19174
|
-
|
|
19175
|
-
|
|
19514
|
+
import_react_native23.Keyboard.dismiss();
|
|
19515
|
+
import_react_native23.Animated.timing(panelAnim, {
|
|
19176
19516
|
toValue: 0,
|
|
19177
19517
|
duration: 250,
|
|
19178
19518
|
useNativeDriver: true
|
|
19179
19519
|
}).start(() => {
|
|
19180
|
-
|
|
19520
|
+
setViewMode("closed");
|
|
19181
19521
|
});
|
|
19182
19522
|
};
|
|
19183
19523
|
const getInitialPosition = () => {
|
|
@@ -19186,22 +19526,22 @@ function BugBearButton({
|
|
|
19186
19526
|
if (initialX !== void 0 && initialY !== void 0) {
|
|
19187
19527
|
return { x: initialX, y: initialY };
|
|
19188
19528
|
}
|
|
19189
|
-
const x = position === "bottom-right" ?
|
|
19190
|
-
const y =
|
|
19529
|
+
const x = position === "bottom-right" ? screenWidth2 - buttonSize - margin : margin;
|
|
19530
|
+
const y = screenHeight2 - 160;
|
|
19191
19531
|
return { x, y };
|
|
19192
19532
|
};
|
|
19193
19533
|
const initialPos = getInitialPosition();
|
|
19194
|
-
const pan = (0,
|
|
19195
|
-
const isDragging = (0,
|
|
19196
|
-
const panResponder = (0,
|
|
19197
|
-
|
|
19534
|
+
const pan = (0, import_react24.useRef)(new import_react_native23.Animated.ValueXY(initialPos)).current;
|
|
19535
|
+
const isDragging = (0, import_react24.useRef)(false);
|
|
19536
|
+
const panResponder = (0, import_react24.useRef)(
|
|
19537
|
+
import_react_native23.PanResponder.create({
|
|
19198
19538
|
onStartShouldSetPanResponder: () => draggable,
|
|
19199
19539
|
onMoveShouldSetPanResponder: (_, gs) => draggable && (Math.abs(gs.dx) > 5 || Math.abs(gs.dy) > 5),
|
|
19200
19540
|
onPanResponderGrant: () => {
|
|
19201
19541
|
isDragging.current = false;
|
|
19202
19542
|
pan.setOffset({
|
|
19203
|
-
x: pan.x
|
|
19204
|
-
y: pan.y
|
|
19543
|
+
x: getAnimatedValue(pan.x),
|
|
19544
|
+
y: getAnimatedValue(pan.y)
|
|
19205
19545
|
});
|
|
19206
19546
|
pan.setValue({ x: 0, y: 0 });
|
|
19207
19547
|
},
|
|
@@ -19209,20 +19549,20 @@ function BugBearButton({
|
|
|
19209
19549
|
if (Math.abs(gs.dx) > 5 || Math.abs(gs.dy) > 5) {
|
|
19210
19550
|
isDragging.current = true;
|
|
19211
19551
|
}
|
|
19212
|
-
|
|
19552
|
+
import_react_native23.Animated.event(
|
|
19213
19553
|
[null, { dx: pan.x, dy: pan.y }],
|
|
19214
19554
|
{ useNativeDriver: false }
|
|
19215
19555
|
)(_, gs);
|
|
19216
19556
|
},
|
|
19217
19557
|
onPanResponderRelease: (_, gs) => {
|
|
19218
19558
|
pan.flattenOffset();
|
|
19219
|
-
const currentX = pan.x
|
|
19220
|
-
const currentY = pan.y
|
|
19559
|
+
const currentX = getAnimatedValue(pan.x);
|
|
19560
|
+
const currentY = getAnimatedValue(pan.y);
|
|
19221
19561
|
const buttonSize = 56;
|
|
19222
19562
|
const margin = 16;
|
|
19223
|
-
const snapX = currentX <
|
|
19224
|
-
const snapY = Math.max(minY, Math.min(currentY,
|
|
19225
|
-
|
|
19563
|
+
const snapX = currentX < screenWidth2 / 2 ? margin : screenWidth2 - buttonSize - margin;
|
|
19564
|
+
const snapY = Math.max(minY, Math.min(currentY, screenHeight2 - maxYOffset));
|
|
19565
|
+
import_react_native23.Animated.spring(pan, {
|
|
19226
19566
|
toValue: { x: snapX, y: snapY },
|
|
19227
19567
|
useNativeDriver: false,
|
|
19228
19568
|
friction: 7,
|
|
@@ -19237,11 +19577,11 @@ function BugBearButton({
|
|
|
19237
19577
|
).current;
|
|
19238
19578
|
const pendingTests = widgetMode === "qa" ? assignments.filter((a) => a.status === "pending" || a.status === "in_progress").length : 0;
|
|
19239
19579
|
const badgeCount = pendingTests + unreadCount;
|
|
19240
|
-
(0,
|
|
19241
|
-
if (!panelVisible ||
|
|
19242
|
-
const handler =
|
|
19580
|
+
(0, import_react24.useEffect)(() => {
|
|
19581
|
+
if (!panelVisible || import_react_native23.Platform.OS !== "android") return;
|
|
19582
|
+
const handler = import_react_native23.BackHandler.addEventListener("hardwareBackPress", () => {
|
|
19243
19583
|
if (canGoBack) {
|
|
19244
|
-
|
|
19584
|
+
import_react_native23.Keyboard.dismiss();
|
|
19245
19585
|
pop();
|
|
19246
19586
|
} else {
|
|
19247
19587
|
closePanel();
|
|
@@ -19250,6 +19590,51 @@ function BugBearButton({
|
|
|
19250
19590
|
});
|
|
19251
19591
|
return () => handler.remove();
|
|
19252
19592
|
}, [panelVisible, canGoBack]);
|
|
19593
|
+
const startMiniRunner = (0, import_react24.useCallback)((assignId) => {
|
|
19594
|
+
import_react_native23.Keyboard.dismiss();
|
|
19595
|
+
import_react_native23.Animated.timing(panelAnim, {
|
|
19596
|
+
toValue: 0,
|
|
19597
|
+
duration: 200,
|
|
19598
|
+
useNativeDriver: true
|
|
19599
|
+
}).start(() => {
|
|
19600
|
+
setMiniRunnerAssignmentId(assignId);
|
|
19601
|
+
setViewMode("mini-runner");
|
|
19602
|
+
});
|
|
19603
|
+
}, [panelAnim]);
|
|
19604
|
+
const expandFromMiniRunner = (0, import_react24.useCallback)(() => {
|
|
19605
|
+
setViewMode("panel");
|
|
19606
|
+
if (miniRunnerAssignmentId) {
|
|
19607
|
+
replace({ name: "TEST_DETAIL", testId: miniRunnerAssignmentId });
|
|
19608
|
+
}
|
|
19609
|
+
setMiniRunnerAssignmentId(null);
|
|
19610
|
+
import_react_native23.Animated.spring(panelAnim, {
|
|
19611
|
+
toValue: 1,
|
|
19612
|
+
useNativeDriver: true,
|
|
19613
|
+
friction: 8,
|
|
19614
|
+
tension: 65
|
|
19615
|
+
}).start();
|
|
19616
|
+
}, [miniRunnerAssignmentId, replace, panelAnim]);
|
|
19617
|
+
const handleMiniRunnerAdvance = (0, import_react24.useCallback)((nextId) => {
|
|
19618
|
+
setMiniRunnerAssignmentId(nextId);
|
|
19619
|
+
}, []);
|
|
19620
|
+
const handleMiniRunnerComplete = (0, import_react24.useCallback)(() => {
|
|
19621
|
+
setMiniRunnerAssignmentId(null);
|
|
19622
|
+
setViewMode("closed");
|
|
19623
|
+
}, []);
|
|
19624
|
+
const handleMiniRunnerReport = (0, import_react24.useCallback)((assignId, testCaseId) => {
|
|
19625
|
+
setMiniRunnerAssignmentId(null);
|
|
19626
|
+
setViewMode("panel");
|
|
19627
|
+
replace({
|
|
19628
|
+
name: "REPORT",
|
|
19629
|
+
prefill: { type: "test_fail", assignmentId: assignId, testCaseId }
|
|
19630
|
+
});
|
|
19631
|
+
import_react_native23.Animated.spring(panelAnim, {
|
|
19632
|
+
toValue: 1,
|
|
19633
|
+
useNativeDriver: true,
|
|
19634
|
+
friction: 8,
|
|
19635
|
+
tension: 65
|
|
19636
|
+
}).start();
|
|
19637
|
+
}, [replace, panelAnim]);
|
|
19253
19638
|
if (!shouldShowWidget) return null;
|
|
19254
19639
|
const getHeaderTitle = () => {
|
|
19255
19640
|
switch (currentScreen.name) {
|
|
@@ -19292,40 +19677,41 @@ function BugBearButton({
|
|
|
19292
19677
|
};
|
|
19293
19678
|
const nav = {
|
|
19294
19679
|
push: (screen) => {
|
|
19295
|
-
|
|
19680
|
+
import_react_native23.Keyboard.dismiss();
|
|
19296
19681
|
push(screen);
|
|
19297
19682
|
},
|
|
19298
19683
|
pop: () => {
|
|
19299
|
-
|
|
19684
|
+
import_react_native23.Keyboard.dismiss();
|
|
19300
19685
|
pop();
|
|
19301
19686
|
},
|
|
19302
19687
|
replace: (screen) => {
|
|
19303
|
-
|
|
19688
|
+
import_react_native23.Keyboard.dismiss();
|
|
19304
19689
|
replace(screen);
|
|
19305
19690
|
},
|
|
19306
19691
|
reset: () => {
|
|
19307
|
-
|
|
19692
|
+
import_react_native23.Keyboard.dismiss();
|
|
19308
19693
|
reset();
|
|
19309
19694
|
},
|
|
19310
19695
|
canGoBack,
|
|
19311
|
-
closeWidget: handleClose
|
|
19696
|
+
closeWidget: handleClose,
|
|
19697
|
+
startMiniRunner
|
|
19312
19698
|
};
|
|
19313
19699
|
const QA_ONLY_SCREENS = ["TEST_DETAIL", "TEST_LIST", "TEST_FEEDBACK", "SESSION_START", "SESSION_ACTIVE", "SESSION_FINDING"];
|
|
19314
19700
|
const renderScreen = () => {
|
|
19315
19701
|
if (widgetMode === "feedback" && QA_ONLY_SCREENS.includes(currentScreen.name)) {
|
|
19316
|
-
return /* @__PURE__ */
|
|
19702
|
+
return /* @__PURE__ */ import_react24.default.createElement(HomeScreen, { nav });
|
|
19317
19703
|
}
|
|
19318
19704
|
switch (currentScreen.name) {
|
|
19319
19705
|
case "HOME":
|
|
19320
|
-
return /* @__PURE__ */
|
|
19706
|
+
return /* @__PURE__ */ import_react24.default.createElement(HomeScreen, { nav });
|
|
19321
19707
|
case "TEST_DETAIL":
|
|
19322
|
-
return /* @__PURE__ */
|
|
19708
|
+
return /* @__PURE__ */ import_react24.default.createElement(TestDetailScreen, { testId: currentScreen.testId, nav });
|
|
19323
19709
|
case "TEST_LIST":
|
|
19324
|
-
return /* @__PURE__ */
|
|
19710
|
+
return /* @__PURE__ */ import_react24.default.createElement(TestListScreen, { nav });
|
|
19325
19711
|
case "TEST_FEEDBACK":
|
|
19326
|
-
return /* @__PURE__ */
|
|
19712
|
+
return /* @__PURE__ */ import_react24.default.createElement(TestFeedbackScreen, { status: currentScreen.status, assignmentId: currentScreen.assignmentId, nav });
|
|
19327
19713
|
case "REPORT":
|
|
19328
|
-
return /* @__PURE__ */
|
|
19714
|
+
return /* @__PURE__ */ import_react24.default.createElement(
|
|
19329
19715
|
ReportScreen,
|
|
19330
19716
|
{
|
|
19331
19717
|
nav,
|
|
@@ -19337,84 +19723,93 @@ function BugBearButton({
|
|
|
19337
19723
|
}
|
|
19338
19724
|
);
|
|
19339
19725
|
case "REPORT_SUCCESS":
|
|
19340
|
-
return /* @__PURE__ */
|
|
19726
|
+
return /* @__PURE__ */ import_react24.default.createElement(ReportSuccessScreen, { nav });
|
|
19341
19727
|
case "MESSAGE_LIST":
|
|
19342
|
-
return /* @__PURE__ */
|
|
19728
|
+
return /* @__PURE__ */ import_react24.default.createElement(MessageListScreen, { nav });
|
|
19343
19729
|
case "THREAD_DETAIL":
|
|
19344
|
-
return /* @__PURE__ */
|
|
19730
|
+
return /* @__PURE__ */ import_react24.default.createElement(ThreadDetailScreen, { thread: currentScreen.thread, nav });
|
|
19345
19731
|
case "COMPOSE_MESSAGE":
|
|
19346
|
-
return /* @__PURE__ */
|
|
19732
|
+
return /* @__PURE__ */ import_react24.default.createElement(ComposeMessageScreen, { nav });
|
|
19347
19733
|
case "ISSUE_LIST":
|
|
19348
|
-
return /* @__PURE__ */
|
|
19734
|
+
return /* @__PURE__ */ import_react24.default.createElement(IssueListScreen, { nav, category: currentScreen.category });
|
|
19349
19735
|
case "ISSUE_DETAIL":
|
|
19350
|
-
return /* @__PURE__ */
|
|
19736
|
+
return /* @__PURE__ */ import_react24.default.createElement(IssueDetailScreen, { nav, issue: currentScreen.issue });
|
|
19351
19737
|
case "PROFILE":
|
|
19352
|
-
return /* @__PURE__ */
|
|
19738
|
+
return /* @__PURE__ */ import_react24.default.createElement(ProfileScreen, { nav });
|
|
19353
19739
|
case "SESSION_START":
|
|
19354
|
-
return /* @__PURE__ */
|
|
19740
|
+
return /* @__PURE__ */ import_react24.default.createElement(SessionStartScreen, { nav });
|
|
19355
19741
|
case "SESSION_ACTIVE":
|
|
19356
|
-
return /* @__PURE__ */
|
|
19742
|
+
return /* @__PURE__ */ import_react24.default.createElement(SessionActiveScreen, { nav });
|
|
19357
19743
|
case "SESSION_FINDING":
|
|
19358
|
-
return /* @__PURE__ */
|
|
19744
|
+
return /* @__PURE__ */ import_react24.default.createElement(SessionFindingScreen, { nav });
|
|
19359
19745
|
default:
|
|
19360
|
-
return /* @__PURE__ */
|
|
19746
|
+
return /* @__PURE__ */ import_react24.default.createElement(HomeScreen, { nav });
|
|
19361
19747
|
}
|
|
19362
19748
|
};
|
|
19363
|
-
return /* @__PURE__ */
|
|
19364
|
-
|
|
19749
|
+
return /* @__PURE__ */ import_react24.default.createElement(import_react24.default.Fragment, null, viewMode === "mini-runner" && miniRunnerAssignmentId && /* @__PURE__ */ import_react24.default.createElement(
|
|
19750
|
+
MiniTestRunner,
|
|
19751
|
+
{
|
|
19752
|
+
assignmentId: miniRunnerAssignmentId,
|
|
19753
|
+
onExpand: expandFromMiniRunner,
|
|
19754
|
+
onAdvance: handleMiniRunnerAdvance,
|
|
19755
|
+
onComplete: handleMiniRunnerComplete,
|
|
19756
|
+
onNavigateToReport: handleMiniRunnerReport
|
|
19757
|
+
}
|
|
19758
|
+
), viewMode === "closed" && /* @__PURE__ */ import_react24.default.createElement(
|
|
19759
|
+
import_react_native23.Animated.View,
|
|
19365
19760
|
{
|
|
19366
|
-
style: [
|
|
19761
|
+
style: [styles6.fabContainer, { transform: pan.getTranslateTransform() }, buttonStyle],
|
|
19367
19762
|
...panResponder.panHandlers
|
|
19368
19763
|
},
|
|
19369
|
-
/* @__PURE__ */
|
|
19370
|
-
|
|
19764
|
+
/* @__PURE__ */ import_react24.default.createElement(
|
|
19765
|
+
import_react_native23.TouchableOpacity,
|
|
19371
19766
|
{
|
|
19372
|
-
style:
|
|
19767
|
+
style: styles6.fab,
|
|
19373
19768
|
onPress: openPanel,
|
|
19374
19769
|
activeOpacity: draggable ? 1 : 0.7
|
|
19375
19770
|
},
|
|
19376
|
-
/* @__PURE__ */
|
|
19377
|
-
badgeCount > 0 && /* @__PURE__ */
|
|
19771
|
+
/* @__PURE__ */ import_react24.default.createElement(import_react_native23.Image, { source: { uri: BUGBEAR_LOGO_BASE64 }, style: styles6.fabIcon }),
|
|
19772
|
+
badgeCount > 0 && /* @__PURE__ */ import_react24.default.createElement(import_react_native23.View, { style: styles6.badge }, /* @__PURE__ */ import_react24.default.createElement(import_react_native23.Text, { style: styles6.badgeText }, badgeCount > 9 ? "9+" : badgeCount))
|
|
19378
19773
|
)
|
|
19379
|
-
),
|
|
19380
|
-
|
|
19774
|
+
), viewMode === "panel" && /* @__PURE__ */ import_react24.default.createElement(import_react_native23.View, { style: styles6.panelWrapper, pointerEvents: "box-none" }, /* @__PURE__ */ import_react24.default.createElement(
|
|
19775
|
+
import_react_native23.KeyboardAvoidingView,
|
|
19381
19776
|
{
|
|
19382
|
-
behavior:
|
|
19383
|
-
style:
|
|
19777
|
+
behavior: import_react_native23.Platform.OS === "ios" ? "padding" : "height",
|
|
19778
|
+
style: styles6.panelKeyboardAvoid,
|
|
19384
19779
|
pointerEvents: "box-none"
|
|
19385
19780
|
},
|
|
19386
|
-
/* @__PURE__ */
|
|
19387
|
-
|
|
19781
|
+
/* @__PURE__ */ import_react24.default.createElement(
|
|
19782
|
+
import_react_native23.Animated.View,
|
|
19388
19783
|
{
|
|
19389
19784
|
style: [
|
|
19390
|
-
|
|
19785
|
+
styles6.panelContainer,
|
|
19391
19786
|
{
|
|
19392
19787
|
transform: [{
|
|
19393
19788
|
translateY: panelAnim.interpolate({
|
|
19394
19789
|
inputRange: [0, 1],
|
|
19395
|
-
outputRange: [
|
|
19790
|
+
outputRange: [screenHeight2, 0]
|
|
19396
19791
|
})
|
|
19397
19792
|
}]
|
|
19398
19793
|
}
|
|
19399
19794
|
]
|
|
19400
19795
|
},
|
|
19401
|
-
/* @__PURE__ */
|
|
19402
|
-
/* @__PURE__ */
|
|
19403
|
-
/* @__PURE__ */
|
|
19404
|
-
|
|
19796
|
+
/* @__PURE__ */ import_react24.default.createElement(import_react_native23.View, { style: styles6.panelHandle }, /* @__PURE__ */ import_react24.default.createElement(import_react_native23.View, { style: styles6.panelHandleBar })),
|
|
19797
|
+
/* @__PURE__ */ import_react24.default.createElement(import_react_native23.View, { style: styles6.header }, /* @__PURE__ */ import_react24.default.createElement(import_react_native23.View, { style: styles6.headerLeft }, canGoBack ? /* @__PURE__ */ import_react24.default.createElement(import_react_native23.TouchableOpacity, { onPress: () => nav.pop(), style: styles6.backButton }, /* @__PURE__ */ import_react24.default.createElement(import_react_native23.Text, { style: styles6.backText }, "\u2190 Back")) : /* @__PURE__ */ import_react24.default.createElement(import_react_native23.View, { style: styles6.headerTitleRow }, /* @__PURE__ */ import_react24.default.createElement(import_react_native23.Text, { style: styles6.headerTitle }, "BugBear"), testerInfo && /* @__PURE__ */ import_react24.default.createElement(import_react_native23.TouchableOpacity, { onPress: () => push({ name: "PROFILE" }) }, /* @__PURE__ */ import_react24.default.createElement(import_react_native23.Text, { style: styles6.headerName }, testerInfo.name, " \u270E")))), getHeaderTitle() ? /* @__PURE__ */ import_react24.default.createElement(import_react_native23.Text, { style: styles6.headerScreenTitle, numberOfLines: 1 }, getHeaderTitle()) : null, /* @__PURE__ */ import_react24.default.createElement(import_react_native23.View, { style: styles6.headerActions }, currentScreen.name !== "HOME" && /* @__PURE__ */ import_react24.default.createElement(import_react_native23.TouchableOpacity, { onPress: () => nav.reset(), style: styles6.homeButton }, /* @__PURE__ */ import_react24.default.createElement(import_react_native23.Text, { style: styles6.homeIcon }, "\u2302")), /* @__PURE__ */ import_react24.default.createElement(import_react_native23.TouchableOpacity, { onPress: handleClose, style: styles6.closeButton }, /* @__PURE__ */ import_react24.default.createElement(import_react_native23.Text, { style: styles6.closeText }, "\u2715")))),
|
|
19798
|
+
/* @__PURE__ */ import_react24.default.createElement(
|
|
19799
|
+
import_react_native23.ScrollView,
|
|
19405
19800
|
{
|
|
19406
|
-
style:
|
|
19407
|
-
contentContainerStyle:
|
|
19801
|
+
style: styles6.content,
|
|
19802
|
+
contentContainerStyle: styles6.contentContainer,
|
|
19408
19803
|
keyboardShouldPersistTaps: "handled",
|
|
19409
19804
|
showsVerticalScrollIndicator: false
|
|
19410
19805
|
},
|
|
19411
|
-
isLoading ? /* @__PURE__ */
|
|
19806
|
+
isLoading ? /* @__PURE__ */ import_react24.default.createElement(import_react_native23.View, { style: styles6.loadingContainer }, /* @__PURE__ */ import_react24.default.createElement(import_react_native23.ActivityIndicator, { size: "large", color: colors.blue }), /* @__PURE__ */ import_react24.default.createElement(import_react_native23.Text, { style: styles6.loadingText }, "Loading...")) : renderScreen()
|
|
19412
19807
|
)
|
|
19413
19808
|
)
|
|
19414
19809
|
)));
|
|
19415
19810
|
}
|
|
19416
19811
|
function createStyles16() {
|
|
19417
|
-
return
|
|
19812
|
+
return import_react_native23.StyleSheet.create({
|
|
19418
19813
|
// FAB
|
|
19419
19814
|
fabContainer: {
|
|
19420
19815
|
position: "absolute",
|
|
@@ -19573,7 +19968,7 @@ function createStyles16() {
|
|
|
19573
19968
|
},
|
|
19574
19969
|
contentContainer: {
|
|
19575
19970
|
padding: 16,
|
|
19576
|
-
paddingBottom:
|
|
19971
|
+
paddingBottom: import_react_native23.Platform.OS === "ios" ? 50 : 28
|
|
19577
19972
|
},
|
|
19578
19973
|
// Loading
|
|
19579
19974
|
loadingContainer: {
|
|
@@ -19589,9 +19984,9 @@ function createStyles16() {
|
|
|
19589
19984
|
}
|
|
19590
19985
|
|
|
19591
19986
|
// src/BugBearErrorBoundary.tsx
|
|
19592
|
-
var
|
|
19593
|
-
var
|
|
19594
|
-
var BugBearErrorBoundary = class extends
|
|
19987
|
+
var import_react25 = __toESM(require("react"));
|
|
19988
|
+
var import_react_native24 = require("react-native");
|
|
19989
|
+
var BugBearErrorBoundary = class extends import_react25.Component {
|
|
19595
19990
|
constructor(props) {
|
|
19596
19991
|
super(props);
|
|
19597
19992
|
this.reset = () => {
|
|
@@ -19635,7 +20030,7 @@ var BugBearErrorBoundary = class extends import_react24.Component {
|
|
|
19635
20030
|
if (fallback) {
|
|
19636
20031
|
return fallback;
|
|
19637
20032
|
}
|
|
19638
|
-
return /* @__PURE__ */
|
|
20033
|
+
return /* @__PURE__ */ import_react25.default.createElement(import_react_native24.View, { style: styles5.container }, /* @__PURE__ */ import_react25.default.createElement(import_react_native24.Text, { style: styles5.title }, "Something went wrong"), /* @__PURE__ */ import_react25.default.createElement(import_react_native24.Text, { style: styles5.message }, error.message), /* @__PURE__ */ import_react25.default.createElement(import_react_native24.TouchableOpacity, { style: styles5.button, onPress: this.reset }, /* @__PURE__ */ import_react25.default.createElement(import_react_native24.Text, { style: styles5.buttonText }, "Try Again")), /* @__PURE__ */ import_react25.default.createElement(import_react_native24.Text, { style: styles5.caption }, "The error has been captured by BugBear"));
|
|
19639
20034
|
}
|
|
19640
20035
|
return children;
|
|
19641
20036
|
}
|
|
@@ -19646,7 +20041,7 @@ function useErrorContext() {
|
|
|
19646
20041
|
getEnhancedContext: () => contextCapture.getEnhancedContext()
|
|
19647
20042
|
};
|
|
19648
20043
|
}
|
|
19649
|
-
var
|
|
20044
|
+
var styles5 = import_react_native24.StyleSheet.create({
|
|
19650
20045
|
container: {
|
|
19651
20046
|
padding: 20,
|
|
19652
20047
|
margin: 20,
|