@bbearai/react-native 0.9.2 → 0.10.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js +916 -392
- package/dist/index.mjs +932 -397
- package/package.json +2 -2
package/dist/index.js
CHANGED
|
@@ -14118,7 +14118,9 @@ var BugBearClient = class {
|
|
|
14118
14118
|
p_tester_id: testerInfo.id,
|
|
14119
14119
|
p_focus_area: options.focusArea || null,
|
|
14120
14120
|
p_track: options.track || null,
|
|
14121
|
-
p_platform: options.platform || null
|
|
14121
|
+
p_platform: options.platform || null,
|
|
14122
|
+
p_session_type: options.sessionType || "exploratory",
|
|
14123
|
+
p_task_id: options.taskId || null
|
|
14122
14124
|
});
|
|
14123
14125
|
if (error) {
|
|
14124
14126
|
console.error("BugBear: Failed to start session", formatPgError(error));
|
|
@@ -14302,6 +14304,45 @@ var BugBearClient = class {
|
|
|
14302
14304
|
return { success: false, error: message };
|
|
14303
14305
|
}
|
|
14304
14306
|
}
|
|
14307
|
+
// ============================================
|
|
14308
|
+
// QA Tasks (Ad Hoc Testing)
|
|
14309
|
+
// ============================================
|
|
14310
|
+
/**
|
|
14311
|
+
* Get active QA tasks for the project
|
|
14312
|
+
*/
|
|
14313
|
+
async getTasks(status = "active") {
|
|
14314
|
+
try {
|
|
14315
|
+
await this.ensureReady();
|
|
14316
|
+
const { data, error } = await this.supabase.rpc("list_qa_tasks", {
|
|
14317
|
+
p_project_id: this.config.projectId,
|
|
14318
|
+
p_status: status
|
|
14319
|
+
});
|
|
14320
|
+
if (error) {
|
|
14321
|
+
console.error("BugBear: Failed to fetch tasks", formatPgError(error));
|
|
14322
|
+
return [];
|
|
14323
|
+
}
|
|
14324
|
+
return (data || []).map((t) => this.transformTask(t));
|
|
14325
|
+
} catch (err) {
|
|
14326
|
+
console.error("BugBear: Error fetching tasks", err);
|
|
14327
|
+
return [];
|
|
14328
|
+
}
|
|
14329
|
+
}
|
|
14330
|
+
/**
|
|
14331
|
+
* Transform database task to QATask type
|
|
14332
|
+
*/
|
|
14333
|
+
transformTask(data) {
|
|
14334
|
+
return {
|
|
14335
|
+
id: data.id,
|
|
14336
|
+
projectId: data.project_id,
|
|
14337
|
+
title: data.title,
|
|
14338
|
+
description: data.description || void 0,
|
|
14339
|
+
trackId: data.track_id || void 0,
|
|
14340
|
+
priority: data.priority,
|
|
14341
|
+
status: data.status,
|
|
14342
|
+
createdAt: data.created_at,
|
|
14343
|
+
updatedAt: data.updated_at
|
|
14344
|
+
};
|
|
14345
|
+
}
|
|
14305
14346
|
/**
|
|
14306
14347
|
* Transform database session to QASession type
|
|
14307
14348
|
*/
|
|
@@ -14313,6 +14354,8 @@ var BugBearClient = class {
|
|
|
14313
14354
|
focusArea: data.focus_area,
|
|
14314
14355
|
track: data.track,
|
|
14315
14356
|
platform: data.platform,
|
|
14357
|
+
sessionType: data.session_type || "exploratory",
|
|
14358
|
+
taskId: data.task_id || void 0,
|
|
14316
14359
|
startedAt: data.started_at,
|
|
14317
14360
|
endedAt: data.ended_at,
|
|
14318
14361
|
notes: data.notes,
|
|
@@ -14894,7 +14937,13 @@ function BugBearProvider({ config, children, appVersion, enabled = true }) {
|
|
|
14894
14937
|
}, [client, activeSession]);
|
|
14895
14938
|
const addFinding = (0, import_react.useCallback)(async (options) => {
|
|
14896
14939
|
if (!client || !activeSession) return { success: false, error: "No active session" };
|
|
14897
|
-
const
|
|
14940
|
+
const enhanced = contextCapture.getEnhancedContext();
|
|
14941
|
+
const enriched = {
|
|
14942
|
+
...options,
|
|
14943
|
+
consoleLogs: options.consoleLogs ?? enhanced.consoleLogs,
|
|
14944
|
+
networkSnapshot: options.networkSnapshot ?? enhanced.networkRequests
|
|
14945
|
+
};
|
|
14946
|
+
const result = await client.addFinding(activeSession.id, enriched);
|
|
14898
14947
|
if (result.success && result.finding) {
|
|
14899
14948
|
setSessionFindings((prev) => [...prev, result.finding]);
|
|
14900
14949
|
setActiveSession((prev) => prev ? { ...prev, findingsCount: prev.findingsCount + 1 } : null);
|
|
@@ -15195,8 +15244,8 @@ function BugBearProvider({ config, children, appVersion, enabled = true }) {
|
|
|
15195
15244
|
}
|
|
15196
15245
|
|
|
15197
15246
|
// src/BugBearButton.tsx
|
|
15198
|
-
var
|
|
15199
|
-
var
|
|
15247
|
+
var import_react25 = __toESM(require("react"));
|
|
15248
|
+
var import_react_native24 = require("react-native");
|
|
15200
15249
|
|
|
15201
15250
|
// src/widget/logo.ts
|
|
15202
15251
|
var BUGBEAR_LOGO_BASE64 = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGAAAABgCAYAAADimHc4AAAAAXNSR0IArs4c6QAAAJhlWElmTU0AKgAAAAgABAEaAAUAAAABAAAAPgEbAAUAAAABAAAARgEoAAMAAAABAAIAAIdpAAQAAAABAAAATgAAAAAAAABIAAAAAQAAAEgAAAABAASQBAACAAAAFAAAAISgAQADAAAAAQABAACgAgAEAAAAAQAAAGCgAwAEAAAAAQAAAGAAAAAAMjAyNjowMToyNCAxNjoyMTozOABbbVCuAAAACXBIWXMAAAsTAAALEwEAmpwYAAACo2lUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iWE1QIENvcmUgNi4wLjAiPgogICA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPgogICAgICA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIgogICAgICAgICAgICB4bWxuczpJcHRjNHhtcEV4dD0iaHR0cDovL2lwdGMub3JnL3N0ZC9JcHRjNHhtcEV4dC8yMDA4LTAyLTI5LyIKICAgICAgICAgICAgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIj4KICAgICAgICAgPElwdGM0eG1wRXh0OkRpZ2l0YWxTb3VyY2VUeXBlPmh0dHA6Ly9jdi5pcHRjLm9yZy9uZXdzY29kZXMvZGlnaXRhbHNvdXJjZXR5cGUvdHJhaW5lZEFsZ29yaXRobWljTWVkaWE8L0lwdGM0eG1wRXh0OkRpZ2l0YWxTb3VyY2VUeXBlPgogICAgICAgICA8SXB0YzR4bXBFeHQ6RGlnSW1hZ2VHVUlEPmZjNzJlN2Q2LTYyYTEtNDE1ZS04MjY5LWM2NjA4MjY0OWRiMDwvSXB0YzR4bXBFeHQ6RGlnSW1hZ2VHVUlEPgogICAgICAgICA8eG1wOkNyZWF0ZURhdGU+MjAyNi0wMS0yNFQxNjoyMTozODwveG1wOkNyZWF0ZURhdGU+CiAgICAgIDwvcmRmOkRlc2NyaXB0aW9uPgogICA8L3JkZjpSREY+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";
|
|
@@ -15340,7 +15389,7 @@ var s = import_react_native3.StyleSheet.create({
|
|
|
15340
15389
|
// src/widget/screens/HomeScreen.tsx
|
|
15341
15390
|
function HomeScreen({ nav }) {
|
|
15342
15391
|
const { assignments, unreadCount, threads, refreshAssignments, refreshThreads, issueCounts, refreshIssueCounts, dashboardUrl, isLoading, activeSession, sessionFindings, refreshSession, widgetMode, widgetColorScheme } = useBugBear();
|
|
15343
|
-
const
|
|
15392
|
+
const styles7 = (0, import_react4.useMemo)(() => createStyles(), [widgetColorScheme]);
|
|
15344
15393
|
const [sessionElapsed, setSessionElapsed] = (0, import_react4.useState)(0);
|
|
15345
15394
|
const timerRef = (0, import_react4.useRef)(null);
|
|
15346
15395
|
(0, import_react4.useEffect)(() => {
|
|
@@ -15369,98 +15418,98 @@ function HomeScreen({ nav }) {
|
|
|
15369
15418
|
return /* @__PURE__ */ import_react4.default.createElement(import_react_native4.View, null, unreadCount > 0 ? /* @__PURE__ */ import_react4.default.createElement(
|
|
15370
15419
|
import_react_native4.TouchableOpacity,
|
|
15371
15420
|
{
|
|
15372
|
-
style: [
|
|
15421
|
+
style: [styles7.heroBanner, styles7.heroBannerMessages],
|
|
15373
15422
|
onPress: () => nav.push({ name: "MESSAGE_LIST" }),
|
|
15374
15423
|
activeOpacity: 0.8
|
|
15375
15424
|
},
|
|
15376
|
-
/* @__PURE__ */ import_react4.default.createElement(import_react_native4.Text, { style:
|
|
15377
|
-
/* @__PURE__ */ import_react4.default.createElement(import_react_native4.Text, { style:
|
|
15378
|
-
/* @__PURE__ */ import_react4.default.createElement(import_react_native4.Text, { style:
|
|
15379
|
-
) : /* @__PURE__ */ import_react4.default.createElement(import_react_native4.View, { style: [
|
|
15425
|
+
/* @__PURE__ */ import_react4.default.createElement(import_react_native4.Text, { style: styles7.heroCount }, unreadCount),
|
|
15426
|
+
/* @__PURE__ */ import_react4.default.createElement(import_react_native4.Text, { style: styles7.heroLabel }, "unread message", unreadCount !== 1 ? "s" : ""),
|
|
15427
|
+
/* @__PURE__ */ import_react4.default.createElement(import_react_native4.Text, { style: styles7.heroAction }, "View Messages \u2192")
|
|
15428
|
+
) : /* @__PURE__ */ import_react4.default.createElement(import_react_native4.View, { style: [styles7.heroBanner, styles7.heroBannerClear] }, /* @__PURE__ */ import_react4.default.createElement(import_react_native4.Text, { style: styles7.heroClearEmoji }, "\u{1F4AC}"), /* @__PURE__ */ import_react4.default.createElement(import_react_native4.Text, { style: styles7.heroClearTitle }, "Help us improve"), /* @__PURE__ */ import_react4.default.createElement(import_react_native4.Text, { style: styles7.heroClearSub }, "Report bugs, share ideas, and track your submissions")), /* @__PURE__ */ import_react4.default.createElement(import_react_native4.View, { style: styles7.actionGrid }, /* @__PURE__ */ import_react4.default.createElement(
|
|
15380
15429
|
import_react_native4.TouchableOpacity,
|
|
15381
15430
|
{
|
|
15382
|
-
style:
|
|
15431
|
+
style: styles7.actionCard,
|
|
15383
15432
|
onPress: () => nav.push({ name: "REPORT", prefill: { type: "bug" } }),
|
|
15384
15433
|
activeOpacity: 0.7
|
|
15385
15434
|
},
|
|
15386
|
-
/* @__PURE__ */ import_react4.default.createElement(import_react_native4.Text, { style:
|
|
15387
|
-
/* @__PURE__ */ import_react4.default.createElement(import_react_native4.Text, { style:
|
|
15435
|
+
/* @__PURE__ */ import_react4.default.createElement(import_react_native4.Text, { style: styles7.actionIcon }, "\u{1F41B}"),
|
|
15436
|
+
/* @__PURE__ */ import_react4.default.createElement(import_react_native4.Text, { style: styles7.actionLabel }, "Report Bug")
|
|
15388
15437
|
), /* @__PURE__ */ import_react4.default.createElement(
|
|
15389
15438
|
import_react_native4.TouchableOpacity,
|
|
15390
15439
|
{
|
|
15391
|
-
style:
|
|
15440
|
+
style: styles7.actionCard,
|
|
15392
15441
|
onPress: () => nav.push({ name: "REPORT", prefill: { type: "feedback" } }),
|
|
15393
15442
|
activeOpacity: 0.7
|
|
15394
15443
|
},
|
|
15395
|
-
/* @__PURE__ */ import_react4.default.createElement(import_react_native4.Text, { style:
|
|
15396
|
-
/* @__PURE__ */ import_react4.default.createElement(import_react_native4.Text, { style:
|
|
15444
|
+
/* @__PURE__ */ import_react4.default.createElement(import_react_native4.Text, { style: styles7.actionIcon }, "\u{1F4A1}"),
|
|
15445
|
+
/* @__PURE__ */ import_react4.default.createElement(import_react_native4.Text, { style: styles7.actionLabel }, "Share Feedback")
|
|
15397
15446
|
), /* @__PURE__ */ import_react4.default.createElement(
|
|
15398
15447
|
import_react_native4.TouchableOpacity,
|
|
15399
15448
|
{
|
|
15400
|
-
style:
|
|
15449
|
+
style: styles7.actionCard,
|
|
15401
15450
|
onPress: () => nav.push({ name: "MESSAGE_LIST" }),
|
|
15402
15451
|
activeOpacity: 0.7
|
|
15403
15452
|
},
|
|
15404
|
-
/* @__PURE__ */ import_react4.default.createElement(import_react_native4.Text, { style:
|
|
15405
|
-
/* @__PURE__ */ import_react4.default.createElement(import_react_native4.Text, { style:
|
|
15406
|
-
unreadCount > 0 && /* @__PURE__ */ import_react4.default.createElement(import_react_native4.View, { style: [
|
|
15453
|
+
/* @__PURE__ */ import_react4.default.createElement(import_react_native4.Text, { style: styles7.actionIcon }, "\u{1F4AC}"),
|
|
15454
|
+
/* @__PURE__ */ import_react4.default.createElement(import_react_native4.Text, { style: styles7.actionLabel }, "Messages"),
|
|
15455
|
+
unreadCount > 0 && /* @__PURE__ */ import_react4.default.createElement(import_react_native4.View, { style: [styles7.actionBadge, styles7.actionBadgeMsg] }, /* @__PURE__ */ import_react4.default.createElement(import_react_native4.Text, { style: styles7.actionBadgeText }, unreadCount))
|
|
15407
15456
|
), /* @__PURE__ */ import_react4.default.createElement(
|
|
15408
15457
|
import_react_native4.TouchableOpacity,
|
|
15409
15458
|
{
|
|
15410
|
-
style:
|
|
15459
|
+
style: styles7.actionCard,
|
|
15411
15460
|
onPress: () => nav.push({ name: "ISSUE_LIST", category: "open" }),
|
|
15412
15461
|
activeOpacity: 0.7
|
|
15413
15462
|
},
|
|
15414
|
-
/* @__PURE__ */ import_react4.default.createElement(import_react_native4.Text, { style:
|
|
15415
|
-
/* @__PURE__ */ import_react4.default.createElement(import_react_native4.Text, { style:
|
|
15416
|
-
issueCounts.open > 0 && /* @__PURE__ */ import_react4.default.createElement(import_react_native4.View, { style: [
|
|
15417
|
-
)), /* @__PURE__ */ import_react4.default.createElement(import_react_native4.View, { style:
|
|
15463
|
+
/* @__PURE__ */ import_react4.default.createElement(import_react_native4.Text, { style: styles7.actionIcon }, "\u{1F4CB}"),
|
|
15464
|
+
/* @__PURE__ */ import_react4.default.createElement(import_react_native4.Text, { style: styles7.actionLabel }, "My Issues"),
|
|
15465
|
+
issueCounts.open > 0 && /* @__PURE__ */ import_react4.default.createElement(import_react_native4.View, { style: [styles7.actionBadge, styles7.actionBadgeIssue] }, /* @__PURE__ */ import_react4.default.createElement(import_react_native4.Text, { style: styles7.actionBadgeText }, issueCounts.open))
|
|
15466
|
+
)), /* @__PURE__ */ import_react4.default.createElement(import_react_native4.View, { style: styles7.issueGrid }, /* @__PURE__ */ import_react4.default.createElement(
|
|
15418
15467
|
import_react_native4.TouchableOpacity,
|
|
15419
15468
|
{
|
|
15420
|
-
style: [
|
|
15469
|
+
style: [styles7.issueCard, styles7.issueCardOpen],
|
|
15421
15470
|
onPress: () => nav.push({ name: "ISSUE_LIST", category: "open" }),
|
|
15422
15471
|
activeOpacity: 0.7
|
|
15423
15472
|
},
|
|
15424
|
-
/* @__PURE__ */ import_react4.default.createElement(import_react_native4.Text, { style:
|
|
15425
|
-
/* @__PURE__ */ import_react4.default.createElement(import_react_native4.Text, { style:
|
|
15473
|
+
/* @__PURE__ */ import_react4.default.createElement(import_react_native4.Text, { style: styles7.issueCountOpen }, issueCounts.open),
|
|
15474
|
+
/* @__PURE__ */ import_react4.default.createElement(import_react_native4.Text, { style: styles7.issueLabel }, "Open")
|
|
15426
15475
|
), /* @__PURE__ */ import_react4.default.createElement(
|
|
15427
15476
|
import_react_native4.TouchableOpacity,
|
|
15428
15477
|
{
|
|
15429
|
-
style: [
|
|
15478
|
+
style: [styles7.issueCard, styles7.issueCardDone],
|
|
15430
15479
|
onPress: () => nav.push({ name: "ISSUE_LIST", category: "done" }),
|
|
15431
15480
|
activeOpacity: 0.7
|
|
15432
15481
|
},
|
|
15433
|
-
/* @__PURE__ */ import_react4.default.createElement(import_react_native4.Text, { style:
|
|
15434
|
-
/* @__PURE__ */ import_react4.default.createElement(import_react_native4.Text, { style:
|
|
15482
|
+
/* @__PURE__ */ import_react4.default.createElement(import_react_native4.Text, { style: styles7.issueCountDone }, issueCounts.done),
|
|
15483
|
+
/* @__PURE__ */ import_react4.default.createElement(import_react_native4.Text, { style: styles7.issueLabel }, "Done")
|
|
15435
15484
|
), /* @__PURE__ */ import_react4.default.createElement(
|
|
15436
15485
|
import_react_native4.TouchableOpacity,
|
|
15437
15486
|
{
|
|
15438
|
-
style: [
|
|
15487
|
+
style: [styles7.issueCard, styles7.issueCardReopened],
|
|
15439
15488
|
onPress: () => nav.push({ name: "ISSUE_LIST", category: "reopened" }),
|
|
15440
15489
|
activeOpacity: 0.7
|
|
15441
15490
|
},
|
|
15442
|
-
/* @__PURE__ */ import_react4.default.createElement(import_react_native4.Text, { style:
|
|
15443
|
-
/* @__PURE__ */ import_react4.default.createElement(import_react_native4.Text, { style:
|
|
15491
|
+
/* @__PURE__ */ import_react4.default.createElement(import_react_native4.Text, { style: styles7.issueCountReopened }, issueCounts.reopened),
|
|
15492
|
+
/* @__PURE__ */ import_react4.default.createElement(import_react_native4.Text, { style: styles7.issueLabel }, "Reopened")
|
|
15444
15493
|
)), dashboardUrl && /* @__PURE__ */ import_react4.default.createElement(
|
|
15445
15494
|
import_react_native4.TouchableOpacity,
|
|
15446
15495
|
{
|
|
15447
|
-
style:
|
|
15496
|
+
style: styles7.webAppLink,
|
|
15448
15497
|
onPress: () => import_react_native4.Linking.openURL(dashboardUrl),
|
|
15449
15498
|
activeOpacity: 0.7
|
|
15450
15499
|
},
|
|
15451
|
-
/* @__PURE__ */ import_react4.default.createElement(import_react_native4.Text, { style:
|
|
15452
|
-
/* @__PURE__ */ import_react4.default.createElement(import_react_native4.View, { style:
|
|
15453
|
-
/* @__PURE__ */ import_react4.default.createElement(import_react_native4.Text, { style:
|
|
15500
|
+
/* @__PURE__ */ import_react4.default.createElement(import_react_native4.Text, { style: styles7.webAppIcon }, "\u{1F310}"),
|
|
15501
|
+
/* @__PURE__ */ import_react4.default.createElement(import_react_native4.View, { style: styles7.webAppTextWrap }, /* @__PURE__ */ import_react4.default.createElement(import_react_native4.Text, { style: styles7.webAppTitle }, "Open Web Dashboard"), /* @__PURE__ */ import_react4.default.createElement(import_react_native4.Text, { style: styles7.webAppSub }, "View your submissions & updates")),
|
|
15502
|
+
/* @__PURE__ */ import_react4.default.createElement(import_react_native4.Text, { style: styles7.webAppArrow }, "\u2192")
|
|
15454
15503
|
), /* @__PURE__ */ import_react4.default.createElement(
|
|
15455
15504
|
import_react_native4.TouchableOpacity,
|
|
15456
15505
|
{
|
|
15457
|
-
style:
|
|
15506
|
+
style: styles7.refreshButton,
|
|
15458
15507
|
onPress: () => {
|
|
15459
15508
|
refreshThreads();
|
|
15460
15509
|
refreshIssueCounts();
|
|
15461
15510
|
}
|
|
15462
15511
|
},
|
|
15463
|
-
/* @__PURE__ */ import_react4.default.createElement(import_react_native4.Text, { style:
|
|
15512
|
+
/* @__PURE__ */ import_react4.default.createElement(import_react_native4.Text, { style: styles7.refreshText }, "\u21BB Refresh")
|
|
15464
15513
|
));
|
|
15465
15514
|
}
|
|
15466
15515
|
const formatTimer = (s2) => {
|
|
@@ -15477,130 +15526,140 @@ function HomeScreen({ nav }) {
|
|
|
15477
15526
|
return /* @__PURE__ */ import_react4.default.createElement(import_react_native4.View, null, pendingCount > 0 ? /* @__PURE__ */ import_react4.default.createElement(
|
|
15478
15527
|
import_react_native4.TouchableOpacity,
|
|
15479
15528
|
{
|
|
15480
|
-
style: [
|
|
15529
|
+
style: [styles7.heroBanner, styles7.heroBannerTests],
|
|
15481
15530
|
onPress: () => nav.push({ name: "TEST_DETAIL" }),
|
|
15482
15531
|
activeOpacity: 0.8
|
|
15483
15532
|
},
|
|
15484
|
-
/* @__PURE__ */ import_react4.default.createElement(import_react_native4.Text, { style:
|
|
15485
|
-
/* @__PURE__ */ import_react4.default.createElement(import_react_native4.Text, { style:
|
|
15486
|
-
retestCount > 0 && /* @__PURE__ */ import_react4.default.createElement(import_react_native4.View, { style:
|
|
15487
|
-
/* @__PURE__ */ import_react4.default.createElement(import_react_native4.Text, { style:
|
|
15533
|
+
/* @__PURE__ */ import_react4.default.createElement(import_react_native4.Text, { style: styles7.heroCount }, pendingCount),
|
|
15534
|
+
/* @__PURE__ */ import_react4.default.createElement(import_react_native4.Text, { style: styles7.heroLabel }, "test", pendingCount !== 1 ? "s" : "", " waiting"),
|
|
15535
|
+
retestCount > 0 && /* @__PURE__ */ import_react4.default.createElement(import_react_native4.View, { style: styles7.retestPill }, /* @__PURE__ */ import_react4.default.createElement(import_react_native4.Text, { style: styles7.retestPillText }, "\u{1F504} ", retestCount, " retest", retestCount !== 1 ? "s" : "")),
|
|
15536
|
+
/* @__PURE__ */ import_react4.default.createElement(import_react_native4.Text, { style: styles7.heroAction }, "Start Testing \u2192")
|
|
15488
15537
|
) : unreadCount > 0 ? /* @__PURE__ */ import_react4.default.createElement(
|
|
15489
15538
|
import_react_native4.TouchableOpacity,
|
|
15490
15539
|
{
|
|
15491
|
-
style: [
|
|
15540
|
+
style: [styles7.heroBanner, styles7.heroBannerMessages],
|
|
15492
15541
|
onPress: () => nav.push({ name: "MESSAGE_LIST" }),
|
|
15493
15542
|
activeOpacity: 0.8
|
|
15494
15543
|
},
|
|
15495
|
-
/* @__PURE__ */ import_react4.default.createElement(import_react_native4.Text, { style:
|
|
15496
|
-
/* @__PURE__ */ import_react4.default.createElement(import_react_native4.Text, { style:
|
|
15497
|
-
/* @__PURE__ */ import_react4.default.createElement(import_react_native4.Text, { style:
|
|
15498
|
-
) : /* @__PURE__ */ import_react4.default.createElement(import_react_native4.View, { style: [
|
|
15544
|
+
/* @__PURE__ */ import_react4.default.createElement(import_react_native4.Text, { style: styles7.heroCount }, unreadCount),
|
|
15545
|
+
/* @__PURE__ */ import_react4.default.createElement(import_react_native4.Text, { style: styles7.heroLabel }, "unread message", unreadCount !== 1 ? "s" : ""),
|
|
15546
|
+
/* @__PURE__ */ import_react4.default.createElement(import_react_native4.Text, { style: styles7.heroAction }, "View Messages \u2192")
|
|
15547
|
+
) : /* @__PURE__ */ import_react4.default.createElement(import_react_native4.View, { style: [styles7.heroBanner, styles7.heroBannerClear] }, /* @__PURE__ */ import_react4.default.createElement(import_react_native4.Text, { style: styles7.heroClearEmoji }, "\u2705"), /* @__PURE__ */ import_react4.default.createElement(import_react_native4.Text, { style: styles7.heroClearTitle }, "All caught up!"), totalTests > 0 && /* @__PURE__ */ import_react4.default.createElement(import_react_native4.Text, { style: styles7.heroClearSub }, completedCount, "/", totalTests, " tests completed")), activeSession && activeSession.status === "active" ? /* @__PURE__ */ import_react4.default.createElement(
|
|
15499
15548
|
import_react_native4.TouchableOpacity,
|
|
15500
15549
|
{
|
|
15501
|
-
style:
|
|
15550
|
+
style: styles7.sessionCardActive,
|
|
15502
15551
|
onPress: () => nav.push({ name: "SESSION_ACTIVE" }),
|
|
15503
15552
|
activeOpacity: 0.8
|
|
15504
15553
|
},
|
|
15505
|
-
/* @__PURE__ */ import_react4.default.createElement(import_react_native4.View, { style:
|
|
15506
|
-
/* @__PURE__ */ import_react4.default.createElement(import_react_native4.View, { style:
|
|
15507
|
-
/* @__PURE__ */ import_react4.default.createElement(import_react_native4.Text, { style:
|
|
15554
|
+
/* @__PURE__ */ import_react4.default.createElement(import_react_native4.View, { style: styles7.sessionDot }),
|
|
15555
|
+
/* @__PURE__ */ import_react4.default.createElement(import_react_native4.View, { style: styles7.sessionCardContent }, /* @__PURE__ */ import_react4.default.createElement(import_react_native4.Text, { style: styles7.sessionCardTitle, numberOfLines: 1 }, activeSession.focusArea || "QA Session"), /* @__PURE__ */ import_react4.default.createElement(import_react_native4.Text, { style: styles7.sessionCardMeta }, formatTimer(sessionElapsed), " \xB7 ", sessionFindings.length, " finding", sessionFindings.length !== 1 ? "s" : "")),
|
|
15556
|
+
/* @__PURE__ */ import_react4.default.createElement(import_react_native4.Text, { style: styles7.sessionCardAction }, "Resume \u2192")
|
|
15508
15557
|
) : /* @__PURE__ */ import_react4.default.createElement(
|
|
15509
15558
|
import_react_native4.TouchableOpacity,
|
|
15510
15559
|
{
|
|
15511
|
-
style:
|
|
15560
|
+
style: styles7.sessionCardInactive,
|
|
15512
15561
|
onPress: () => nav.push({ name: "SESSION_START" }),
|
|
15513
15562
|
activeOpacity: 0.7
|
|
15514
15563
|
},
|
|
15515
|
-
/* @__PURE__ */ import_react4.default.createElement(import_react_native4.Text, { style:
|
|
15516
|
-
/* @__PURE__ */ import_react4.default.createElement(import_react_native4.Text, { style:
|
|
15517
|
-
/* @__PURE__ */ import_react4.default.createElement(import_react_native4.Text, { style:
|
|
15518
|
-
),
|
|
15564
|
+
/* @__PURE__ */ import_react4.default.createElement(import_react_native4.Text, { style: styles7.sessionCardIcon }, "\u{1F50D}"),
|
|
15565
|
+
/* @__PURE__ */ import_react4.default.createElement(import_react_native4.Text, { style: styles7.sessionCardLabel }, "Start QA Session"),
|
|
15566
|
+
/* @__PURE__ */ import_react4.default.createElement(import_react_native4.Text, { style: styles7.sessionCardArrow }, "\u2192")
|
|
15567
|
+
), !activeSession && nav.startAdHoc && /* @__PURE__ */ import_react4.default.createElement(
|
|
15568
|
+
import_react_native4.TouchableOpacity,
|
|
15569
|
+
{
|
|
15570
|
+
style: styles7.quickTestCard,
|
|
15571
|
+
onPress: () => nav.startAdHoc?.(),
|
|
15572
|
+
activeOpacity: 0.7
|
|
15573
|
+
},
|
|
15574
|
+
/* @__PURE__ */ import_react4.default.createElement(import_react_native4.Text, { style: styles7.quickTestIcon }, "\u26A1"),
|
|
15575
|
+
/* @__PURE__ */ import_react4.default.createElement(import_react_native4.View, { style: styles7.quickTestContent }, /* @__PURE__ */ import_react4.default.createElement(import_react_native4.Text, { style: styles7.quickTestTitle }, "Quick Test"), /* @__PURE__ */ import_react4.default.createElement(import_react_native4.Text, { style: styles7.quickTestSub }, "Ad hoc explore & report")),
|
|
15576
|
+
/* @__PURE__ */ import_react4.default.createElement(import_react_native4.Text, { style: styles7.sessionCardArrow }, "\u2192")
|
|
15577
|
+
), /* @__PURE__ */ import_react4.default.createElement(import_react_native4.View, { style: styles7.actionGrid }, /* @__PURE__ */ import_react4.default.createElement(
|
|
15519
15578
|
import_react_native4.TouchableOpacity,
|
|
15520
15579
|
{
|
|
15521
|
-
style:
|
|
15580
|
+
style: styles7.actionCard,
|
|
15522
15581
|
onPress: () => nav.push({ name: "TEST_LIST" }),
|
|
15523
15582
|
activeOpacity: 0.7
|
|
15524
15583
|
},
|
|
15525
|
-
/* @__PURE__ */ import_react4.default.createElement(import_react_native4.Text, { style:
|
|
15526
|
-
/* @__PURE__ */ import_react4.default.createElement(import_react_native4.Text, { style:
|
|
15527
|
-
pendingCount > 0 && /* @__PURE__ */ import_react4.default.createElement(import_react_native4.View, { style:
|
|
15584
|
+
/* @__PURE__ */ import_react4.default.createElement(import_react_native4.Text, { style: styles7.actionIcon }, "\u2705"),
|
|
15585
|
+
/* @__PURE__ */ import_react4.default.createElement(import_react_native4.Text, { style: styles7.actionLabel }, "Tests"),
|
|
15586
|
+
pendingCount > 0 && /* @__PURE__ */ import_react4.default.createElement(import_react_native4.View, { style: styles7.actionBadge }, /* @__PURE__ */ import_react4.default.createElement(import_react_native4.Text, { style: styles7.actionBadgeText }, pendingCount))
|
|
15528
15587
|
), /* @__PURE__ */ import_react4.default.createElement(
|
|
15529
15588
|
import_react_native4.TouchableOpacity,
|
|
15530
15589
|
{
|
|
15531
|
-
style:
|
|
15590
|
+
style: styles7.actionCard,
|
|
15532
15591
|
onPress: () => nav.push({ name: "REPORT", prefill: { type: "bug" } }),
|
|
15533
15592
|
activeOpacity: 0.7
|
|
15534
15593
|
},
|
|
15535
|
-
/* @__PURE__ */ import_react4.default.createElement(import_react_native4.Text, { style:
|
|
15536
|
-
/* @__PURE__ */ import_react4.default.createElement(import_react_native4.Text, { style:
|
|
15594
|
+
/* @__PURE__ */ import_react4.default.createElement(import_react_native4.Text, { style: styles7.actionIcon }, "\u{1F41B}"),
|
|
15595
|
+
/* @__PURE__ */ import_react4.default.createElement(import_react_native4.Text, { style: styles7.actionLabel }, "Report Bug")
|
|
15537
15596
|
), /* @__PURE__ */ import_react4.default.createElement(
|
|
15538
15597
|
import_react_native4.TouchableOpacity,
|
|
15539
15598
|
{
|
|
15540
|
-
style:
|
|
15599
|
+
style: styles7.actionCard,
|
|
15541
15600
|
onPress: () => nav.push({ name: "REPORT", prefill: { type: "feedback" } }),
|
|
15542
15601
|
activeOpacity: 0.7
|
|
15543
15602
|
},
|
|
15544
|
-
/* @__PURE__ */ import_react4.default.createElement(import_react_native4.Text, { style:
|
|
15545
|
-
/* @__PURE__ */ import_react4.default.createElement(import_react_native4.Text, { style:
|
|
15603
|
+
/* @__PURE__ */ import_react4.default.createElement(import_react_native4.Text, { style: styles7.actionIcon }, "\u{1F4A1}"),
|
|
15604
|
+
/* @__PURE__ */ import_react4.default.createElement(import_react_native4.Text, { style: styles7.actionLabel }, "Feedback")
|
|
15546
15605
|
), /* @__PURE__ */ import_react4.default.createElement(
|
|
15547
15606
|
import_react_native4.TouchableOpacity,
|
|
15548
15607
|
{
|
|
15549
|
-
style:
|
|
15608
|
+
style: styles7.actionCard,
|
|
15550
15609
|
onPress: () => nav.push({ name: "MESSAGE_LIST" }),
|
|
15551
15610
|
activeOpacity: 0.7
|
|
15552
15611
|
},
|
|
15553
|
-
/* @__PURE__ */ import_react4.default.createElement(import_react_native4.Text, { style:
|
|
15554
|
-
/* @__PURE__ */ import_react4.default.createElement(import_react_native4.Text, { style:
|
|
15555
|
-
unreadCount > 0 && /* @__PURE__ */ import_react4.default.createElement(import_react_native4.View, { style: [
|
|
15556
|
-
)), /* @__PURE__ */ import_react4.default.createElement(import_react_native4.View, { style:
|
|
15612
|
+
/* @__PURE__ */ import_react4.default.createElement(import_react_native4.Text, { style: styles7.actionIcon }, "\u{1F4AC}"),
|
|
15613
|
+
/* @__PURE__ */ import_react4.default.createElement(import_react_native4.Text, { style: styles7.actionLabel }, "Messages"),
|
|
15614
|
+
unreadCount > 0 && /* @__PURE__ */ import_react4.default.createElement(import_react_native4.View, { style: [styles7.actionBadge, styles7.actionBadgeMsg] }, /* @__PURE__ */ import_react4.default.createElement(import_react_native4.Text, { style: styles7.actionBadgeText }, unreadCount))
|
|
15615
|
+
)), /* @__PURE__ */ import_react4.default.createElement(import_react_native4.View, { style: styles7.issueGrid }, /* @__PURE__ */ import_react4.default.createElement(
|
|
15557
15616
|
import_react_native4.TouchableOpacity,
|
|
15558
15617
|
{
|
|
15559
|
-
style: [
|
|
15618
|
+
style: [styles7.issueCard, styles7.issueCardOpen],
|
|
15560
15619
|
onPress: () => nav.push({ name: "ISSUE_LIST", category: "open" }),
|
|
15561
15620
|
activeOpacity: 0.7
|
|
15562
15621
|
},
|
|
15563
|
-
/* @__PURE__ */ import_react4.default.createElement(import_react_native4.Text, { style:
|
|
15564
|
-
/* @__PURE__ */ import_react4.default.createElement(import_react_native4.Text, { style:
|
|
15622
|
+
/* @__PURE__ */ import_react4.default.createElement(import_react_native4.Text, { style: styles7.issueCountOpen }, issueCounts.open),
|
|
15623
|
+
/* @__PURE__ */ import_react4.default.createElement(import_react_native4.Text, { style: styles7.issueLabel }, "Open")
|
|
15565
15624
|
), /* @__PURE__ */ import_react4.default.createElement(
|
|
15566
15625
|
import_react_native4.TouchableOpacity,
|
|
15567
15626
|
{
|
|
15568
|
-
style: [
|
|
15627
|
+
style: [styles7.issueCard, styles7.issueCardDone],
|
|
15569
15628
|
onPress: () => nav.push({ name: "ISSUE_LIST", category: "done" }),
|
|
15570
15629
|
activeOpacity: 0.7
|
|
15571
15630
|
},
|
|
15572
|
-
/* @__PURE__ */ import_react4.default.createElement(import_react_native4.Text, { style:
|
|
15573
|
-
/* @__PURE__ */ import_react4.default.createElement(import_react_native4.Text, { style:
|
|
15631
|
+
/* @__PURE__ */ import_react4.default.createElement(import_react_native4.Text, { style: styles7.issueCountDone }, issueCounts.done),
|
|
15632
|
+
/* @__PURE__ */ import_react4.default.createElement(import_react_native4.Text, { style: styles7.issueLabel }, "Done")
|
|
15574
15633
|
), /* @__PURE__ */ import_react4.default.createElement(
|
|
15575
15634
|
import_react_native4.TouchableOpacity,
|
|
15576
15635
|
{
|
|
15577
|
-
style: [
|
|
15636
|
+
style: [styles7.issueCard, styles7.issueCardReopened],
|
|
15578
15637
|
onPress: () => nav.push({ name: "ISSUE_LIST", category: "reopened" }),
|
|
15579
15638
|
activeOpacity: 0.7
|
|
15580
15639
|
},
|
|
15581
|
-
/* @__PURE__ */ import_react4.default.createElement(import_react_native4.Text, { style:
|
|
15582
|
-
/* @__PURE__ */ import_react4.default.createElement(import_react_native4.Text, { style:
|
|
15583
|
-
)), totalTests > 0 && /* @__PURE__ */ import_react4.default.createElement(import_react_native4.View, { style:
|
|
15640
|
+
/* @__PURE__ */ import_react4.default.createElement(import_react_native4.Text, { style: styles7.issueCountReopened }, issueCounts.reopened),
|
|
15641
|
+
/* @__PURE__ */ import_react4.default.createElement(import_react_native4.Text, { style: styles7.issueLabel }, "Reopened")
|
|
15642
|
+
)), totalTests > 0 && /* @__PURE__ */ import_react4.default.createElement(import_react_native4.View, { style: styles7.progressSection }, /* @__PURE__ */ import_react4.default.createElement(import_react_native4.View, { style: styles7.progressBar }, /* @__PURE__ */ import_react4.default.createElement(import_react_native4.View, { style: [styles7.progressFill, { width: `${Math.round(completedCount / totalTests * 100)}%` }] })), /* @__PURE__ */ import_react4.default.createElement(import_react_native4.Text, { style: styles7.progressText }, completedCount, "/", totalTests, " tests completed")), dashboardUrl && /* @__PURE__ */ import_react4.default.createElement(
|
|
15584
15643
|
import_react_native4.TouchableOpacity,
|
|
15585
15644
|
{
|
|
15586
|
-
style:
|
|
15645
|
+
style: styles7.webAppLink,
|
|
15587
15646
|
onPress: () => import_react_native4.Linking.openURL(dashboardUrl),
|
|
15588
15647
|
activeOpacity: 0.7
|
|
15589
15648
|
},
|
|
15590
|
-
/* @__PURE__ */ import_react4.default.createElement(import_react_native4.Text, { style:
|
|
15591
|
-
/* @__PURE__ */ import_react4.default.createElement(import_react_native4.View, { style:
|
|
15592
|
-
/* @__PURE__ */ import_react4.default.createElement(import_react_native4.Text, { style:
|
|
15649
|
+
/* @__PURE__ */ import_react4.default.createElement(import_react_native4.Text, { style: styles7.webAppIcon }, "\u{1F310}"),
|
|
15650
|
+
/* @__PURE__ */ import_react4.default.createElement(import_react_native4.View, { style: styles7.webAppTextWrap }, /* @__PURE__ */ import_react4.default.createElement(import_react_native4.Text, { style: styles7.webAppTitle }, "Open Web Dashboard"), /* @__PURE__ */ import_react4.default.createElement(import_react_native4.Text, { style: styles7.webAppSub }, "View analytics, history & more")),
|
|
15651
|
+
/* @__PURE__ */ import_react4.default.createElement(import_react_native4.Text, { style: styles7.webAppArrow }, "\u2192")
|
|
15593
15652
|
), /* @__PURE__ */ import_react4.default.createElement(
|
|
15594
15653
|
import_react_native4.TouchableOpacity,
|
|
15595
15654
|
{
|
|
15596
|
-
style:
|
|
15655
|
+
style: styles7.refreshButton,
|
|
15597
15656
|
onPress: () => {
|
|
15598
15657
|
refreshAssignments();
|
|
15599
15658
|
refreshThreads();
|
|
15600
15659
|
refreshIssueCounts();
|
|
15601
15660
|
}
|
|
15602
15661
|
},
|
|
15603
|
-
/* @__PURE__ */ import_react4.default.createElement(import_react_native4.Text, { style:
|
|
15662
|
+
/* @__PURE__ */ import_react4.default.createElement(import_react_native4.Text, { style: styles7.refreshText }, "\u21BB Refresh")
|
|
15604
15663
|
));
|
|
15605
15664
|
}
|
|
15606
15665
|
function createStyles() {
|
|
@@ -15889,6 +15948,35 @@ function createStyles() {
|
|
|
15889
15948
|
sessionCardArrow: {
|
|
15890
15949
|
fontSize: 13,
|
|
15891
15950
|
color: colors.textMuted
|
|
15951
|
+
},
|
|
15952
|
+
// Quick Test card
|
|
15953
|
+
quickTestCard: {
|
|
15954
|
+
flexDirection: "row",
|
|
15955
|
+
alignItems: "center",
|
|
15956
|
+
backgroundColor: colors.card,
|
|
15957
|
+
borderWidth: 1,
|
|
15958
|
+
borderColor: colors.border,
|
|
15959
|
+
borderRadius: 12,
|
|
15960
|
+
padding: 12,
|
|
15961
|
+
paddingHorizontal: 16,
|
|
15962
|
+
gap: 12,
|
|
15963
|
+
marginBottom: 16
|
|
15964
|
+
},
|
|
15965
|
+
quickTestIcon: {
|
|
15966
|
+
fontSize: 22
|
|
15967
|
+
},
|
|
15968
|
+
quickTestContent: {
|
|
15969
|
+
flex: 1
|
|
15970
|
+
},
|
|
15971
|
+
quickTestTitle: {
|
|
15972
|
+
fontSize: 14,
|
|
15973
|
+
fontWeight: "600",
|
|
15974
|
+
color: colors.textPrimary
|
|
15975
|
+
},
|
|
15976
|
+
quickTestSub: {
|
|
15977
|
+
fontSize: 12,
|
|
15978
|
+
color: colors.textMuted,
|
|
15979
|
+
marginTop: 2
|
|
15892
15980
|
}
|
|
15893
15981
|
});
|
|
15894
15982
|
}
|
|
@@ -15898,7 +15986,7 @@ var import_react5 = __toESM(require("react"));
|
|
|
15898
15986
|
var import_react_native5 = require("react-native");
|
|
15899
15987
|
function TestDetailScreen({ testId, nav }) {
|
|
15900
15988
|
const { client, assignments, currentAssignment, refreshAssignments, getDeviceInfo, onNavigate, widgetColorScheme } = useBugBear();
|
|
15901
|
-
const
|
|
15989
|
+
const styles7 = (0, import_react5.useMemo)(() => createStyles2(), [widgetColorScheme]);
|
|
15902
15990
|
const displayedAssignment = testId ? assignments.find((a) => a.id === testId) || currentAssignment : currentAssignment;
|
|
15903
15991
|
const [showSteps, setShowSteps] = (0, import_react5.useState)(true);
|
|
15904
15992
|
const [showDetails, setShowDetails] = (0, import_react5.useState)(false);
|
|
@@ -16076,7 +16164,7 @@ function TestDetailScreen({ testId, nav }) {
|
|
|
16076
16164
|
const steps = testCase.steps;
|
|
16077
16165
|
const info = templateInfo[template] || templateInfo.steps;
|
|
16078
16166
|
const rubricMode = testCase.track?.rubricMode || "pass_fail";
|
|
16079
|
-
return /* @__PURE__ */ import_react5.default.createElement(import_react_native5.View, { style:
|
|
16167
|
+
return /* @__PURE__ */ import_react5.default.createElement(import_react_native5.View, { style: styles7.container }, /* @__PURE__ */ import_react5.default.createElement(import_react_native5.View, { style: styles7.topRow }, /* @__PURE__ */ import_react5.default.createElement(import_react_native5.View, { style: styles7.positionInfo }, /* @__PURE__ */ import_react5.default.createElement(import_react_native5.Text, { style: styles7.positionText }, "Test ", currentIndex + 1, " of ", allTests.length), displayedAssignment.status === "in_progress" && assignmentElapsedTime > 0 && /* @__PURE__ */ import_react5.default.createElement(import_react_native5.View, { style: styles7.timerBadge }, /* @__PURE__ */ import_react5.default.createElement(import_react_native5.Text, { style: styles7.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: styles7.viewAllLink }, "View All \u2192"))), displayedAssignment.isVerification && /* @__PURE__ */ import_react5.default.createElement(import_react_native5.View, { style: styles7.retestBanner }, /* @__PURE__ */ import_react5.default.createElement(import_react_native5.Text, { style: styles7.retestIcon }, "\u{1F504}"), /* @__PURE__ */ import_react5.default.createElement(import_react_native5.Text, { style: styles7.retestLabel }, "Retest"), /* @__PURE__ */ import_react5.default.createElement(import_react_native5.Text, { style: styles7.retestSub }, "\u2014 Verify bug fix")), /* @__PURE__ */ import_react5.default.createElement(import_react_native5.Text, { style: styles7.testTitle }, testCase.title), testCase.key && /* @__PURE__ */ import_react5.default.createElement(import_react_native5.Text, { style: styles7.testKey }, testCase.key), /* @__PURE__ */ import_react5.default.createElement(import_react_native5.TouchableOpacity, { onPress: () => setShowSteps(!showSteps), style: styles7.sectionHeader }, /* @__PURE__ */ import_react5.default.createElement(import_react_native5.Text, { style: styles7.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: styles7.templateContent }, template === "steps" && steps.map((step, idx) => /* @__PURE__ */ import_react5.default.createElement(import_react_native5.View, { key: idx, style: styles7.step }, /* @__PURE__ */ import_react5.default.createElement(import_react_native5.View, { style: styles7.stepNumber }, /* @__PURE__ */ import_react5.default.createElement(import_react_native5.Text, { style: styles7.stepNumberText }, step.stepNumber)), /* @__PURE__ */ import_react5.default.createElement(import_react_native5.View, { style: styles7.stepBody }, /* @__PURE__ */ import_react5.default.createElement(import_react_native5.Text, { style: styles7.stepAction }, step.action), step.expectedResult && /* @__PURE__ */ import_react5.default.createElement(import_react_native5.Text, { style: styles7.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(
|
|
16080
16168
|
import_react_native5.TouchableOpacity,
|
|
16081
16169
|
{
|
|
16082
16170
|
key: idx,
|
|
@@ -16086,86 +16174,86 @@ function TestDetailScreen({ testId, nav }) {
|
|
|
16086
16174
|
else next[idx] = true;
|
|
16087
16175
|
return next;
|
|
16088
16176
|
}),
|
|
16089
|
-
style: [
|
|
16177
|
+
style: [styles7.checklistItem, criteriaResults[idx] === true && styles7.checklistItemChecked]
|
|
16090
16178
|
},
|
|
16091
|
-
/* @__PURE__ */ import_react5.default.createElement(import_react_native5.View, { style: [
|
|
16092
|
-
/* @__PURE__ */ import_react5.default.createElement(import_react_native5.Text, { style: [
|
|
16093
|
-
)), Object.keys(criteriaResults).length > 0 && /* @__PURE__ */ import_react5.default.createElement(import_react_native5.TouchableOpacity, { onPress: () => setCriteriaResults({}), style:
|
|
16179
|
+
/* @__PURE__ */ import_react5.default.createElement(import_react_native5.View, { style: [styles7.checkbox, criteriaResults[idx] === true && styles7.checkboxChecked] }, criteriaResults[idx] === true && /* @__PURE__ */ import_react5.default.createElement(import_react_native5.Text, { style: styles7.checkmark }, "\u2713")),
|
|
16180
|
+
/* @__PURE__ */ import_react5.default.createElement(import_react_native5.Text, { style: [styles7.checklistText, criteriaResults[idx] === true && styles7.checklistTextDone] }, step.action)
|
|
16181
|
+
)), Object.keys(criteriaResults).length > 0 && /* @__PURE__ */ import_react5.default.createElement(import_react_native5.TouchableOpacity, { onPress: () => setCriteriaResults({}), style: styles7.resetRow }, /* @__PURE__ */ import_react5.default.createElement(import_react_native5.Text, { style: styles7.resetText }, "\u21BA Reset"))), template === "rubric" && steps.map((step, idx) => /* @__PURE__ */ import_react5.default.createElement(import_react_native5.View, { key: idx, style: styles7.rubricItem }, /* @__PURE__ */ import_react5.default.createElement(import_react_native5.Text, { style: styles7.rubricTitle }, idx + 1, ". ", step.action), step.expectedResult && /* @__PURE__ */ import_react5.default.createElement(import_react_native5.Text, { style: styles7.rubricExpected }, step.expectedResult), rubricMode === "pass_fail" ? /* @__PURE__ */ import_react5.default.createElement(import_react_native5.View, { style: styles7.passFailRow }, /* @__PURE__ */ import_react5.default.createElement(
|
|
16094
16182
|
import_react_native5.TouchableOpacity,
|
|
16095
16183
|
{
|
|
16096
16184
|
onPress: () => setCriteriaResults((prev) => ({ ...prev, [idx]: true })),
|
|
16097
|
-
style: [
|
|
16185
|
+
style: [styles7.pfButton, criteriaResults[idx] === true && styles7.pfButtonPass]
|
|
16098
16186
|
},
|
|
16099
|
-
/* @__PURE__ */ import_react5.default.createElement(import_react_native5.Text, { style: [
|
|
16187
|
+
/* @__PURE__ */ import_react5.default.createElement(import_react_native5.Text, { style: [styles7.pfButtonText, criteriaResults[idx] === true && styles7.pfButtonTextActive] }, "\u2713 Pass")
|
|
16100
16188
|
), /* @__PURE__ */ import_react5.default.createElement(
|
|
16101
16189
|
import_react_native5.TouchableOpacity,
|
|
16102
16190
|
{
|
|
16103
16191
|
onPress: () => setCriteriaResults((prev) => ({ ...prev, [idx]: false })),
|
|
16104
|
-
style: [
|
|
16192
|
+
style: [styles7.pfButton, criteriaResults[idx] === false && styles7.pfButtonFail]
|
|
16105
16193
|
},
|
|
16106
|
-
/* @__PURE__ */ import_react5.default.createElement(import_react_native5.Text, { style: [
|
|
16107
|
-
)) : /* @__PURE__ */ import_react5.default.createElement(import_react_native5.View, { style:
|
|
16194
|
+
/* @__PURE__ */ import_react5.default.createElement(import_react_native5.Text, { style: [styles7.pfButtonText, criteriaResults[idx] === false && styles7.pfButtonTextActive] }, "\u2717 Fail")
|
|
16195
|
+
)) : /* @__PURE__ */ import_react5.default.createElement(import_react_native5.View, { style: styles7.ratingRow }, [1, 2, 3, 4, 5].map((n) => /* @__PURE__ */ import_react5.default.createElement(
|
|
16108
16196
|
import_react_native5.TouchableOpacity,
|
|
16109
16197
|
{
|
|
16110
16198
|
key: n,
|
|
16111
16199
|
onPress: () => setCriteriaResults((prev) => ({ ...prev, [idx]: n })),
|
|
16112
|
-
style: [
|
|
16200
|
+
style: [styles7.ratingBtn, criteriaResults[idx] === n && styles7.ratingBtnActive]
|
|
16113
16201
|
},
|
|
16114
|
-
/* @__PURE__ */ import_react5.default.createElement(import_react_native5.Text, { style: [
|
|
16115
|
-
))))), template === "freeform" && /* @__PURE__ */ import_react5.default.createElement(import_react_native5.View, { style:
|
|
16202
|
+
/* @__PURE__ */ import_react5.default.createElement(import_react_native5.Text, { style: [styles7.ratingBtnText, criteriaResults[idx] === n && styles7.ratingBtnTextActive] }, n)
|
|
16203
|
+
))))), template === "freeform" && /* @__PURE__ */ import_react5.default.createElement(import_react_native5.View, { style: styles7.freeformBox }, /* @__PURE__ */ import_react5.default.createElement(import_react_native5.Text, { style: styles7.freeformText }, "Review the area and note:"), /* @__PURE__ */ import_react5.default.createElement(import_react_native5.Text, { style: styles7.freeformBullet }, "\u2022 What works well"), /* @__PURE__ */ import_react5.default.createElement(import_react_native5.Text, { style: styles7.freeformBullet }, "\u2022 Issues or concerns"), /* @__PURE__ */ import_react5.default.createElement(import_react_native5.Text, { style: styles7.freeformBullet }, "\u2022 Suggestions"))), testCase.expectedResult && /* @__PURE__ */ import_react5.default.createElement(import_react_native5.View, { style: styles7.expectedBox }, /* @__PURE__ */ import_react5.default.createElement(import_react_native5.Text, { style: styles7.expectedLabel }, "\u2705 Expected Result"), /* @__PURE__ */ import_react5.default.createElement(import_react_native5.Text, { style: styles7.expectedText }, testCase.expectedResult)), testCase.targetRoute && onNavigate && /* @__PURE__ */ import_react5.default.createElement(
|
|
16116
16204
|
import_react_native5.TouchableOpacity,
|
|
16117
16205
|
{
|
|
16118
|
-
style:
|
|
16206
|
+
style: styles7.navigateButton,
|
|
16119
16207
|
onPress: () => {
|
|
16120
16208
|
import_react_native5.Keyboard.dismiss();
|
|
16121
16209
|
onNavigate(testCase.targetRoute);
|
|
16122
16210
|
nav.closeWidget?.();
|
|
16123
16211
|
}
|
|
16124
16212
|
},
|
|
16125
|
-
/* @__PURE__ */ import_react5.default.createElement(import_react_native5.Text, { style:
|
|
16126
|
-
), /* @__PURE__ */ import_react5.default.createElement(import_react_native5.TouchableOpacity, { onPress: () => setShowDetails(!showDetails), style:
|
|
16213
|
+
/* @__PURE__ */ import_react5.default.createElement(import_react_native5.Text, { style: styles7.navigateText }, "\u{1F9ED} Go to test location")
|
|
16214
|
+
), /* @__PURE__ */ import_react5.default.createElement(import_react_native5.TouchableOpacity, { onPress: () => setShowDetails(!showDetails), style: styles7.detailsToggle }, /* @__PURE__ */ import_react5.default.createElement(import_react_native5.Text, { style: styles7.detailsToggleText }, showDetails ? "\u25BC" : "\u25B6", " Details")), showDetails && /* @__PURE__ */ import_react5.default.createElement(import_react_native5.View, { style: styles7.detailsSection }, testCase.key && /* @__PURE__ */ import_react5.default.createElement(import_react_native5.Text, { style: styles7.detailMeta }, testCase.key, " \xB7 ", testCase.priority, " \xB7 ", info.name), testCase.track && /* @__PURE__ */ import_react5.default.createElement(import_react_native5.Text, { style: styles7.detailMeta }, testCase.track.icon, " ", testCase.track.name), testCase.description && /* @__PURE__ */ import_react5.default.createElement(import_react_native5.Text, { style: styles7.detailDesc }, testCase.description), testCase.group && /* @__PURE__ */ import_react5.default.createElement(import_react_native5.View, { style: styles7.folderProgress }, /* @__PURE__ */ import_react5.default.createElement(import_react_native5.Text, { style: styles7.folderName }, "\u{1F4C1} ", testCase.group.name))), displayedAssignment.status === "in_progress" && nav.startMiniRunner && /* @__PURE__ */ import_react5.default.createElement(
|
|
16127
16215
|
import_react_native5.TouchableOpacity,
|
|
16128
16216
|
{
|
|
16129
|
-
style:
|
|
16217
|
+
style: styles7.startTestBtn,
|
|
16130
16218
|
onPress: () => nav.startMiniRunner(displayedAssignment.id)
|
|
16131
16219
|
},
|
|
16132
|
-
/* @__PURE__ */ import_react5.default.createElement(import_react_native5.Text, { style:
|
|
16220
|
+
/* @__PURE__ */ import_react5.default.createElement(import_react_native5.Text, { style: styles7.startTestText }, "\u25B6 Start Test")
|
|
16133
16221
|
), 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
|
-
|
|
16135
|
-
displayedAssignment.status === "passed" &&
|
|
16136
|
-
displayedAssignment.status === "failed" &&
|
|
16137
|
-
] }, /* @__PURE__ */ import_react5.default.createElement(import_react_native5.Text, { style:
|
|
16138
|
-
|
|
16222
|
+
styles7.completedBanner,
|
|
16223
|
+
displayedAssignment.status === "passed" && styles7.completedBannerPass,
|
|
16224
|
+
displayedAssignment.status === "failed" && styles7.completedBannerFail
|
|
16225
|
+
] }, /* @__PURE__ */ import_react5.default.createElement(import_react_native5.Text, { style: styles7.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: [
|
|
16226
|
+
styles7.completedLabel,
|
|
16139
16227
|
displayedAssignment.status === "passed" && { color: colors.green },
|
|
16140
16228
|
displayedAssignment.status === "failed" && { color: colors.redLight }
|
|
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: [
|
|
16229
|
+
] }, "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: [styles7.actionButtons, { marginTop: 4 }] }, /* @__PURE__ */ import_react5.default.createElement(
|
|
16142
16230
|
import_react_native5.TouchableOpacity,
|
|
16143
16231
|
{
|
|
16144
|
-
style: [
|
|
16232
|
+
style: [styles7.actionBtn, styles7.reopenBtn, isSubmitting && { opacity: 0.5 }],
|
|
16145
16233
|
onPress: handleReopen,
|
|
16146
16234
|
disabled: isSubmitting
|
|
16147
16235
|
},
|
|
16148
|
-
/* @__PURE__ */ import_react5.default.createElement(import_react_native5.Text, { style:
|
|
16236
|
+
/* @__PURE__ */ import_react5.default.createElement(import_react_native5.Text, { style: styles7.reopenBtnText }, isSubmitting ? "Reopening..." : "\u{1F504} Reopen Test")
|
|
16149
16237
|
), displayedAssignment.status === "passed" && /* @__PURE__ */ import_react5.default.createElement(
|
|
16150
16238
|
import_react_native5.TouchableOpacity,
|
|
16151
16239
|
{
|
|
16152
|
-
style: [
|
|
16240
|
+
style: [styles7.actionBtn, styles7.failBtn, isSubmitting && { opacity: 0.5 }],
|
|
16153
16241
|
onPress: () => handleChangeResult("failed"),
|
|
16154
16242
|
disabled: isSubmitting
|
|
16155
16243
|
},
|
|
16156
|
-
/* @__PURE__ */ import_react5.default.createElement(import_react_native5.Text, { style:
|
|
16244
|
+
/* @__PURE__ */ import_react5.default.createElement(import_react_native5.Text, { style: styles7.failBtnText }, "Change to Fail")
|
|
16157
16245
|
), displayedAssignment.status === "failed" && /* @__PURE__ */ import_react5.default.createElement(
|
|
16158
16246
|
import_react_native5.TouchableOpacity,
|
|
16159
16247
|
{
|
|
16160
|
-
style: [
|
|
16248
|
+
style: [styles7.actionBtn, styles7.passBtn, isSubmitting && { opacity: 0.5 }],
|
|
16161
16249
|
onPress: () => handleChangeResult("passed"),
|
|
16162
16250
|
disabled: isSubmitting
|
|
16163
16251
|
},
|
|
16164
|
-
/* @__PURE__ */ import_react5.default.createElement(import_react_native5.Text, { style:
|
|
16165
|
-
))) : /* @__PURE__ */ import_react5.default.createElement(import_react_native5.View, { style:
|
|
16252
|
+
/* @__PURE__ */ import_react5.default.createElement(import_react_native5.Text, { style: styles7.passBtnText }, "Change to Pass")
|
|
16253
|
+
))) : /* @__PURE__ */ import_react5.default.createElement(import_react_native5.View, { style: styles7.actionButtons }, /* @__PURE__ */ import_react5.default.createElement(import_react_native5.TouchableOpacity, { style: [styles7.actionBtn, styles7.failBtn, isSubmitting && { opacity: 0.5 }], onPress: handleFail, disabled: isSubmitting }, /* @__PURE__ */ import_react5.default.createElement(import_react_native5.Text, { style: styles7.failBtnText }, isSubmitting ? displayedAssignment.isVerification ? "Reporting..." : "Failing..." : displayedAssignment.isVerification ? "\u2717 Still Broken" : "Fail")), /* @__PURE__ */ import_react5.default.createElement(import_react_native5.TouchableOpacity, { style: [styles7.actionBtn, styles7.skipBtn, isSubmitting && { opacity: 0.5 }], onPress: () => setShowSkipModal(true), disabled: isSubmitting }, /* @__PURE__ */ import_react5.default.createElement(import_react_native5.Text, { style: styles7.skipBtnText }, "Skip")), /* @__PURE__ */ import_react5.default.createElement(import_react_native5.TouchableOpacity, { style: [styles7.actionBtn, styles7.passBtn, isSubmitting && { opacity: 0.5 }], onPress: handlePass, disabled: isSubmitting }, /* @__PURE__ */ import_react5.default.createElement(import_react_native5.Text, { style: styles7.passBtnText }, isSubmitting ? displayedAssignment.isVerification ? "Verifying..." : "Passing..." : displayedAssignment.isVerification ? "\u2713 Fix Verified" : "Pass"))), feedbackToastAssignmentId && /* @__PURE__ */ import_react5.default.createElement(import_react_native5.Animated.View, { style: [styles7.passToast, { transform: [{ translateY: toastSlideAnim }] }] }, /* @__PURE__ */ import_react5.default.createElement(import_react_native5.View, { style: styles7.passToastContent }, /* @__PURE__ */ import_react5.default.createElement(import_react_native5.Text, { style: styles7.passToastIcon }, "\u2705"), /* @__PURE__ */ import_react5.default.createElement(import_react_native5.Text, { style: styles7.passToastText }, "Test passed!")), /* @__PURE__ */ import_react5.default.createElement(
|
|
16166
16254
|
import_react_native5.TouchableOpacity,
|
|
16167
16255
|
{
|
|
16168
|
-
style:
|
|
16256
|
+
style: styles7.passToastButton,
|
|
16169
16257
|
onPress: () => {
|
|
16170
16258
|
if (toastTimerRef.current) clearTimeout(toastTimerRef.current);
|
|
16171
16259
|
const toastId = feedbackToastAssignmentId;
|
|
@@ -16173,8 +16261,8 @@ function TestDetailScreen({ testId, nav }) {
|
|
|
16173
16261
|
nav.push({ name: "TEST_FEEDBACK", status: "passed", assignmentId: toastId });
|
|
16174
16262
|
}
|
|
16175
16263
|
},
|
|
16176
|
-
/* @__PURE__ */ import_react5.default.createElement(import_react_native5.Text, { style:
|
|
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:
|
|
16264
|
+
/* @__PURE__ */ import_react5.default.createElement(import_react_native5.Text, { style: styles7.passToastButtonText }, "Rate this test")
|
|
16265
|
+
)), /* @__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: styles7.modalOverlay }, /* @__PURE__ */ import_react5.default.createElement(import_react_native5.View, { style: styles7.modalContent }, /* @__PURE__ */ import_react5.default.createElement(import_react_native5.Text, { style: styles7.modalTitle }, "Skip this test?"), /* @__PURE__ */ import_react5.default.createElement(import_react_native5.Text, { style: styles7.modalSubtitle }, "Select a reason:"), [
|
|
16178
16266
|
{ reason: "blocked", label: "\u{1F6AB} Blocked by a bug" },
|
|
16179
16267
|
{ reason: "not_ready", label: "\u{1F6A7} Feature not ready" },
|
|
16180
16268
|
{ reason: "dependency", label: "\u{1F517} Needs another test first" },
|
|
@@ -16183,32 +16271,32 @@ function TestDetailScreen({ testId, nav }) {
|
|
|
16183
16271
|
import_react_native5.TouchableOpacity,
|
|
16184
16272
|
{
|
|
16185
16273
|
key: reason,
|
|
16186
|
-
style: [
|
|
16274
|
+
style: [styles7.skipOption, selectedSkipReason === reason && styles7.skipOptionActive],
|
|
16187
16275
|
onPress: () => setSelectedSkipReason(reason)
|
|
16188
16276
|
},
|
|
16189
|
-
/* @__PURE__ */ import_react5.default.createElement(import_react_native5.Text, { style: [
|
|
16277
|
+
/* @__PURE__ */ import_react5.default.createElement(import_react_native5.Text, { style: [styles7.skipOptionText, selectedSkipReason === reason && styles7.skipOptionTextActive] }, label)
|
|
16190
16278
|
)), /* @__PURE__ */ import_react5.default.createElement(
|
|
16191
16279
|
import_react_native5.TextInput,
|
|
16192
16280
|
{
|
|
16193
|
-
style:
|
|
16281
|
+
style: styles7.skipNotes,
|
|
16194
16282
|
value: skipNotes,
|
|
16195
16283
|
onChangeText: setSkipNotes,
|
|
16196
16284
|
placeholder: "Additional notes (optional)",
|
|
16197
16285
|
placeholderTextColor: colors.textMuted,
|
|
16198
16286
|
multiline: true
|
|
16199
16287
|
}
|
|
16200
|
-
), /* @__PURE__ */ import_react5.default.createElement(import_react_native5.View, { style:
|
|
16288
|
+
), /* @__PURE__ */ import_react5.default.createElement(import_react_native5.View, { style: styles7.skipActions }, /* @__PURE__ */ import_react5.default.createElement(import_react_native5.TouchableOpacity, { style: styles7.skipCancel, onPress: () => {
|
|
16201
16289
|
setShowSkipModal(false);
|
|
16202
16290
|
setSelectedSkipReason(null);
|
|
16203
16291
|
setSkipNotes("");
|
|
16204
|
-
} }, /* @__PURE__ */ import_react5.default.createElement(import_react_native5.Text, { style:
|
|
16292
|
+
} }, /* @__PURE__ */ import_react5.default.createElement(import_react_native5.Text, { style: styles7.skipCancelText }, "Cancel")), /* @__PURE__ */ import_react5.default.createElement(
|
|
16205
16293
|
import_react_native5.TouchableOpacity,
|
|
16206
16294
|
{
|
|
16207
|
-
style: [
|
|
16295
|
+
style: [styles7.skipConfirm, !selectedSkipReason && { opacity: 0.4 }],
|
|
16208
16296
|
onPress: handleSkip,
|
|
16209
16297
|
disabled: !selectedSkipReason || skipping
|
|
16210
16298
|
},
|
|
16211
|
-
/* @__PURE__ */ import_react5.default.createElement(import_react_native5.Text, { style:
|
|
16299
|
+
/* @__PURE__ */ import_react5.default.createElement(import_react_native5.Text, { style: styles7.skipConfirmText }, skipping ? "Skipping..." : "Skip Test")
|
|
16212
16300
|
))))));
|
|
16213
16301
|
}
|
|
16214
16302
|
function createStyles2() {
|
|
@@ -16330,7 +16418,7 @@ var import_react6 = __toESM(require("react"));
|
|
|
16330
16418
|
var import_react_native6 = require("react-native");
|
|
16331
16419
|
function TestListScreen({ nav }) {
|
|
16332
16420
|
const { assignments, currentAssignment, refreshAssignments, dashboardUrl, isLoading, widgetColorScheme } = useBugBear();
|
|
16333
|
-
const
|
|
16421
|
+
const styles7 = (0, import_react6.useMemo)(() => createStyles3(), [widgetColorScheme]);
|
|
16334
16422
|
const [filter, setFilter] = (0, import_react6.useState)("all");
|
|
16335
16423
|
const [roleFilter, setRoleFilter] = (0, import_react6.useState)(null);
|
|
16336
16424
|
const [trackFilter, setTrackFilter] = (0, import_react6.useState)(null);
|
|
@@ -16422,18 +16510,18 @@ function TestListScreen({ nav }) {
|
|
|
16422
16510
|
return true;
|
|
16423
16511
|
}, [platformFilter, roleFilter, trackFilter, searchQuery, filter]);
|
|
16424
16512
|
if (isLoading) return /* @__PURE__ */ import_react6.default.createElement(TestListScreenSkeleton, null);
|
|
16425
|
-
return /* @__PURE__ */ import_react6.default.createElement(import_react_native6.View, null, /* @__PURE__ */ import_react6.default.createElement(import_react_native6.View, { style:
|
|
16513
|
+
return /* @__PURE__ */ import_react6.default.createElement(import_react_native6.View, null, /* @__PURE__ */ import_react6.default.createElement(import_react_native6.View, { style: styles7.filterBar }, [
|
|
16426
16514
|
{ key: "all", label: "All", count: assignments.length },
|
|
16427
16515
|
{ key: "todo", label: "To Do", count: assignments.filter((a) => !a.isVerification && (a.status === "pending" || a.status === "in_progress" || a.status === "failed")).length },
|
|
16428
16516
|
{ key: "retest", label: "Retest", count: assignments.filter((a) => !!a.isVerification && (a.status === "pending" || a.status === "in_progress")).length },
|
|
16429
16517
|
{ key: "done", label: "Done", count: assignments.filter((a) => a.status === "passed" || a.status === "skipped" || a.status === "blocked").length }
|
|
16430
|
-
].map((f) => /* @__PURE__ */ import_react6.default.createElement(import_react_native6.TouchableOpacity, { key: f.key, style: [
|
|
16518
|
+
].map((f) => /* @__PURE__ */ import_react6.default.createElement(import_react_native6.TouchableOpacity, { key: f.key, style: [styles7.filterBtn, filter === f.key && styles7.filterBtnActive], onPress: () => setFilter(f.key) }, /* @__PURE__ */ import_react6.default.createElement(import_react_native6.Text, { style: [styles7.filterBtnText, filter === f.key && styles7.filterBtnTextActive] }, f.label, " (", f.count, ")")))), availableRoles.length >= 2 && /* @__PURE__ */ import_react6.default.createElement(import_react_native6.View, { style: styles7.roleSection }, /* @__PURE__ */ import_react6.default.createElement(import_react_native6.ScrollView, { horizontal: true, showsHorizontalScrollIndicator: false, style: styles7.roleBar }, /* @__PURE__ */ import_react6.default.createElement(
|
|
16431
16519
|
import_react_native6.TouchableOpacity,
|
|
16432
16520
|
{
|
|
16433
|
-
style: [
|
|
16521
|
+
style: [styles7.roleBtn, !roleFilter && styles7.roleBtnActive],
|
|
16434
16522
|
onPress: () => setRoleFilter(null)
|
|
16435
16523
|
},
|
|
16436
|
-
/* @__PURE__ */ import_react6.default.createElement(import_react_native6.Text, { style: [
|
|
16524
|
+
/* @__PURE__ */ import_react6.default.createElement(import_react_native6.Text, { style: [styles7.roleBtnText, !roleFilter && styles7.roleBtnTextActive] }, "All Roles")
|
|
16437
16525
|
), availableRoles.map((role) => {
|
|
16438
16526
|
const isActive = roleFilter === role.id;
|
|
16439
16527
|
return /* @__PURE__ */ import_react6.default.createElement(
|
|
@@ -16441,30 +16529,30 @@ function TestListScreen({ nav }) {
|
|
|
16441
16529
|
{
|
|
16442
16530
|
key: role.id,
|
|
16443
16531
|
style: [
|
|
16444
|
-
|
|
16532
|
+
styles7.roleBtn,
|
|
16445
16533
|
isActive && { backgroundColor: role.color + "20", borderColor: role.color + "60", borderWidth: 1 }
|
|
16446
16534
|
],
|
|
16447
16535
|
onPress: () => setRoleFilter(isActive ? null : role.id)
|
|
16448
16536
|
},
|
|
16449
|
-
/* @__PURE__ */ import_react6.default.createElement(import_react_native6.View, { style: [
|
|
16450
|
-
/* @__PURE__ */ import_react6.default.createElement(import_react_native6.Text, { style: [
|
|
16537
|
+
/* @__PURE__ */ import_react6.default.createElement(import_react_native6.View, { style: [styles7.roleDot, { backgroundColor: role.color }] }),
|
|
16538
|
+
/* @__PURE__ */ import_react6.default.createElement(import_react_native6.Text, { style: [styles7.roleBtnText, isActive && { color: role.color, fontWeight: "600" }] }, role.name)
|
|
16451
16539
|
);
|
|
16452
|
-
})), selectedRole?.loginHint && /* @__PURE__ */ import_react6.default.createElement(import_react_native6.View, { style: [
|
|
16540
|
+
})), selectedRole?.loginHint && /* @__PURE__ */ import_react6.default.createElement(import_react_native6.View, { style: [styles7.loginHint, { backgroundColor: selectedRole.color + "10", borderColor: selectedRole.color + "30" }] }, /* @__PURE__ */ import_react6.default.createElement(import_react_native6.Text, { style: styles7.loginHintText }, "Log in as: ", selectedRole.loginHint))), /* @__PURE__ */ import_react6.default.createElement(import_react_native6.View, { style: styles7.searchContainer }, /* @__PURE__ */ import_react6.default.createElement(
|
|
16453
16541
|
import_react_native6.TextInput,
|
|
16454
16542
|
{
|
|
16455
16543
|
value: searchQuery,
|
|
16456
16544
|
onChangeText: setSearchQuery,
|
|
16457
16545
|
placeholder: "Search tests...",
|
|
16458
16546
|
placeholderTextColor: colors.textMuted,
|
|
16459
|
-
style:
|
|
16547
|
+
style: styles7.searchInput
|
|
16460
16548
|
}
|
|
16461
|
-
)), /* @__PURE__ */ import_react6.default.createElement(import_react_native6.ScrollView, { horizontal: true, showsHorizontalScrollIndicator: false, style:
|
|
16549
|
+
)), /* @__PURE__ */ import_react6.default.createElement(import_react_native6.ScrollView, { horizontal: true, showsHorizontalScrollIndicator: false, style: styles7.platformBar }, /* @__PURE__ */ import_react6.default.createElement(
|
|
16462
16550
|
import_react_native6.TouchableOpacity,
|
|
16463
16551
|
{
|
|
16464
|
-
style: [
|
|
16552
|
+
style: [styles7.platformBtn, !platformFilter && styles7.platformBtnActive],
|
|
16465
16553
|
onPress: () => setPlatformFilter(null)
|
|
16466
16554
|
},
|
|
16467
|
-
/* @__PURE__ */ import_react6.default.createElement(import_react_native6.Text, { style: [
|
|
16555
|
+
/* @__PURE__ */ import_react6.default.createElement(import_react_native6.Text, { style: [styles7.platformBtnText, !platformFilter && styles7.platformBtnTextActive] }, "All")
|
|
16468
16556
|
), [
|
|
16469
16557
|
{ key: "web", label: "Web", icon: "\u{1F310}" },
|
|
16470
16558
|
{ key: "ios", label: "iOS", icon: "\u{1F4F1}" },
|
|
@@ -16476,32 +16564,32 @@ function TestListScreen({ nav }) {
|
|
|
16476
16564
|
{
|
|
16477
16565
|
key: p.key,
|
|
16478
16566
|
style: [
|
|
16479
|
-
|
|
16567
|
+
styles7.platformBtn,
|
|
16480
16568
|
isActive && { backgroundColor: colors.blue + "20", borderColor: colors.blue + "60", borderWidth: 1 }
|
|
16481
16569
|
],
|
|
16482
16570
|
onPress: () => setPlatformFilter(isActive ? null : p.key)
|
|
16483
16571
|
},
|
|
16484
|
-
/* @__PURE__ */ import_react6.default.createElement(import_react_native6.Text, { style: [
|
|
16572
|
+
/* @__PURE__ */ import_react6.default.createElement(import_react_native6.Text, { style: [styles7.platformBtnText, isActive && { color: colors.blue, fontWeight: "600" }] }, p.icon, " ", p.label)
|
|
16485
16573
|
);
|
|
16486
|
-
})), /* @__PURE__ */ import_react6.default.createElement(import_react_native6.View, { style:
|
|
16574
|
+
})), /* @__PURE__ */ import_react6.default.createElement(import_react_native6.View, { style: styles7.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(
|
|
16487
16575
|
import_react_native6.TouchableOpacity,
|
|
16488
16576
|
{
|
|
16489
|
-
style: [
|
|
16577
|
+
style: [styles7.trackBtn, !trackFilter && styles7.trackBtnActive],
|
|
16490
16578
|
onPress: () => setTrackFilter(null)
|
|
16491
16579
|
},
|
|
16492
|
-
/* @__PURE__ */ import_react6.default.createElement(import_react_native6.Text, { style: [
|
|
16580
|
+
/* @__PURE__ */ import_react6.default.createElement(import_react_native6.Text, { style: [styles7.trackBtnText, !trackFilter && styles7.trackBtnTextActive] }, "All Tracks")
|
|
16493
16581
|
), availableTracks.map((track) => {
|
|
16494
16582
|
const isActive = trackFilter === track.id;
|
|
16495
16583
|
return /* @__PURE__ */ import_react6.default.createElement(
|
|
16496
16584
|
import_react_native6.TouchableOpacity,
|
|
16497
16585
|
{
|
|
16498
16586
|
key: track.id,
|
|
16499
|
-
style: [
|
|
16587
|
+
style: [styles7.trackBtn, isActive && { backgroundColor: track.color + "20", borderColor: track.color + "60", borderWidth: 1 }],
|
|
16500
16588
|
onPress: () => setTrackFilter(isActive ? null : track.id)
|
|
16501
16589
|
},
|
|
16502
|
-
/* @__PURE__ */ import_react6.default.createElement(import_react_native6.Text, { style: [
|
|
16590
|
+
/* @__PURE__ */ import_react6.default.createElement(import_react_native6.Text, { style: [styles7.trackBtnText, isActive && { color: track.color, fontWeight: "600" }] }, track.icon, " ", track.name)
|
|
16503
16591
|
);
|
|
16504
|
-
})), /* @__PURE__ */ import_react6.default.createElement(import_react_native6.View, { style:
|
|
16592
|
+
})), /* @__PURE__ */ import_react6.default.createElement(import_react_native6.View, { style: styles7.sortGroup }, [
|
|
16505
16593
|
{ key: "priority", label: "\u2195 Priority" },
|
|
16506
16594
|
{ key: "recent", label: "\u{1F550} Recent" },
|
|
16507
16595
|
{ key: "alpha", label: "A-Z" }
|
|
@@ -16509,41 +16597,41 @@ function TestListScreen({ nav }) {
|
|
|
16509
16597
|
import_react_native6.TouchableOpacity,
|
|
16510
16598
|
{
|
|
16511
16599
|
key: s2.key,
|
|
16512
|
-
style: [
|
|
16600
|
+
style: [styles7.sortBtn, sortMode === s2.key && styles7.sortBtnActive],
|
|
16513
16601
|
onPress: () => setSortMode(s2.key)
|
|
16514
16602
|
},
|
|
16515
|
-
/* @__PURE__ */ import_react6.default.createElement(import_react_native6.Text, { style: [
|
|
16603
|
+
/* @__PURE__ */ import_react6.default.createElement(import_react_native6.Text, { style: [styles7.sortBtnText, sortMode === s2.key && styles7.sortBtnTextActive] }, s2.label)
|
|
16516
16604
|
)))), groupedAssignments.map((folder) => {
|
|
16517
16605
|
const folderId = folder.group?.id || "ungrouped";
|
|
16518
16606
|
const isCollapsed = collapsedFolders.has(folderId);
|
|
16519
16607
|
const filtered = folder.assignments.filter(filterAssignment);
|
|
16520
16608
|
if (filtered.length === 0 && filter !== "all") return null;
|
|
16521
|
-
return /* @__PURE__ */ import_react6.default.createElement(import_react_native6.View, { key: folderId, style:
|
|
16609
|
+
return /* @__PURE__ */ import_react6.default.createElement(import_react_native6.View, { key: folderId, style: styles7.folder }, /* @__PURE__ */ import_react6.default.createElement(import_react_native6.TouchableOpacity, { style: styles7.folderHeader, onPress: () => toggleFolder(folderId) }, /* @__PURE__ */ import_react6.default.createElement(import_react_native6.Text, { style: styles7.folderToggle }, isCollapsed ? "\u25B6" : "\u25BC"), /* @__PURE__ */ import_react6.default.createElement(import_react_native6.Text, { style: styles7.folderName, numberOfLines: 1 }, folder.group?.name || "Ungrouped"), /* @__PURE__ */ import_react6.default.createElement(import_react_native6.View, { style: styles7.folderProgress }, /* @__PURE__ */ import_react6.default.createElement(import_react_native6.View, { style: [styles7.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: styles7.folderCount }, folder.stats.passed + folder.stats.failed, "/", folder.stats.total)), !isCollapsed && filtered.map((assignment) => {
|
|
16522
16610
|
const badge = getStatusBadge(assignment.status);
|
|
16523
16611
|
const isCurrent = currentAssignment?.id === assignment.id;
|
|
16524
16612
|
return /* @__PURE__ */ import_react6.default.createElement(
|
|
16525
16613
|
import_react_native6.TouchableOpacity,
|
|
16526
16614
|
{
|
|
16527
16615
|
key: assignment.id,
|
|
16528
|
-
style: [
|
|
16616
|
+
style: [styles7.testItem, isCurrent && styles7.testItemCurrent],
|
|
16529
16617
|
onPress: () => nav.push({ name: "TEST_DETAIL", testId: assignment.id })
|
|
16530
16618
|
},
|
|
16531
|
-
/* @__PURE__ */ import_react6.default.createElement(import_react_native6.Text, { style:
|
|
16532
|
-
/* @__PURE__ */ import_react6.default.createElement(import_react_native6.View, { style:
|
|
16533
|
-
|
|
16619
|
+
/* @__PURE__ */ import_react6.default.createElement(import_react_native6.Text, { style: styles7.testBadge }, badge.icon),
|
|
16620
|
+
/* @__PURE__ */ import_react6.default.createElement(import_react_native6.View, { style: styles7.testInfo }, /* @__PURE__ */ import_react6.default.createElement(import_react_native6.Text, { style: styles7.testTitle, numberOfLines: 1 }, assignment.testCase.title), /* @__PURE__ */ import_react6.default.createElement(import_react_native6.View, { style: styles7.testMetaRow }, assignment.isVerification && /* @__PURE__ */ import_react6.default.createElement(import_react_native6.View, { style: [
|
|
16621
|
+
styles7.retestTag,
|
|
16534
16622
|
assignment.status === "passed" && { backgroundColor: colors.greenDark, borderColor: colors.greenBorder }
|
|
16535
16623
|
] }, /* @__PURE__ */ import_react6.default.createElement(import_react_native6.Text, { style: [
|
|
16536
|
-
|
|
16624
|
+
styles7.retestTagText,
|
|
16537
16625
|
assignment.status === "passed" && { color: colors.greenLight }
|
|
16538
|
-
] }, assignment.status === "passed" ? "Verified" : "Retest")), /* @__PURE__ */ import_react6.default.createElement(import_react_native6.Text, { style:
|
|
16626
|
+
] }, assignment.status === "passed" ? "Verified" : "Retest")), /* @__PURE__ */ import_react6.default.createElement(import_react_native6.Text, { style: styles7.testMeta }, assignment.testCase.testKey, " \xB7 ", assignment.testCase.priority), assignment.testCase.role && /* @__PURE__ */ import_react6.default.createElement(import_react_native6.View, { style: styles7.roleBadgeRow }, /* @__PURE__ */ import_react6.default.createElement(import_react_native6.Text, { style: styles7.testMeta }, " \xB7 "), /* @__PURE__ */ import_react6.default.createElement(import_react_native6.View, { style: [styles7.roleBadgeDot, { backgroundColor: assignment.testCase.role.color }] }), /* @__PURE__ */ import_react6.default.createElement(import_react_native6.Text, { style: [styles7.testMeta, { color: assignment.testCase.role.color, fontWeight: "500" }] }, assignment.testCase.role.name)))),
|
|
16539
16627
|
/* @__PURE__ */ import_react6.default.createElement(import_react_native6.View, { style: [
|
|
16540
|
-
|
|
16628
|
+
styles7.statusPill,
|
|
16541
16629
|
{
|
|
16542
16630
|
backgroundColor: assignment.status === "passed" ? colors.greenDark : assignment.status === "failed" ? colors.redSurface : assignment.status === "in_progress" ? colors.blueSurface : colors.card,
|
|
16543
16631
|
borderColor: assignment.status === "passed" ? colors.greenBorder : assignment.status === "failed" ? colors.redDark : assignment.status === "in_progress" ? colors.blueDark : colors.border
|
|
16544
16632
|
}
|
|
16545
16633
|
] }, /* @__PURE__ */ import_react6.default.createElement(import_react_native6.Text, { style: [
|
|
16546
|
-
|
|
16634
|
+
styles7.statusPillText,
|
|
16547
16635
|
{
|
|
16548
16636
|
color: assignment.status === "passed" ? colors.greenMed : assignment.status === "failed" ? colors.redMed : assignment.status === "in_progress" ? colors.blueLight : colors.zincLight
|
|
16549
16637
|
}
|
|
@@ -16553,12 +16641,12 @@ function TestListScreen({ nav }) {
|
|
|
16553
16641
|
}), dashboardUrl && /* @__PURE__ */ import_react6.default.createElement(
|
|
16554
16642
|
import_react_native6.TouchableOpacity,
|
|
16555
16643
|
{
|
|
16556
|
-
style:
|
|
16644
|
+
style: styles7.dashboardLink,
|
|
16557
16645
|
onPress: () => import_react_native6.Linking.openURL(`${dashboardUrl}/test-cases`),
|
|
16558
16646
|
activeOpacity: 0.7
|
|
16559
16647
|
},
|
|
16560
|
-
/* @__PURE__ */ import_react6.default.createElement(import_react_native6.Text, { style:
|
|
16561
|
-
), /* @__PURE__ */ import_react6.default.createElement(import_react_native6.TouchableOpacity, { style:
|
|
16648
|
+
/* @__PURE__ */ import_react6.default.createElement(import_react_native6.Text, { style: styles7.dashboardLinkText }, "\u{1F310}", " Manage on Dashboard ", "\u2192")
|
|
16649
|
+
), /* @__PURE__ */ import_react6.default.createElement(import_react_native6.TouchableOpacity, { style: styles7.refreshBtn, onPress: refreshAssignments }, /* @__PURE__ */ import_react6.default.createElement(import_react_native6.Text, { style: styles7.refreshText }, "\u21BB", " Refresh")));
|
|
16562
16650
|
}
|
|
16563
16651
|
function createStyles3() {
|
|
16564
16652
|
return import_react_native6.StyleSheet.create({
|
|
@@ -16878,7 +16966,7 @@ var styles2 = import_react_native8.StyleSheet.create({
|
|
|
16878
16966
|
// src/widget/screens/TestFeedbackScreen.tsx
|
|
16879
16967
|
function TestFeedbackScreen({ status, assignmentId, nav }) {
|
|
16880
16968
|
const { client, assignments, refreshAssignments, uploadImage, widgetColorScheme } = useBugBear();
|
|
16881
|
-
const
|
|
16969
|
+
const styles7 = (0, import_react10.useMemo)(() => createStyles4(), [widgetColorScheme]);
|
|
16882
16970
|
const images = useImageAttachments(uploadImage, 3, "screenshots");
|
|
16883
16971
|
const [rating, setRating] = (0, import_react10.useState)(5);
|
|
16884
16972
|
const [note, setNote] = (0, import_react10.useState)("");
|
|
@@ -16938,7 +17026,7 @@ function TestFeedbackScreen({ status, assignmentId, nav }) {
|
|
|
16938
17026
|
}
|
|
16939
17027
|
}
|
|
16940
17028
|
};
|
|
16941
|
-
return /* @__PURE__ */ import_react10.default.createElement(import_react_native9.View, { style:
|
|
17029
|
+
return /* @__PURE__ */ import_react10.default.createElement(import_react_native9.View, { style: styles7.container }, /* @__PURE__ */ import_react10.default.createElement(import_react_native9.Text, { style: styles7.header }, status === "passed" ? "\u2705 Test Passed!" : "\u274C Test Failed"), /* @__PURE__ */ import_react10.default.createElement(import_react_native9.Text, { style: styles7.subheader }, "Rate this test case"), /* @__PURE__ */ import_react10.default.createElement(import_react_native9.View, { style: styles7.starRow }, [1, 2, 3, 4, 5].map((n) => /* @__PURE__ */ import_react10.default.createElement(import_react_native9.TouchableOpacity, { key: n, onPress: () => setRating(n), style: styles7.starButton }, /* @__PURE__ */ import_react10.default.createElement(import_react_native9.Text, { style: [styles7.star, n <= rating && styles7.starActive] }, n <= rating ? "\u2605" : "\u2606")))), showFlags && /* @__PURE__ */ import_react10.default.createElement(import_react_native9.View, { style: styles7.flagsSection }, /* @__PURE__ */ import_react10.default.createElement(import_react_native9.Text, { style: styles7.flagsLabel }, "What could be improved?"), [
|
|
16942
17030
|
{ key: "isOutdated", label: "Test is outdated" },
|
|
16943
17031
|
{ key: "needsMoreDetail", label: "Needs more detail" },
|
|
16944
17032
|
{ key: "stepsUnclear", label: "Steps are unclear" },
|
|
@@ -16947,15 +17035,15 @@ function TestFeedbackScreen({ status, assignmentId, nav }) {
|
|
|
16947
17035
|
import_react_native9.TouchableOpacity,
|
|
16948
17036
|
{
|
|
16949
17037
|
key,
|
|
16950
|
-
style: [
|
|
17038
|
+
style: [styles7.flagItem, flags[key] && styles7.flagItemActive],
|
|
16951
17039
|
onPress: () => setFlags((prev) => ({ ...prev, [key]: !prev[key] }))
|
|
16952
17040
|
},
|
|
16953
|
-
/* @__PURE__ */ import_react10.default.createElement(import_react_native9.View, { style: [
|
|
16954
|
-
/* @__PURE__ */ import_react10.default.createElement(import_react_native9.Text, { style: [
|
|
17041
|
+
/* @__PURE__ */ import_react10.default.createElement(import_react_native9.View, { style: [styles7.flagCheck, flags[key] && styles7.flagCheckActive] }, flags[key] && /* @__PURE__ */ import_react10.default.createElement(import_react_native9.Text, { style: styles7.flagCheckmark }, "\u2713")),
|
|
17042
|
+
/* @__PURE__ */ import_react10.default.createElement(import_react_native9.Text, { style: [styles7.flagText, flags[key] && styles7.flagTextActive] }, label)
|
|
16955
17043
|
))), /* @__PURE__ */ import_react10.default.createElement(
|
|
16956
17044
|
import_react_native9.TextInput,
|
|
16957
17045
|
{
|
|
16958
|
-
style:
|
|
17046
|
+
style: styles7.noteInput,
|
|
16959
17047
|
value: note,
|
|
16960
17048
|
onChangeText: setNote,
|
|
16961
17049
|
placeholder: "Add a note (optional)",
|
|
@@ -16972,7 +17060,7 @@ function TestFeedbackScreen({ status, assignmentId, nav }) {
|
|
|
16972
17060
|
onRemove: images.removeImage,
|
|
16973
17061
|
label: "Screenshots (optional)"
|
|
16974
17062
|
}
|
|
16975
|
-
), /* @__PURE__ */ import_react10.default.createElement(import_react_native9.View, { style:
|
|
17063
|
+
), /* @__PURE__ */ import_react10.default.createElement(import_react_native9.View, { style: styles7.actions }, /* @__PURE__ */ import_react10.default.createElement(import_react_native9.TouchableOpacity, { style: styles7.skipButton, onPress: handleSkip }, /* @__PURE__ */ import_react10.default.createElement(import_react_native9.Text, { style: styles7.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"))));
|
|
16976
17064
|
}
|
|
16977
17065
|
function createStyles4() {
|
|
16978
17066
|
return import_react_native9.StyleSheet.create({
|
|
@@ -17161,7 +17249,7 @@ var styles3 = import_react_native10.StyleSheet.create({
|
|
|
17161
17249
|
// src/widget/screens/ReportScreen.tsx
|
|
17162
17250
|
function ReportScreen({ nav, prefill, autoCaptureUri, onAutoCaptureConsumed }) {
|
|
17163
17251
|
const { client, getDeviceInfo, uploadImage, refreshAssignments, widgetColorScheme } = useBugBear();
|
|
17164
|
-
const
|
|
17252
|
+
const styles7 = (0, import_react12.useMemo)(() => createStyles5(), [widgetColorScheme]);
|
|
17165
17253
|
const [reportType, setReportType] = (0, import_react12.useState)(prefill?.type || "bug");
|
|
17166
17254
|
const [severity, setSeverity] = (0, import_react12.useState)("medium");
|
|
17167
17255
|
const [category, setCategory] = (0, import_react12.useState)(null);
|
|
@@ -17267,7 +17355,7 @@ function ReportScreen({ nav, prefill, autoCaptureUri, onAutoCaptureConsumed }) {
|
|
|
17267
17355
|
submittingRef.current = false;
|
|
17268
17356
|
}
|
|
17269
17357
|
};
|
|
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:
|
|
17358
|
+
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: styles7.retestBanner }, /* @__PURE__ */ import_react12.default.createElement(import_react_native11.Text, { style: styles7.retestIcon }, "\u{1F504}"), /* @__PURE__ */ import_react12.default.createElement(import_react_native11.View, null, /* @__PURE__ */ import_react12.default.createElement(import_react_native11.Text, { style: styles7.retestTitle }, "Bug Still Present"), /* @__PURE__ */ import_react12.default.createElement(import_react_native11.Text, { style: styles7.retestSubtitle }, "The fix did not resolve this issue"))), /* @__PURE__ */ import_react12.default.createElement(import_react_native11.View, { style: styles7.section }, /* @__PURE__ */ import_react12.default.createElement(import_react_native11.Text, { style: shared.label }, "Severity"), /* @__PURE__ */ import_react12.default.createElement(import_react_native11.View, { style: styles7.severityRow }, [
|
|
17271
17359
|
{ sev: "critical", color: colors.red },
|
|
17272
17360
|
{ sev: "high", color: colors.orange },
|
|
17273
17361
|
{ sev: "medium", color: colors.yellow },
|
|
@@ -17276,14 +17364,14 @@ function ReportScreen({ nav, prefill, autoCaptureUri, onAutoCaptureConsumed }) {
|
|
|
17276
17364
|
import_react_native11.TouchableOpacity,
|
|
17277
17365
|
{
|
|
17278
17366
|
key: sev,
|
|
17279
|
-
style: [
|
|
17367
|
+
style: [styles7.sevButton, severity === sev && { backgroundColor: `${color}30`, borderColor: color }],
|
|
17280
17368
|
onPress: () => setSeverity(sev)
|
|
17281
17369
|
},
|
|
17282
|
-
/* @__PURE__ */ import_react12.default.createElement(import_react_native11.Text, { style: [
|
|
17283
|
-
)))), /* @__PURE__ */ import_react12.default.createElement(import_react_native11.View, { style:
|
|
17370
|
+
/* @__PURE__ */ import_react12.default.createElement(import_react_native11.Text, { style: [styles7.sevText, severity === sev && { color }] }, sev)
|
|
17371
|
+
)))), /* @__PURE__ */ import_react12.default.createElement(import_react_native11.View, { style: styles7.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: styles7.section }, /* @__PURE__ */ import_react12.default.createElement(import_react_native11.Text, { style: shared.label }, "What went wrong?"), /* @__PURE__ */ import_react12.default.createElement(
|
|
17284
17372
|
import_react_native11.TextInput,
|
|
17285
17373
|
{
|
|
17286
|
-
style:
|
|
17374
|
+
style: styles7.descInput,
|
|
17287
17375
|
value: description,
|
|
17288
17376
|
onChangeText: setDescription,
|
|
17289
17377
|
placeholder: "Describe what you observed. What still doesn't work?",
|
|
@@ -17336,15 +17424,15 @@ function ReportScreen({ nav, prefill, autoCaptureUri, onAutoCaptureConsumed }) {
|
|
|
17336
17424
|
onRemove: images.removeImage,
|
|
17337
17425
|
label: "Attachments (optional)"
|
|
17338
17426
|
}
|
|
17339
|
-
), error && /* @__PURE__ */ import_react12.default.createElement(import_react_native11.View, { style:
|
|
17427
|
+
), error && /* @__PURE__ */ import_react12.default.createElement(import_react_native11.View, { style: styles7.errorBanner }, /* @__PURE__ */ import_react12.default.createElement(import_react_native11.Text, { style: styles7.errorText }, error)), /* @__PURE__ */ import_react12.default.createElement(
|
|
17340
17428
|
import_react_native11.TouchableOpacity,
|
|
17341
17429
|
{
|
|
17342
|
-
style: [shared.primaryButton,
|
|
17430
|
+
style: [shared.primaryButton, styles7.retestSubmitButton, (!description.trim() || submitting || images.isUploading) && shared.primaryButtonDisabled, { marginTop: 20 }],
|
|
17343
17431
|
onPress: handleSubmit,
|
|
17344
17432
|
disabled: !description.trim() || submitting || images.isUploading
|
|
17345
17433
|
},
|
|
17346
17434
|
/* @__PURE__ */ import_react12.default.createElement(import_react_native11.Text, { style: shared.primaryButtonText }, images.isUploading ? "Uploading images..." : submitting ? "Submitting..." : error ? "Retry" : "Submit Failed Retest")
|
|
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:
|
|
17435
|
+
)) : /* @__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: styles7.typeRow }, [
|
|
17348
17436
|
{ type: "bug", label: "Bug", icon: "\u{1F41B}" },
|
|
17349
17437
|
{ type: "feedback", label: "Feedback", icon: "\u{1F4A1}" },
|
|
17350
17438
|
{ type: "suggestion", label: "Idea", icon: "\u2728" }
|
|
@@ -17352,12 +17440,12 @@ function ReportScreen({ nav, prefill, autoCaptureUri, onAutoCaptureConsumed }) {
|
|
|
17352
17440
|
import_react_native11.TouchableOpacity,
|
|
17353
17441
|
{
|
|
17354
17442
|
key: type,
|
|
17355
|
-
style: [
|
|
17443
|
+
style: [styles7.typeCard, reportType === type && styles7.typeCardActive],
|
|
17356
17444
|
onPress: () => setReportType(type)
|
|
17357
17445
|
},
|
|
17358
|
-
/* @__PURE__ */ import_react12.default.createElement(import_react_native11.Text, { style:
|
|
17359
|
-
/* @__PURE__ */ import_react12.default.createElement(import_react_native11.Text, { style: [
|
|
17360
|
-
))), isBugType && /* @__PURE__ */ import_react12.default.createElement(import_react_native11.View, { style:
|
|
17446
|
+
/* @__PURE__ */ import_react12.default.createElement(import_react_native11.Text, { style: styles7.typeIcon }, icon),
|
|
17447
|
+
/* @__PURE__ */ import_react12.default.createElement(import_react_native11.Text, { style: [styles7.typeLabel, reportType === type && styles7.typeLabelActive] }, label)
|
|
17448
|
+
))), isBugType && /* @__PURE__ */ import_react12.default.createElement(import_react_native11.View, { style: styles7.section }, /* @__PURE__ */ import_react12.default.createElement(import_react_native11.Text, { style: shared.label }, "Severity"), /* @__PURE__ */ import_react12.default.createElement(import_react_native11.View, { style: styles7.severityRow }, [
|
|
17361
17449
|
{ sev: "critical", color: colors.red },
|
|
17362
17450
|
{ sev: "high", color: colors.orange },
|
|
17363
17451
|
{ sev: "medium", color: colors.yellow },
|
|
@@ -17366,14 +17454,14 @@ function ReportScreen({ nav, prefill, autoCaptureUri, onAutoCaptureConsumed }) {
|
|
|
17366
17454
|
import_react_native11.TouchableOpacity,
|
|
17367
17455
|
{
|
|
17368
17456
|
key: sev,
|
|
17369
|
-
style: [
|
|
17457
|
+
style: [styles7.sevButton, severity === sev && { backgroundColor: `${color}30`, borderColor: color }],
|
|
17370
17458
|
onPress: () => setSeverity(sev)
|
|
17371
17459
|
},
|
|
17372
|
-
/* @__PURE__ */ import_react12.default.createElement(import_react_native11.Text, { style: [
|
|
17373
|
-
)))), isBugType && /* @__PURE__ */ import_react12.default.createElement(import_react_native11.View, { style:
|
|
17460
|
+
/* @__PURE__ */ import_react12.default.createElement(import_react_native11.Text, { style: [styles7.sevText, severity === sev && { color }] }, sev)
|
|
17461
|
+
)))), isBugType && /* @__PURE__ */ import_react12.default.createElement(import_react_native11.View, { style: styles7.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: styles7.section }, /* @__PURE__ */ import_react12.default.createElement(import_react_native11.Text, { style: shared.label }, "What happened?"), /* @__PURE__ */ import_react12.default.createElement(
|
|
17374
17462
|
import_react_native11.TextInput,
|
|
17375
17463
|
{
|
|
17376
|
-
style:
|
|
17464
|
+
style: styles7.descInput,
|
|
17377
17465
|
value: description,
|
|
17378
17466
|
onChangeText: setDescription,
|
|
17379
17467
|
placeholder: "Describe the issue...",
|
|
@@ -17416,16 +17504,16 @@ function ReportScreen({ nav, prefill, autoCaptureUri, onAutoCaptureConsumed }) {
|
|
|
17416
17504
|
issue.title
|
|
17417
17505
|
),
|
|
17418
17506
|
/* @__PURE__ */ import_react12.default.createElement(import_react_native11.Text, { style: { fontSize: 11, color: colors.textMuted } }, issue.status)
|
|
17419
|
-
)))), isBugType && /* @__PURE__ */ import_react12.default.createElement(import_react_native11.View, { style:
|
|
17507
|
+
)))), isBugType && /* @__PURE__ */ import_react12.default.createElement(import_react_native11.View, { style: styles7.section }, /* @__PURE__ */ import_react12.default.createElement(import_react_native11.Text, { style: shared.label }, "Which screen?"), /* @__PURE__ */ import_react12.default.createElement(
|
|
17420
17508
|
import_react_native11.TextInput,
|
|
17421
17509
|
{
|
|
17422
|
-
style:
|
|
17510
|
+
style: styles7.screenInput,
|
|
17423
17511
|
value: affectedScreen,
|
|
17424
17512
|
onChangeText: setAffectedScreen,
|
|
17425
17513
|
placeholder: "e.g. Reservations, Settings...",
|
|
17426
17514
|
placeholderTextColor: colors.textMuted
|
|
17427
17515
|
}
|
|
17428
|
-
), /* @__PURE__ */ import_react12.default.createElement(import_react_native11.Text, { style:
|
|
17516
|
+
), /* @__PURE__ */ import_react12.default.createElement(import_react_native11.Text, { style: styles7.screenHint }, "Which screen or area was the bug on? (optional)")), /* @__PURE__ */ import_react12.default.createElement(
|
|
17429
17517
|
ImagePickerButtons,
|
|
17430
17518
|
{
|
|
17431
17519
|
images: images.images,
|
|
@@ -17435,7 +17523,7 @@ function ReportScreen({ nav, prefill, autoCaptureUri, onAutoCaptureConsumed }) {
|
|
|
17435
17523
|
onRemove: images.removeImage,
|
|
17436
17524
|
label: "Screenshots (optional)"
|
|
17437
17525
|
}
|
|
17438
|
-
), error && /* @__PURE__ */ import_react12.default.createElement(import_react_native11.View, { style:
|
|
17526
|
+
), error && /* @__PURE__ */ import_react12.default.createElement(import_react_native11.View, { style: styles7.errorBanner }, /* @__PURE__ */ import_react12.default.createElement(import_react_native11.Text, { style: styles7.errorText }, error)), /* @__PURE__ */ import_react12.default.createElement(
|
|
17439
17527
|
import_react_native11.TouchableOpacity,
|
|
17440
17528
|
{
|
|
17441
17529
|
style: [shared.primaryButton, (!description.trim() || submitting || images.isUploading) && shared.primaryButtonDisabled, { marginTop: 20 }],
|
|
@@ -17475,12 +17563,12 @@ var import_react13 = __toESM(require("react"));
|
|
|
17475
17563
|
var import_react_native12 = require("react-native");
|
|
17476
17564
|
function ReportSuccessScreen({ nav }) {
|
|
17477
17565
|
const { widgetColorScheme } = useBugBear();
|
|
17478
|
-
const
|
|
17566
|
+
const styles7 = (0, import_react13.useMemo)(() => createStyles6(), [widgetColorScheme]);
|
|
17479
17567
|
(0, import_react13.useEffect)(() => {
|
|
17480
17568
|
const timer = setTimeout(() => nav.reset(), 2e3);
|
|
17481
17569
|
return () => clearTimeout(timer);
|
|
17482
17570
|
}, [nav]);
|
|
17483
|
-
return /* @__PURE__ */ import_react13.default.createElement(import_react_native12.View, { style:
|
|
17571
|
+
return /* @__PURE__ */ import_react13.default.createElement(import_react_native12.View, { style: styles7.container }, /* @__PURE__ */ import_react13.default.createElement(import_react_native12.Text, { style: styles7.emoji }, "\u{1F389}"), /* @__PURE__ */ import_react13.default.createElement(import_react_native12.Text, { style: styles7.title }, "Report submitted!"), /* @__PURE__ */ import_react13.default.createElement(import_react_native12.Text, { style: styles7.subtitle }, "Thank you for your feedback"));
|
|
17484
17572
|
}
|
|
17485
17573
|
function createStyles6() {
|
|
17486
17574
|
return import_react_native12.StyleSheet.create({
|
|
@@ -17496,7 +17584,7 @@ var import_react14 = __toESM(require("react"));
|
|
|
17496
17584
|
var import_react_native13 = require("react-native");
|
|
17497
17585
|
function MessageListScreen({ nav }) {
|
|
17498
17586
|
const { threads, unreadCount, refreshThreads, dashboardUrl, isLoading, widgetColorScheme } = useBugBear();
|
|
17499
|
-
const
|
|
17587
|
+
const styles7 = (0, import_react14.useMemo)(() => createStyles7(), [widgetColorScheme]);
|
|
17500
17588
|
const [activeFilter, setActiveFilter] = (0, import_react14.useState)("all");
|
|
17501
17589
|
const filteredThreads = threads.filter((thread) => {
|
|
17502
17590
|
if (activeFilter === "all") return true;
|
|
@@ -17514,10 +17602,10 @@ function MessageListScreen({ nav }) {
|
|
|
17514
17602
|
return /* @__PURE__ */ import_react14.default.createElement(import_react_native13.View, null, /* @__PURE__ */ import_react14.default.createElement(
|
|
17515
17603
|
import_react_native13.TouchableOpacity,
|
|
17516
17604
|
{
|
|
17517
|
-
style:
|
|
17605
|
+
style: styles7.newMsgButton,
|
|
17518
17606
|
onPress: () => nav.push({ name: "COMPOSE_MESSAGE" })
|
|
17519
17607
|
},
|
|
17520
|
-
/* @__PURE__ */ import_react14.default.createElement(import_react_native13.Text, { style:
|
|
17608
|
+
/* @__PURE__ */ import_react14.default.createElement(import_react_native13.Text, { style: styles7.newMsgText }, "\u2709\uFE0F New Message")
|
|
17521
17609
|
), /* @__PURE__ */ import_react14.default.createElement(
|
|
17522
17610
|
import_react_native13.ScrollView,
|
|
17523
17611
|
{
|
|
@@ -17562,20 +17650,20 @@ function MessageListScreen({ nav }) {
|
|
|
17562
17650
|
import_react_native13.TouchableOpacity,
|
|
17563
17651
|
{
|
|
17564
17652
|
key: thread.id,
|
|
17565
|
-
style: [
|
|
17653
|
+
style: [styles7.threadItem, thread.unreadCount > 0 && styles7.threadItemUnread],
|
|
17566
17654
|
onPress: () => nav.push({ name: "THREAD_DETAIL", thread })
|
|
17567
17655
|
},
|
|
17568
|
-
/* @__PURE__ */ import_react14.default.createElement(import_react_native13.View, { style:
|
|
17569
|
-
/* @__PURE__ */ import_react14.default.createElement(import_react_native13.View, { style:
|
|
17656
|
+
/* @__PURE__ */ import_react14.default.createElement(import_react_native13.View, { style: styles7.threadLeft }, /* @__PURE__ */ import_react14.default.createElement(import_react_native13.Text, { style: styles7.threadIcon }, getThreadTypeIcon(thread.threadType)), /* @__PURE__ */ import_react14.default.createElement(import_react_native13.View, { style: styles7.threadInfo }, /* @__PURE__ */ import_react14.default.createElement(import_react_native13.View, { style: styles7.threadTitleRow }, thread.isPinned && /* @__PURE__ */ import_react14.default.createElement(import_react_native13.Text, { style: styles7.pinIcon }, "\u{1F4CC}"), /* @__PURE__ */ import_react14.default.createElement(import_react_native13.Text, { style: styles7.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: styles7.threadPreview, numberOfLines: 1 }, thread.lastMessage.senderName, ": ", thread.lastMessage.content))),
|
|
17657
|
+
/* @__PURE__ */ import_react14.default.createElement(import_react_native13.View, { style: styles7.threadRight }, /* @__PURE__ */ import_react14.default.createElement(import_react_native13.Text, { style: styles7.threadTime }, formatRelativeTime(thread.lastMessageAt)), thread.unreadCount > 0 && /* @__PURE__ */ import_react14.default.createElement(import_react_native13.View, { style: styles7.unreadBadge }, /* @__PURE__ */ import_react14.default.createElement(import_react_native13.Text, { style: styles7.unreadText }, thread.unreadCount)), thread.priority !== "normal" && /* @__PURE__ */ import_react14.default.createElement(import_react_native13.View, { style: [styles7.priorityDot, { backgroundColor: getPriorityColor(thread.priority) }] }))
|
|
17570
17658
|
))), dashboardUrl && /* @__PURE__ */ import_react14.default.createElement(
|
|
17571
17659
|
import_react_native13.TouchableOpacity,
|
|
17572
17660
|
{
|
|
17573
|
-
style:
|
|
17661
|
+
style: styles7.dashboardLink,
|
|
17574
17662
|
onPress: () => import_react_native13.Linking.openURL(`${dashboardUrl}/discussions`),
|
|
17575
17663
|
activeOpacity: 0.7
|
|
17576
17664
|
},
|
|
17577
|
-
/* @__PURE__ */ import_react14.default.createElement(import_react_native13.Text, { style:
|
|
17578
|
-
), /* @__PURE__ */ import_react14.default.createElement(import_react_native13.View, { style:
|
|
17665
|
+
/* @__PURE__ */ import_react14.default.createElement(import_react_native13.Text, { style: styles7.dashboardLinkText }, "\u{1F310}", " View on Dashboard ", "\u2192")
|
|
17666
|
+
), /* @__PURE__ */ import_react14.default.createElement(import_react_native13.View, { style: styles7.footer }, /* @__PURE__ */ import_react14.default.createElement(import_react_native13.Text, { style: styles7.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: styles7.refreshText }, "\u21BB Refresh"))));
|
|
17579
17667
|
}
|
|
17580
17668
|
function createStyles7() {
|
|
17581
17669
|
return import_react_native13.StyleSheet.create({
|
|
@@ -17608,7 +17696,7 @@ var import_react15 = __toESM(require("react"));
|
|
|
17608
17696
|
var import_react_native14 = require("react-native");
|
|
17609
17697
|
function ThreadDetailScreen({ thread, nav }) {
|
|
17610
17698
|
const { getThreadMessages, sendMessage, markAsRead, uploadImage, widgetColorScheme } = useBugBear();
|
|
17611
|
-
const
|
|
17699
|
+
const styles7 = (0, import_react15.useMemo)(() => createStyles8(), [widgetColorScheme]);
|
|
17612
17700
|
const [messages, setMessages] = (0, import_react15.useState)([]);
|
|
17613
17701
|
const [loading, setLoading] = (0, import_react15.useState)(true);
|
|
17614
17702
|
const [replyText, setReplyText] = (0, import_react15.useState)("");
|
|
@@ -17660,20 +17748,20 @@ function ThreadDetailScreen({ thread, nav }) {
|
|
|
17660
17748
|
}
|
|
17661
17749
|
setSending(false);
|
|
17662
17750
|
};
|
|
17663
|
-
return /* @__PURE__ */ import_react15.default.createElement(import_react_native14.View, { style:
|
|
17751
|
+
return /* @__PURE__ */ import_react15.default.createElement(import_react_native14.View, { style: styles7.container }, /* @__PURE__ */ import_react15.default.createElement(import_react_native14.View, { style: styles7.header }, /* @__PURE__ */ import_react15.default.createElement(import_react_native14.Text, { style: styles7.headerIcon }, getThreadTypeIcon(thread.threadType)), /* @__PURE__ */ import_react15.default.createElement(import_react_native14.Text, { style: styles7.headerSubject, numberOfLines: 2 }, thread.subject || "No subject")), loading ? /* @__PURE__ */ import_react15.default.createElement(import_react_native14.View, { style: styles7.loadingContainer }, /* @__PURE__ */ import_react15.default.createElement(import_react_native14.Text, { style: styles7.loadingText }, "Loading messages...")) : /* @__PURE__ */ import_react15.default.createElement(import_react_native14.View, { style: styles7.messagesContainer }, messages.map((msg) => /* @__PURE__ */ import_react15.default.createElement(
|
|
17664
17752
|
import_react_native14.View,
|
|
17665
17753
|
{
|
|
17666
17754
|
key: msg.id,
|
|
17667
|
-
style: [
|
|
17755
|
+
style: [styles7.bubble, msg.senderType === "tester" ? styles7.bubbleTester : styles7.bubbleAdmin]
|
|
17668
17756
|
},
|
|
17669
|
-
/* @__PURE__ */ import_react15.default.createElement(import_react_native14.Text, { style: [
|
|
17670
|
-
/* @__PURE__ */ import_react15.default.createElement(import_react_native14.Text, { style: [
|
|
17671
|
-
msg.attachments && msg.attachments.length > 0 && /* @__PURE__ */ import_react15.default.createElement(import_react_native14.View, { style:
|
|
17672
|
-
/* @__PURE__ */ import_react15.default.createElement(import_react_native14.Text, { style: [
|
|
17673
|
-
))), sendError && /* @__PURE__ */ import_react15.default.createElement(import_react_native14.View, { style:
|
|
17757
|
+
/* @__PURE__ */ import_react15.default.createElement(import_react_native14.Text, { style: [styles7.sender, msg.senderType === "tester" && styles7.senderTester] }, msg.senderType === "tester" ? "You" : msg.senderName),
|
|
17758
|
+
/* @__PURE__ */ import_react15.default.createElement(import_react_native14.Text, { style: [styles7.content, msg.senderType === "tester" && styles7.contentTester] }, msg.content),
|
|
17759
|
+
msg.attachments && msg.attachments.length > 0 && /* @__PURE__ */ import_react15.default.createElement(import_react_native14.View, { style: styles7.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: styles7.attachmentImage, resizeMode: "cover" }))),
|
|
17760
|
+
/* @__PURE__ */ import_react15.default.createElement(import_react_native14.Text, { style: [styles7.time, msg.senderType === "tester" && styles7.timeTester] }, formatMessageTime(msg.createdAt))
|
|
17761
|
+
))), sendError && /* @__PURE__ */ import_react15.default.createElement(import_react_native14.View, { style: styles7.errorBar }, /* @__PURE__ */ import_react15.default.createElement(import_react_native14.Text, { style: styles7.errorText }, "Failed to send. Tap Send to retry.")), replyImages.images.length > 0 && /* @__PURE__ */ import_react15.default.createElement(import_react_native14.View, { style: styles7.replyPreview }, /* @__PURE__ */ import_react15.default.createElement(ImagePreviewStrip, { images: replyImages.images, onRemove: replyImages.removeImage })), /* @__PURE__ */ import_react15.default.createElement(import_react_native14.View, { style: styles7.composer }, IMAGE_PICKER_AVAILABLE && /* @__PURE__ */ import_react15.default.createElement(import_react_native14.TouchableOpacity, { style: styles7.attachBtn, onPress: replyImages.pickFromGallery, disabled: replyImages.images.length >= 3 }, /* @__PURE__ */ import_react15.default.createElement(import_react_native14.Text, { style: styles7.attachBtnText }, "\u{1F4CE}")), /* @__PURE__ */ import_react15.default.createElement(
|
|
17674
17762
|
import_react_native14.TextInput,
|
|
17675
17763
|
{
|
|
17676
|
-
style:
|
|
17764
|
+
style: styles7.replyInput,
|
|
17677
17765
|
value: replyText,
|
|
17678
17766
|
onChangeText: setReplyText,
|
|
17679
17767
|
placeholder: "Type a reply...",
|
|
@@ -17684,11 +17772,11 @@ function ThreadDetailScreen({ thread, nav }) {
|
|
|
17684
17772
|
), /* @__PURE__ */ import_react15.default.createElement(
|
|
17685
17773
|
import_react_native14.TouchableOpacity,
|
|
17686
17774
|
{
|
|
17687
|
-
style: [
|
|
17775
|
+
style: [styles7.sendBtn, (!replyText.trim() && replyImages.images.length === 0 || sending || replyImages.isUploading) && styles7.sendBtnDisabled],
|
|
17688
17776
|
onPress: handleSend,
|
|
17689
17777
|
disabled: !replyText.trim() && replyImages.images.length === 0 || sending || replyImages.isUploading
|
|
17690
17778
|
},
|
|
17691
|
-
/* @__PURE__ */ import_react15.default.createElement(import_react_native14.Text, { style:
|
|
17779
|
+
/* @__PURE__ */ import_react15.default.createElement(import_react_native14.Text, { style: styles7.sendBtnText }, sending ? "..." : "Send")
|
|
17692
17780
|
)));
|
|
17693
17781
|
}
|
|
17694
17782
|
function createStyles8() {
|
|
@@ -17729,7 +17817,7 @@ var import_react16 = __toESM(require("react"));
|
|
|
17729
17817
|
var import_react_native15 = require("react-native");
|
|
17730
17818
|
function ComposeMessageScreen({ nav }) {
|
|
17731
17819
|
const { createThread, uploadImage, widgetColorScheme } = useBugBear();
|
|
17732
|
-
const
|
|
17820
|
+
const styles7 = (0, import_react16.useMemo)(() => createStyles9(), [widgetColorScheme]);
|
|
17733
17821
|
const [subject, setSubject] = (0, import_react16.useState)("");
|
|
17734
17822
|
const [message, setMessage] = (0, import_react16.useState)("");
|
|
17735
17823
|
const [sending, setSending] = (0, import_react16.useState)(false);
|
|
@@ -17748,10 +17836,10 @@ function ComposeMessageScreen({ nav }) {
|
|
|
17748
17836
|
nav.pop();
|
|
17749
17837
|
}
|
|
17750
17838
|
};
|
|
17751
|
-
return /* @__PURE__ */ import_react16.default.createElement(import_react_native15.View, null, /* @__PURE__ */ import_react16.default.createElement(import_react_native15.View, { style:
|
|
17839
|
+
return /* @__PURE__ */ import_react16.default.createElement(import_react_native15.View, null, /* @__PURE__ */ import_react16.default.createElement(import_react_native15.View, { style: styles7.header }, /* @__PURE__ */ import_react16.default.createElement(import_react_native15.Text, { style: styles7.title }, "New Message"), /* @__PURE__ */ import_react16.default.createElement(import_react_native15.Text, { style: styles7.subtitle }, "Send a message to the QA team")), /* @__PURE__ */ import_react16.default.createElement(import_react_native15.View, { style: styles7.form }, /* @__PURE__ */ import_react16.default.createElement(import_react_native15.Text, { style: shared.label }, "Subject"), /* @__PURE__ */ import_react16.default.createElement(
|
|
17752
17840
|
import_react_native15.TextInput,
|
|
17753
17841
|
{
|
|
17754
|
-
style:
|
|
17842
|
+
style: styles7.subjectInput,
|
|
17755
17843
|
value: subject,
|
|
17756
17844
|
onChangeText: setSubject,
|
|
17757
17845
|
placeholder: "What's this about?",
|
|
@@ -17761,7 +17849,7 @@ function ComposeMessageScreen({ nav }) {
|
|
|
17761
17849
|
), /* @__PURE__ */ import_react16.default.createElement(import_react_native15.Text, { style: [shared.label, { marginTop: 16 }] }, "Message"), /* @__PURE__ */ import_react16.default.createElement(
|
|
17762
17850
|
import_react_native15.TextInput,
|
|
17763
17851
|
{
|
|
17764
|
-
style:
|
|
17852
|
+
style: styles7.messageInput,
|
|
17765
17853
|
value: message,
|
|
17766
17854
|
onChangeText: setMessage,
|
|
17767
17855
|
placeholder: "Write your message...",
|
|
@@ -17806,7 +17894,7 @@ var import_react17 = __toESM(require("react"));
|
|
|
17806
17894
|
var import_react_native16 = require("react-native");
|
|
17807
17895
|
function ProfileScreen({ nav }) {
|
|
17808
17896
|
const { testerInfo, assignments, updateTesterProfile, refreshTesterInfo, widgetColorScheme } = useBugBear();
|
|
17809
|
-
const
|
|
17897
|
+
const styles7 = (0, import_react17.useMemo)(() => createStyles10(), [widgetColorScheme]);
|
|
17810
17898
|
const [editing, setEditing] = (0, import_react17.useState)(false);
|
|
17811
17899
|
const [name, setName] = (0, import_react17.useState)(testerInfo?.name || "");
|
|
17812
17900
|
const [additionalEmails, setAdditionalEmails] = (0, import_react17.useState)(testerInfo?.additionalEmails || []);
|
|
@@ -17857,13 +17945,13 @@ function ProfileScreen({ nav }) {
|
|
|
17857
17945
|
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"));
|
|
17858
17946
|
}
|
|
17859
17947
|
if (editing) {
|
|
17860
|
-
return /* @__PURE__ */ import_react17.default.createElement(import_react_native16.View, null, /* @__PURE__ */ import_react17.default.createElement(import_react_native16.View, { style:
|
|
17948
|
+
return /* @__PURE__ */ import_react17.default.createElement(import_react_native16.View, null, /* @__PURE__ */ import_react17.default.createElement(import_react_native16.View, { style: styles7.editHeader }, /* @__PURE__ */ import_react17.default.createElement(import_react_native16.Text, { style: styles7.editTitle }, "Edit Profile"), /* @__PURE__ */ import_react17.default.createElement(import_react_native16.TouchableOpacity, { onPress: () => {
|
|
17861
17949
|
setEditing(false);
|
|
17862
17950
|
setNewEmailInput("");
|
|
17863
|
-
} }, /* @__PURE__ */ import_react17.default.createElement(import_react_native16.Text, { style:
|
|
17951
|
+
} }, /* @__PURE__ */ import_react17.default.createElement(import_react_native16.Text, { style: styles7.cancelText }, "Cancel"))), /* @__PURE__ */ import_react17.default.createElement(import_react_native16.View, { style: styles7.field }, /* @__PURE__ */ import_react17.default.createElement(import_react_native16.Text, { style: shared.label }, "Name"), /* @__PURE__ */ import_react17.default.createElement(import_react_native16.TextInput, { style: styles7.input, value: name, onChangeText: setName, placeholder: "Your name", placeholderTextColor: colors.textMuted })), /* @__PURE__ */ import_react17.default.createElement(import_react_native16.View, { style: styles7.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: styles7.emailFixed }, testerInfo.email)), /* @__PURE__ */ import_react17.default.createElement(import_react_native16.View, { style: styles7.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: styles7.emailRow }, /* @__PURE__ */ import_react17.default.createElement(import_react_native16.Text, { style: styles7.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: styles7.removeEmail }, "\u2715")))), /* @__PURE__ */ import_react17.default.createElement(import_react_native16.View, { style: styles7.addEmailRow }, /* @__PURE__ */ import_react17.default.createElement(
|
|
17864
17952
|
import_react_native16.TextInput,
|
|
17865
17953
|
{
|
|
17866
|
-
style: [
|
|
17954
|
+
style: [styles7.input, { flex: 1, marginRight: 8 }],
|
|
17867
17955
|
value: newEmailInput,
|
|
17868
17956
|
onChangeText: setNewEmailInput,
|
|
17869
17957
|
placeholder: "Add email",
|
|
@@ -17871,17 +17959,17 @@ function ProfileScreen({ nav }) {
|
|
|
17871
17959
|
keyboardType: "email-address",
|
|
17872
17960
|
autoCapitalize: "none"
|
|
17873
17961
|
}
|
|
17874
|
-
), /* @__PURE__ */ import_react17.default.createElement(import_react_native16.TouchableOpacity, { style:
|
|
17962
|
+
), /* @__PURE__ */ import_react17.default.createElement(import_react_native16.TouchableOpacity, { style: styles7.addButton, onPress: handleAddEmail }, /* @__PURE__ */ import_react17.default.createElement(import_react_native16.Text, { style: styles7.addButtonText }, "Add")))), /* @__PURE__ */ import_react17.default.createElement(import_react_native16.View, { style: styles7.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: styles7.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(
|
|
17875
17963
|
import_react_native16.TouchableOpacity,
|
|
17876
17964
|
{
|
|
17877
17965
|
key,
|
|
17878
|
-
style: [
|
|
17966
|
+
style: [styles7.platformBtn, platforms.includes(key) && styles7.platformBtnActive],
|
|
17879
17967
|
onPress: () => setPlatforms((prev) => prev.includes(key) ? prev.filter((p) => p !== key) : [...prev, key])
|
|
17880
17968
|
},
|
|
17881
|
-
/* @__PURE__ */ import_react17.default.createElement(import_react_native16.Text, { style: [
|
|
17969
|
+
/* @__PURE__ */ import_react17.default.createElement(import_react_native16.Text, { style: [styles7.platformText, platforms.includes(key) && styles7.platformTextActive] }, label)
|
|
17882
17970
|
)))), /* @__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")));
|
|
17883
17971
|
}
|
|
17884
|
-
return /* @__PURE__ */ import_react17.default.createElement(import_react_native16.View, null, /* @__PURE__ */ import_react17.default.createElement(import_react_native16.View, { style:
|
|
17972
|
+
return /* @__PURE__ */ import_react17.default.createElement(import_react_native16.View, null, /* @__PURE__ */ import_react17.default.createElement(import_react_native16.View, { style: styles7.profileCard }, /* @__PURE__ */ import_react17.default.createElement(import_react_native16.View, { style: styles7.avatar }, /* @__PURE__ */ import_react17.default.createElement(import_react_native16.Text, { style: styles7.avatarText }, testerInfo.name.charAt(0).toUpperCase())), /* @__PURE__ */ import_react17.default.createElement(import_react_native16.Text, { style: styles7.profileName }, testerInfo.name), /* @__PURE__ */ import_react17.default.createElement(import_react_native16.Text, { style: styles7.profileEmail }, testerInfo.email)), /* @__PURE__ */ import_react17.default.createElement(import_react_native16.View, { style: styles7.statsRow }, /* @__PURE__ */ import_react17.default.createElement(import_react_native16.View, { style: styles7.statItem }, /* @__PURE__ */ import_react17.default.createElement(import_react_native16.Text, { style: styles7.statNumber }, completedCount), /* @__PURE__ */ import_react17.default.createElement(import_react_native16.Text, { style: styles7.statLabel }, "Completed")), /* @__PURE__ */ import_react17.default.createElement(import_react_native16.View, { style: styles7.statDivider }), /* @__PURE__ */ import_react17.default.createElement(import_react_native16.View, { style: styles7.statItem }, /* @__PURE__ */ import_react17.default.createElement(import_react_native16.Text, { style: styles7.statNumber }, assignments.length), /* @__PURE__ */ import_react17.default.createElement(import_react_native16.Text, { style: styles7.statLabel }, "Total Assigned"))), /* @__PURE__ */ import_react17.default.createElement(import_react_native16.TouchableOpacity, { onPress: () => setShowDetails(!showDetails), style: styles7.detailsToggle }, /* @__PURE__ */ import_react17.default.createElement(import_react_native16.Text, { style: styles7.detailsToggleText }, showDetails ? "\u25BC" : "\u25B6", " Details")), showDetails && /* @__PURE__ */ import_react17.default.createElement(import_react_native16.View, { style: styles7.detailsSection }, additionalEmails.length > 0 && /* @__PURE__ */ import_react17.default.createElement(import_react_native16.View, { style: styles7.detailBlock }, /* @__PURE__ */ import_react17.default.createElement(import_react_native16.Text, { style: styles7.detailLabel }, "Additional Emails"), additionalEmails.map((e) => /* @__PURE__ */ import_react17.default.createElement(import_react_native16.Text, { key: e, style: styles7.detailValue }, e))), platforms.length > 0 && /* @__PURE__ */ import_react17.default.createElement(import_react_native16.View, { style: styles7.detailBlock }, /* @__PURE__ */ import_react17.default.createElement(import_react_native16.Text, { style: styles7.detailLabel }, "Platforms"), /* @__PURE__ */ import_react17.default.createElement(import_react_native16.View, { style: styles7.platformTags }, platforms.map((p) => /* @__PURE__ */ import_react17.default.createElement(import_react_native16.View, { key: p, style: styles7.platformTag }, /* @__PURE__ */ import_react17.default.createElement(import_react_native16.Text, { style: styles7.platformTagText }, p === "ios" ? "\u{1F4F1} iOS" : p === "android" ? "\u{1F916} Android" : "\u{1F310} Web")))))), /* @__PURE__ */ import_react17.default.createElement(
|
|
17885
17973
|
import_react_native16.TouchableOpacity,
|
|
17886
17974
|
{
|
|
17887
17975
|
style: [shared.primaryButton, { marginTop: 20 }],
|
|
@@ -17939,7 +18027,7 @@ var CATEGORIES = ["open", "done", "reopened"];
|
|
|
17939
18027
|
var SEVERITY_ORDER2 = { critical: 0, high: 1, medium: 2, low: 3 };
|
|
17940
18028
|
function IssueListScreen({ nav, category }) {
|
|
17941
18029
|
const { client, widgetColorScheme } = useBugBear();
|
|
17942
|
-
const
|
|
18030
|
+
const styles7 = (0, import_react18.useMemo)(() => createStyles11(), [widgetColorScheme]);
|
|
17943
18031
|
const CATEGORY_CONFIG = (0, import_react18.useMemo)(() => ({
|
|
17944
18032
|
open: { label: "Open", accent: colors.orange, emptyIcon: "\u2705", emptyText: "No open issues" },
|
|
17945
18033
|
done: { label: "Done", accent: colors.green, emptyIcon: "\u{1F389}", emptyText: "No completed issues yet" },
|
|
@@ -18009,7 +18097,7 @@ function IssueListScreen({ nav, category }) {
|
|
|
18009
18097
|
const searchFilteredIssues = debouncedQuery ? sortedIssues.filter(
|
|
18010
18098
|
(issue) => (issue.title || "").toLowerCase().includes(debouncedQuery.toLowerCase()) || (issue.description || "").toLowerCase().includes(debouncedQuery.toLowerCase())
|
|
18011
18099
|
) : sortedIssues;
|
|
18012
|
-
return /* @__PURE__ */ import_react18.default.createElement(import_react_native17.View, null, /* @__PURE__ */ import_react18.default.createElement(import_react_native17.View, { style:
|
|
18100
|
+
return /* @__PURE__ */ import_react18.default.createElement(import_react_native17.View, null, /* @__PURE__ */ import_react18.default.createElement(import_react_native17.View, { style: styles7.tabBar }, CATEGORIES.map((cat) => {
|
|
18013
18101
|
const catConfig = CATEGORY_CONFIG[cat];
|
|
18014
18102
|
const isActive = activeCategory === cat;
|
|
18015
18103
|
const count = counts?.[cat];
|
|
@@ -18018,7 +18106,7 @@ function IssueListScreen({ nav, category }) {
|
|
|
18018
18106
|
{
|
|
18019
18107
|
key: cat,
|
|
18020
18108
|
style: [
|
|
18021
|
-
|
|
18109
|
+
styles7.tab,
|
|
18022
18110
|
{ borderBottomColor: isActive ? catConfig.accent : "transparent" }
|
|
18023
18111
|
],
|
|
18024
18112
|
onPress: () => {
|
|
@@ -18028,20 +18116,20 @@ function IssueListScreen({ nav, category }) {
|
|
|
18028
18116
|
activeOpacity: 0.7
|
|
18029
18117
|
},
|
|
18030
18118
|
/* @__PURE__ */ import_react18.default.createElement(import_react_native17.Text, { style: [
|
|
18031
|
-
|
|
18119
|
+
styles7.tabLabel,
|
|
18032
18120
|
isActive && { fontWeight: "600", color: colors.textPrimary }
|
|
18033
18121
|
] }, catConfig.label),
|
|
18034
18122
|
count !== void 0 && /* @__PURE__ */ import_react18.default.createElement(import_react_native17.View, { style: [
|
|
18035
|
-
|
|
18123
|
+
styles7.countBadge,
|
|
18036
18124
|
{
|
|
18037
18125
|
backgroundColor: isActive ? catConfig.accent + "18" : colors.card
|
|
18038
18126
|
}
|
|
18039
18127
|
] }, /* @__PURE__ */ import_react18.default.createElement(import_react_native17.Text, { style: [
|
|
18040
|
-
|
|
18128
|
+
styles7.countText,
|
|
18041
18129
|
{ color: isActive ? catConfig.accent : colors.textDim }
|
|
18042
18130
|
] }, count))
|
|
18043
18131
|
);
|
|
18044
|
-
})), /* @__PURE__ */ import_react18.default.createElement(import_react_native17.View, { style:
|
|
18132
|
+
})), /* @__PURE__ */ import_react18.default.createElement(import_react_native17.View, { style: styles7.sortRow }, [
|
|
18045
18133
|
{ key: "severity", label: "Severity" },
|
|
18046
18134
|
{ key: "recent", label: "Recent" }
|
|
18047
18135
|
].map((s2) => /* @__PURE__ */ import_react18.default.createElement(
|
|
@@ -18049,14 +18137,14 @@ function IssueListScreen({ nav, category }) {
|
|
|
18049
18137
|
{
|
|
18050
18138
|
key: s2.key,
|
|
18051
18139
|
style: [
|
|
18052
|
-
|
|
18053
|
-
sortMode === s2.key &&
|
|
18140
|
+
styles7.sortBtn,
|
|
18141
|
+
sortMode === s2.key && styles7.sortBtnActive
|
|
18054
18142
|
],
|
|
18055
18143
|
onPress: () => setSortMode(s2.key)
|
|
18056
18144
|
},
|
|
18057
18145
|
/* @__PURE__ */ import_react18.default.createElement(import_react_native17.Text, { style: [
|
|
18058
|
-
|
|
18059
|
-
sortMode === s2.key &&
|
|
18146
|
+
styles7.sortBtnText,
|
|
18147
|
+
sortMode === s2.key && styles7.sortBtnTextActive
|
|
18060
18148
|
] }, s2.label)
|
|
18061
18149
|
))), /* @__PURE__ */ import_react18.default.createElement(import_react_native17.View, { style: { paddingHorizontal: 16, paddingBottom: 12 } }, /* @__PURE__ */ import_react18.default.createElement(
|
|
18062
18150
|
import_react_native17.TextInput,
|
|
@@ -18076,18 +18164,18 @@ function IssueListScreen({ nav, category }) {
|
|
|
18076
18164
|
fontSize: 13
|
|
18077
18165
|
}
|
|
18078
18166
|
}
|
|
18079
|
-
)), loading ? /* @__PURE__ */ import_react18.default.createElement(IssueListScreenSkeleton, null) : searchFilteredIssues.length === 0 ? /* @__PURE__ */ import_react18.default.createElement(import_react_native17.View, { style:
|
|
18167
|
+
)), loading ? /* @__PURE__ */ import_react18.default.createElement(IssueListScreenSkeleton, null) : searchFilteredIssues.length === 0 ? /* @__PURE__ */ import_react18.default.createElement(import_react_native17.View, { style: styles7.emptyContainer }, /* @__PURE__ */ import_react18.default.createElement(import_react_native17.Text, { style: styles7.emptyIcon }, debouncedQuery ? "\u{1F50D}" : config.emptyIcon), /* @__PURE__ */ import_react18.default.createElement(import_react_native17.Text, { style: styles7.emptyText }, debouncedQuery ? "No matching issues" : config.emptyText)) : searchFilteredIssues.map((issue) => /* @__PURE__ */ import_react18.default.createElement(
|
|
18080
18168
|
import_react_native17.TouchableOpacity,
|
|
18081
18169
|
{
|
|
18082
18170
|
key: issue.id,
|
|
18083
|
-
style:
|
|
18171
|
+
style: styles7.issueCard,
|
|
18084
18172
|
onPress: () => nav.push({ name: "ISSUE_DETAIL", issue }),
|
|
18085
18173
|
activeOpacity: 0.7
|
|
18086
18174
|
},
|
|
18087
|
-
/* @__PURE__ */ import_react18.default.createElement(import_react_native17.View, { style:
|
|
18088
|
-
/* @__PURE__ */ import_react18.default.createElement(import_react_native17.View, { style:
|
|
18089
|
-
activeCategory === "done" && issue.verifiedByName && /* @__PURE__ */ import_react18.default.createElement(import_react_native17.View, { style:
|
|
18090
|
-
activeCategory === "reopened" && issue.originalBugTitle && /* @__PURE__ */ import_react18.default.createElement(import_react_native17.View, { style:
|
|
18175
|
+
/* @__PURE__ */ import_react18.default.createElement(import_react_native17.View, { style: styles7.topRow }, issue.severity && /* @__PURE__ */ import_react18.default.createElement(import_react_native17.View, { style: [styles7.severityDot, { backgroundColor: SEVERITY_COLORS[issue.severity] || colors.textDim }] }), /* @__PURE__ */ import_react18.default.createElement(import_react_native17.Text, { style: styles7.issueTitle, numberOfLines: 1 }, issue.title)),
|
|
18176
|
+
/* @__PURE__ */ import_react18.default.createElement(import_react_native17.View, { style: styles7.bottomRow }, issue.route && /* @__PURE__ */ import_react18.default.createElement(import_react_native17.Text, { style: styles7.routeText, numberOfLines: 1 }, issue.route), /* @__PURE__ */ import_react18.default.createElement(import_react_native17.Text, { style: styles7.timeText }, formatRelativeTime(issue.updatedAt))),
|
|
18177
|
+
activeCategory === "done" && issue.verifiedByName && /* @__PURE__ */ import_react18.default.createElement(import_react_native17.View, { style: styles7.verifiedBadge }, /* @__PURE__ */ import_react18.default.createElement(import_react_native17.Text, { style: styles7.verifiedBadgeText }, "\u2714", " Verified by ", issue.verifiedByName)),
|
|
18178
|
+
activeCategory === "reopened" && issue.originalBugTitle && /* @__PURE__ */ import_react18.default.createElement(import_react_native17.View, { style: styles7.reopenedBadge }, /* @__PURE__ */ import_react18.default.createElement(import_react_native17.Text, { style: styles7.reopenedBadgeText, numberOfLines: 1 }, "\u{1F504}", " Retest of: ", issue.originalBugTitle))
|
|
18091
18179
|
)));
|
|
18092
18180
|
}
|
|
18093
18181
|
function createStyles11() {
|
|
@@ -18246,7 +18334,7 @@ var import_react_native18 = require("react-native");
|
|
|
18246
18334
|
var DONE_STATUSES = ["verified", "resolved", "closed", "reviewed"];
|
|
18247
18335
|
function IssueDetailScreen({ nav, issue }) {
|
|
18248
18336
|
const { dashboardUrl, widgetColorScheme, reopenReport } = useBugBear();
|
|
18249
|
-
const
|
|
18337
|
+
const styles7 = (0, import_react19.useMemo)(() => createStyles12(), [widgetColorScheme]);
|
|
18250
18338
|
const [showReopenForm, setShowReopenForm] = (0, import_react19.useState)(false);
|
|
18251
18339
|
const [reopenReason, setReopenReason] = (0, import_react19.useState)("");
|
|
18252
18340
|
const [isSubmitting, setIsSubmitting] = (0, import_react19.useState)(false);
|
|
@@ -18288,44 +18376,44 @@ function IssueDetailScreen({ nav, issue }) {
|
|
|
18288
18376
|
setReopenError(result.error || "Failed to reopen");
|
|
18289
18377
|
}
|
|
18290
18378
|
}, [reopenReason, reopenReport, issue.id]);
|
|
18291
|
-
return /* @__PURE__ */ import_react19.default.createElement(import_react_native18.View, null, /* @__PURE__ */ import_react19.default.createElement(import_react_native18.View, { style:
|
|
18379
|
+
return /* @__PURE__ */ import_react19.default.createElement(import_react_native18.View, null, /* @__PURE__ */ import_react19.default.createElement(import_react_native18.View, { style: styles7.badgeRow }, /* @__PURE__ */ import_react19.default.createElement(import_react_native18.View, { style: [styles7.badge, { backgroundColor: wasReopened ? colors.yellowDark : statusConfig.bg }] }, /* @__PURE__ */ import_react19.default.createElement(import_react_native18.Text, { style: [styles7.badgeText, { color: wasReopened ? colors.yellowLight : statusConfig.color }] }, wasReopened ? "Reopened" : statusConfig.label)), severityConfig && /* @__PURE__ */ import_react19.default.createElement(import_react_native18.View, { style: [styles7.badge, { backgroundColor: severityConfig.bg }] }, /* @__PURE__ */ import_react19.default.createElement(import_react_native18.Text, { style: [styles7.badgeText, { color: severityConfig.color }] }, severityConfig.label))), /* @__PURE__ */ import_react19.default.createElement(import_react_native18.Text, { style: styles7.title }, issue.title), issue.route && /* @__PURE__ */ import_react19.default.createElement(import_react_native18.Text, { style: styles7.route }, issue.route), issue.description && /* @__PURE__ */ import_react19.default.createElement(import_react_native18.View, { style: styles7.descriptionCard }, /* @__PURE__ */ import_react19.default.createElement(import_react_native18.Text, { style: styles7.descriptionText }, issue.description)), wasReopened && /* @__PURE__ */ import_react19.default.createElement(import_react_native18.View, { style: styles7.reopenedCard }, /* @__PURE__ */ import_react19.default.createElement(import_react_native18.View, { style: styles7.reopenedRow }, /* @__PURE__ */ import_react19.default.createElement(import_react_native18.Text, { style: styles7.reopenedIcon }, "\u{1F504}"), /* @__PURE__ */ import_react19.default.createElement(import_react_native18.Text, { style: styles7.reopenedText }, "Issue reopened \u2014 your team has been notified"))), issue.verifiedByName && !wasReopened && /* @__PURE__ */ import_react19.default.createElement(import_react_native18.View, { style: styles7.verifiedCard }, /* @__PURE__ */ import_react19.default.createElement(import_react_native18.View, { style: styles7.verifiedHeader }, /* @__PURE__ */ import_react19.default.createElement(import_react_native18.Text, { style: styles7.verifiedIcon }, "\u2705"), /* @__PURE__ */ import_react19.default.createElement(import_react_native18.Text, { style: styles7.verifiedTitle }, "Retesting Proof")), /* @__PURE__ */ import_react19.default.createElement(import_react_native18.Text, { style: styles7.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: styles7.originalBugCard }, /* @__PURE__ */ import_react19.default.createElement(import_react_native18.View, { style: styles7.originalBugHeader }, /* @__PURE__ */ import_react19.default.createElement(import_react_native18.Text, { style: styles7.originalBugIcon }, "\u{1F504}"), /* @__PURE__ */ import_react19.default.createElement(import_react_native18.Text, { style: styles7.originalBugTitleText }, "Original Bug")), /* @__PURE__ */ import_react19.default.createElement(import_react_native18.Text, { style: styles7.originalBugBody }, "Retest of: ", issue.originalBugTitle)), isDone && !wasReopened && !showReopenForm && /* @__PURE__ */ import_react19.default.createElement(
|
|
18292
18380
|
import_react_native18.TouchableOpacity,
|
|
18293
18381
|
{
|
|
18294
|
-
style:
|
|
18382
|
+
style: styles7.reopenButton,
|
|
18295
18383
|
onPress: () => setShowReopenForm(true),
|
|
18296
18384
|
activeOpacity: 0.7
|
|
18297
18385
|
},
|
|
18298
|
-
/* @__PURE__ */ import_react19.default.createElement(import_react_native18.Text, { style:
|
|
18299
|
-
), showReopenForm && !wasReopened && /* @__PURE__ */ import_react19.default.createElement(import_react_native18.View, { style:
|
|
18386
|
+
/* @__PURE__ */ import_react19.default.createElement(import_react_native18.Text, { style: styles7.reopenButtonText }, "\u{1F504}", " Not Fixed \u2014 Reopen Issue")
|
|
18387
|
+
), showReopenForm && !wasReopened && /* @__PURE__ */ import_react19.default.createElement(import_react_native18.View, { style: styles7.reopenForm }, /* @__PURE__ */ import_react19.default.createElement(import_react_native18.Text, { style: styles7.reopenFormTitle }, "Why isn't this fixed?"), /* @__PURE__ */ import_react19.default.createElement(
|
|
18300
18388
|
import_react_native18.TextInput,
|
|
18301
18389
|
{
|
|
18302
18390
|
value: reopenReason,
|
|
18303
18391
|
onChangeText: setReopenReason,
|
|
18304
18392
|
placeholder: "Describe what you're still seeing...",
|
|
18305
18393
|
placeholderTextColor: colors.textMuted,
|
|
18306
|
-
style:
|
|
18394
|
+
style: styles7.reopenInput,
|
|
18307
18395
|
multiline: true,
|
|
18308
18396
|
autoFocus: true
|
|
18309
18397
|
}
|
|
18310
|
-
), reopenError && /* @__PURE__ */ import_react19.default.createElement(import_react_native18.Text, { style:
|
|
18398
|
+
), reopenError && /* @__PURE__ */ import_react19.default.createElement(import_react_native18.Text, { style: styles7.reopenErrorText }, reopenError), /* @__PURE__ */ import_react19.default.createElement(import_react_native18.View, { style: styles7.reopenActions }, /* @__PURE__ */ import_react19.default.createElement(
|
|
18311
18399
|
import_react_native18.TouchableOpacity,
|
|
18312
18400
|
{
|
|
18313
18401
|
style: [
|
|
18314
|
-
|
|
18315
|
-
(!reopenReason.trim() || isSubmitting) &&
|
|
18402
|
+
styles7.reopenSubmitButton,
|
|
18403
|
+
(!reopenReason.trim() || isSubmitting) && styles7.reopenSubmitDisabled
|
|
18316
18404
|
],
|
|
18317
18405
|
onPress: handleReopen,
|
|
18318
18406
|
disabled: isSubmitting || !reopenReason.trim(),
|
|
18319
18407
|
activeOpacity: 0.7
|
|
18320
18408
|
},
|
|
18321
18409
|
isSubmitting ? /* @__PURE__ */ import_react19.default.createElement(import_react_native18.ActivityIndicator, { size: "small", color: "#fff" }) : /* @__PURE__ */ import_react19.default.createElement(import_react_native18.Text, { style: [
|
|
18322
|
-
|
|
18323
|
-
!reopenReason.trim() &&
|
|
18410
|
+
styles7.reopenSubmitText,
|
|
18411
|
+
!reopenReason.trim() && styles7.reopenSubmitTextDisabled
|
|
18324
18412
|
] }, "Reopen Issue")
|
|
18325
18413
|
), /* @__PURE__ */ import_react19.default.createElement(
|
|
18326
18414
|
import_react_native18.TouchableOpacity,
|
|
18327
18415
|
{
|
|
18328
|
-
style:
|
|
18416
|
+
style: styles7.reopenCancelButton,
|
|
18329
18417
|
onPress: () => {
|
|
18330
18418
|
setShowReopenForm(false);
|
|
18331
18419
|
setReopenReason("");
|
|
@@ -18334,7 +18422,7 @@ function IssueDetailScreen({ nav, issue }) {
|
|
|
18334
18422
|
disabled: isSubmitting,
|
|
18335
18423
|
activeOpacity: 0.7
|
|
18336
18424
|
},
|
|
18337
|
-
/* @__PURE__ */ import_react19.default.createElement(import_react_native18.Text, { style:
|
|
18425
|
+
/* @__PURE__ */ import_react19.default.createElement(import_react_native18.Text, { style: styles7.reopenCancelText }, "Cancel")
|
|
18338
18426
|
))), issue.status === "ready_to_test" && (issue.fixCommitSha || issue.resolutionNotes) && /* @__PURE__ */ import_react19.default.createElement(import_react_native18.View, { style: {
|
|
18339
18427
|
backgroundColor: "rgba(59, 130, 246, 0.1)",
|
|
18340
18428
|
borderWidth: 1,
|
|
@@ -18342,14 +18430,14 @@ function IssueDetailScreen({ nav, issue }) {
|
|
|
18342
18430
|
borderRadius: 8,
|
|
18343
18431
|
padding: 12,
|
|
18344
18432
|
marginBottom: 12
|
|
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:
|
|
18433
|
+
} }, /* @__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: styles7.screenshotSection }, /* @__PURE__ */ import_react19.default.createElement(import_react_native18.Text, { style: styles7.screenshotLabel }, "Screenshots (", issue.screenshotUrls.length, ")"), /* @__PURE__ */ import_react19.default.createElement(import_react_native18.View, { style: styles7.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: styles7.screenshotThumb }))))), /* @__PURE__ */ import_react19.default.createElement(import_react_native18.View, { style: styles7.metaSection }, issue.reporterName && /* @__PURE__ */ import_react19.default.createElement(import_react_native18.Text, { style: styles7.metaText }, "Reported by ", issue.reporterName), /* @__PURE__ */ import_react19.default.createElement(import_react_native18.Text, { style: styles7.metaTextSmall }, "Created ", formatRelativeTime(issue.createdAt), " ", "\xB7", " Updated ", formatRelativeTime(issue.updatedAt))), dashboardUrl && /* @__PURE__ */ import_react19.default.createElement(
|
|
18346
18434
|
import_react_native18.TouchableOpacity,
|
|
18347
18435
|
{
|
|
18348
|
-
style:
|
|
18436
|
+
style: styles7.dashboardLink,
|
|
18349
18437
|
onPress: () => import_react_native18.Linking.openURL(`${dashboardUrl}/reports`),
|
|
18350
18438
|
activeOpacity: 0.7
|
|
18351
18439
|
},
|
|
18352
|
-
/* @__PURE__ */ import_react19.default.createElement(import_react_native18.Text, { style:
|
|
18440
|
+
/* @__PURE__ */ import_react19.default.createElement(import_react_native18.Text, { style: styles7.dashboardLinkText }, "\u{1F310}", " View on Dashboard ", "\u2192")
|
|
18353
18441
|
));
|
|
18354
18442
|
}
|
|
18355
18443
|
function createStyles12() {
|
|
@@ -18606,7 +18694,7 @@ var import_react20 = __toESM(require("react"));
|
|
|
18606
18694
|
var import_react_native19 = require("react-native");
|
|
18607
18695
|
function SessionStartScreen({ nav }) {
|
|
18608
18696
|
const { startSession, assignments, widgetColorScheme } = useBugBear();
|
|
18609
|
-
const
|
|
18697
|
+
const styles7 = (0, import_react20.useMemo)(() => createStyles13(), [widgetColorScheme]);
|
|
18610
18698
|
const [focusArea, setFocusArea] = (0, import_react20.useState)("");
|
|
18611
18699
|
const [isStarting, setIsStarting] = (0, import_react20.useState)(false);
|
|
18612
18700
|
const [error, setError] = (0, import_react20.useState)(null);
|
|
@@ -18633,35 +18721,35 @@ function SessionStartScreen({ nav }) {
|
|
|
18633
18721
|
setIsStarting(false);
|
|
18634
18722
|
}
|
|
18635
18723
|
};
|
|
18636
|
-
return /* @__PURE__ */ import_react20.default.createElement(import_react_native19.View, null, /* @__PURE__ */ import_react20.default.createElement(import_react_native19.View, { style:
|
|
18724
|
+
return /* @__PURE__ */ import_react20.default.createElement(import_react_native19.View, null, /* @__PURE__ */ import_react20.default.createElement(import_react_native19.View, { style: styles7.header }, /* @__PURE__ */ import_react20.default.createElement(import_react_native19.Text, { style: styles7.headerIcon }, "\u{1F50D}"), /* @__PURE__ */ import_react20.default.createElement(import_react_native19.Text, { style: styles7.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: styles7.inputSection }, /* @__PURE__ */ import_react20.default.createElement(import_react_native19.Text, { style: styles7.label }, "What are you testing?"), /* @__PURE__ */ import_react20.default.createElement(
|
|
18637
18725
|
import_react_native19.TextInput,
|
|
18638
18726
|
{
|
|
18639
18727
|
value: focusArea,
|
|
18640
18728
|
onChangeText: setFocusArea,
|
|
18641
18729
|
placeholder: "e.g. Checkout flow, Settings page...",
|
|
18642
18730
|
placeholderTextColor: colors.textMuted,
|
|
18643
|
-
style:
|
|
18731
|
+
style: styles7.input,
|
|
18644
18732
|
returnKeyType: "done",
|
|
18645
18733
|
onSubmitEditing: handleStart
|
|
18646
18734
|
}
|
|
18647
|
-
)), trackNames.length > 0 && /* @__PURE__ */ import_react20.default.createElement(import_react_native19.View, { style:
|
|
18735
|
+
)), trackNames.length > 0 && /* @__PURE__ */ import_react20.default.createElement(import_react_native19.View, { style: styles7.chipsSection }, /* @__PURE__ */ import_react20.default.createElement(import_react_native19.Text, { style: styles7.chipsLabel }, "Quick pick:"), /* @__PURE__ */ import_react20.default.createElement(import_react_native19.View, { style: styles7.chipsRow }, trackNames.map((name) => /* @__PURE__ */ import_react20.default.createElement(
|
|
18648
18736
|
import_react_native19.TouchableOpacity,
|
|
18649
18737
|
{
|
|
18650
18738
|
key: name,
|
|
18651
|
-
style: [
|
|
18739
|
+
style: [styles7.chip, focusArea === name && styles7.chipActive],
|
|
18652
18740
|
onPress: () => setFocusArea(name),
|
|
18653
18741
|
activeOpacity: 0.7
|
|
18654
18742
|
},
|
|
18655
|
-
/* @__PURE__ */ import_react20.default.createElement(import_react_native19.Text, { style: [
|
|
18656
|
-
)))), error && /* @__PURE__ */ import_react20.default.createElement(import_react_native19.View, { style:
|
|
18743
|
+
/* @__PURE__ */ import_react20.default.createElement(import_react_native19.Text, { style: [styles7.chipText, focusArea === name && styles7.chipTextActive] }, name)
|
|
18744
|
+
)))), error && /* @__PURE__ */ import_react20.default.createElement(import_react_native19.View, { style: styles7.errorBox }, /* @__PURE__ */ import_react20.default.createElement(import_react_native19.Text, { style: styles7.errorText }, error)), /* @__PURE__ */ import_react20.default.createElement(
|
|
18657
18745
|
import_react_native19.TouchableOpacity,
|
|
18658
18746
|
{
|
|
18659
|
-
style: [
|
|
18747
|
+
style: [styles7.startBtn, isStarting && styles7.startBtnDisabled],
|
|
18660
18748
|
onPress: handleStart,
|
|
18661
18749
|
disabled: isStarting,
|
|
18662
18750
|
activeOpacity: 0.8
|
|
18663
18751
|
},
|
|
18664
|
-
/* @__PURE__ */ import_react20.default.createElement(import_react_native19.Text, { style:
|
|
18752
|
+
/* @__PURE__ */ import_react20.default.createElement(import_react_native19.Text, { style: styles7.startBtnText }, isStarting ? "Starting..." : "\u25B6 Start Session")
|
|
18665
18753
|
));
|
|
18666
18754
|
}
|
|
18667
18755
|
function createStyles13() {
|
|
@@ -18770,7 +18858,7 @@ var import_react21 = __toESM(require("react"));
|
|
|
18770
18858
|
var import_react_native20 = require("react-native");
|
|
18771
18859
|
function SessionActiveScreen({ nav }) {
|
|
18772
18860
|
const { activeSession, sessionFindings, endSession, refreshSession, widgetColorScheme } = useBugBear();
|
|
18773
|
-
const
|
|
18861
|
+
const styles7 = (0, import_react21.useMemo)(() => createStyles14(), [widgetColorScheme]);
|
|
18774
18862
|
const FINDING_TYPE_CONFIG = (0, import_react21.useMemo)(() => ({
|
|
18775
18863
|
bug: { icon: "\u{1F41B}", label: "Bug", color: colors.red },
|
|
18776
18864
|
concern: { icon: "\u26A0\uFE0F", label: "Concern", color: colors.amber },
|
|
@@ -18812,30 +18900,38 @@ function SessionActiveScreen({ nav }) {
|
|
|
18812
18900
|
}
|
|
18813
18901
|
};
|
|
18814
18902
|
if (!activeSession) {
|
|
18815
|
-
return /* @__PURE__ */ import_react21.default.createElement(import_react_native20.View, { style:
|
|
18903
|
+
return /* @__PURE__ */ import_react21.default.createElement(import_react_native20.View, { style: styles7.emptyContainer }, /* @__PURE__ */ import_react21.default.createElement(import_react_native20.Text, { style: styles7.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: styles7.emptyLink }, "Start a new session")));
|
|
18816
18904
|
}
|
|
18817
18905
|
const renderFinding = (finding) => {
|
|
18818
18906
|
const config = FINDING_TYPE_CONFIG[finding.type] || FINDING_TYPE_CONFIG.bug;
|
|
18819
|
-
return /* @__PURE__ */ import_react21.default.createElement(import_react_native20.View, { key: finding.id, style:
|
|
18907
|
+
return /* @__PURE__ */ import_react21.default.createElement(import_react_native20.View, { key: finding.id, style: styles7.findingRow }, /* @__PURE__ */ import_react21.default.createElement(import_react_native20.Text, { style: styles7.findingIcon }, config.icon), /* @__PURE__ */ import_react21.default.createElement(import_react_native20.View, { style: styles7.findingContent }, /* @__PURE__ */ import_react21.default.createElement(import_react_native20.Text, { style: styles7.findingTitle, numberOfLines: 1 }, finding.title), /* @__PURE__ */ import_react21.default.createElement(import_react_native20.View, { style: styles7.findingMeta }, /* @__PURE__ */ import_react21.default.createElement(import_react_native20.Text, { style: [styles7.findingType, { color: config.color }] }, config.label), /* @__PURE__ */ import_react21.default.createElement(import_react_native20.Text, { style: styles7.findingSeverity }, finding.severity), finding.convertedToBugId && /* @__PURE__ */ import_react21.default.createElement(import_react_native20.Text, { style: styles7.findingConverted }, "\u2192 Bug filed"))));
|
|
18820
18908
|
};
|
|
18821
|
-
return /* @__PURE__ */ import_react21.default.createElement(import_react_native20.View, null, /* @__PURE__ */ import_react21.default.createElement(import_react_native20.View, { style:
|
|
18909
|
+
return /* @__PURE__ */ import_react21.default.createElement(import_react_native20.View, null, /* @__PURE__ */ import_react21.default.createElement(import_react_native20.View, { style: styles7.timerCard }, /* @__PURE__ */ import_react21.default.createElement(import_react_native20.View, { style: styles7.recordingRow }, /* @__PURE__ */ import_react21.default.createElement(import_react_native20.View, { style: styles7.recordingDot }), /* @__PURE__ */ import_react21.default.createElement(import_react_native20.Text, { style: styles7.recordingLabel }, "Recording")), /* @__PURE__ */ import_react21.default.createElement(import_react_native20.Text, { style: styles7.timerText }, formatTimer(elapsed)), activeSession.focusArea ? /* @__PURE__ */ import_react21.default.createElement(import_react_native20.Text, { style: styles7.focusArea }, activeSession.focusArea) : null), /* @__PURE__ */ import_react21.default.createElement(import_react_native20.View, { style: styles7.actionRow }, /* @__PURE__ */ import_react21.default.createElement(
|
|
18822
18910
|
import_react_native20.TouchableOpacity,
|
|
18823
18911
|
{
|
|
18824
|
-
style:
|
|
18912
|
+
style: styles7.addFindingBtn,
|
|
18825
18913
|
onPress: () => nav.push({ name: "SESSION_FINDING" }),
|
|
18826
18914
|
activeOpacity: 0.8
|
|
18827
18915
|
},
|
|
18828
|
-
/* @__PURE__ */ import_react21.default.createElement(import_react_native20.Text, { style:
|
|
18916
|
+
/* @__PURE__ */ import_react21.default.createElement(import_react_native20.Text, { style: styles7.addFindingText }, "+ Add Finding")
|
|
18917
|
+
), nav.minimizeToAdHoc && /* @__PURE__ */ import_react21.default.createElement(
|
|
18918
|
+
import_react_native20.TouchableOpacity,
|
|
18919
|
+
{
|
|
18920
|
+
style: styles7.minimizeBtn,
|
|
18921
|
+
onPress: nav.minimizeToAdHoc,
|
|
18922
|
+
activeOpacity: 0.8
|
|
18923
|
+
},
|
|
18924
|
+
/* @__PURE__ */ import_react21.default.createElement(import_react_native20.Text, { style: styles7.minimizeBtnText }, "\u2199")
|
|
18829
18925
|
), /* @__PURE__ */ import_react21.default.createElement(
|
|
18830
18926
|
import_react_native20.TouchableOpacity,
|
|
18831
18927
|
{
|
|
18832
|
-
style: [
|
|
18928
|
+
style: [styles7.endBtn, isEnding && styles7.endBtnDisabled],
|
|
18833
18929
|
onPress: handleEnd,
|
|
18834
18930
|
disabled: isEnding,
|
|
18835
18931
|
activeOpacity: 0.8
|
|
18836
18932
|
},
|
|
18837
|
-
/* @__PURE__ */ import_react21.default.createElement(import_react_native20.Text, { style:
|
|
18838
|
-
)), /* @__PURE__ */ import_react21.default.createElement(import_react_native20.Text, { style:
|
|
18933
|
+
/* @__PURE__ */ import_react21.default.createElement(import_react_native20.Text, { style: styles7.endBtnText }, isEnding ? "..." : "End")
|
|
18934
|
+
)), /* @__PURE__ */ import_react21.default.createElement(import_react_native20.Text, { style: styles7.sectionTitle }, "Findings (", sessionFindings.length, ")"), sessionFindings.length === 0 ? /* @__PURE__ */ import_react21.default.createElement(import_react_native20.View, { style: styles7.emptyFindings }, /* @__PURE__ */ import_react21.default.createElement(import_react_native20.Text, { style: styles7.emptyFindingsIcon }, "\u{1F4CB}"), /* @__PURE__ */ import_react21.default.createElement(import_react_native20.Text, { style: styles7.emptyFindingsText }, 'No findings yet. Tap "Add Finding" to log something.')) : /* @__PURE__ */ import_react21.default.createElement(import_react_native20.View, { style: styles7.findingsList }, sessionFindings.map(renderFinding)));
|
|
18839
18935
|
}
|
|
18840
18936
|
function createStyles14() {
|
|
18841
18937
|
return import_react_native20.StyleSheet.create({
|
|
@@ -18912,6 +19008,21 @@ function createStyles14() {
|
|
|
18912
19008
|
fontWeight: "600",
|
|
18913
19009
|
color: colors.blueLight
|
|
18914
19010
|
},
|
|
19011
|
+
minimizeBtn: {
|
|
19012
|
+
paddingVertical: 12,
|
|
19013
|
+
paddingHorizontal: 16,
|
|
19014
|
+
backgroundColor: colors.card,
|
|
19015
|
+
borderWidth: 1,
|
|
19016
|
+
borderColor: colors.border,
|
|
19017
|
+
borderRadius: 10,
|
|
19018
|
+
alignItems: "center",
|
|
19019
|
+
justifyContent: "center"
|
|
19020
|
+
},
|
|
19021
|
+
minimizeBtnText: {
|
|
19022
|
+
fontSize: 14,
|
|
19023
|
+
fontWeight: "600",
|
|
19024
|
+
color: colors.textSecondary
|
|
19025
|
+
},
|
|
18915
19026
|
endBtn: {
|
|
18916
19027
|
paddingVertical: 12,
|
|
18917
19028
|
paddingHorizontal: 16,
|
|
@@ -19013,7 +19124,7 @@ var FINDING_TYPES = [
|
|
|
19013
19124
|
];
|
|
19014
19125
|
function SessionFindingScreen({ nav }) {
|
|
19015
19126
|
const { addFinding, widgetColorScheme } = useBugBear();
|
|
19016
|
-
const
|
|
19127
|
+
const styles7 = (0, import_react22.useMemo)(() => createStyles15(), [widgetColorScheme]);
|
|
19017
19128
|
const SEVERITIES = (0, import_react22.useMemo)(() => [
|
|
19018
19129
|
{ value: "critical", label: "Critical", color: colors.red },
|
|
19019
19130
|
{ value: "high", label: "High", color: colors.orange },
|
|
@@ -19045,46 +19156,46 @@ function SessionFindingScreen({ nav }) {
|
|
|
19045
19156
|
}
|
|
19046
19157
|
};
|
|
19047
19158
|
const canSubmit = title.trim().length > 0 && !isSubmitting;
|
|
19048
|
-
return /* @__PURE__ */ import_react22.default.createElement(import_react_native21.View, null, /* @__PURE__ */ import_react22.default.createElement(import_react_native21.View, { style:
|
|
19159
|
+
return /* @__PURE__ */ import_react22.default.createElement(import_react_native21.View, null, /* @__PURE__ */ import_react22.default.createElement(import_react_native21.View, { style: styles7.section }, /* @__PURE__ */ import_react22.default.createElement(import_react_native21.Text, { style: styles7.sectionLabel }, "Type"), /* @__PURE__ */ import_react22.default.createElement(import_react_native21.View, { style: styles7.typeRow }, FINDING_TYPES.map((ft) => /* @__PURE__ */ import_react22.default.createElement(
|
|
19049
19160
|
import_react_native21.TouchableOpacity,
|
|
19050
19161
|
{
|
|
19051
19162
|
key: ft.value,
|
|
19052
|
-
style: [
|
|
19163
|
+
style: [styles7.typePill, type === ft.value && styles7.typePillActive],
|
|
19053
19164
|
onPress: () => setType(ft.value),
|
|
19054
19165
|
activeOpacity: 0.7
|
|
19055
19166
|
},
|
|
19056
|
-
/* @__PURE__ */ import_react22.default.createElement(import_react_native21.Text, { style:
|
|
19057
|
-
/* @__PURE__ */ import_react22.default.createElement(import_react_native21.Text, { style: [
|
|
19058
|
-
)))), /* @__PURE__ */ import_react22.default.createElement(import_react_native21.View, { style:
|
|
19167
|
+
/* @__PURE__ */ import_react22.default.createElement(import_react_native21.Text, { style: styles7.typePillIcon }, ft.icon),
|
|
19168
|
+
/* @__PURE__ */ import_react22.default.createElement(import_react_native21.Text, { style: [styles7.typePillLabel, type === ft.value && styles7.typePillLabelActive] }, ft.label)
|
|
19169
|
+
)))), /* @__PURE__ */ import_react22.default.createElement(import_react_native21.View, { style: styles7.section }, /* @__PURE__ */ import_react22.default.createElement(import_react_native21.Text, { style: styles7.sectionLabel }, "Severity"), /* @__PURE__ */ import_react22.default.createElement(import_react_native21.View, { style: styles7.severityRow }, SEVERITIES.map((s2) => /* @__PURE__ */ import_react22.default.createElement(
|
|
19059
19170
|
import_react_native21.TouchableOpacity,
|
|
19060
19171
|
{
|
|
19061
19172
|
key: s2.value,
|
|
19062
19173
|
style: [
|
|
19063
|
-
|
|
19174
|
+
styles7.severityPill,
|
|
19064
19175
|
severity === s2.value && { backgroundColor: `${s2.color}20`, borderColor: s2.color }
|
|
19065
19176
|
],
|
|
19066
19177
|
onPress: () => setSeverity(s2.value),
|
|
19067
19178
|
activeOpacity: 0.7
|
|
19068
19179
|
},
|
|
19069
|
-
/* @__PURE__ */ import_react22.default.createElement(import_react_native21.Text, { style: [
|
|
19070
|
-
)))), /* @__PURE__ */ import_react22.default.createElement(import_react_native21.View, { style:
|
|
19180
|
+
/* @__PURE__ */ import_react22.default.createElement(import_react_native21.Text, { style: [styles7.severityText, severity === s2.value && { color: s2.color }] }, s2.label)
|
|
19181
|
+
)))), /* @__PURE__ */ import_react22.default.createElement(import_react_native21.View, { style: styles7.inputSection }, /* @__PURE__ */ import_react22.default.createElement(
|
|
19071
19182
|
import_react_native21.TextInput,
|
|
19072
19183
|
{
|
|
19073
19184
|
value: title,
|
|
19074
19185
|
onChangeText: setTitle,
|
|
19075
19186
|
placeholder: "What did you find?",
|
|
19076
19187
|
placeholderTextColor: colors.textMuted,
|
|
19077
|
-
style:
|
|
19188
|
+
style: styles7.titleInput,
|
|
19078
19189
|
returnKeyType: "next"
|
|
19079
19190
|
}
|
|
19080
|
-
)), /* @__PURE__ */ import_react22.default.createElement(import_react_native21.View, { style:
|
|
19191
|
+
)), /* @__PURE__ */ import_react22.default.createElement(import_react_native21.View, { style: styles7.inputSection }, /* @__PURE__ */ import_react22.default.createElement(
|
|
19081
19192
|
import_react_native21.TextInput,
|
|
19082
19193
|
{
|
|
19083
19194
|
value: description,
|
|
19084
19195
|
onChangeText: setDescription,
|
|
19085
19196
|
placeholder: "Details (optional)",
|
|
19086
19197
|
placeholderTextColor: colors.textMuted,
|
|
19087
|
-
style:
|
|
19198
|
+
style: styles7.descInput,
|
|
19088
19199
|
multiline: true,
|
|
19089
19200
|
numberOfLines: 3,
|
|
19090
19201
|
textAlignVertical: "top"
|
|
@@ -19092,12 +19203,12 @@ function SessionFindingScreen({ nav }) {
|
|
|
19092
19203
|
)), /* @__PURE__ */ import_react22.default.createElement(
|
|
19093
19204
|
import_react_native21.TouchableOpacity,
|
|
19094
19205
|
{
|
|
19095
|
-
style: [
|
|
19206
|
+
style: [styles7.submitBtn, !canSubmit && styles7.submitBtnDisabled],
|
|
19096
19207
|
onPress: handleSubmit,
|
|
19097
19208
|
disabled: !canSubmit,
|
|
19098
19209
|
activeOpacity: 0.8
|
|
19099
19210
|
},
|
|
19100
|
-
/* @__PURE__ */ import_react22.default.createElement(import_react_native21.Text, { style: [
|
|
19211
|
+
/* @__PURE__ */ import_react22.default.createElement(import_react_native21.Text, { style: [styles7.submitBtnText, !canSubmit && styles7.submitBtnTextDisabled] }, isSubmitting ? "Saving..." : "Save Finding")
|
|
19101
19212
|
));
|
|
19102
19213
|
}
|
|
19103
19214
|
function createStyles15() {
|
|
@@ -19215,6 +19326,10 @@ var import_react_native22 = require("react-native");
|
|
|
19215
19326
|
var screenWidth = import_react_native22.Dimensions.get("window").width;
|
|
19216
19327
|
var screenHeight = import_react_native22.Dimensions.get("window").height;
|
|
19217
19328
|
var RUNNER_WIDTH = 280;
|
|
19329
|
+
var RUNNER_MARGIN = 16;
|
|
19330
|
+
var MIN_Y = 80;
|
|
19331
|
+
var BOTTOM_SAFE_PADDING = import_react_native22.Platform.OS === "ios" ? 34 : 24;
|
|
19332
|
+
var SAFE_MAX_Y = screenHeight - 200 - BOTTOM_SAFE_PADDING;
|
|
19218
19333
|
function MiniTestRunner({ assignmentId, onExpand, onComplete, onAdvance, onNavigateToReport }) {
|
|
19219
19334
|
const { client, assignments, refreshAssignments } = useBugBear();
|
|
19220
19335
|
const assignment = assignments.find((a) => a.id === assignmentId);
|
|
@@ -19229,8 +19344,8 @@ function MiniTestRunner({ assignmentId, onExpand, onComplete, onAdvance, onNavig
|
|
|
19229
19344
|
setCurrentStepIndex(0);
|
|
19230
19345
|
}, [assignmentId]);
|
|
19231
19346
|
const pan = (0, import_react23.useRef)(new import_react_native22.Animated.ValueXY({
|
|
19232
|
-
x: screenWidth - RUNNER_WIDTH -
|
|
19233
|
-
y:
|
|
19347
|
+
x: screenWidth - RUNNER_WIDTH - RUNNER_MARGIN,
|
|
19348
|
+
y: SAFE_MAX_Y
|
|
19234
19349
|
})).current;
|
|
19235
19350
|
const panResponder = (0, import_react23.useRef)(
|
|
19236
19351
|
import_react_native22.PanResponder.create({
|
|
@@ -19238,8 +19353,8 @@ function MiniTestRunner({ assignmentId, onExpand, onComplete, onAdvance, onNavig
|
|
|
19238
19353
|
onMoveShouldSetPanResponder: (_, gs) => Math.abs(gs.dx) > 5 || Math.abs(gs.dy) > 5,
|
|
19239
19354
|
onPanResponderGrant: () => {
|
|
19240
19355
|
pan.setOffset({
|
|
19241
|
-
x: getAnimatedValue(pan.x),
|
|
19242
|
-
y: getAnimatedValue(pan.y)
|
|
19356
|
+
x: Math.max(RUNNER_MARGIN, Math.min(getAnimatedValue(pan.x), screenWidth - RUNNER_WIDTH - RUNNER_MARGIN)),
|
|
19357
|
+
y: Math.max(MIN_Y, Math.min(getAnimatedValue(pan.y), SAFE_MAX_Y))
|
|
19243
19358
|
});
|
|
19244
19359
|
pan.setValue({ x: 0, y: 0 });
|
|
19245
19360
|
},
|
|
@@ -19251,8 +19366,8 @@ function MiniTestRunner({ assignmentId, onExpand, onComplete, onAdvance, onNavig
|
|
|
19251
19366
|
pan.flattenOffset();
|
|
19252
19367
|
const currentX = getAnimatedValue(pan.x);
|
|
19253
19368
|
const currentY = getAnimatedValue(pan.y);
|
|
19254
|
-
const snapX = currentX < screenWidth / 2 ?
|
|
19255
|
-
const snapY = Math.max(
|
|
19369
|
+
const snapX = currentX < screenWidth / 2 ? RUNNER_MARGIN : screenWidth - RUNNER_WIDTH - RUNNER_MARGIN;
|
|
19370
|
+
const snapY = Math.max(MIN_Y, Math.min(currentY, SAFE_MAX_Y));
|
|
19256
19371
|
import_react_native22.Animated.spring(pan, {
|
|
19257
19372
|
toValue: { x: snapX, y: snapY },
|
|
19258
19373
|
useNativeDriver: false,
|
|
@@ -19478,9 +19593,365 @@ var styles4 = import_react_native22.StyleSheet.create({
|
|
|
19478
19593
|
}
|
|
19479
19594
|
});
|
|
19480
19595
|
|
|
19481
|
-
// src/
|
|
19596
|
+
// src/widget/AdHocOverlay.tsx
|
|
19597
|
+
var import_react24 = __toESM(require("react"));
|
|
19598
|
+
var import_react_native23 = require("react-native");
|
|
19482
19599
|
var screenWidth2 = import_react_native23.Dimensions.get("window").width;
|
|
19483
19600
|
var screenHeight2 = import_react_native23.Dimensions.get("window").height;
|
|
19601
|
+
var OVERLAY_WIDTH = 280;
|
|
19602
|
+
var OVERLAY_MARGIN = 16;
|
|
19603
|
+
var MIN_Y2 = 80;
|
|
19604
|
+
var BOTTOM_SAFE_PADDING2 = import_react_native23.Platform.OS === "ios" ? 34 : 24;
|
|
19605
|
+
var SAFE_MAX_Y2 = screenHeight2 - 200 - BOTTOM_SAFE_PADDING2;
|
|
19606
|
+
function AdHocOverlay({ sessionId, focusArea, startedAt, onExpand, onComplete }) {
|
|
19607
|
+
const { client, addFinding, endSession, activeSession } = useBugBear();
|
|
19608
|
+
const [inputMode, setInputMode] = (0, import_react24.useState)("closed");
|
|
19609
|
+
const [inputText, setInputText] = (0, import_react24.useState)("");
|
|
19610
|
+
const [isSubmitting, setIsSubmitting] = (0, import_react24.useState)(false);
|
|
19611
|
+
const [flashMessage, setFlashMessage] = (0, import_react24.useState)(null);
|
|
19612
|
+
const [elapsedTime, setElapsedTime] = (0, import_react24.useState)(0);
|
|
19613
|
+
const inputRef = (0, import_react24.useRef)(null);
|
|
19614
|
+
const screenshotRef = (0, import_react24.useRef)(null);
|
|
19615
|
+
const mountAnim = (0, import_react24.useRef)(new import_react_native23.Animated.Value(0)).current;
|
|
19616
|
+
(0, import_react24.useEffect)(() => {
|
|
19617
|
+
import_react_native23.Animated.spring(mountAnim, { toValue: 1, useNativeDriver: true, tension: 80, friction: 10 }).start();
|
|
19618
|
+
}, []);
|
|
19619
|
+
const pan = (0, import_react24.useRef)(new import_react_native23.Animated.ValueXY({
|
|
19620
|
+
x: screenWidth2 - OVERLAY_WIDTH - OVERLAY_MARGIN,
|
|
19621
|
+
y: SAFE_MAX_Y2
|
|
19622
|
+
})).current;
|
|
19623
|
+
const panResponder = (0, import_react24.useRef)(
|
|
19624
|
+
import_react_native23.PanResponder.create({
|
|
19625
|
+
onStartShouldSetPanResponder: () => true,
|
|
19626
|
+
onMoveShouldSetPanResponder: (_, gs) => Math.abs(gs.dx) > 5 || Math.abs(gs.dy) > 5,
|
|
19627
|
+
onPanResponderGrant: () => {
|
|
19628
|
+
pan.setOffset({
|
|
19629
|
+
x: Math.max(OVERLAY_MARGIN, Math.min(getAnimatedValue(pan.x), screenWidth2 - OVERLAY_WIDTH - OVERLAY_MARGIN)),
|
|
19630
|
+
y: Math.max(MIN_Y2, Math.min(getAnimatedValue(pan.y), SAFE_MAX_Y2))
|
|
19631
|
+
});
|
|
19632
|
+
pan.setValue({ x: 0, y: 0 });
|
|
19633
|
+
},
|
|
19634
|
+
onPanResponderMove: import_react_native23.Animated.event(
|
|
19635
|
+
[null, { dx: pan.x, dy: pan.y }],
|
|
19636
|
+
{ useNativeDriver: false }
|
|
19637
|
+
),
|
|
19638
|
+
onPanResponderRelease: () => {
|
|
19639
|
+
pan.flattenOffset();
|
|
19640
|
+
const currentX = getAnimatedValue(pan.x);
|
|
19641
|
+
const currentY = getAnimatedValue(pan.y);
|
|
19642
|
+
const snapX = currentX < screenWidth2 / 2 ? OVERLAY_MARGIN : screenWidth2 - OVERLAY_WIDTH - OVERLAY_MARGIN;
|
|
19643
|
+
const snapY = Math.max(MIN_Y2, Math.min(currentY, SAFE_MAX_Y2));
|
|
19644
|
+
import_react_native23.Animated.spring(pan, {
|
|
19645
|
+
toValue: { x: snapX, y: snapY },
|
|
19646
|
+
useNativeDriver: false,
|
|
19647
|
+
friction: 7,
|
|
19648
|
+
tension: 40
|
|
19649
|
+
}).start();
|
|
19650
|
+
}
|
|
19651
|
+
})
|
|
19652
|
+
).current;
|
|
19653
|
+
(0, import_react24.useEffect)(() => {
|
|
19654
|
+
const startTime = new Date(startedAt).getTime();
|
|
19655
|
+
setElapsedTime(Math.floor((Date.now() - startTime) / 1e3));
|
|
19656
|
+
const interval = setInterval(() => {
|
|
19657
|
+
setElapsedTime(Math.floor((Date.now() - startTime) / 1e3));
|
|
19658
|
+
}, 1e3);
|
|
19659
|
+
return () => clearInterval(interval);
|
|
19660
|
+
}, [startedAt]);
|
|
19661
|
+
(0, import_react24.useEffect)(() => {
|
|
19662
|
+
if (inputMode !== "closed") {
|
|
19663
|
+
setTimeout(() => inputRef.current?.focus(), 50);
|
|
19664
|
+
}
|
|
19665
|
+
}, [inputMode]);
|
|
19666
|
+
const handleOpenInput = (0, import_react24.useCallback)(async (mode) => {
|
|
19667
|
+
import_react_native23.Keyboard.dismiss();
|
|
19668
|
+
const uri = await captureAppScreen();
|
|
19669
|
+
screenshotRef.current = uri;
|
|
19670
|
+
setInputMode(mode);
|
|
19671
|
+
setInputText("");
|
|
19672
|
+
}, []);
|
|
19673
|
+
const handleCancel = (0, import_react24.useCallback)(() => {
|
|
19674
|
+
import_react_native23.Keyboard.dismiss();
|
|
19675
|
+
setInputMode("closed");
|
|
19676
|
+
setInputText("");
|
|
19677
|
+
screenshotRef.current = null;
|
|
19678
|
+
}, []);
|
|
19679
|
+
const handleSend = (0, import_react24.useCallback)(async () => {
|
|
19680
|
+
if (!inputText.trim() || isSubmitting) return;
|
|
19681
|
+
import_react_native23.Keyboard.dismiss();
|
|
19682
|
+
setIsSubmitting(true);
|
|
19683
|
+
try {
|
|
19684
|
+
let screenshotUrl;
|
|
19685
|
+
if (screenshotRef.current && client) {
|
|
19686
|
+
screenshotUrl = await client.uploadImageFromUri(screenshotRef.current) || void 0;
|
|
19687
|
+
}
|
|
19688
|
+
const enhanced = contextCapture.getEnhancedContext();
|
|
19689
|
+
await addFinding({
|
|
19690
|
+
type: inputMode === "bug" ? "bug" : "concern",
|
|
19691
|
+
title: inputText.trim(),
|
|
19692
|
+
severity: inputMode === "bug" ? "medium" : "observation",
|
|
19693
|
+
screenshotUrl,
|
|
19694
|
+
consoleLogs: enhanced.consoleLogs,
|
|
19695
|
+
networkSnapshot: enhanced.networkRequests
|
|
19696
|
+
});
|
|
19697
|
+
setFlashMessage("Saved!");
|
|
19698
|
+
setInputMode("closed");
|
|
19699
|
+
setInputText("");
|
|
19700
|
+
screenshotRef.current = null;
|
|
19701
|
+
setTimeout(() => setFlashMessage(null), 1500);
|
|
19702
|
+
} finally {
|
|
19703
|
+
setIsSubmitting(false);
|
|
19704
|
+
}
|
|
19705
|
+
}, [inputText, isSubmitting, inputMode, client, addFinding]);
|
|
19706
|
+
const handleComplete = (0, import_react24.useCallback)(async () => {
|
|
19707
|
+
if (isSubmitting) return;
|
|
19708
|
+
import_react_native23.Keyboard.dismiss();
|
|
19709
|
+
setIsSubmitting(true);
|
|
19710
|
+
try {
|
|
19711
|
+
const result = await endSession();
|
|
19712
|
+
if (result.success) {
|
|
19713
|
+
const mins = activeSession?.durationMinutes ?? Math.round(elapsedTime / 60);
|
|
19714
|
+
const findings = activeSession?.findingsCount ?? 0;
|
|
19715
|
+
setFlashMessage(`Session complete! ${mins} min, ${findings} finding${findings !== 1 ? "s" : ""}`);
|
|
19716
|
+
setTimeout(() => {
|
|
19717
|
+
setFlashMessage(null);
|
|
19718
|
+
onComplete();
|
|
19719
|
+
}, 2e3);
|
|
19720
|
+
}
|
|
19721
|
+
} finally {
|
|
19722
|
+
setIsSubmitting(false);
|
|
19723
|
+
}
|
|
19724
|
+
}, [isSubmitting, endSession, activeSession, elapsedTime, onComplete]);
|
|
19725
|
+
return /* @__PURE__ */ import_react24.default.createElement(
|
|
19726
|
+
import_react_native23.Animated.View,
|
|
19727
|
+
{
|
|
19728
|
+
style: [
|
|
19729
|
+
styles5.container,
|
|
19730
|
+
{
|
|
19731
|
+
opacity: mountAnim,
|
|
19732
|
+
transform: [
|
|
19733
|
+
...pan.getTranslateTransform(),
|
|
19734
|
+
{ scale: mountAnim.interpolate({ inputRange: [0, 1], outputRange: [0.8, 1] }) }
|
|
19735
|
+
]
|
|
19736
|
+
}
|
|
19737
|
+
],
|
|
19738
|
+
...panResponder.panHandlers
|
|
19739
|
+
},
|
|
19740
|
+
/* @__PURE__ */ import_react24.default.createElement(import_react_native23.View, { style: styles5.header }, /* @__PURE__ */ import_react24.default.createElement(import_react_native23.View, { style: styles5.headerLeft }, /* @__PURE__ */ import_react24.default.createElement(import_react_native23.Text, { style: styles5.headerLabel }, "Ad Hoc"), focusArea ? /* @__PURE__ */ import_react24.default.createElement(import_react_native23.Text, { style: styles5.focusText, numberOfLines: 1 }, "\xB7 ", focusArea) : null, /* @__PURE__ */ import_react24.default.createElement(import_react_native23.Text, { style: styles5.timer }, formatElapsedTime(elapsedTime))), /* @__PURE__ */ import_react24.default.createElement(import_react_native23.TouchableOpacity, { onPress: onExpand, style: styles5.expandButton }, /* @__PURE__ */ import_react24.default.createElement(import_react_native23.Text, { style: styles5.expandText }, "\u2197"))),
|
|
19741
|
+
flashMessage ? /* @__PURE__ */ import_react24.default.createElement(import_react_native23.View, { style: styles5.flash }, /* @__PURE__ */ import_react24.default.createElement(import_react_native23.Text, { style: styles5.flashText }, flashMessage)) : null,
|
|
19742
|
+
inputMode !== "closed" && !flashMessage ? /* @__PURE__ */ import_react24.default.createElement(import_react_native23.View, { style: styles5.inputArea }, /* @__PURE__ */ import_react24.default.createElement(
|
|
19743
|
+
import_react_native23.TextInput,
|
|
19744
|
+
{
|
|
19745
|
+
ref: inputRef,
|
|
19746
|
+
value: inputText,
|
|
19747
|
+
onChangeText: setInputText,
|
|
19748
|
+
placeholder: inputMode === "bug" ? "What went wrong?" : "What did you notice?",
|
|
19749
|
+
placeholderTextColor: colors.textDim,
|
|
19750
|
+
multiline: true,
|
|
19751
|
+
numberOfLines: 2,
|
|
19752
|
+
style: styles5.textInput
|
|
19753
|
+
}
|
|
19754
|
+
), /* @__PURE__ */ import_react24.default.createElement(import_react_native23.View, { style: styles5.inputActions }, /* @__PURE__ */ import_react24.default.createElement(import_react_native23.TouchableOpacity, { onPress: handleCancel }, /* @__PURE__ */ import_react24.default.createElement(import_react_native23.Text, { style: styles5.cancelText }, "Cancel")), /* @__PURE__ */ import_react24.default.createElement(
|
|
19755
|
+
import_react_native23.TouchableOpacity,
|
|
19756
|
+
{
|
|
19757
|
+
onPress: handleSend,
|
|
19758
|
+
disabled: !inputText.trim() || isSubmitting,
|
|
19759
|
+
style: [
|
|
19760
|
+
styles5.sendBtn,
|
|
19761
|
+
{ backgroundColor: inputMode === "bug" ? colors.red : colors.blue },
|
|
19762
|
+
(!inputText.trim() || isSubmitting) && { opacity: 0.5 }
|
|
19763
|
+
]
|
|
19764
|
+
},
|
|
19765
|
+
/* @__PURE__ */ import_react24.default.createElement(import_react_native23.Text, { style: styles5.sendText }, isSubmitting ? "Sending..." : "Send \u2192")
|
|
19766
|
+
))) : null,
|
|
19767
|
+
inputMode === "closed" && !flashMessage ? /* @__PURE__ */ import_react24.default.createElement(import_react_native23.View, { style: styles5.actions }, /* @__PURE__ */ import_react24.default.createElement(
|
|
19768
|
+
import_react_native23.TouchableOpacity,
|
|
19769
|
+
{
|
|
19770
|
+
style: [styles5.feedbackBtn, isSubmitting && { opacity: 0.5 }],
|
|
19771
|
+
onPress: () => handleOpenInput("feedback"),
|
|
19772
|
+
disabled: isSubmitting
|
|
19773
|
+
},
|
|
19774
|
+
/* @__PURE__ */ import_react24.default.createElement(import_react_native23.Text, { style: styles5.feedbackText }, "Feedback")
|
|
19775
|
+
), /* @__PURE__ */ import_react24.default.createElement(
|
|
19776
|
+
import_react_native23.TouchableOpacity,
|
|
19777
|
+
{
|
|
19778
|
+
style: [styles5.bugBtn, isSubmitting && { opacity: 0.5 }],
|
|
19779
|
+
onPress: () => handleOpenInput("bug"),
|
|
19780
|
+
disabled: isSubmitting
|
|
19781
|
+
},
|
|
19782
|
+
/* @__PURE__ */ import_react24.default.createElement(import_react_native23.Text, { style: styles5.bugText }, "Bug")
|
|
19783
|
+
), /* @__PURE__ */ import_react24.default.createElement(
|
|
19784
|
+
import_react_native23.TouchableOpacity,
|
|
19785
|
+
{
|
|
19786
|
+
style: [styles5.completeBtn, isSubmitting && { opacity: 0.5 }],
|
|
19787
|
+
onPress: handleComplete,
|
|
19788
|
+
disabled: isSubmitting
|
|
19789
|
+
},
|
|
19790
|
+
/* @__PURE__ */ import_react24.default.createElement(import_react_native23.Text, { style: styles5.completeText }, "Complete")
|
|
19791
|
+
)) : null
|
|
19792
|
+
);
|
|
19793
|
+
}
|
|
19794
|
+
var styles5 = import_react_native23.StyleSheet.create({
|
|
19795
|
+
container: {
|
|
19796
|
+
position: "absolute",
|
|
19797
|
+
width: OVERLAY_WIDTH,
|
|
19798
|
+
zIndex: 9999,
|
|
19799
|
+
backgroundColor: colors.bg,
|
|
19800
|
+
borderRadius: 12,
|
|
19801
|
+
borderWidth: 1,
|
|
19802
|
+
borderColor: colors.border,
|
|
19803
|
+
shadowColor: "#000",
|
|
19804
|
+
shadowOffset: { width: 0, height: 8 },
|
|
19805
|
+
shadowOpacity: 0.4,
|
|
19806
|
+
shadowRadius: 16,
|
|
19807
|
+
elevation: 20,
|
|
19808
|
+
overflow: "hidden"
|
|
19809
|
+
},
|
|
19810
|
+
header: {
|
|
19811
|
+
backgroundColor: colors.bgDarker,
|
|
19812
|
+
paddingVertical: 6,
|
|
19813
|
+
paddingHorizontal: 12,
|
|
19814
|
+
flexDirection: "row",
|
|
19815
|
+
alignItems: "center",
|
|
19816
|
+
justifyContent: "space-between",
|
|
19817
|
+
borderBottomWidth: 1,
|
|
19818
|
+
borderBottomColor: colors.border
|
|
19819
|
+
},
|
|
19820
|
+
headerLeft: {
|
|
19821
|
+
flexDirection: "row",
|
|
19822
|
+
alignItems: "center",
|
|
19823
|
+
gap: 6,
|
|
19824
|
+
flex: 1
|
|
19825
|
+
},
|
|
19826
|
+
headerLabel: {
|
|
19827
|
+
fontSize: 11,
|
|
19828
|
+
color: colors.textMuted,
|
|
19829
|
+
fontWeight: "600"
|
|
19830
|
+
},
|
|
19831
|
+
focusText: {
|
|
19832
|
+
fontSize: 10,
|
|
19833
|
+
color: colors.textDim,
|
|
19834
|
+
maxWidth: 100
|
|
19835
|
+
},
|
|
19836
|
+
timer: {
|
|
19837
|
+
fontSize: 10,
|
|
19838
|
+
color: colors.green,
|
|
19839
|
+
fontWeight: "600",
|
|
19840
|
+
fontVariant: ["tabular-nums"]
|
|
19841
|
+
},
|
|
19842
|
+
expandButton: {
|
|
19843
|
+
paddingVertical: 2,
|
|
19844
|
+
paddingHorizontal: 4
|
|
19845
|
+
},
|
|
19846
|
+
expandText: {
|
|
19847
|
+
fontSize: 12,
|
|
19848
|
+
color: colors.blue,
|
|
19849
|
+
fontWeight: "500"
|
|
19850
|
+
},
|
|
19851
|
+
flash: {
|
|
19852
|
+
paddingVertical: 6,
|
|
19853
|
+
paddingHorizontal: 12,
|
|
19854
|
+
backgroundColor: colors.greenDark,
|
|
19855
|
+
alignItems: "center"
|
|
19856
|
+
},
|
|
19857
|
+
flashText: {
|
|
19858
|
+
fontSize: 12,
|
|
19859
|
+
fontWeight: "600",
|
|
19860
|
+
color: colors.greenLight
|
|
19861
|
+
},
|
|
19862
|
+
inputArea: {
|
|
19863
|
+
padding: 8,
|
|
19864
|
+
paddingHorizontal: 10
|
|
19865
|
+
},
|
|
19866
|
+
textInput: {
|
|
19867
|
+
backgroundColor: colors.card,
|
|
19868
|
+
borderWidth: 1,
|
|
19869
|
+
borderColor: colors.border,
|
|
19870
|
+
borderRadius: 8,
|
|
19871
|
+
padding: 6,
|
|
19872
|
+
paddingHorizontal: 8,
|
|
19873
|
+
color: colors.textPrimary,
|
|
19874
|
+
fontSize: 12,
|
|
19875
|
+
lineHeight: 16,
|
|
19876
|
+
minHeight: 40,
|
|
19877
|
+
textAlignVertical: "top"
|
|
19878
|
+
},
|
|
19879
|
+
inputActions: {
|
|
19880
|
+
flexDirection: "row",
|
|
19881
|
+
justifyContent: "space-between",
|
|
19882
|
+
marginTop: 6
|
|
19883
|
+
},
|
|
19884
|
+
cancelText: {
|
|
19885
|
+
fontSize: 11,
|
|
19886
|
+
color: colors.textMuted,
|
|
19887
|
+
paddingVertical: 4,
|
|
19888
|
+
paddingHorizontal: 8
|
|
19889
|
+
},
|
|
19890
|
+
sendBtn: {
|
|
19891
|
+
paddingVertical: 4,
|
|
19892
|
+
paddingHorizontal: 14,
|
|
19893
|
+
borderRadius: 6
|
|
19894
|
+
},
|
|
19895
|
+
sendText: {
|
|
19896
|
+
fontSize: 11,
|
|
19897
|
+
fontWeight: "600",
|
|
19898
|
+
color: "#fff"
|
|
19899
|
+
},
|
|
19900
|
+
actions: {
|
|
19901
|
+
flexDirection: "row",
|
|
19902
|
+
gap: 6,
|
|
19903
|
+
padding: 8,
|
|
19904
|
+
paddingHorizontal: 10,
|
|
19905
|
+
paddingBottom: 10
|
|
19906
|
+
},
|
|
19907
|
+
feedbackBtn: {
|
|
19908
|
+
flex: 1,
|
|
19909
|
+
paddingVertical: 8,
|
|
19910
|
+
borderRadius: 8,
|
|
19911
|
+
backgroundColor: colors.blueDark,
|
|
19912
|
+
borderWidth: 1,
|
|
19913
|
+
borderColor: `${colors.blue}40`,
|
|
19914
|
+
alignItems: "center"
|
|
19915
|
+
},
|
|
19916
|
+
feedbackText: {
|
|
19917
|
+
fontSize: 11,
|
|
19918
|
+
fontWeight: "600",
|
|
19919
|
+
color: colors.blueLight
|
|
19920
|
+
},
|
|
19921
|
+
bugBtn: {
|
|
19922
|
+
flex: 1,
|
|
19923
|
+
paddingVertical: 8,
|
|
19924
|
+
borderRadius: 8,
|
|
19925
|
+
backgroundColor: colors.redDark,
|
|
19926
|
+
borderWidth: 1,
|
|
19927
|
+
borderColor: colors.red,
|
|
19928
|
+
alignItems: "center"
|
|
19929
|
+
},
|
|
19930
|
+
bugText: {
|
|
19931
|
+
fontSize: 11,
|
|
19932
|
+
fontWeight: "600",
|
|
19933
|
+
color: colors.redLight
|
|
19934
|
+
},
|
|
19935
|
+
completeBtn: {
|
|
19936
|
+
flex: 1,
|
|
19937
|
+
paddingVertical: 8,
|
|
19938
|
+
borderRadius: 8,
|
|
19939
|
+
backgroundColor: colors.greenDark,
|
|
19940
|
+
borderWidth: 1,
|
|
19941
|
+
borderColor: colors.green,
|
|
19942
|
+
alignItems: "center"
|
|
19943
|
+
},
|
|
19944
|
+
completeText: {
|
|
19945
|
+
fontSize: 11,
|
|
19946
|
+
fontWeight: "600",
|
|
19947
|
+
color: colors.greenLight
|
|
19948
|
+
}
|
|
19949
|
+
});
|
|
19950
|
+
|
|
19951
|
+
// src/BugBearButton.tsx
|
|
19952
|
+
var screenWidth3 = import_react_native24.Dimensions.get("window").width;
|
|
19953
|
+
var screenHeight3 = import_react_native24.Dimensions.get("window").height;
|
|
19954
|
+
var BOTTOM_SAFE_PADDING3 = import_react_native24.Platform.OS === "ios" ? 34 : 24;
|
|
19484
19955
|
function BugBearButton({
|
|
19485
19956
|
position = "bottom-right",
|
|
19486
19957
|
buttonStyle,
|
|
@@ -19490,20 +19961,20 @@ function BugBearButton({
|
|
|
19490
19961
|
minY = 100,
|
|
19491
19962
|
maxYOffset = 160
|
|
19492
19963
|
}) {
|
|
19493
|
-
const { shouldShowWidget, testerInfo, isLoading, unreadCount, assignments, widgetMode, widgetColorScheme } = useBugBear();
|
|
19964
|
+
const { shouldShowWidget, testerInfo, isLoading, unreadCount, assignments, widgetMode, widgetColorScheme, activeSession, startSession } = useBugBear();
|
|
19494
19965
|
const { currentScreen, canGoBack, push, pop, replace, reset } = useNavigation();
|
|
19495
|
-
const [viewMode, setViewMode] = (0,
|
|
19496
|
-
const [miniRunnerAssignmentId, setMiniRunnerAssignmentId] = (0,
|
|
19497
|
-
const panelAnim = (0,
|
|
19498
|
-
const
|
|
19966
|
+
const [viewMode, setViewMode] = (0, import_react25.useState)("closed");
|
|
19967
|
+
const [miniRunnerAssignmentId, setMiniRunnerAssignmentId] = (0, import_react25.useState)(null);
|
|
19968
|
+
const panelAnim = (0, import_react25.useRef)(new import_react_native24.Animated.Value(0)).current;
|
|
19969
|
+
const styles7 = (0, import_react25.useMemo)(() => createStyles16(), [widgetColorScheme]);
|
|
19499
19970
|
const panelVisible = viewMode === "panel";
|
|
19500
|
-
const screenCaptureRef = (0,
|
|
19971
|
+
const screenCaptureRef = (0, import_react25.useRef)(null);
|
|
19501
19972
|
const openPanel = () => {
|
|
19502
19973
|
captureAppScreen().then((uri) => {
|
|
19503
19974
|
screenCaptureRef.current = uri;
|
|
19504
19975
|
});
|
|
19505
19976
|
setViewMode("panel");
|
|
19506
|
-
|
|
19977
|
+
import_react_native24.Animated.spring(panelAnim, {
|
|
19507
19978
|
toValue: 1,
|
|
19508
19979
|
useNativeDriver: true,
|
|
19509
19980
|
friction: 8,
|
|
@@ -19511,8 +19982,8 @@ function BugBearButton({
|
|
|
19511
19982
|
}).start();
|
|
19512
19983
|
};
|
|
19513
19984
|
const closePanel = () => {
|
|
19514
|
-
|
|
19515
|
-
|
|
19985
|
+
import_react_native24.Keyboard.dismiss();
|
|
19986
|
+
import_react_native24.Animated.timing(panelAnim, {
|
|
19516
19987
|
toValue: 0,
|
|
19517
19988
|
duration: 250,
|
|
19518
19989
|
useNativeDriver: true
|
|
@@ -19520,28 +19991,29 @@ function BugBearButton({
|
|
|
19520
19991
|
setViewMode("closed");
|
|
19521
19992
|
});
|
|
19522
19993
|
};
|
|
19994
|
+
const buttonSize = 56;
|
|
19995
|
+
const margin = 16;
|
|
19996
|
+
const safeMaxY = screenHeight3 - maxYOffset - BOTTOM_SAFE_PADDING3;
|
|
19523
19997
|
const getInitialPosition = () => {
|
|
19524
|
-
const buttonSize = 56;
|
|
19525
|
-
const margin = 16;
|
|
19526
19998
|
if (initialX !== void 0 && initialY !== void 0) {
|
|
19527
19999
|
return { x: initialX, y: initialY };
|
|
19528
20000
|
}
|
|
19529
|
-
const x = position === "bottom-right" ?
|
|
19530
|
-
const y =
|
|
20001
|
+
const x = position === "bottom-right" ? screenWidth3 - buttonSize - margin : margin;
|
|
20002
|
+
const y = screenHeight3 - maxYOffset - BOTTOM_SAFE_PADDING3;
|
|
19531
20003
|
return { x, y };
|
|
19532
20004
|
};
|
|
19533
20005
|
const initialPos = getInitialPosition();
|
|
19534
|
-
const pan = (0,
|
|
19535
|
-
const isDragging = (0,
|
|
19536
|
-
const panResponder = (0,
|
|
19537
|
-
|
|
20006
|
+
const pan = (0, import_react25.useRef)(new import_react_native24.Animated.ValueXY(initialPos)).current;
|
|
20007
|
+
const isDragging = (0, import_react25.useRef)(false);
|
|
20008
|
+
const panResponder = (0, import_react25.useRef)(
|
|
20009
|
+
import_react_native24.PanResponder.create({
|
|
19538
20010
|
onStartShouldSetPanResponder: () => draggable,
|
|
19539
20011
|
onMoveShouldSetPanResponder: (_, gs) => draggable && (Math.abs(gs.dx) > 5 || Math.abs(gs.dy) > 5),
|
|
19540
20012
|
onPanResponderGrant: () => {
|
|
19541
20013
|
isDragging.current = false;
|
|
19542
20014
|
pan.setOffset({
|
|
19543
|
-
x: getAnimatedValue(pan.x),
|
|
19544
|
-
y: getAnimatedValue(pan.y)
|
|
20015
|
+
x: Math.max(margin, Math.min(getAnimatedValue(pan.x), screenWidth3 - buttonSize - margin)),
|
|
20016
|
+
y: Math.max(minY, Math.min(getAnimatedValue(pan.y), safeMaxY))
|
|
19545
20017
|
});
|
|
19546
20018
|
pan.setValue({ x: 0, y: 0 });
|
|
19547
20019
|
},
|
|
@@ -19549,7 +20021,7 @@ function BugBearButton({
|
|
|
19549
20021
|
if (Math.abs(gs.dx) > 5 || Math.abs(gs.dy) > 5) {
|
|
19550
20022
|
isDragging.current = true;
|
|
19551
20023
|
}
|
|
19552
|
-
|
|
20024
|
+
import_react_native24.Animated.event(
|
|
19553
20025
|
[null, { dx: pan.x, dy: pan.y }],
|
|
19554
20026
|
{ useNativeDriver: false }
|
|
19555
20027
|
)(_, gs);
|
|
@@ -19558,11 +20030,9 @@ function BugBearButton({
|
|
|
19558
20030
|
pan.flattenOffset();
|
|
19559
20031
|
const currentX = getAnimatedValue(pan.x);
|
|
19560
20032
|
const currentY = getAnimatedValue(pan.y);
|
|
19561
|
-
const
|
|
19562
|
-
const
|
|
19563
|
-
|
|
19564
|
-
const snapY = Math.max(minY, Math.min(currentY, screenHeight2 - maxYOffset));
|
|
19565
|
-
import_react_native23.Animated.spring(pan, {
|
|
20033
|
+
const snapX = currentX < screenWidth3 / 2 ? margin : screenWidth3 - buttonSize - margin;
|
|
20034
|
+
const snapY = Math.max(minY, Math.min(currentY, safeMaxY));
|
|
20035
|
+
import_react_native24.Animated.spring(pan, {
|
|
19566
20036
|
toValue: { x: snapX, y: snapY },
|
|
19567
20037
|
useNativeDriver: false,
|
|
19568
20038
|
friction: 7,
|
|
@@ -19577,11 +20047,11 @@ function BugBearButton({
|
|
|
19577
20047
|
).current;
|
|
19578
20048
|
const pendingTests = widgetMode === "qa" ? assignments.filter((a) => a.status === "pending" || a.status === "in_progress").length : 0;
|
|
19579
20049
|
const badgeCount = pendingTests + unreadCount;
|
|
19580
|
-
(0,
|
|
19581
|
-
if (!panelVisible ||
|
|
19582
|
-
const handler =
|
|
20050
|
+
(0, import_react25.useEffect)(() => {
|
|
20051
|
+
if (!panelVisible || import_react_native24.Platform.OS !== "android") return;
|
|
20052
|
+
const handler = import_react_native24.BackHandler.addEventListener("hardwareBackPress", () => {
|
|
19583
20053
|
if (canGoBack) {
|
|
19584
|
-
|
|
20054
|
+
import_react_native24.Keyboard.dismiss();
|
|
19585
20055
|
pop();
|
|
19586
20056
|
} else {
|
|
19587
20057
|
closePanel();
|
|
@@ -19590,9 +20060,9 @@ function BugBearButton({
|
|
|
19590
20060
|
});
|
|
19591
20061
|
return () => handler.remove();
|
|
19592
20062
|
}, [panelVisible, canGoBack]);
|
|
19593
|
-
const startMiniRunner = (0,
|
|
19594
|
-
|
|
19595
|
-
|
|
20063
|
+
const startMiniRunner = (0, import_react25.useCallback)((assignId) => {
|
|
20064
|
+
import_react_native24.Keyboard.dismiss();
|
|
20065
|
+
import_react_native24.Animated.timing(panelAnim, {
|
|
19596
20066
|
toValue: 0,
|
|
19597
20067
|
duration: 200,
|
|
19598
20068
|
useNativeDriver: true
|
|
@@ -19601,40 +20071,83 @@ function BugBearButton({
|
|
|
19601
20071
|
setViewMode("mini-runner");
|
|
19602
20072
|
});
|
|
19603
20073
|
}, [panelAnim]);
|
|
19604
|
-
const expandFromMiniRunner = (0,
|
|
20074
|
+
const expandFromMiniRunner = (0, import_react25.useCallback)(() => {
|
|
19605
20075
|
setViewMode("panel");
|
|
19606
20076
|
if (miniRunnerAssignmentId) {
|
|
19607
20077
|
replace({ name: "TEST_DETAIL", testId: miniRunnerAssignmentId });
|
|
19608
20078
|
}
|
|
19609
20079
|
setMiniRunnerAssignmentId(null);
|
|
19610
|
-
|
|
20080
|
+
import_react_native24.Animated.spring(panelAnim, {
|
|
19611
20081
|
toValue: 1,
|
|
19612
20082
|
useNativeDriver: true,
|
|
19613
20083
|
friction: 8,
|
|
19614
20084
|
tension: 65
|
|
19615
20085
|
}).start();
|
|
19616
20086
|
}, [miniRunnerAssignmentId, replace, panelAnim]);
|
|
19617
|
-
const handleMiniRunnerAdvance = (0,
|
|
20087
|
+
const handleMiniRunnerAdvance = (0, import_react25.useCallback)((nextId) => {
|
|
19618
20088
|
setMiniRunnerAssignmentId(nextId);
|
|
19619
20089
|
}, []);
|
|
19620
|
-
const handleMiniRunnerComplete = (0,
|
|
20090
|
+
const handleMiniRunnerComplete = (0, import_react25.useCallback)(() => {
|
|
19621
20091
|
setMiniRunnerAssignmentId(null);
|
|
19622
20092
|
setViewMode("closed");
|
|
19623
20093
|
}, []);
|
|
19624
|
-
const handleMiniRunnerReport = (0,
|
|
20094
|
+
const handleMiniRunnerReport = (0, import_react25.useCallback)((assignId, testCaseId) => {
|
|
19625
20095
|
setMiniRunnerAssignmentId(null);
|
|
19626
20096
|
setViewMode("panel");
|
|
19627
20097
|
replace({
|
|
19628
20098
|
name: "REPORT",
|
|
19629
20099
|
prefill: { type: "test_fail", assignmentId: assignId, testCaseId }
|
|
19630
20100
|
});
|
|
19631
|
-
|
|
20101
|
+
import_react_native24.Animated.spring(panelAnim, {
|
|
20102
|
+
toValue: 1,
|
|
20103
|
+
useNativeDriver: true,
|
|
20104
|
+
friction: 8,
|
|
20105
|
+
tension: 65
|
|
20106
|
+
}).start();
|
|
20107
|
+
}, [replace, panelAnim]);
|
|
20108
|
+
const startAdHoc = (0, import_react25.useCallback)(async (taskId, focusArea) => {
|
|
20109
|
+
import_react_native24.Keyboard.dismiss();
|
|
20110
|
+
const result = await startSession({
|
|
20111
|
+
sessionType: "ad_hoc",
|
|
20112
|
+
taskId,
|
|
20113
|
+
focusArea,
|
|
20114
|
+
platform: "ios"
|
|
20115
|
+
});
|
|
20116
|
+
if (result.success) {
|
|
20117
|
+
import_react_native24.Animated.timing(panelAnim, {
|
|
20118
|
+
toValue: 0,
|
|
20119
|
+
duration: 200,
|
|
20120
|
+
useNativeDriver: true
|
|
20121
|
+
}).start(() => {
|
|
20122
|
+
setViewMode("ad-hoc");
|
|
20123
|
+
});
|
|
20124
|
+
}
|
|
20125
|
+
}, [startSession, panelAnim]);
|
|
20126
|
+
const expandFromAdHoc = (0, import_react25.useCallback)(() => {
|
|
20127
|
+
setViewMode("panel");
|
|
20128
|
+
replace({ name: "SESSION_ACTIVE" });
|
|
20129
|
+
import_react_native24.Animated.spring(panelAnim, {
|
|
19632
20130
|
toValue: 1,
|
|
19633
20131
|
useNativeDriver: true,
|
|
19634
20132
|
friction: 8,
|
|
19635
20133
|
tension: 65
|
|
19636
20134
|
}).start();
|
|
19637
20135
|
}, [replace, panelAnim]);
|
|
20136
|
+
const handleAdHocComplete = (0, import_react25.useCallback)(() => {
|
|
20137
|
+
setViewMode("closed");
|
|
20138
|
+
}, []);
|
|
20139
|
+
const minimizeToAdHoc = (0, import_react25.useCallback)(() => {
|
|
20140
|
+
if (activeSession?.sessionType === "ad_hoc") {
|
|
20141
|
+
import_react_native24.Keyboard.dismiss();
|
|
20142
|
+
import_react_native24.Animated.timing(panelAnim, {
|
|
20143
|
+
toValue: 0,
|
|
20144
|
+
duration: 200,
|
|
20145
|
+
useNativeDriver: true
|
|
20146
|
+
}).start(() => {
|
|
20147
|
+
setViewMode("ad-hoc");
|
|
20148
|
+
});
|
|
20149
|
+
}
|
|
20150
|
+
}, [activeSession, panelAnim]);
|
|
19638
20151
|
if (!shouldShowWidget) return null;
|
|
19639
20152
|
const getHeaderTitle = () => {
|
|
19640
20153
|
switch (currentScreen.name) {
|
|
@@ -19677,41 +20190,43 @@ function BugBearButton({
|
|
|
19677
20190
|
};
|
|
19678
20191
|
const nav = {
|
|
19679
20192
|
push: (screen) => {
|
|
19680
|
-
|
|
20193
|
+
import_react_native24.Keyboard.dismiss();
|
|
19681
20194
|
push(screen);
|
|
19682
20195
|
},
|
|
19683
20196
|
pop: () => {
|
|
19684
|
-
|
|
20197
|
+
import_react_native24.Keyboard.dismiss();
|
|
19685
20198
|
pop();
|
|
19686
20199
|
},
|
|
19687
20200
|
replace: (screen) => {
|
|
19688
|
-
|
|
20201
|
+
import_react_native24.Keyboard.dismiss();
|
|
19689
20202
|
replace(screen);
|
|
19690
20203
|
},
|
|
19691
20204
|
reset: () => {
|
|
19692
|
-
|
|
20205
|
+
import_react_native24.Keyboard.dismiss();
|
|
19693
20206
|
reset();
|
|
19694
20207
|
},
|
|
19695
20208
|
canGoBack,
|
|
19696
20209
|
closeWidget: handleClose,
|
|
19697
|
-
startMiniRunner
|
|
20210
|
+
startMiniRunner,
|
|
20211
|
+
startAdHoc,
|
|
20212
|
+
minimizeToAdHoc: activeSession?.sessionType === "ad_hoc" ? minimizeToAdHoc : void 0
|
|
19698
20213
|
};
|
|
19699
20214
|
const QA_ONLY_SCREENS = ["TEST_DETAIL", "TEST_LIST", "TEST_FEEDBACK", "SESSION_START", "SESSION_ACTIVE", "SESSION_FINDING"];
|
|
19700
20215
|
const renderScreen = () => {
|
|
19701
20216
|
if (widgetMode === "feedback" && QA_ONLY_SCREENS.includes(currentScreen.name)) {
|
|
19702
|
-
return /* @__PURE__ */
|
|
20217
|
+
return /* @__PURE__ */ import_react25.default.createElement(HomeScreen, { nav });
|
|
19703
20218
|
}
|
|
19704
20219
|
switch (currentScreen.name) {
|
|
19705
20220
|
case "HOME":
|
|
19706
|
-
return /* @__PURE__ */
|
|
20221
|
+
return /* @__PURE__ */ import_react25.default.createElement(HomeScreen, { nav });
|
|
19707
20222
|
case "TEST_DETAIL":
|
|
19708
|
-
return /* @__PURE__ */
|
|
20223
|
+
return /* @__PURE__ */ import_react25.default.createElement(TestDetailScreen, { testId: currentScreen.testId, nav });
|
|
19709
20224
|
case "TEST_LIST":
|
|
19710
|
-
return /* @__PURE__ */
|
|
20225
|
+
return /* @__PURE__ */ import_react25.default.createElement(TestListScreen, { nav });
|
|
19711
20226
|
case "TEST_FEEDBACK":
|
|
19712
|
-
return /* @__PURE__ */
|
|
20227
|
+
return /* @__PURE__ */ import_react25.default.createElement(TestFeedbackScreen, { status: currentScreen.status, assignmentId: currentScreen.assignmentId, nav });
|
|
19713
20228
|
case "REPORT":
|
|
19714
|
-
return /* @__PURE__ */
|
|
20229
|
+
return /* @__PURE__ */ import_react25.default.createElement(
|
|
19715
20230
|
ReportScreen,
|
|
19716
20231
|
{
|
|
19717
20232
|
nav,
|
|
@@ -19723,30 +20238,30 @@ function BugBearButton({
|
|
|
19723
20238
|
}
|
|
19724
20239
|
);
|
|
19725
20240
|
case "REPORT_SUCCESS":
|
|
19726
|
-
return /* @__PURE__ */
|
|
20241
|
+
return /* @__PURE__ */ import_react25.default.createElement(ReportSuccessScreen, { nav });
|
|
19727
20242
|
case "MESSAGE_LIST":
|
|
19728
|
-
return /* @__PURE__ */
|
|
20243
|
+
return /* @__PURE__ */ import_react25.default.createElement(MessageListScreen, { nav });
|
|
19729
20244
|
case "THREAD_DETAIL":
|
|
19730
|
-
return /* @__PURE__ */
|
|
20245
|
+
return /* @__PURE__ */ import_react25.default.createElement(ThreadDetailScreen, { thread: currentScreen.thread, nav });
|
|
19731
20246
|
case "COMPOSE_MESSAGE":
|
|
19732
|
-
return /* @__PURE__ */
|
|
20247
|
+
return /* @__PURE__ */ import_react25.default.createElement(ComposeMessageScreen, { nav });
|
|
19733
20248
|
case "ISSUE_LIST":
|
|
19734
|
-
return /* @__PURE__ */
|
|
20249
|
+
return /* @__PURE__ */ import_react25.default.createElement(IssueListScreen, { nav, category: currentScreen.category });
|
|
19735
20250
|
case "ISSUE_DETAIL":
|
|
19736
|
-
return /* @__PURE__ */
|
|
20251
|
+
return /* @__PURE__ */ import_react25.default.createElement(IssueDetailScreen, { nav, issue: currentScreen.issue });
|
|
19737
20252
|
case "PROFILE":
|
|
19738
|
-
return /* @__PURE__ */
|
|
20253
|
+
return /* @__PURE__ */ import_react25.default.createElement(ProfileScreen, { nav });
|
|
19739
20254
|
case "SESSION_START":
|
|
19740
|
-
return /* @__PURE__ */
|
|
20255
|
+
return /* @__PURE__ */ import_react25.default.createElement(SessionStartScreen, { nav });
|
|
19741
20256
|
case "SESSION_ACTIVE":
|
|
19742
|
-
return /* @__PURE__ */
|
|
20257
|
+
return /* @__PURE__ */ import_react25.default.createElement(SessionActiveScreen, { nav });
|
|
19743
20258
|
case "SESSION_FINDING":
|
|
19744
|
-
return /* @__PURE__ */
|
|
20259
|
+
return /* @__PURE__ */ import_react25.default.createElement(SessionFindingScreen, { nav });
|
|
19745
20260
|
default:
|
|
19746
|
-
return /* @__PURE__ */
|
|
20261
|
+
return /* @__PURE__ */ import_react25.default.createElement(HomeScreen, { nav });
|
|
19747
20262
|
}
|
|
19748
20263
|
};
|
|
19749
|
-
return /* @__PURE__ */
|
|
20264
|
+
return /* @__PURE__ */ import_react25.default.createElement(import_react25.default.Fragment, null, viewMode === "mini-runner" && miniRunnerAssignmentId && /* @__PURE__ */ import_react25.default.createElement(
|
|
19750
20265
|
MiniTestRunner,
|
|
19751
20266
|
{
|
|
19752
20267
|
assignmentId: miniRunnerAssignmentId,
|
|
@@ -19755,61 +20270,70 @@ function BugBearButton({
|
|
|
19755
20270
|
onComplete: handleMiniRunnerComplete,
|
|
19756
20271
|
onNavigateToReport: handleMiniRunnerReport
|
|
19757
20272
|
}
|
|
19758
|
-
), viewMode === "
|
|
19759
|
-
|
|
20273
|
+
), viewMode === "ad-hoc" && activeSession && /* @__PURE__ */ import_react25.default.createElement(
|
|
20274
|
+
AdHocOverlay,
|
|
19760
20275
|
{
|
|
19761
|
-
|
|
20276
|
+
sessionId: activeSession.id,
|
|
20277
|
+
focusArea: activeSession.focusArea,
|
|
20278
|
+
startedAt: activeSession.startedAt,
|
|
20279
|
+
onExpand: expandFromAdHoc,
|
|
20280
|
+
onComplete: handleAdHocComplete
|
|
20281
|
+
}
|
|
20282
|
+
), viewMode === "closed" && /* @__PURE__ */ import_react25.default.createElement(
|
|
20283
|
+
import_react_native24.Animated.View,
|
|
20284
|
+
{
|
|
20285
|
+
style: [styles7.fabContainer, { transform: pan.getTranslateTransform() }, buttonStyle],
|
|
19762
20286
|
...panResponder.panHandlers
|
|
19763
20287
|
},
|
|
19764
|
-
/* @__PURE__ */
|
|
19765
|
-
|
|
20288
|
+
/* @__PURE__ */ import_react25.default.createElement(
|
|
20289
|
+
import_react_native24.TouchableOpacity,
|
|
19766
20290
|
{
|
|
19767
|
-
style:
|
|
20291
|
+
style: styles7.fab,
|
|
19768
20292
|
onPress: openPanel,
|
|
19769
20293
|
activeOpacity: draggable ? 1 : 0.7
|
|
19770
20294
|
},
|
|
19771
|
-
/* @__PURE__ */
|
|
19772
|
-
badgeCount > 0 && /* @__PURE__ */
|
|
20295
|
+
/* @__PURE__ */ import_react25.default.createElement(import_react_native24.Image, { source: { uri: BUGBEAR_LOGO_BASE64 }, style: styles7.fabIcon }),
|
|
20296
|
+
badgeCount > 0 && /* @__PURE__ */ import_react25.default.createElement(import_react_native24.View, { style: styles7.badge }, /* @__PURE__ */ import_react25.default.createElement(import_react_native24.Text, { style: styles7.badgeText }, badgeCount > 9 ? "9+" : badgeCount))
|
|
19773
20297
|
)
|
|
19774
|
-
), viewMode === "panel" && /* @__PURE__ */
|
|
19775
|
-
|
|
20298
|
+
), viewMode === "panel" && /* @__PURE__ */ import_react25.default.createElement(import_react_native24.View, { style: styles7.panelWrapper, pointerEvents: "box-none" }, /* @__PURE__ */ import_react25.default.createElement(
|
|
20299
|
+
import_react_native24.KeyboardAvoidingView,
|
|
19776
20300
|
{
|
|
19777
|
-
behavior:
|
|
19778
|
-
style:
|
|
20301
|
+
behavior: import_react_native24.Platform.OS === "ios" ? "padding" : "height",
|
|
20302
|
+
style: styles7.panelKeyboardAvoid,
|
|
19779
20303
|
pointerEvents: "box-none"
|
|
19780
20304
|
},
|
|
19781
|
-
/* @__PURE__ */
|
|
19782
|
-
|
|
20305
|
+
/* @__PURE__ */ import_react25.default.createElement(
|
|
20306
|
+
import_react_native24.Animated.View,
|
|
19783
20307
|
{
|
|
19784
20308
|
style: [
|
|
19785
|
-
|
|
20309
|
+
styles7.panelContainer,
|
|
19786
20310
|
{
|
|
19787
20311
|
transform: [{
|
|
19788
20312
|
translateY: panelAnim.interpolate({
|
|
19789
20313
|
inputRange: [0, 1],
|
|
19790
|
-
outputRange: [
|
|
20314
|
+
outputRange: [screenHeight3, 0]
|
|
19791
20315
|
})
|
|
19792
20316
|
}]
|
|
19793
20317
|
}
|
|
19794
20318
|
]
|
|
19795
20319
|
},
|
|
19796
|
-
/* @__PURE__ */
|
|
19797
|
-
/* @__PURE__ */
|
|
19798
|
-
/* @__PURE__ */
|
|
19799
|
-
|
|
20320
|
+
/* @__PURE__ */ import_react25.default.createElement(import_react_native24.View, { style: styles7.panelHandle }, /* @__PURE__ */ import_react25.default.createElement(import_react_native24.View, { style: styles7.panelHandleBar })),
|
|
20321
|
+
/* @__PURE__ */ import_react25.default.createElement(import_react_native24.View, { style: styles7.header }, /* @__PURE__ */ import_react25.default.createElement(import_react_native24.View, { style: styles7.headerLeft }, canGoBack ? /* @__PURE__ */ import_react25.default.createElement(import_react_native24.TouchableOpacity, { onPress: () => nav.pop(), style: styles7.backButton }, /* @__PURE__ */ import_react25.default.createElement(import_react_native24.Text, { style: styles7.backText }, "\u2190 Back")) : /* @__PURE__ */ import_react25.default.createElement(import_react_native24.View, { style: styles7.headerTitleRow }, /* @__PURE__ */ import_react25.default.createElement(import_react_native24.Text, { style: styles7.headerTitle }, "BugBear"), testerInfo && /* @__PURE__ */ import_react25.default.createElement(import_react_native24.TouchableOpacity, { onPress: () => push({ name: "PROFILE" }) }, /* @__PURE__ */ import_react25.default.createElement(import_react_native24.Text, { style: styles7.headerName }, testerInfo.name, " \u270E")))), getHeaderTitle() ? /* @__PURE__ */ import_react25.default.createElement(import_react_native24.Text, { style: styles7.headerScreenTitle, numberOfLines: 1 }, getHeaderTitle()) : null, /* @__PURE__ */ import_react25.default.createElement(import_react_native24.View, { style: styles7.headerActions }, currentScreen.name !== "HOME" && /* @__PURE__ */ import_react25.default.createElement(import_react_native24.TouchableOpacity, { onPress: () => nav.reset(), style: styles7.homeButton }, /* @__PURE__ */ import_react25.default.createElement(import_react_native24.Text, { style: styles7.homeIcon }, "\u2302")), /* @__PURE__ */ import_react25.default.createElement(import_react_native24.TouchableOpacity, { onPress: handleClose, style: styles7.closeButton }, /* @__PURE__ */ import_react25.default.createElement(import_react_native24.Text, { style: styles7.closeText }, "\u2715")))),
|
|
20322
|
+
/* @__PURE__ */ import_react25.default.createElement(
|
|
20323
|
+
import_react_native24.ScrollView,
|
|
19800
20324
|
{
|
|
19801
|
-
style:
|
|
19802
|
-
contentContainerStyle:
|
|
20325
|
+
style: styles7.content,
|
|
20326
|
+
contentContainerStyle: styles7.contentContainer,
|
|
19803
20327
|
keyboardShouldPersistTaps: "handled",
|
|
19804
20328
|
showsVerticalScrollIndicator: false
|
|
19805
20329
|
},
|
|
19806
|
-
isLoading ? /* @__PURE__ */
|
|
20330
|
+
isLoading ? /* @__PURE__ */ import_react25.default.createElement(import_react_native24.View, { style: styles7.loadingContainer }, /* @__PURE__ */ import_react25.default.createElement(import_react_native24.ActivityIndicator, { size: "large", color: colors.blue }), /* @__PURE__ */ import_react25.default.createElement(import_react_native24.Text, { style: styles7.loadingText }, "Loading...")) : renderScreen()
|
|
19807
20331
|
)
|
|
19808
20332
|
)
|
|
19809
20333
|
)));
|
|
19810
20334
|
}
|
|
19811
20335
|
function createStyles16() {
|
|
19812
|
-
return
|
|
20336
|
+
return import_react_native24.StyleSheet.create({
|
|
19813
20337
|
// FAB
|
|
19814
20338
|
fabContainer: {
|
|
19815
20339
|
position: "absolute",
|
|
@@ -19968,7 +20492,7 @@ function createStyles16() {
|
|
|
19968
20492
|
},
|
|
19969
20493
|
contentContainer: {
|
|
19970
20494
|
padding: 16,
|
|
19971
|
-
paddingBottom:
|
|
20495
|
+
paddingBottom: import_react_native24.Platform.OS === "ios" ? 50 : 28
|
|
19972
20496
|
},
|
|
19973
20497
|
// Loading
|
|
19974
20498
|
loadingContainer: {
|
|
@@ -19984,9 +20508,9 @@ function createStyles16() {
|
|
|
19984
20508
|
}
|
|
19985
20509
|
|
|
19986
20510
|
// src/BugBearErrorBoundary.tsx
|
|
19987
|
-
var
|
|
19988
|
-
var
|
|
19989
|
-
var BugBearErrorBoundary = class extends
|
|
20511
|
+
var import_react26 = __toESM(require("react"));
|
|
20512
|
+
var import_react_native25 = require("react-native");
|
|
20513
|
+
var BugBearErrorBoundary = class extends import_react26.Component {
|
|
19990
20514
|
constructor(props) {
|
|
19991
20515
|
super(props);
|
|
19992
20516
|
this.reset = () => {
|
|
@@ -20030,7 +20554,7 @@ var BugBearErrorBoundary = class extends import_react25.Component {
|
|
|
20030
20554
|
if (fallback) {
|
|
20031
20555
|
return fallback;
|
|
20032
20556
|
}
|
|
20033
|
-
return /* @__PURE__ */
|
|
20557
|
+
return /* @__PURE__ */ import_react26.default.createElement(import_react_native25.View, { style: styles6.container }, /* @__PURE__ */ import_react26.default.createElement(import_react_native25.Text, { style: styles6.title }, "Something went wrong"), /* @__PURE__ */ import_react26.default.createElement(import_react_native25.Text, { style: styles6.message }, error.message), /* @__PURE__ */ import_react26.default.createElement(import_react_native25.TouchableOpacity, { style: styles6.button, onPress: this.reset }, /* @__PURE__ */ import_react26.default.createElement(import_react_native25.Text, { style: styles6.buttonText }, "Try Again")), /* @__PURE__ */ import_react26.default.createElement(import_react_native25.Text, { style: styles6.caption }, "The error has been captured by BugBear"));
|
|
20034
20558
|
}
|
|
20035
20559
|
return children;
|
|
20036
20560
|
}
|
|
@@ -20041,7 +20565,7 @@ function useErrorContext() {
|
|
|
20041
20565
|
getEnhancedContext: () => contextCapture.getEnhancedContext()
|
|
20042
20566
|
};
|
|
20043
20567
|
}
|
|
20044
|
-
var
|
|
20568
|
+
var styles6 = import_react_native25.StyleSheet.create({
|
|
20045
20569
|
container: {
|
|
20046
20570
|
padding: 20,
|
|
20047
20571
|
margin: 20,
|