@bbearai/react-native 0.9.3 → 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 +901 -381
- package/dist/index.mjs +916 -385
- package/package.json +2 -2
package/dist/index.mjs
CHANGED
|
@@ -14085,7 +14085,9 @@ var BugBearClient = class {
|
|
|
14085
14085
|
p_tester_id: testerInfo.id,
|
|
14086
14086
|
p_focus_area: options.focusArea || null,
|
|
14087
14087
|
p_track: options.track || null,
|
|
14088
|
-
p_platform: options.platform || null
|
|
14088
|
+
p_platform: options.platform || null,
|
|
14089
|
+
p_session_type: options.sessionType || "exploratory",
|
|
14090
|
+
p_task_id: options.taskId || null
|
|
14089
14091
|
});
|
|
14090
14092
|
if (error) {
|
|
14091
14093
|
console.error("BugBear: Failed to start session", formatPgError(error));
|
|
@@ -14269,6 +14271,45 @@ var BugBearClient = class {
|
|
|
14269
14271
|
return { success: false, error: message };
|
|
14270
14272
|
}
|
|
14271
14273
|
}
|
|
14274
|
+
// ============================================
|
|
14275
|
+
// QA Tasks (Ad Hoc Testing)
|
|
14276
|
+
// ============================================
|
|
14277
|
+
/**
|
|
14278
|
+
* Get active QA tasks for the project
|
|
14279
|
+
*/
|
|
14280
|
+
async getTasks(status = "active") {
|
|
14281
|
+
try {
|
|
14282
|
+
await this.ensureReady();
|
|
14283
|
+
const { data, error } = await this.supabase.rpc("list_qa_tasks", {
|
|
14284
|
+
p_project_id: this.config.projectId,
|
|
14285
|
+
p_status: status
|
|
14286
|
+
});
|
|
14287
|
+
if (error) {
|
|
14288
|
+
console.error("BugBear: Failed to fetch tasks", formatPgError(error));
|
|
14289
|
+
return [];
|
|
14290
|
+
}
|
|
14291
|
+
return (data || []).map((t) => this.transformTask(t));
|
|
14292
|
+
} catch (err) {
|
|
14293
|
+
console.error("BugBear: Error fetching tasks", err);
|
|
14294
|
+
return [];
|
|
14295
|
+
}
|
|
14296
|
+
}
|
|
14297
|
+
/**
|
|
14298
|
+
* Transform database task to QATask type
|
|
14299
|
+
*/
|
|
14300
|
+
transformTask(data) {
|
|
14301
|
+
return {
|
|
14302
|
+
id: data.id,
|
|
14303
|
+
projectId: data.project_id,
|
|
14304
|
+
title: data.title,
|
|
14305
|
+
description: data.description || void 0,
|
|
14306
|
+
trackId: data.track_id || void 0,
|
|
14307
|
+
priority: data.priority,
|
|
14308
|
+
status: data.status,
|
|
14309
|
+
createdAt: data.created_at,
|
|
14310
|
+
updatedAt: data.updated_at
|
|
14311
|
+
};
|
|
14312
|
+
}
|
|
14272
14313
|
/**
|
|
14273
14314
|
* Transform database session to QASession type
|
|
14274
14315
|
*/
|
|
@@ -14280,6 +14321,8 @@ var BugBearClient = class {
|
|
|
14280
14321
|
focusArea: data.focus_area,
|
|
14281
14322
|
track: data.track,
|
|
14282
14323
|
platform: data.platform,
|
|
14324
|
+
sessionType: data.session_type || "exploratory",
|
|
14325
|
+
taskId: data.task_id || void 0,
|
|
14283
14326
|
startedAt: data.started_at,
|
|
14284
14327
|
endedAt: data.ended_at,
|
|
14285
14328
|
notes: data.notes,
|
|
@@ -14861,7 +14904,13 @@ function BugBearProvider({ config, children, appVersion, enabled = true }) {
|
|
|
14861
14904
|
}, [client, activeSession]);
|
|
14862
14905
|
const addFinding = useCallback(async (options) => {
|
|
14863
14906
|
if (!client || !activeSession) return { success: false, error: "No active session" };
|
|
14864
|
-
const
|
|
14907
|
+
const enhanced = contextCapture.getEnhancedContext();
|
|
14908
|
+
const enriched = {
|
|
14909
|
+
...options,
|
|
14910
|
+
consoleLogs: options.consoleLogs ?? enhanced.consoleLogs,
|
|
14911
|
+
networkSnapshot: options.networkSnapshot ?? enhanced.networkRequests
|
|
14912
|
+
};
|
|
14913
|
+
const result = await client.addFinding(activeSession.id, enriched);
|
|
14865
14914
|
if (result.success && result.finding) {
|
|
14866
14915
|
setSessionFindings((prev) => [...prev, result.finding]);
|
|
14867
14916
|
setActiveSession((prev) => prev ? { ...prev, findingsCount: prev.findingsCount + 1 } : null);
|
|
@@ -15162,21 +15211,21 @@ function BugBearProvider({ config, children, appVersion, enabled = true }) {
|
|
|
15162
15211
|
}
|
|
15163
15212
|
|
|
15164
15213
|
// src/BugBearButton.tsx
|
|
15165
|
-
import
|
|
15214
|
+
import React23, { useState as useState20, useRef as useRef9, useEffect as useEffect14, useMemo as useMemo16, useCallback as useCallback8 } from "react";
|
|
15166
15215
|
import {
|
|
15167
|
-
View as
|
|
15168
|
-
Text as
|
|
15216
|
+
View as View23,
|
|
15217
|
+
Text as Text21,
|
|
15169
15218
|
Image as Image4,
|
|
15170
|
-
TouchableOpacity as
|
|
15219
|
+
TouchableOpacity as TouchableOpacity20,
|
|
15171
15220
|
ScrollView as ScrollView4,
|
|
15172
|
-
StyleSheet as
|
|
15173
|
-
Dimensions as
|
|
15221
|
+
StyleSheet as StyleSheet23,
|
|
15222
|
+
Dimensions as Dimensions4,
|
|
15174
15223
|
KeyboardAvoidingView,
|
|
15175
|
-
Platform as
|
|
15176
|
-
PanResponder as
|
|
15177
|
-
Animated as
|
|
15224
|
+
Platform as Platform7,
|
|
15225
|
+
PanResponder as PanResponder3,
|
|
15226
|
+
Animated as Animated5,
|
|
15178
15227
|
ActivityIndicator as ActivityIndicator3,
|
|
15179
|
-
Keyboard as
|
|
15228
|
+
Keyboard as Keyboard5,
|
|
15180
15229
|
BackHandler
|
|
15181
15230
|
} from "react-native";
|
|
15182
15231
|
|
|
@@ -15322,7 +15371,7 @@ var s = StyleSheet2.create({
|
|
|
15322
15371
|
// src/widget/screens/HomeScreen.tsx
|
|
15323
15372
|
function HomeScreen({ nav }) {
|
|
15324
15373
|
const { assignments, unreadCount, threads, refreshAssignments, refreshThreads, issueCounts, refreshIssueCounts, dashboardUrl, isLoading, activeSession, sessionFindings, refreshSession, widgetMode, widgetColorScheme } = useBugBear();
|
|
15325
|
-
const
|
|
15374
|
+
const styles7 = useMemo(() => createStyles(), [widgetColorScheme]);
|
|
15326
15375
|
const [sessionElapsed, setSessionElapsed] = useState2(0);
|
|
15327
15376
|
const timerRef = useRef3(null);
|
|
15328
15377
|
useEffect3(() => {
|
|
@@ -15351,98 +15400,98 @@ function HomeScreen({ nav }) {
|
|
|
15351
15400
|
return /* @__PURE__ */ React3.createElement(View3, null, unreadCount > 0 ? /* @__PURE__ */ React3.createElement(
|
|
15352
15401
|
TouchableOpacity,
|
|
15353
15402
|
{
|
|
15354
|
-
style: [
|
|
15403
|
+
style: [styles7.heroBanner, styles7.heroBannerMessages],
|
|
15355
15404
|
onPress: () => nav.push({ name: "MESSAGE_LIST" }),
|
|
15356
15405
|
activeOpacity: 0.8
|
|
15357
15406
|
},
|
|
15358
|
-
/* @__PURE__ */ React3.createElement(Text, { style:
|
|
15359
|
-
/* @__PURE__ */ React3.createElement(Text, { style:
|
|
15360
|
-
/* @__PURE__ */ React3.createElement(Text, { style:
|
|
15361
|
-
) : /* @__PURE__ */ React3.createElement(View3, { style: [
|
|
15407
|
+
/* @__PURE__ */ React3.createElement(Text, { style: styles7.heroCount }, unreadCount),
|
|
15408
|
+
/* @__PURE__ */ React3.createElement(Text, { style: styles7.heroLabel }, "unread message", unreadCount !== 1 ? "s" : ""),
|
|
15409
|
+
/* @__PURE__ */ React3.createElement(Text, { style: styles7.heroAction }, "View Messages \u2192")
|
|
15410
|
+
) : /* @__PURE__ */ React3.createElement(View3, { style: [styles7.heroBanner, styles7.heroBannerClear] }, /* @__PURE__ */ React3.createElement(Text, { style: styles7.heroClearEmoji }, "\u{1F4AC}"), /* @__PURE__ */ React3.createElement(Text, { style: styles7.heroClearTitle }, "Help us improve"), /* @__PURE__ */ React3.createElement(Text, { style: styles7.heroClearSub }, "Report bugs, share ideas, and track your submissions")), /* @__PURE__ */ React3.createElement(View3, { style: styles7.actionGrid }, /* @__PURE__ */ React3.createElement(
|
|
15362
15411
|
TouchableOpacity,
|
|
15363
15412
|
{
|
|
15364
|
-
style:
|
|
15413
|
+
style: styles7.actionCard,
|
|
15365
15414
|
onPress: () => nav.push({ name: "REPORT", prefill: { type: "bug" } }),
|
|
15366
15415
|
activeOpacity: 0.7
|
|
15367
15416
|
},
|
|
15368
|
-
/* @__PURE__ */ React3.createElement(Text, { style:
|
|
15369
|
-
/* @__PURE__ */ React3.createElement(Text, { style:
|
|
15417
|
+
/* @__PURE__ */ React3.createElement(Text, { style: styles7.actionIcon }, "\u{1F41B}"),
|
|
15418
|
+
/* @__PURE__ */ React3.createElement(Text, { style: styles7.actionLabel }, "Report Bug")
|
|
15370
15419
|
), /* @__PURE__ */ React3.createElement(
|
|
15371
15420
|
TouchableOpacity,
|
|
15372
15421
|
{
|
|
15373
|
-
style:
|
|
15422
|
+
style: styles7.actionCard,
|
|
15374
15423
|
onPress: () => nav.push({ name: "REPORT", prefill: { type: "feedback" } }),
|
|
15375
15424
|
activeOpacity: 0.7
|
|
15376
15425
|
},
|
|
15377
|
-
/* @__PURE__ */ React3.createElement(Text, { style:
|
|
15378
|
-
/* @__PURE__ */ React3.createElement(Text, { style:
|
|
15426
|
+
/* @__PURE__ */ React3.createElement(Text, { style: styles7.actionIcon }, "\u{1F4A1}"),
|
|
15427
|
+
/* @__PURE__ */ React3.createElement(Text, { style: styles7.actionLabel }, "Share Feedback")
|
|
15379
15428
|
), /* @__PURE__ */ React3.createElement(
|
|
15380
15429
|
TouchableOpacity,
|
|
15381
15430
|
{
|
|
15382
|
-
style:
|
|
15431
|
+
style: styles7.actionCard,
|
|
15383
15432
|
onPress: () => nav.push({ name: "MESSAGE_LIST" }),
|
|
15384
15433
|
activeOpacity: 0.7
|
|
15385
15434
|
},
|
|
15386
|
-
/* @__PURE__ */ React3.createElement(Text, { style:
|
|
15387
|
-
/* @__PURE__ */ React3.createElement(Text, { style:
|
|
15388
|
-
unreadCount > 0 && /* @__PURE__ */ React3.createElement(View3, { style: [
|
|
15435
|
+
/* @__PURE__ */ React3.createElement(Text, { style: styles7.actionIcon }, "\u{1F4AC}"),
|
|
15436
|
+
/* @__PURE__ */ React3.createElement(Text, { style: styles7.actionLabel }, "Messages"),
|
|
15437
|
+
unreadCount > 0 && /* @__PURE__ */ React3.createElement(View3, { style: [styles7.actionBadge, styles7.actionBadgeMsg] }, /* @__PURE__ */ React3.createElement(Text, { style: styles7.actionBadgeText }, unreadCount))
|
|
15389
15438
|
), /* @__PURE__ */ React3.createElement(
|
|
15390
15439
|
TouchableOpacity,
|
|
15391
15440
|
{
|
|
15392
|
-
style:
|
|
15441
|
+
style: styles7.actionCard,
|
|
15393
15442
|
onPress: () => nav.push({ name: "ISSUE_LIST", category: "open" }),
|
|
15394
15443
|
activeOpacity: 0.7
|
|
15395
15444
|
},
|
|
15396
|
-
/* @__PURE__ */ React3.createElement(Text, { style:
|
|
15397
|
-
/* @__PURE__ */ React3.createElement(Text, { style:
|
|
15398
|
-
issueCounts.open > 0 && /* @__PURE__ */ React3.createElement(View3, { style: [
|
|
15399
|
-
)), /* @__PURE__ */ React3.createElement(View3, { style:
|
|
15445
|
+
/* @__PURE__ */ React3.createElement(Text, { style: styles7.actionIcon }, "\u{1F4CB}"),
|
|
15446
|
+
/* @__PURE__ */ React3.createElement(Text, { style: styles7.actionLabel }, "My Issues"),
|
|
15447
|
+
issueCounts.open > 0 && /* @__PURE__ */ React3.createElement(View3, { style: [styles7.actionBadge, styles7.actionBadgeIssue] }, /* @__PURE__ */ React3.createElement(Text, { style: styles7.actionBadgeText }, issueCounts.open))
|
|
15448
|
+
)), /* @__PURE__ */ React3.createElement(View3, { style: styles7.issueGrid }, /* @__PURE__ */ React3.createElement(
|
|
15400
15449
|
TouchableOpacity,
|
|
15401
15450
|
{
|
|
15402
|
-
style: [
|
|
15451
|
+
style: [styles7.issueCard, styles7.issueCardOpen],
|
|
15403
15452
|
onPress: () => nav.push({ name: "ISSUE_LIST", category: "open" }),
|
|
15404
15453
|
activeOpacity: 0.7
|
|
15405
15454
|
},
|
|
15406
|
-
/* @__PURE__ */ React3.createElement(Text, { style:
|
|
15407
|
-
/* @__PURE__ */ React3.createElement(Text, { style:
|
|
15455
|
+
/* @__PURE__ */ React3.createElement(Text, { style: styles7.issueCountOpen }, issueCounts.open),
|
|
15456
|
+
/* @__PURE__ */ React3.createElement(Text, { style: styles7.issueLabel }, "Open")
|
|
15408
15457
|
), /* @__PURE__ */ React3.createElement(
|
|
15409
15458
|
TouchableOpacity,
|
|
15410
15459
|
{
|
|
15411
|
-
style: [
|
|
15460
|
+
style: [styles7.issueCard, styles7.issueCardDone],
|
|
15412
15461
|
onPress: () => nav.push({ name: "ISSUE_LIST", category: "done" }),
|
|
15413
15462
|
activeOpacity: 0.7
|
|
15414
15463
|
},
|
|
15415
|
-
/* @__PURE__ */ React3.createElement(Text, { style:
|
|
15416
|
-
/* @__PURE__ */ React3.createElement(Text, { style:
|
|
15464
|
+
/* @__PURE__ */ React3.createElement(Text, { style: styles7.issueCountDone }, issueCounts.done),
|
|
15465
|
+
/* @__PURE__ */ React3.createElement(Text, { style: styles7.issueLabel }, "Done")
|
|
15417
15466
|
), /* @__PURE__ */ React3.createElement(
|
|
15418
15467
|
TouchableOpacity,
|
|
15419
15468
|
{
|
|
15420
|
-
style: [
|
|
15469
|
+
style: [styles7.issueCard, styles7.issueCardReopened],
|
|
15421
15470
|
onPress: () => nav.push({ name: "ISSUE_LIST", category: "reopened" }),
|
|
15422
15471
|
activeOpacity: 0.7
|
|
15423
15472
|
},
|
|
15424
|
-
/* @__PURE__ */ React3.createElement(Text, { style:
|
|
15425
|
-
/* @__PURE__ */ React3.createElement(Text, { style:
|
|
15473
|
+
/* @__PURE__ */ React3.createElement(Text, { style: styles7.issueCountReopened }, issueCounts.reopened),
|
|
15474
|
+
/* @__PURE__ */ React3.createElement(Text, { style: styles7.issueLabel }, "Reopened")
|
|
15426
15475
|
)), dashboardUrl && /* @__PURE__ */ React3.createElement(
|
|
15427
15476
|
TouchableOpacity,
|
|
15428
15477
|
{
|
|
15429
|
-
style:
|
|
15478
|
+
style: styles7.webAppLink,
|
|
15430
15479
|
onPress: () => Linking.openURL(dashboardUrl),
|
|
15431
15480
|
activeOpacity: 0.7
|
|
15432
15481
|
},
|
|
15433
|
-
/* @__PURE__ */ React3.createElement(Text, { style:
|
|
15434
|
-
/* @__PURE__ */ React3.createElement(View3, { style:
|
|
15435
|
-
/* @__PURE__ */ React3.createElement(Text, { style:
|
|
15482
|
+
/* @__PURE__ */ React3.createElement(Text, { style: styles7.webAppIcon }, "\u{1F310}"),
|
|
15483
|
+
/* @__PURE__ */ React3.createElement(View3, { style: styles7.webAppTextWrap }, /* @__PURE__ */ React3.createElement(Text, { style: styles7.webAppTitle }, "Open Web Dashboard"), /* @__PURE__ */ React3.createElement(Text, { style: styles7.webAppSub }, "View your submissions & updates")),
|
|
15484
|
+
/* @__PURE__ */ React3.createElement(Text, { style: styles7.webAppArrow }, "\u2192")
|
|
15436
15485
|
), /* @__PURE__ */ React3.createElement(
|
|
15437
15486
|
TouchableOpacity,
|
|
15438
15487
|
{
|
|
15439
|
-
style:
|
|
15488
|
+
style: styles7.refreshButton,
|
|
15440
15489
|
onPress: () => {
|
|
15441
15490
|
refreshThreads();
|
|
15442
15491
|
refreshIssueCounts();
|
|
15443
15492
|
}
|
|
15444
15493
|
},
|
|
15445
|
-
/* @__PURE__ */ React3.createElement(Text, { style:
|
|
15494
|
+
/* @__PURE__ */ React3.createElement(Text, { style: styles7.refreshText }, "\u21BB Refresh")
|
|
15446
15495
|
));
|
|
15447
15496
|
}
|
|
15448
15497
|
const formatTimer = (s2) => {
|
|
@@ -15459,130 +15508,140 @@ function HomeScreen({ nav }) {
|
|
|
15459
15508
|
return /* @__PURE__ */ React3.createElement(View3, null, pendingCount > 0 ? /* @__PURE__ */ React3.createElement(
|
|
15460
15509
|
TouchableOpacity,
|
|
15461
15510
|
{
|
|
15462
|
-
style: [
|
|
15511
|
+
style: [styles7.heroBanner, styles7.heroBannerTests],
|
|
15463
15512
|
onPress: () => nav.push({ name: "TEST_DETAIL" }),
|
|
15464
15513
|
activeOpacity: 0.8
|
|
15465
15514
|
},
|
|
15466
|
-
/* @__PURE__ */ React3.createElement(Text, { style:
|
|
15467
|
-
/* @__PURE__ */ React3.createElement(Text, { style:
|
|
15468
|
-
retestCount > 0 && /* @__PURE__ */ React3.createElement(View3, { style:
|
|
15469
|
-
/* @__PURE__ */ React3.createElement(Text, { style:
|
|
15515
|
+
/* @__PURE__ */ React3.createElement(Text, { style: styles7.heroCount }, pendingCount),
|
|
15516
|
+
/* @__PURE__ */ React3.createElement(Text, { style: styles7.heroLabel }, "test", pendingCount !== 1 ? "s" : "", " waiting"),
|
|
15517
|
+
retestCount > 0 && /* @__PURE__ */ React3.createElement(View3, { style: styles7.retestPill }, /* @__PURE__ */ React3.createElement(Text, { style: styles7.retestPillText }, "\u{1F504} ", retestCount, " retest", retestCount !== 1 ? "s" : "")),
|
|
15518
|
+
/* @__PURE__ */ React3.createElement(Text, { style: styles7.heroAction }, "Start Testing \u2192")
|
|
15470
15519
|
) : unreadCount > 0 ? /* @__PURE__ */ React3.createElement(
|
|
15471
15520
|
TouchableOpacity,
|
|
15472
15521
|
{
|
|
15473
|
-
style: [
|
|
15522
|
+
style: [styles7.heroBanner, styles7.heroBannerMessages],
|
|
15474
15523
|
onPress: () => nav.push({ name: "MESSAGE_LIST" }),
|
|
15475
15524
|
activeOpacity: 0.8
|
|
15476
15525
|
},
|
|
15477
|
-
/* @__PURE__ */ React3.createElement(Text, { style:
|
|
15478
|
-
/* @__PURE__ */ React3.createElement(Text, { style:
|
|
15479
|
-
/* @__PURE__ */ React3.createElement(Text, { style:
|
|
15480
|
-
) : /* @__PURE__ */ React3.createElement(View3, { style: [
|
|
15526
|
+
/* @__PURE__ */ React3.createElement(Text, { style: styles7.heroCount }, unreadCount),
|
|
15527
|
+
/* @__PURE__ */ React3.createElement(Text, { style: styles7.heroLabel }, "unread message", unreadCount !== 1 ? "s" : ""),
|
|
15528
|
+
/* @__PURE__ */ React3.createElement(Text, { style: styles7.heroAction }, "View Messages \u2192")
|
|
15529
|
+
) : /* @__PURE__ */ React3.createElement(View3, { style: [styles7.heroBanner, styles7.heroBannerClear] }, /* @__PURE__ */ React3.createElement(Text, { style: styles7.heroClearEmoji }, "\u2705"), /* @__PURE__ */ React3.createElement(Text, { style: styles7.heroClearTitle }, "All caught up!"), totalTests > 0 && /* @__PURE__ */ React3.createElement(Text, { style: styles7.heroClearSub }, completedCount, "/", totalTests, " tests completed")), activeSession && activeSession.status === "active" ? /* @__PURE__ */ React3.createElement(
|
|
15481
15530
|
TouchableOpacity,
|
|
15482
15531
|
{
|
|
15483
|
-
style:
|
|
15532
|
+
style: styles7.sessionCardActive,
|
|
15484
15533
|
onPress: () => nav.push({ name: "SESSION_ACTIVE" }),
|
|
15485
15534
|
activeOpacity: 0.8
|
|
15486
15535
|
},
|
|
15487
|
-
/* @__PURE__ */ React3.createElement(View3, { style:
|
|
15488
|
-
/* @__PURE__ */ React3.createElement(View3, { style:
|
|
15489
|
-
/* @__PURE__ */ React3.createElement(Text, { style:
|
|
15536
|
+
/* @__PURE__ */ React3.createElement(View3, { style: styles7.sessionDot }),
|
|
15537
|
+
/* @__PURE__ */ React3.createElement(View3, { style: styles7.sessionCardContent }, /* @__PURE__ */ React3.createElement(Text, { style: styles7.sessionCardTitle, numberOfLines: 1 }, activeSession.focusArea || "QA Session"), /* @__PURE__ */ React3.createElement(Text, { style: styles7.sessionCardMeta }, formatTimer(sessionElapsed), " \xB7 ", sessionFindings.length, " finding", sessionFindings.length !== 1 ? "s" : "")),
|
|
15538
|
+
/* @__PURE__ */ React3.createElement(Text, { style: styles7.sessionCardAction }, "Resume \u2192")
|
|
15490
15539
|
) : /* @__PURE__ */ React3.createElement(
|
|
15491
15540
|
TouchableOpacity,
|
|
15492
15541
|
{
|
|
15493
|
-
style:
|
|
15542
|
+
style: styles7.sessionCardInactive,
|
|
15494
15543
|
onPress: () => nav.push({ name: "SESSION_START" }),
|
|
15495
15544
|
activeOpacity: 0.7
|
|
15496
15545
|
},
|
|
15497
|
-
/* @__PURE__ */ React3.createElement(Text, { style:
|
|
15498
|
-
/* @__PURE__ */ React3.createElement(Text, { style:
|
|
15499
|
-
/* @__PURE__ */ React3.createElement(Text, { style:
|
|
15500
|
-
),
|
|
15546
|
+
/* @__PURE__ */ React3.createElement(Text, { style: styles7.sessionCardIcon }, "\u{1F50D}"),
|
|
15547
|
+
/* @__PURE__ */ React3.createElement(Text, { style: styles7.sessionCardLabel }, "Start QA Session"),
|
|
15548
|
+
/* @__PURE__ */ React3.createElement(Text, { style: styles7.sessionCardArrow }, "\u2192")
|
|
15549
|
+
), !activeSession && nav.startAdHoc && /* @__PURE__ */ React3.createElement(
|
|
15550
|
+
TouchableOpacity,
|
|
15551
|
+
{
|
|
15552
|
+
style: styles7.quickTestCard,
|
|
15553
|
+
onPress: () => nav.startAdHoc?.(),
|
|
15554
|
+
activeOpacity: 0.7
|
|
15555
|
+
},
|
|
15556
|
+
/* @__PURE__ */ React3.createElement(Text, { style: styles7.quickTestIcon }, "\u26A1"),
|
|
15557
|
+
/* @__PURE__ */ React3.createElement(View3, { style: styles7.quickTestContent }, /* @__PURE__ */ React3.createElement(Text, { style: styles7.quickTestTitle }, "Quick Test"), /* @__PURE__ */ React3.createElement(Text, { style: styles7.quickTestSub }, "Ad hoc explore & report")),
|
|
15558
|
+
/* @__PURE__ */ React3.createElement(Text, { style: styles7.sessionCardArrow }, "\u2192")
|
|
15559
|
+
), /* @__PURE__ */ React3.createElement(View3, { style: styles7.actionGrid }, /* @__PURE__ */ React3.createElement(
|
|
15501
15560
|
TouchableOpacity,
|
|
15502
15561
|
{
|
|
15503
|
-
style:
|
|
15562
|
+
style: styles7.actionCard,
|
|
15504
15563
|
onPress: () => nav.push({ name: "TEST_LIST" }),
|
|
15505
15564
|
activeOpacity: 0.7
|
|
15506
15565
|
},
|
|
15507
|
-
/* @__PURE__ */ React3.createElement(Text, { style:
|
|
15508
|
-
/* @__PURE__ */ React3.createElement(Text, { style:
|
|
15509
|
-
pendingCount > 0 && /* @__PURE__ */ React3.createElement(View3, { style:
|
|
15566
|
+
/* @__PURE__ */ React3.createElement(Text, { style: styles7.actionIcon }, "\u2705"),
|
|
15567
|
+
/* @__PURE__ */ React3.createElement(Text, { style: styles7.actionLabel }, "Tests"),
|
|
15568
|
+
pendingCount > 0 && /* @__PURE__ */ React3.createElement(View3, { style: styles7.actionBadge }, /* @__PURE__ */ React3.createElement(Text, { style: styles7.actionBadgeText }, pendingCount))
|
|
15510
15569
|
), /* @__PURE__ */ React3.createElement(
|
|
15511
15570
|
TouchableOpacity,
|
|
15512
15571
|
{
|
|
15513
|
-
style:
|
|
15572
|
+
style: styles7.actionCard,
|
|
15514
15573
|
onPress: () => nav.push({ name: "REPORT", prefill: { type: "bug" } }),
|
|
15515
15574
|
activeOpacity: 0.7
|
|
15516
15575
|
},
|
|
15517
|
-
/* @__PURE__ */ React3.createElement(Text, { style:
|
|
15518
|
-
/* @__PURE__ */ React3.createElement(Text, { style:
|
|
15576
|
+
/* @__PURE__ */ React3.createElement(Text, { style: styles7.actionIcon }, "\u{1F41B}"),
|
|
15577
|
+
/* @__PURE__ */ React3.createElement(Text, { style: styles7.actionLabel }, "Report Bug")
|
|
15519
15578
|
), /* @__PURE__ */ React3.createElement(
|
|
15520
15579
|
TouchableOpacity,
|
|
15521
15580
|
{
|
|
15522
|
-
style:
|
|
15581
|
+
style: styles7.actionCard,
|
|
15523
15582
|
onPress: () => nav.push({ name: "REPORT", prefill: { type: "feedback" } }),
|
|
15524
15583
|
activeOpacity: 0.7
|
|
15525
15584
|
},
|
|
15526
|
-
/* @__PURE__ */ React3.createElement(Text, { style:
|
|
15527
|
-
/* @__PURE__ */ React3.createElement(Text, { style:
|
|
15585
|
+
/* @__PURE__ */ React3.createElement(Text, { style: styles7.actionIcon }, "\u{1F4A1}"),
|
|
15586
|
+
/* @__PURE__ */ React3.createElement(Text, { style: styles7.actionLabel }, "Feedback")
|
|
15528
15587
|
), /* @__PURE__ */ React3.createElement(
|
|
15529
15588
|
TouchableOpacity,
|
|
15530
15589
|
{
|
|
15531
|
-
style:
|
|
15590
|
+
style: styles7.actionCard,
|
|
15532
15591
|
onPress: () => nav.push({ name: "MESSAGE_LIST" }),
|
|
15533
15592
|
activeOpacity: 0.7
|
|
15534
15593
|
},
|
|
15535
|
-
/* @__PURE__ */ React3.createElement(Text, { style:
|
|
15536
|
-
/* @__PURE__ */ React3.createElement(Text, { style:
|
|
15537
|
-
unreadCount > 0 && /* @__PURE__ */ React3.createElement(View3, { style: [
|
|
15538
|
-
)), /* @__PURE__ */ React3.createElement(View3, { style:
|
|
15594
|
+
/* @__PURE__ */ React3.createElement(Text, { style: styles7.actionIcon }, "\u{1F4AC}"),
|
|
15595
|
+
/* @__PURE__ */ React3.createElement(Text, { style: styles7.actionLabel }, "Messages"),
|
|
15596
|
+
unreadCount > 0 && /* @__PURE__ */ React3.createElement(View3, { style: [styles7.actionBadge, styles7.actionBadgeMsg] }, /* @__PURE__ */ React3.createElement(Text, { style: styles7.actionBadgeText }, unreadCount))
|
|
15597
|
+
)), /* @__PURE__ */ React3.createElement(View3, { style: styles7.issueGrid }, /* @__PURE__ */ React3.createElement(
|
|
15539
15598
|
TouchableOpacity,
|
|
15540
15599
|
{
|
|
15541
|
-
style: [
|
|
15600
|
+
style: [styles7.issueCard, styles7.issueCardOpen],
|
|
15542
15601
|
onPress: () => nav.push({ name: "ISSUE_LIST", category: "open" }),
|
|
15543
15602
|
activeOpacity: 0.7
|
|
15544
15603
|
},
|
|
15545
|
-
/* @__PURE__ */ React3.createElement(Text, { style:
|
|
15546
|
-
/* @__PURE__ */ React3.createElement(Text, { style:
|
|
15604
|
+
/* @__PURE__ */ React3.createElement(Text, { style: styles7.issueCountOpen }, issueCounts.open),
|
|
15605
|
+
/* @__PURE__ */ React3.createElement(Text, { style: styles7.issueLabel }, "Open")
|
|
15547
15606
|
), /* @__PURE__ */ React3.createElement(
|
|
15548
15607
|
TouchableOpacity,
|
|
15549
15608
|
{
|
|
15550
|
-
style: [
|
|
15609
|
+
style: [styles7.issueCard, styles7.issueCardDone],
|
|
15551
15610
|
onPress: () => nav.push({ name: "ISSUE_LIST", category: "done" }),
|
|
15552
15611
|
activeOpacity: 0.7
|
|
15553
15612
|
},
|
|
15554
|
-
/* @__PURE__ */ React3.createElement(Text, { style:
|
|
15555
|
-
/* @__PURE__ */ React3.createElement(Text, { style:
|
|
15613
|
+
/* @__PURE__ */ React3.createElement(Text, { style: styles7.issueCountDone }, issueCounts.done),
|
|
15614
|
+
/* @__PURE__ */ React3.createElement(Text, { style: styles7.issueLabel }, "Done")
|
|
15556
15615
|
), /* @__PURE__ */ React3.createElement(
|
|
15557
15616
|
TouchableOpacity,
|
|
15558
15617
|
{
|
|
15559
|
-
style: [
|
|
15618
|
+
style: [styles7.issueCard, styles7.issueCardReopened],
|
|
15560
15619
|
onPress: () => nav.push({ name: "ISSUE_LIST", category: "reopened" }),
|
|
15561
15620
|
activeOpacity: 0.7
|
|
15562
15621
|
},
|
|
15563
|
-
/* @__PURE__ */ React3.createElement(Text, { style:
|
|
15564
|
-
/* @__PURE__ */ React3.createElement(Text, { style:
|
|
15565
|
-
)), totalTests > 0 && /* @__PURE__ */ React3.createElement(View3, { style:
|
|
15622
|
+
/* @__PURE__ */ React3.createElement(Text, { style: styles7.issueCountReopened }, issueCounts.reopened),
|
|
15623
|
+
/* @__PURE__ */ React3.createElement(Text, { style: styles7.issueLabel }, "Reopened")
|
|
15624
|
+
)), totalTests > 0 && /* @__PURE__ */ React3.createElement(View3, { style: styles7.progressSection }, /* @__PURE__ */ React3.createElement(View3, { style: styles7.progressBar }, /* @__PURE__ */ React3.createElement(View3, { style: [styles7.progressFill, { width: `${Math.round(completedCount / totalTests * 100)}%` }] })), /* @__PURE__ */ React3.createElement(Text, { style: styles7.progressText }, completedCount, "/", totalTests, " tests completed")), dashboardUrl && /* @__PURE__ */ React3.createElement(
|
|
15566
15625
|
TouchableOpacity,
|
|
15567
15626
|
{
|
|
15568
|
-
style:
|
|
15627
|
+
style: styles7.webAppLink,
|
|
15569
15628
|
onPress: () => Linking.openURL(dashboardUrl),
|
|
15570
15629
|
activeOpacity: 0.7
|
|
15571
15630
|
},
|
|
15572
|
-
/* @__PURE__ */ React3.createElement(Text, { style:
|
|
15573
|
-
/* @__PURE__ */ React3.createElement(View3, { style:
|
|
15574
|
-
/* @__PURE__ */ React3.createElement(Text, { style:
|
|
15631
|
+
/* @__PURE__ */ React3.createElement(Text, { style: styles7.webAppIcon }, "\u{1F310}"),
|
|
15632
|
+
/* @__PURE__ */ React3.createElement(View3, { style: styles7.webAppTextWrap }, /* @__PURE__ */ React3.createElement(Text, { style: styles7.webAppTitle }, "Open Web Dashboard"), /* @__PURE__ */ React3.createElement(Text, { style: styles7.webAppSub }, "View analytics, history & more")),
|
|
15633
|
+
/* @__PURE__ */ React3.createElement(Text, { style: styles7.webAppArrow }, "\u2192")
|
|
15575
15634
|
), /* @__PURE__ */ React3.createElement(
|
|
15576
15635
|
TouchableOpacity,
|
|
15577
15636
|
{
|
|
15578
|
-
style:
|
|
15637
|
+
style: styles7.refreshButton,
|
|
15579
15638
|
onPress: () => {
|
|
15580
15639
|
refreshAssignments();
|
|
15581
15640
|
refreshThreads();
|
|
15582
15641
|
refreshIssueCounts();
|
|
15583
15642
|
}
|
|
15584
15643
|
},
|
|
15585
|
-
/* @__PURE__ */ React3.createElement(Text, { style:
|
|
15644
|
+
/* @__PURE__ */ React3.createElement(Text, { style: styles7.refreshText }, "\u21BB Refresh")
|
|
15586
15645
|
));
|
|
15587
15646
|
}
|
|
15588
15647
|
function createStyles() {
|
|
@@ -15871,6 +15930,35 @@ function createStyles() {
|
|
|
15871
15930
|
sessionCardArrow: {
|
|
15872
15931
|
fontSize: 13,
|
|
15873
15932
|
color: colors.textMuted
|
|
15933
|
+
},
|
|
15934
|
+
// Quick Test card
|
|
15935
|
+
quickTestCard: {
|
|
15936
|
+
flexDirection: "row",
|
|
15937
|
+
alignItems: "center",
|
|
15938
|
+
backgroundColor: colors.card,
|
|
15939
|
+
borderWidth: 1,
|
|
15940
|
+
borderColor: colors.border,
|
|
15941
|
+
borderRadius: 12,
|
|
15942
|
+
padding: 12,
|
|
15943
|
+
paddingHorizontal: 16,
|
|
15944
|
+
gap: 12,
|
|
15945
|
+
marginBottom: 16
|
|
15946
|
+
},
|
|
15947
|
+
quickTestIcon: {
|
|
15948
|
+
fontSize: 22
|
|
15949
|
+
},
|
|
15950
|
+
quickTestContent: {
|
|
15951
|
+
flex: 1
|
|
15952
|
+
},
|
|
15953
|
+
quickTestTitle: {
|
|
15954
|
+
fontSize: 14,
|
|
15955
|
+
fontWeight: "600",
|
|
15956
|
+
color: colors.textPrimary
|
|
15957
|
+
},
|
|
15958
|
+
quickTestSub: {
|
|
15959
|
+
fontSize: 12,
|
|
15960
|
+
color: colors.textMuted,
|
|
15961
|
+
marginTop: 2
|
|
15874
15962
|
}
|
|
15875
15963
|
});
|
|
15876
15964
|
}
|
|
@@ -15880,7 +15968,7 @@ import React4, { useState as useState3, useEffect as useEffect4, useCallback as
|
|
|
15880
15968
|
import { View as View4, Text as Text2, TouchableOpacity as TouchableOpacity2, StyleSheet as StyleSheet4, Modal, TextInput, Keyboard, Animated as Animated2 } from "react-native";
|
|
15881
15969
|
function TestDetailScreen({ testId, nav }) {
|
|
15882
15970
|
const { client, assignments, currentAssignment, refreshAssignments, getDeviceInfo, onNavigate, widgetColorScheme } = useBugBear();
|
|
15883
|
-
const
|
|
15971
|
+
const styles7 = useMemo2(() => createStyles2(), [widgetColorScheme]);
|
|
15884
15972
|
const displayedAssignment = testId ? assignments.find((a) => a.id === testId) || currentAssignment : currentAssignment;
|
|
15885
15973
|
const [showSteps, setShowSteps] = useState3(true);
|
|
15886
15974
|
const [showDetails, setShowDetails] = useState3(false);
|
|
@@ -16058,7 +16146,7 @@ function TestDetailScreen({ testId, nav }) {
|
|
|
16058
16146
|
const steps = testCase.steps;
|
|
16059
16147
|
const info = templateInfo[template] || templateInfo.steps;
|
|
16060
16148
|
const rubricMode = testCase.track?.rubricMode || "pass_fail";
|
|
16061
|
-
return /* @__PURE__ */ React4.createElement(View4, { style:
|
|
16149
|
+
return /* @__PURE__ */ React4.createElement(View4, { style: styles7.container }, /* @__PURE__ */ React4.createElement(View4, { style: styles7.topRow }, /* @__PURE__ */ React4.createElement(View4, { style: styles7.positionInfo }, /* @__PURE__ */ React4.createElement(Text2, { style: styles7.positionText }, "Test ", currentIndex + 1, " of ", allTests.length), displayedAssignment.status === "in_progress" && assignmentElapsedTime > 0 && /* @__PURE__ */ React4.createElement(View4, { style: styles7.timerBadge }, /* @__PURE__ */ React4.createElement(Text2, { style: styles7.timerText }, formatElapsedTime(assignmentElapsedTime)))), /* @__PURE__ */ React4.createElement(TouchableOpacity2, { onPress: () => nav.push({ name: "TEST_LIST" }) }, /* @__PURE__ */ React4.createElement(Text2, { style: styles7.viewAllLink }, "View All \u2192"))), displayedAssignment.isVerification && /* @__PURE__ */ React4.createElement(View4, { style: styles7.retestBanner }, /* @__PURE__ */ React4.createElement(Text2, { style: styles7.retestIcon }, "\u{1F504}"), /* @__PURE__ */ React4.createElement(Text2, { style: styles7.retestLabel }, "Retest"), /* @__PURE__ */ React4.createElement(Text2, { style: styles7.retestSub }, "\u2014 Verify bug fix")), /* @__PURE__ */ React4.createElement(Text2, { style: styles7.testTitle }, testCase.title), testCase.key && /* @__PURE__ */ React4.createElement(Text2, { style: styles7.testKey }, testCase.key), /* @__PURE__ */ React4.createElement(TouchableOpacity2, { onPress: () => setShowSteps(!showSteps), style: styles7.sectionHeader }, /* @__PURE__ */ React4.createElement(Text2, { style: styles7.sectionHeaderText }, showSteps ? "\u25BC" : "\u25B6", " ", info.icon, " ", template === "freeform" ? "Instructions" : `${steps.length} ${template === "checklist" ? "items" : template === "rubric" ? "criteria" : "steps"}`)), showSteps && /* @__PURE__ */ React4.createElement(View4, { style: styles7.templateContent }, template === "steps" && steps.map((step, idx) => /* @__PURE__ */ React4.createElement(View4, { key: idx, style: styles7.step }, /* @__PURE__ */ React4.createElement(View4, { style: styles7.stepNumber }, /* @__PURE__ */ React4.createElement(Text2, { style: styles7.stepNumberText }, step.stepNumber)), /* @__PURE__ */ React4.createElement(View4, { style: styles7.stepBody }, /* @__PURE__ */ React4.createElement(Text2, { style: styles7.stepAction }, step.action), step.expectedResult && /* @__PURE__ */ React4.createElement(Text2, { style: styles7.stepExpected }, "\u2192 ", step.expectedResult)))), template === "checklist" && /* @__PURE__ */ React4.createElement(React4.Fragment, null, steps.map((step, idx) => /* @__PURE__ */ React4.createElement(
|
|
16062
16150
|
TouchableOpacity2,
|
|
16063
16151
|
{
|
|
16064
16152
|
key: idx,
|
|
@@ -16068,86 +16156,86 @@ function TestDetailScreen({ testId, nav }) {
|
|
|
16068
16156
|
else next[idx] = true;
|
|
16069
16157
|
return next;
|
|
16070
16158
|
}),
|
|
16071
|
-
style: [
|
|
16159
|
+
style: [styles7.checklistItem, criteriaResults[idx] === true && styles7.checklistItemChecked]
|
|
16072
16160
|
},
|
|
16073
|
-
/* @__PURE__ */ React4.createElement(View4, { style: [
|
|
16074
|
-
/* @__PURE__ */ React4.createElement(Text2, { style: [
|
|
16075
|
-
)), Object.keys(criteriaResults).length > 0 && /* @__PURE__ */ React4.createElement(TouchableOpacity2, { onPress: () => setCriteriaResults({}), style:
|
|
16161
|
+
/* @__PURE__ */ React4.createElement(View4, { style: [styles7.checkbox, criteriaResults[idx] === true && styles7.checkboxChecked] }, criteriaResults[idx] === true && /* @__PURE__ */ React4.createElement(Text2, { style: styles7.checkmark }, "\u2713")),
|
|
16162
|
+
/* @__PURE__ */ React4.createElement(Text2, { style: [styles7.checklistText, criteriaResults[idx] === true && styles7.checklistTextDone] }, step.action)
|
|
16163
|
+
)), Object.keys(criteriaResults).length > 0 && /* @__PURE__ */ React4.createElement(TouchableOpacity2, { onPress: () => setCriteriaResults({}), style: styles7.resetRow }, /* @__PURE__ */ React4.createElement(Text2, { style: styles7.resetText }, "\u21BA Reset"))), template === "rubric" && steps.map((step, idx) => /* @__PURE__ */ React4.createElement(View4, { key: idx, style: styles7.rubricItem }, /* @__PURE__ */ React4.createElement(Text2, { style: styles7.rubricTitle }, idx + 1, ". ", step.action), step.expectedResult && /* @__PURE__ */ React4.createElement(Text2, { style: styles7.rubricExpected }, step.expectedResult), rubricMode === "pass_fail" ? /* @__PURE__ */ React4.createElement(View4, { style: styles7.passFailRow }, /* @__PURE__ */ React4.createElement(
|
|
16076
16164
|
TouchableOpacity2,
|
|
16077
16165
|
{
|
|
16078
16166
|
onPress: () => setCriteriaResults((prev) => ({ ...prev, [idx]: true })),
|
|
16079
|
-
style: [
|
|
16167
|
+
style: [styles7.pfButton, criteriaResults[idx] === true && styles7.pfButtonPass]
|
|
16080
16168
|
},
|
|
16081
|
-
/* @__PURE__ */ React4.createElement(Text2, { style: [
|
|
16169
|
+
/* @__PURE__ */ React4.createElement(Text2, { style: [styles7.pfButtonText, criteriaResults[idx] === true && styles7.pfButtonTextActive] }, "\u2713 Pass")
|
|
16082
16170
|
), /* @__PURE__ */ React4.createElement(
|
|
16083
16171
|
TouchableOpacity2,
|
|
16084
16172
|
{
|
|
16085
16173
|
onPress: () => setCriteriaResults((prev) => ({ ...prev, [idx]: false })),
|
|
16086
|
-
style: [
|
|
16174
|
+
style: [styles7.pfButton, criteriaResults[idx] === false && styles7.pfButtonFail]
|
|
16087
16175
|
},
|
|
16088
|
-
/* @__PURE__ */ React4.createElement(Text2, { style: [
|
|
16089
|
-
)) : /* @__PURE__ */ React4.createElement(View4, { style:
|
|
16176
|
+
/* @__PURE__ */ React4.createElement(Text2, { style: [styles7.pfButtonText, criteriaResults[idx] === false && styles7.pfButtonTextActive] }, "\u2717 Fail")
|
|
16177
|
+
)) : /* @__PURE__ */ React4.createElement(View4, { style: styles7.ratingRow }, [1, 2, 3, 4, 5].map((n) => /* @__PURE__ */ React4.createElement(
|
|
16090
16178
|
TouchableOpacity2,
|
|
16091
16179
|
{
|
|
16092
16180
|
key: n,
|
|
16093
16181
|
onPress: () => setCriteriaResults((prev) => ({ ...prev, [idx]: n })),
|
|
16094
|
-
style: [
|
|
16182
|
+
style: [styles7.ratingBtn, criteriaResults[idx] === n && styles7.ratingBtnActive]
|
|
16095
16183
|
},
|
|
16096
|
-
/* @__PURE__ */ React4.createElement(Text2, { style: [
|
|
16097
|
-
))))), template === "freeform" && /* @__PURE__ */ React4.createElement(View4, { style:
|
|
16184
|
+
/* @__PURE__ */ React4.createElement(Text2, { style: [styles7.ratingBtnText, criteriaResults[idx] === n && styles7.ratingBtnTextActive] }, n)
|
|
16185
|
+
))))), template === "freeform" && /* @__PURE__ */ React4.createElement(View4, { style: styles7.freeformBox }, /* @__PURE__ */ React4.createElement(Text2, { style: styles7.freeformText }, "Review the area and note:"), /* @__PURE__ */ React4.createElement(Text2, { style: styles7.freeformBullet }, "\u2022 What works well"), /* @__PURE__ */ React4.createElement(Text2, { style: styles7.freeformBullet }, "\u2022 Issues or concerns"), /* @__PURE__ */ React4.createElement(Text2, { style: styles7.freeformBullet }, "\u2022 Suggestions"))), testCase.expectedResult && /* @__PURE__ */ React4.createElement(View4, { style: styles7.expectedBox }, /* @__PURE__ */ React4.createElement(Text2, { style: styles7.expectedLabel }, "\u2705 Expected Result"), /* @__PURE__ */ React4.createElement(Text2, { style: styles7.expectedText }, testCase.expectedResult)), testCase.targetRoute && onNavigate && /* @__PURE__ */ React4.createElement(
|
|
16098
16186
|
TouchableOpacity2,
|
|
16099
16187
|
{
|
|
16100
|
-
style:
|
|
16188
|
+
style: styles7.navigateButton,
|
|
16101
16189
|
onPress: () => {
|
|
16102
16190
|
Keyboard.dismiss();
|
|
16103
16191
|
onNavigate(testCase.targetRoute);
|
|
16104
16192
|
nav.closeWidget?.();
|
|
16105
16193
|
}
|
|
16106
16194
|
},
|
|
16107
|
-
/* @__PURE__ */ React4.createElement(Text2, { style:
|
|
16108
|
-
), /* @__PURE__ */ React4.createElement(TouchableOpacity2, { onPress: () => setShowDetails(!showDetails), style:
|
|
16195
|
+
/* @__PURE__ */ React4.createElement(Text2, { style: styles7.navigateText }, "\u{1F9ED} Go to test location")
|
|
16196
|
+
), /* @__PURE__ */ React4.createElement(TouchableOpacity2, { onPress: () => setShowDetails(!showDetails), style: styles7.detailsToggle }, /* @__PURE__ */ React4.createElement(Text2, { style: styles7.detailsToggleText }, showDetails ? "\u25BC" : "\u25B6", " Details")), showDetails && /* @__PURE__ */ React4.createElement(View4, { style: styles7.detailsSection }, testCase.key && /* @__PURE__ */ React4.createElement(Text2, { style: styles7.detailMeta }, testCase.key, " \xB7 ", testCase.priority, " \xB7 ", info.name), testCase.track && /* @__PURE__ */ React4.createElement(Text2, { style: styles7.detailMeta }, testCase.track.icon, " ", testCase.track.name), testCase.description && /* @__PURE__ */ React4.createElement(Text2, { style: styles7.detailDesc }, testCase.description), testCase.group && /* @__PURE__ */ React4.createElement(View4, { style: styles7.folderProgress }, /* @__PURE__ */ React4.createElement(Text2, { style: styles7.folderName }, "\u{1F4C1} ", testCase.group.name))), displayedAssignment.status === "in_progress" && nav.startMiniRunner && /* @__PURE__ */ React4.createElement(
|
|
16109
16197
|
TouchableOpacity2,
|
|
16110
16198
|
{
|
|
16111
|
-
style:
|
|
16199
|
+
style: styles7.startTestBtn,
|
|
16112
16200
|
onPress: () => nav.startMiniRunner(displayedAssignment.id)
|
|
16113
16201
|
},
|
|
16114
|
-
/* @__PURE__ */ React4.createElement(Text2, { style:
|
|
16202
|
+
/* @__PURE__ */ React4.createElement(Text2, { style: styles7.startTestText }, "\u25B6 Start Test")
|
|
16115
16203
|
), displayedAssignment.status === "passed" || displayedAssignment.status === "failed" || displayedAssignment.status === "skipped" || displayedAssignment.status === "blocked" ? /* @__PURE__ */ React4.createElement(React4.Fragment, null, /* @__PURE__ */ React4.createElement(View4, { style: [
|
|
16116
|
-
|
|
16117
|
-
displayedAssignment.status === "passed" &&
|
|
16118
|
-
displayedAssignment.status === "failed" &&
|
|
16119
|
-
] }, /* @__PURE__ */ React4.createElement(Text2, { style:
|
|
16120
|
-
|
|
16204
|
+
styles7.completedBanner,
|
|
16205
|
+
displayedAssignment.status === "passed" && styles7.completedBannerPass,
|
|
16206
|
+
displayedAssignment.status === "failed" && styles7.completedBannerFail
|
|
16207
|
+
] }, /* @__PURE__ */ React4.createElement(Text2, { style: styles7.completedIcon }, displayedAssignment.status === "passed" ? "\u2705" : displayedAssignment.status === "failed" ? "\u274C" : displayedAssignment.status === "skipped" ? "\u23ED" : "\u{1F6AB}"), /* @__PURE__ */ React4.createElement(Text2, { style: [
|
|
16208
|
+
styles7.completedLabel,
|
|
16121
16209
|
displayedAssignment.status === "passed" && { color: colors.green },
|
|
16122
16210
|
displayedAssignment.status === "failed" && { color: colors.redLight }
|
|
16123
|
-
] }, "Marked as ", displayedAssignment.status.charAt(0).toUpperCase() + displayedAssignment.status.slice(1))), !(displayedAssignment.isVerification && (displayedAssignment.status === "passed" || displayedAssignment.status === "failed")) && /* @__PURE__ */ React4.createElement(View4, { style: [
|
|
16211
|
+
] }, "Marked as ", displayedAssignment.status.charAt(0).toUpperCase() + displayedAssignment.status.slice(1))), !(displayedAssignment.isVerification && (displayedAssignment.status === "passed" || displayedAssignment.status === "failed")) && /* @__PURE__ */ React4.createElement(View4, { style: [styles7.actionButtons, { marginTop: 4 }] }, /* @__PURE__ */ React4.createElement(
|
|
16124
16212
|
TouchableOpacity2,
|
|
16125
16213
|
{
|
|
16126
|
-
style: [
|
|
16214
|
+
style: [styles7.actionBtn, styles7.reopenBtn, isSubmitting && { opacity: 0.5 }],
|
|
16127
16215
|
onPress: handleReopen,
|
|
16128
16216
|
disabled: isSubmitting
|
|
16129
16217
|
},
|
|
16130
|
-
/* @__PURE__ */ React4.createElement(Text2, { style:
|
|
16218
|
+
/* @__PURE__ */ React4.createElement(Text2, { style: styles7.reopenBtnText }, isSubmitting ? "Reopening..." : "\u{1F504} Reopen Test")
|
|
16131
16219
|
), displayedAssignment.status === "passed" && /* @__PURE__ */ React4.createElement(
|
|
16132
16220
|
TouchableOpacity2,
|
|
16133
16221
|
{
|
|
16134
|
-
style: [
|
|
16222
|
+
style: [styles7.actionBtn, styles7.failBtn, isSubmitting && { opacity: 0.5 }],
|
|
16135
16223
|
onPress: () => handleChangeResult("failed"),
|
|
16136
16224
|
disabled: isSubmitting
|
|
16137
16225
|
},
|
|
16138
|
-
/* @__PURE__ */ React4.createElement(Text2, { style:
|
|
16226
|
+
/* @__PURE__ */ React4.createElement(Text2, { style: styles7.failBtnText }, "Change to Fail")
|
|
16139
16227
|
), displayedAssignment.status === "failed" && /* @__PURE__ */ React4.createElement(
|
|
16140
16228
|
TouchableOpacity2,
|
|
16141
16229
|
{
|
|
16142
|
-
style: [
|
|
16230
|
+
style: [styles7.actionBtn, styles7.passBtn, isSubmitting && { opacity: 0.5 }],
|
|
16143
16231
|
onPress: () => handleChangeResult("passed"),
|
|
16144
16232
|
disabled: isSubmitting
|
|
16145
16233
|
},
|
|
16146
|
-
/* @__PURE__ */ React4.createElement(Text2, { style:
|
|
16147
|
-
))) : /* @__PURE__ */ React4.createElement(View4, { style:
|
|
16234
|
+
/* @__PURE__ */ React4.createElement(Text2, { style: styles7.passBtnText }, "Change to Pass")
|
|
16235
|
+
))) : /* @__PURE__ */ React4.createElement(View4, { style: styles7.actionButtons }, /* @__PURE__ */ React4.createElement(TouchableOpacity2, { style: [styles7.actionBtn, styles7.failBtn, isSubmitting && { opacity: 0.5 }], onPress: handleFail, disabled: isSubmitting }, /* @__PURE__ */ React4.createElement(Text2, { style: styles7.failBtnText }, isSubmitting ? displayedAssignment.isVerification ? "Reporting..." : "Failing..." : displayedAssignment.isVerification ? "\u2717 Still Broken" : "Fail")), /* @__PURE__ */ React4.createElement(TouchableOpacity2, { style: [styles7.actionBtn, styles7.skipBtn, isSubmitting && { opacity: 0.5 }], onPress: () => setShowSkipModal(true), disabled: isSubmitting }, /* @__PURE__ */ React4.createElement(Text2, { style: styles7.skipBtnText }, "Skip")), /* @__PURE__ */ React4.createElement(TouchableOpacity2, { style: [styles7.actionBtn, styles7.passBtn, isSubmitting && { opacity: 0.5 }], onPress: handlePass, disabled: isSubmitting }, /* @__PURE__ */ React4.createElement(Text2, { style: styles7.passBtnText }, isSubmitting ? displayedAssignment.isVerification ? "Verifying..." : "Passing..." : displayedAssignment.isVerification ? "\u2713 Fix Verified" : "Pass"))), feedbackToastAssignmentId && /* @__PURE__ */ React4.createElement(Animated2.View, { style: [styles7.passToast, { transform: [{ translateY: toastSlideAnim }] }] }, /* @__PURE__ */ React4.createElement(View4, { style: styles7.passToastContent }, /* @__PURE__ */ React4.createElement(Text2, { style: styles7.passToastIcon }, "\u2705"), /* @__PURE__ */ React4.createElement(Text2, { style: styles7.passToastText }, "Test passed!")), /* @__PURE__ */ React4.createElement(
|
|
16148
16236
|
TouchableOpacity2,
|
|
16149
16237
|
{
|
|
16150
|
-
style:
|
|
16238
|
+
style: styles7.passToastButton,
|
|
16151
16239
|
onPress: () => {
|
|
16152
16240
|
if (toastTimerRef.current) clearTimeout(toastTimerRef.current);
|
|
16153
16241
|
const toastId = feedbackToastAssignmentId;
|
|
@@ -16155,8 +16243,8 @@ function TestDetailScreen({ testId, nav }) {
|
|
|
16155
16243
|
nav.push({ name: "TEST_FEEDBACK", status: "passed", assignmentId: toastId });
|
|
16156
16244
|
}
|
|
16157
16245
|
},
|
|
16158
|
-
/* @__PURE__ */ React4.createElement(Text2, { style:
|
|
16159
|
-
)), /* @__PURE__ */ React4.createElement(Modal, { visible: showSkipModal, transparent: true, animationType: "fade" }, /* @__PURE__ */ React4.createElement(View4, { style:
|
|
16246
|
+
/* @__PURE__ */ React4.createElement(Text2, { style: styles7.passToastButtonText }, "Rate this test")
|
|
16247
|
+
)), /* @__PURE__ */ React4.createElement(Modal, { visible: showSkipModal, transparent: true, animationType: "fade" }, /* @__PURE__ */ React4.createElement(View4, { style: styles7.modalOverlay }, /* @__PURE__ */ React4.createElement(View4, { style: styles7.modalContent }, /* @__PURE__ */ React4.createElement(Text2, { style: styles7.modalTitle }, "Skip this test?"), /* @__PURE__ */ React4.createElement(Text2, { style: styles7.modalSubtitle }, "Select a reason:"), [
|
|
16160
16248
|
{ reason: "blocked", label: "\u{1F6AB} Blocked by a bug" },
|
|
16161
16249
|
{ reason: "not_ready", label: "\u{1F6A7} Feature not ready" },
|
|
16162
16250
|
{ reason: "dependency", label: "\u{1F517} Needs another test first" },
|
|
@@ -16165,32 +16253,32 @@ function TestDetailScreen({ testId, nav }) {
|
|
|
16165
16253
|
TouchableOpacity2,
|
|
16166
16254
|
{
|
|
16167
16255
|
key: reason,
|
|
16168
|
-
style: [
|
|
16256
|
+
style: [styles7.skipOption, selectedSkipReason === reason && styles7.skipOptionActive],
|
|
16169
16257
|
onPress: () => setSelectedSkipReason(reason)
|
|
16170
16258
|
},
|
|
16171
|
-
/* @__PURE__ */ React4.createElement(Text2, { style: [
|
|
16259
|
+
/* @__PURE__ */ React4.createElement(Text2, { style: [styles7.skipOptionText, selectedSkipReason === reason && styles7.skipOptionTextActive] }, label)
|
|
16172
16260
|
)), /* @__PURE__ */ React4.createElement(
|
|
16173
16261
|
TextInput,
|
|
16174
16262
|
{
|
|
16175
|
-
style:
|
|
16263
|
+
style: styles7.skipNotes,
|
|
16176
16264
|
value: skipNotes,
|
|
16177
16265
|
onChangeText: setSkipNotes,
|
|
16178
16266
|
placeholder: "Additional notes (optional)",
|
|
16179
16267
|
placeholderTextColor: colors.textMuted,
|
|
16180
16268
|
multiline: true
|
|
16181
16269
|
}
|
|
16182
|
-
), /* @__PURE__ */ React4.createElement(View4, { style:
|
|
16270
|
+
), /* @__PURE__ */ React4.createElement(View4, { style: styles7.skipActions }, /* @__PURE__ */ React4.createElement(TouchableOpacity2, { style: styles7.skipCancel, onPress: () => {
|
|
16183
16271
|
setShowSkipModal(false);
|
|
16184
16272
|
setSelectedSkipReason(null);
|
|
16185
16273
|
setSkipNotes("");
|
|
16186
|
-
} }, /* @__PURE__ */ React4.createElement(Text2, { style:
|
|
16274
|
+
} }, /* @__PURE__ */ React4.createElement(Text2, { style: styles7.skipCancelText }, "Cancel")), /* @__PURE__ */ React4.createElement(
|
|
16187
16275
|
TouchableOpacity2,
|
|
16188
16276
|
{
|
|
16189
|
-
style: [
|
|
16277
|
+
style: [styles7.skipConfirm, !selectedSkipReason && { opacity: 0.4 }],
|
|
16190
16278
|
onPress: handleSkip,
|
|
16191
16279
|
disabled: !selectedSkipReason || skipping
|
|
16192
16280
|
},
|
|
16193
|
-
/* @__PURE__ */ React4.createElement(Text2, { style:
|
|
16281
|
+
/* @__PURE__ */ React4.createElement(Text2, { style: styles7.skipConfirmText }, skipping ? "Skipping..." : "Skip Test")
|
|
16194
16282
|
))))));
|
|
16195
16283
|
}
|
|
16196
16284
|
function createStyles2() {
|
|
@@ -16312,7 +16400,7 @@ import React5, { useState as useState4, useMemo as useMemo3, useCallback as useC
|
|
|
16312
16400
|
import { View as View5, Text as Text3, TouchableOpacity as TouchableOpacity3, StyleSheet as StyleSheet5, ScrollView, TextInput as TextInput2, Platform as Platform3, Linking as Linking2 } from "react-native";
|
|
16313
16401
|
function TestListScreen({ nav }) {
|
|
16314
16402
|
const { assignments, currentAssignment, refreshAssignments, dashboardUrl, isLoading, widgetColorScheme } = useBugBear();
|
|
16315
|
-
const
|
|
16403
|
+
const styles7 = useMemo3(() => createStyles3(), [widgetColorScheme]);
|
|
16316
16404
|
const [filter, setFilter] = useState4("all");
|
|
16317
16405
|
const [roleFilter, setRoleFilter] = useState4(null);
|
|
16318
16406
|
const [trackFilter, setTrackFilter] = useState4(null);
|
|
@@ -16404,18 +16492,18 @@ function TestListScreen({ nav }) {
|
|
|
16404
16492
|
return true;
|
|
16405
16493
|
}, [platformFilter, roleFilter, trackFilter, searchQuery, filter]);
|
|
16406
16494
|
if (isLoading) return /* @__PURE__ */ React5.createElement(TestListScreenSkeleton, null);
|
|
16407
|
-
return /* @__PURE__ */ React5.createElement(View5, null, /* @__PURE__ */ React5.createElement(View5, { style:
|
|
16495
|
+
return /* @__PURE__ */ React5.createElement(View5, null, /* @__PURE__ */ React5.createElement(View5, { style: styles7.filterBar }, [
|
|
16408
16496
|
{ key: "all", label: "All", count: assignments.length },
|
|
16409
16497
|
{ key: "todo", label: "To Do", count: assignments.filter((a) => !a.isVerification && (a.status === "pending" || a.status === "in_progress" || a.status === "failed")).length },
|
|
16410
16498
|
{ key: "retest", label: "Retest", count: assignments.filter((a) => !!a.isVerification && (a.status === "pending" || a.status === "in_progress")).length },
|
|
16411
16499
|
{ key: "done", label: "Done", count: assignments.filter((a) => a.status === "passed" || a.status === "skipped" || a.status === "blocked").length }
|
|
16412
|
-
].map((f) => /* @__PURE__ */ React5.createElement(TouchableOpacity3, { key: f.key, style: [
|
|
16500
|
+
].map((f) => /* @__PURE__ */ React5.createElement(TouchableOpacity3, { key: f.key, style: [styles7.filterBtn, filter === f.key && styles7.filterBtnActive], onPress: () => setFilter(f.key) }, /* @__PURE__ */ React5.createElement(Text3, { style: [styles7.filterBtnText, filter === f.key && styles7.filterBtnTextActive] }, f.label, " (", f.count, ")")))), availableRoles.length >= 2 && /* @__PURE__ */ React5.createElement(View5, { style: styles7.roleSection }, /* @__PURE__ */ React5.createElement(ScrollView, { horizontal: true, showsHorizontalScrollIndicator: false, style: styles7.roleBar }, /* @__PURE__ */ React5.createElement(
|
|
16413
16501
|
TouchableOpacity3,
|
|
16414
16502
|
{
|
|
16415
|
-
style: [
|
|
16503
|
+
style: [styles7.roleBtn, !roleFilter && styles7.roleBtnActive],
|
|
16416
16504
|
onPress: () => setRoleFilter(null)
|
|
16417
16505
|
},
|
|
16418
|
-
/* @__PURE__ */ React5.createElement(Text3, { style: [
|
|
16506
|
+
/* @__PURE__ */ React5.createElement(Text3, { style: [styles7.roleBtnText, !roleFilter && styles7.roleBtnTextActive] }, "All Roles")
|
|
16419
16507
|
), availableRoles.map((role) => {
|
|
16420
16508
|
const isActive = roleFilter === role.id;
|
|
16421
16509
|
return /* @__PURE__ */ React5.createElement(
|
|
@@ -16423,30 +16511,30 @@ function TestListScreen({ nav }) {
|
|
|
16423
16511
|
{
|
|
16424
16512
|
key: role.id,
|
|
16425
16513
|
style: [
|
|
16426
|
-
|
|
16514
|
+
styles7.roleBtn,
|
|
16427
16515
|
isActive && { backgroundColor: role.color + "20", borderColor: role.color + "60", borderWidth: 1 }
|
|
16428
16516
|
],
|
|
16429
16517
|
onPress: () => setRoleFilter(isActive ? null : role.id)
|
|
16430
16518
|
},
|
|
16431
|
-
/* @__PURE__ */ React5.createElement(View5, { style: [
|
|
16432
|
-
/* @__PURE__ */ React5.createElement(Text3, { style: [
|
|
16519
|
+
/* @__PURE__ */ React5.createElement(View5, { style: [styles7.roleDot, { backgroundColor: role.color }] }),
|
|
16520
|
+
/* @__PURE__ */ React5.createElement(Text3, { style: [styles7.roleBtnText, isActive && { color: role.color, fontWeight: "600" }] }, role.name)
|
|
16433
16521
|
);
|
|
16434
|
-
})), selectedRole?.loginHint && /* @__PURE__ */ React5.createElement(View5, { style: [
|
|
16522
|
+
})), selectedRole?.loginHint && /* @__PURE__ */ React5.createElement(View5, { style: [styles7.loginHint, { backgroundColor: selectedRole.color + "10", borderColor: selectedRole.color + "30" }] }, /* @__PURE__ */ React5.createElement(Text3, { style: styles7.loginHintText }, "Log in as: ", selectedRole.loginHint))), /* @__PURE__ */ React5.createElement(View5, { style: styles7.searchContainer }, /* @__PURE__ */ React5.createElement(
|
|
16435
16523
|
TextInput2,
|
|
16436
16524
|
{
|
|
16437
16525
|
value: searchQuery,
|
|
16438
16526
|
onChangeText: setSearchQuery,
|
|
16439
16527
|
placeholder: "Search tests...",
|
|
16440
16528
|
placeholderTextColor: colors.textMuted,
|
|
16441
|
-
style:
|
|
16529
|
+
style: styles7.searchInput
|
|
16442
16530
|
}
|
|
16443
|
-
)), /* @__PURE__ */ React5.createElement(ScrollView, { horizontal: true, showsHorizontalScrollIndicator: false, style:
|
|
16531
|
+
)), /* @__PURE__ */ React5.createElement(ScrollView, { horizontal: true, showsHorizontalScrollIndicator: false, style: styles7.platformBar }, /* @__PURE__ */ React5.createElement(
|
|
16444
16532
|
TouchableOpacity3,
|
|
16445
16533
|
{
|
|
16446
|
-
style: [
|
|
16534
|
+
style: [styles7.platformBtn, !platformFilter && styles7.platformBtnActive],
|
|
16447
16535
|
onPress: () => setPlatformFilter(null)
|
|
16448
16536
|
},
|
|
16449
|
-
/* @__PURE__ */ React5.createElement(Text3, { style: [
|
|
16537
|
+
/* @__PURE__ */ React5.createElement(Text3, { style: [styles7.platformBtnText, !platformFilter && styles7.platformBtnTextActive] }, "All")
|
|
16450
16538
|
), [
|
|
16451
16539
|
{ key: "web", label: "Web", icon: "\u{1F310}" },
|
|
16452
16540
|
{ key: "ios", label: "iOS", icon: "\u{1F4F1}" },
|
|
@@ -16458,32 +16546,32 @@ function TestListScreen({ nav }) {
|
|
|
16458
16546
|
{
|
|
16459
16547
|
key: p.key,
|
|
16460
16548
|
style: [
|
|
16461
|
-
|
|
16549
|
+
styles7.platformBtn,
|
|
16462
16550
|
isActive && { backgroundColor: colors.blue + "20", borderColor: colors.blue + "60", borderWidth: 1 }
|
|
16463
16551
|
],
|
|
16464
16552
|
onPress: () => setPlatformFilter(isActive ? null : p.key)
|
|
16465
16553
|
},
|
|
16466
|
-
/* @__PURE__ */ React5.createElement(Text3, { style: [
|
|
16554
|
+
/* @__PURE__ */ React5.createElement(Text3, { style: [styles7.platformBtnText, isActive && { color: colors.blue, fontWeight: "600" }] }, p.icon, " ", p.label)
|
|
16467
16555
|
);
|
|
16468
|
-
})), /* @__PURE__ */ React5.createElement(View5, { style:
|
|
16556
|
+
})), /* @__PURE__ */ React5.createElement(View5, { style: styles7.trackSortRow }, availableTracks.length >= 2 && /* @__PURE__ */ React5.createElement(ScrollView, { horizontal: true, showsHorizontalScrollIndicator: false, style: { flex: 1 } }, /* @__PURE__ */ React5.createElement(
|
|
16469
16557
|
TouchableOpacity3,
|
|
16470
16558
|
{
|
|
16471
|
-
style: [
|
|
16559
|
+
style: [styles7.trackBtn, !trackFilter && styles7.trackBtnActive],
|
|
16472
16560
|
onPress: () => setTrackFilter(null)
|
|
16473
16561
|
},
|
|
16474
|
-
/* @__PURE__ */ React5.createElement(Text3, { style: [
|
|
16562
|
+
/* @__PURE__ */ React5.createElement(Text3, { style: [styles7.trackBtnText, !trackFilter && styles7.trackBtnTextActive] }, "All Tracks")
|
|
16475
16563
|
), availableTracks.map((track) => {
|
|
16476
16564
|
const isActive = trackFilter === track.id;
|
|
16477
16565
|
return /* @__PURE__ */ React5.createElement(
|
|
16478
16566
|
TouchableOpacity3,
|
|
16479
16567
|
{
|
|
16480
16568
|
key: track.id,
|
|
16481
|
-
style: [
|
|
16569
|
+
style: [styles7.trackBtn, isActive && { backgroundColor: track.color + "20", borderColor: track.color + "60", borderWidth: 1 }],
|
|
16482
16570
|
onPress: () => setTrackFilter(isActive ? null : track.id)
|
|
16483
16571
|
},
|
|
16484
|
-
/* @__PURE__ */ React5.createElement(Text3, { style: [
|
|
16572
|
+
/* @__PURE__ */ React5.createElement(Text3, { style: [styles7.trackBtnText, isActive && { color: track.color, fontWeight: "600" }] }, track.icon, " ", track.name)
|
|
16485
16573
|
);
|
|
16486
|
-
})), /* @__PURE__ */ React5.createElement(View5, { style:
|
|
16574
|
+
})), /* @__PURE__ */ React5.createElement(View5, { style: styles7.sortGroup }, [
|
|
16487
16575
|
{ key: "priority", label: "\u2195 Priority" },
|
|
16488
16576
|
{ key: "recent", label: "\u{1F550} Recent" },
|
|
16489
16577
|
{ key: "alpha", label: "A-Z" }
|
|
@@ -16491,41 +16579,41 @@ function TestListScreen({ nav }) {
|
|
|
16491
16579
|
TouchableOpacity3,
|
|
16492
16580
|
{
|
|
16493
16581
|
key: s2.key,
|
|
16494
|
-
style: [
|
|
16582
|
+
style: [styles7.sortBtn, sortMode === s2.key && styles7.sortBtnActive],
|
|
16495
16583
|
onPress: () => setSortMode(s2.key)
|
|
16496
16584
|
},
|
|
16497
|
-
/* @__PURE__ */ React5.createElement(Text3, { style: [
|
|
16585
|
+
/* @__PURE__ */ React5.createElement(Text3, { style: [styles7.sortBtnText, sortMode === s2.key && styles7.sortBtnTextActive] }, s2.label)
|
|
16498
16586
|
)))), groupedAssignments.map((folder) => {
|
|
16499
16587
|
const folderId = folder.group?.id || "ungrouped";
|
|
16500
16588
|
const isCollapsed = collapsedFolders.has(folderId);
|
|
16501
16589
|
const filtered = folder.assignments.filter(filterAssignment);
|
|
16502
16590
|
if (filtered.length === 0 && filter !== "all") return null;
|
|
16503
|
-
return /* @__PURE__ */ React5.createElement(View5, { key: folderId, style:
|
|
16591
|
+
return /* @__PURE__ */ React5.createElement(View5, { key: folderId, style: styles7.folder }, /* @__PURE__ */ React5.createElement(TouchableOpacity3, { style: styles7.folderHeader, onPress: () => toggleFolder(folderId) }, /* @__PURE__ */ React5.createElement(Text3, { style: styles7.folderToggle }, isCollapsed ? "\u25B6" : "\u25BC"), /* @__PURE__ */ React5.createElement(Text3, { style: styles7.folderName, numberOfLines: 1 }, folder.group?.name || "Ungrouped"), /* @__PURE__ */ React5.createElement(View5, { style: styles7.folderProgress }, /* @__PURE__ */ React5.createElement(View5, { style: [styles7.folderProgressFill, { width: `${folder.stats.total > 0 ? Math.round((folder.stats.passed + folder.stats.failed) / folder.stats.total * 100) : 0}%` }] })), /* @__PURE__ */ React5.createElement(Text3, { style: styles7.folderCount }, folder.stats.passed + folder.stats.failed, "/", folder.stats.total)), !isCollapsed && filtered.map((assignment) => {
|
|
16504
16592
|
const badge = getStatusBadge(assignment.status);
|
|
16505
16593
|
const isCurrent = currentAssignment?.id === assignment.id;
|
|
16506
16594
|
return /* @__PURE__ */ React5.createElement(
|
|
16507
16595
|
TouchableOpacity3,
|
|
16508
16596
|
{
|
|
16509
16597
|
key: assignment.id,
|
|
16510
|
-
style: [
|
|
16598
|
+
style: [styles7.testItem, isCurrent && styles7.testItemCurrent],
|
|
16511
16599
|
onPress: () => nav.push({ name: "TEST_DETAIL", testId: assignment.id })
|
|
16512
16600
|
},
|
|
16513
|
-
/* @__PURE__ */ React5.createElement(Text3, { style:
|
|
16514
|
-
/* @__PURE__ */ React5.createElement(View5, { style:
|
|
16515
|
-
|
|
16601
|
+
/* @__PURE__ */ React5.createElement(Text3, { style: styles7.testBadge }, badge.icon),
|
|
16602
|
+
/* @__PURE__ */ React5.createElement(View5, { style: styles7.testInfo }, /* @__PURE__ */ React5.createElement(Text3, { style: styles7.testTitle, numberOfLines: 1 }, assignment.testCase.title), /* @__PURE__ */ React5.createElement(View5, { style: styles7.testMetaRow }, assignment.isVerification && /* @__PURE__ */ React5.createElement(View5, { style: [
|
|
16603
|
+
styles7.retestTag,
|
|
16516
16604
|
assignment.status === "passed" && { backgroundColor: colors.greenDark, borderColor: colors.greenBorder }
|
|
16517
16605
|
] }, /* @__PURE__ */ React5.createElement(Text3, { style: [
|
|
16518
|
-
|
|
16606
|
+
styles7.retestTagText,
|
|
16519
16607
|
assignment.status === "passed" && { color: colors.greenLight }
|
|
16520
|
-
] }, assignment.status === "passed" ? "Verified" : "Retest")), /* @__PURE__ */ React5.createElement(Text3, { style:
|
|
16608
|
+
] }, assignment.status === "passed" ? "Verified" : "Retest")), /* @__PURE__ */ React5.createElement(Text3, { style: styles7.testMeta }, assignment.testCase.testKey, " \xB7 ", assignment.testCase.priority), assignment.testCase.role && /* @__PURE__ */ React5.createElement(View5, { style: styles7.roleBadgeRow }, /* @__PURE__ */ React5.createElement(Text3, { style: styles7.testMeta }, " \xB7 "), /* @__PURE__ */ React5.createElement(View5, { style: [styles7.roleBadgeDot, { backgroundColor: assignment.testCase.role.color }] }), /* @__PURE__ */ React5.createElement(Text3, { style: [styles7.testMeta, { color: assignment.testCase.role.color, fontWeight: "500" }] }, assignment.testCase.role.name)))),
|
|
16521
16609
|
/* @__PURE__ */ React5.createElement(View5, { style: [
|
|
16522
|
-
|
|
16610
|
+
styles7.statusPill,
|
|
16523
16611
|
{
|
|
16524
16612
|
backgroundColor: assignment.status === "passed" ? colors.greenDark : assignment.status === "failed" ? colors.redSurface : assignment.status === "in_progress" ? colors.blueSurface : colors.card,
|
|
16525
16613
|
borderColor: assignment.status === "passed" ? colors.greenBorder : assignment.status === "failed" ? colors.redDark : assignment.status === "in_progress" ? colors.blueDark : colors.border
|
|
16526
16614
|
}
|
|
16527
16615
|
] }, /* @__PURE__ */ React5.createElement(Text3, { style: [
|
|
16528
|
-
|
|
16616
|
+
styles7.statusPillText,
|
|
16529
16617
|
{
|
|
16530
16618
|
color: assignment.status === "passed" ? colors.greenMed : assignment.status === "failed" ? colors.redMed : assignment.status === "in_progress" ? colors.blueLight : colors.zincLight
|
|
16531
16619
|
}
|
|
@@ -16535,12 +16623,12 @@ function TestListScreen({ nav }) {
|
|
|
16535
16623
|
}), dashboardUrl && /* @__PURE__ */ React5.createElement(
|
|
16536
16624
|
TouchableOpacity3,
|
|
16537
16625
|
{
|
|
16538
|
-
style:
|
|
16626
|
+
style: styles7.dashboardLink,
|
|
16539
16627
|
onPress: () => Linking2.openURL(`${dashboardUrl}/test-cases`),
|
|
16540
16628
|
activeOpacity: 0.7
|
|
16541
16629
|
},
|
|
16542
|
-
/* @__PURE__ */ React5.createElement(Text3, { style:
|
|
16543
|
-
), /* @__PURE__ */ React5.createElement(TouchableOpacity3, { style:
|
|
16630
|
+
/* @__PURE__ */ React5.createElement(Text3, { style: styles7.dashboardLinkText }, "\u{1F310}", " Manage on Dashboard ", "\u2192")
|
|
16631
|
+
), /* @__PURE__ */ React5.createElement(TouchableOpacity3, { style: styles7.refreshBtn, onPress: refreshAssignments }, /* @__PURE__ */ React5.createElement(Text3, { style: styles7.refreshText }, "\u21BB", " Refresh")));
|
|
16544
16632
|
}
|
|
16545
16633
|
function createStyles3() {
|
|
16546
16634
|
return StyleSheet5.create({
|
|
@@ -16860,7 +16948,7 @@ var styles2 = StyleSheet7.create({
|
|
|
16860
16948
|
// src/widget/screens/TestFeedbackScreen.tsx
|
|
16861
16949
|
function TestFeedbackScreen({ status, assignmentId, nav }) {
|
|
16862
16950
|
const { client, assignments, refreshAssignments, uploadImage, widgetColorScheme } = useBugBear();
|
|
16863
|
-
const
|
|
16951
|
+
const styles7 = useMemo4(() => createStyles4(), [widgetColorScheme]);
|
|
16864
16952
|
const images = useImageAttachments(uploadImage, 3, "screenshots");
|
|
16865
16953
|
const [rating, setRating] = useState6(5);
|
|
16866
16954
|
const [note, setNote] = useState6("");
|
|
@@ -16920,7 +17008,7 @@ function TestFeedbackScreen({ status, assignmentId, nav }) {
|
|
|
16920
17008
|
}
|
|
16921
17009
|
}
|
|
16922
17010
|
};
|
|
16923
|
-
return /* @__PURE__ */ React8.createElement(View8, { style:
|
|
17011
|
+
return /* @__PURE__ */ React8.createElement(View8, { style: styles7.container }, /* @__PURE__ */ React8.createElement(Text6, { style: styles7.header }, status === "passed" ? "\u2705 Test Passed!" : "\u274C Test Failed"), /* @__PURE__ */ React8.createElement(Text6, { style: styles7.subheader }, "Rate this test case"), /* @__PURE__ */ React8.createElement(View8, { style: styles7.starRow }, [1, 2, 3, 4, 5].map((n) => /* @__PURE__ */ React8.createElement(TouchableOpacity6, { key: n, onPress: () => setRating(n), style: styles7.starButton }, /* @__PURE__ */ React8.createElement(Text6, { style: [styles7.star, n <= rating && styles7.starActive] }, n <= rating ? "\u2605" : "\u2606")))), showFlags && /* @__PURE__ */ React8.createElement(View8, { style: styles7.flagsSection }, /* @__PURE__ */ React8.createElement(Text6, { style: styles7.flagsLabel }, "What could be improved?"), [
|
|
16924
17012
|
{ key: "isOutdated", label: "Test is outdated" },
|
|
16925
17013
|
{ key: "needsMoreDetail", label: "Needs more detail" },
|
|
16926
17014
|
{ key: "stepsUnclear", label: "Steps are unclear" },
|
|
@@ -16929,15 +17017,15 @@ function TestFeedbackScreen({ status, assignmentId, nav }) {
|
|
|
16929
17017
|
TouchableOpacity6,
|
|
16930
17018
|
{
|
|
16931
17019
|
key,
|
|
16932
|
-
style: [
|
|
17020
|
+
style: [styles7.flagItem, flags[key] && styles7.flagItemActive],
|
|
16933
17021
|
onPress: () => setFlags((prev) => ({ ...prev, [key]: !prev[key] }))
|
|
16934
17022
|
},
|
|
16935
|
-
/* @__PURE__ */ React8.createElement(View8, { style: [
|
|
16936
|
-
/* @__PURE__ */ React8.createElement(Text6, { style: [
|
|
17023
|
+
/* @__PURE__ */ React8.createElement(View8, { style: [styles7.flagCheck, flags[key] && styles7.flagCheckActive] }, flags[key] && /* @__PURE__ */ React8.createElement(Text6, { style: styles7.flagCheckmark }, "\u2713")),
|
|
17024
|
+
/* @__PURE__ */ React8.createElement(Text6, { style: [styles7.flagText, flags[key] && styles7.flagTextActive] }, label)
|
|
16937
17025
|
))), /* @__PURE__ */ React8.createElement(
|
|
16938
17026
|
TextInput3,
|
|
16939
17027
|
{
|
|
16940
|
-
style:
|
|
17028
|
+
style: styles7.noteInput,
|
|
16941
17029
|
value: note,
|
|
16942
17030
|
onChangeText: setNote,
|
|
16943
17031
|
placeholder: "Add a note (optional)",
|
|
@@ -16954,7 +17042,7 @@ function TestFeedbackScreen({ status, assignmentId, nav }) {
|
|
|
16954
17042
|
onRemove: images.removeImage,
|
|
16955
17043
|
label: "Screenshots (optional)"
|
|
16956
17044
|
}
|
|
16957
|
-
), /* @__PURE__ */ React8.createElement(View8, { style:
|
|
17045
|
+
), /* @__PURE__ */ React8.createElement(View8, { style: styles7.actions }, /* @__PURE__ */ React8.createElement(TouchableOpacity6, { style: styles7.skipButton, onPress: handleSkip }, /* @__PURE__ */ React8.createElement(Text6, { style: styles7.skipText }, "Skip")), /* @__PURE__ */ React8.createElement(TouchableOpacity6, { style: [shared.primaryButton, { flex: 2, opacity: submitting || images.isUploading ? 0.5 : 1 }], onPress: handleSubmit, disabled: submitting || images.isUploading }, /* @__PURE__ */ React8.createElement(Text6, { style: shared.primaryButtonText }, images.isUploading ? "Uploading..." : submitting ? "Submitting..." : "Submit"))));
|
|
16958
17046
|
}
|
|
16959
17047
|
function createStyles4() {
|
|
16960
17048
|
return StyleSheet8.create({
|
|
@@ -17143,7 +17231,7 @@ var styles3 = StyleSheet9.create({
|
|
|
17143
17231
|
// src/widget/screens/ReportScreen.tsx
|
|
17144
17232
|
function ReportScreen({ nav, prefill, autoCaptureUri, onAutoCaptureConsumed }) {
|
|
17145
17233
|
const { client, getDeviceInfo, uploadImage, refreshAssignments, widgetColorScheme } = useBugBear();
|
|
17146
|
-
const
|
|
17234
|
+
const styles7 = useMemo5(() => createStyles5(), [widgetColorScheme]);
|
|
17147
17235
|
const [reportType, setReportType] = useState8(prefill?.type || "bug");
|
|
17148
17236
|
const [severity, setSeverity] = useState8("medium");
|
|
17149
17237
|
const [category, setCategory] = useState8(null);
|
|
@@ -17249,7 +17337,7 @@ function ReportScreen({ nav, prefill, autoCaptureUri, onAutoCaptureConsumed }) {
|
|
|
17249
17337
|
submittingRef.current = false;
|
|
17250
17338
|
}
|
|
17251
17339
|
};
|
|
17252
|
-
return /* @__PURE__ */ React10.createElement(View10, null, isRetestFailure ? /* @__PURE__ */ React10.createElement(React10.Fragment, null, /* @__PURE__ */ React10.createElement(View10, { style:
|
|
17340
|
+
return /* @__PURE__ */ React10.createElement(View10, null, isRetestFailure ? /* @__PURE__ */ React10.createElement(React10.Fragment, null, /* @__PURE__ */ React10.createElement(View10, { style: styles7.retestBanner }, /* @__PURE__ */ React10.createElement(Text8, { style: styles7.retestIcon }, "\u{1F504}"), /* @__PURE__ */ React10.createElement(View10, null, /* @__PURE__ */ React10.createElement(Text8, { style: styles7.retestTitle }, "Bug Still Present"), /* @__PURE__ */ React10.createElement(Text8, { style: styles7.retestSubtitle }, "The fix did not resolve this issue"))), /* @__PURE__ */ React10.createElement(View10, { style: styles7.section }, /* @__PURE__ */ React10.createElement(Text8, { style: shared.label }, "Severity"), /* @__PURE__ */ React10.createElement(View10, { style: styles7.severityRow }, [
|
|
17253
17341
|
{ sev: "critical", color: colors.red },
|
|
17254
17342
|
{ sev: "high", color: colors.orange },
|
|
17255
17343
|
{ sev: "medium", color: colors.yellow },
|
|
@@ -17258,14 +17346,14 @@ function ReportScreen({ nav, prefill, autoCaptureUri, onAutoCaptureConsumed }) {
|
|
|
17258
17346
|
TouchableOpacity8,
|
|
17259
17347
|
{
|
|
17260
17348
|
key: sev,
|
|
17261
|
-
style: [
|
|
17349
|
+
style: [styles7.sevButton, severity === sev && { backgroundColor: `${color}30`, borderColor: color }],
|
|
17262
17350
|
onPress: () => setSeverity(sev)
|
|
17263
17351
|
},
|
|
17264
|
-
/* @__PURE__ */ React10.createElement(Text8, { style: [
|
|
17265
|
-
)))), /* @__PURE__ */ React10.createElement(View10, { style:
|
|
17352
|
+
/* @__PURE__ */ React10.createElement(Text8, { style: [styles7.sevText, severity === sev && { color }] }, sev)
|
|
17353
|
+
)))), /* @__PURE__ */ React10.createElement(View10, { style: styles7.section }, /* @__PURE__ */ React10.createElement(Text8, { style: shared.label }, "Category (optional)"), /* @__PURE__ */ React10.createElement(CategoryPicker, { value: category, onChange: setCategory, optional: true })), /* @__PURE__ */ React10.createElement(View10, { style: styles7.section }, /* @__PURE__ */ React10.createElement(Text8, { style: shared.label }, "What went wrong?"), /* @__PURE__ */ React10.createElement(
|
|
17266
17354
|
TextInput4,
|
|
17267
17355
|
{
|
|
17268
|
-
style:
|
|
17356
|
+
style: styles7.descInput,
|
|
17269
17357
|
value: description,
|
|
17270
17358
|
onChangeText: setDescription,
|
|
17271
17359
|
placeholder: "Describe what you observed. What still doesn't work?",
|
|
@@ -17318,15 +17406,15 @@ function ReportScreen({ nav, prefill, autoCaptureUri, onAutoCaptureConsumed }) {
|
|
|
17318
17406
|
onRemove: images.removeImage,
|
|
17319
17407
|
label: "Attachments (optional)"
|
|
17320
17408
|
}
|
|
17321
|
-
), error && /* @__PURE__ */ React10.createElement(View10, { style:
|
|
17409
|
+
), error && /* @__PURE__ */ React10.createElement(View10, { style: styles7.errorBanner }, /* @__PURE__ */ React10.createElement(Text8, { style: styles7.errorText }, error)), /* @__PURE__ */ React10.createElement(
|
|
17322
17410
|
TouchableOpacity8,
|
|
17323
17411
|
{
|
|
17324
|
-
style: [shared.primaryButton,
|
|
17412
|
+
style: [shared.primaryButton, styles7.retestSubmitButton, (!description.trim() || submitting || images.isUploading) && shared.primaryButtonDisabled, { marginTop: 20 }],
|
|
17325
17413
|
onPress: handleSubmit,
|
|
17326
17414
|
disabled: !description.trim() || submitting || images.isUploading
|
|
17327
17415
|
},
|
|
17328
17416
|
/* @__PURE__ */ React10.createElement(Text8, { style: shared.primaryButtonText }, images.isUploading ? "Uploading images..." : submitting ? "Submitting..." : error ? "Retry" : "Submit Failed Retest")
|
|
17329
|
-
)) : /* @__PURE__ */ React10.createElement(React10.Fragment, null, /* @__PURE__ */ React10.createElement(Text8, { style: shared.label }, "What are you reporting?"), /* @__PURE__ */ React10.createElement(View10, { style:
|
|
17417
|
+
)) : /* @__PURE__ */ React10.createElement(React10.Fragment, null, /* @__PURE__ */ React10.createElement(Text8, { style: shared.label }, "What are you reporting?"), /* @__PURE__ */ React10.createElement(View10, { style: styles7.typeRow }, [
|
|
17330
17418
|
{ type: "bug", label: "Bug", icon: "\u{1F41B}" },
|
|
17331
17419
|
{ type: "feedback", label: "Feedback", icon: "\u{1F4A1}" },
|
|
17332
17420
|
{ type: "suggestion", label: "Idea", icon: "\u2728" }
|
|
@@ -17334,12 +17422,12 @@ function ReportScreen({ nav, prefill, autoCaptureUri, onAutoCaptureConsumed }) {
|
|
|
17334
17422
|
TouchableOpacity8,
|
|
17335
17423
|
{
|
|
17336
17424
|
key: type,
|
|
17337
|
-
style: [
|
|
17425
|
+
style: [styles7.typeCard, reportType === type && styles7.typeCardActive],
|
|
17338
17426
|
onPress: () => setReportType(type)
|
|
17339
17427
|
},
|
|
17340
|
-
/* @__PURE__ */ React10.createElement(Text8, { style:
|
|
17341
|
-
/* @__PURE__ */ React10.createElement(Text8, { style: [
|
|
17342
|
-
))), isBugType && /* @__PURE__ */ React10.createElement(View10, { style:
|
|
17428
|
+
/* @__PURE__ */ React10.createElement(Text8, { style: styles7.typeIcon }, icon),
|
|
17429
|
+
/* @__PURE__ */ React10.createElement(Text8, { style: [styles7.typeLabel, reportType === type && styles7.typeLabelActive] }, label)
|
|
17430
|
+
))), isBugType && /* @__PURE__ */ React10.createElement(View10, { style: styles7.section }, /* @__PURE__ */ React10.createElement(Text8, { style: shared.label }, "Severity"), /* @__PURE__ */ React10.createElement(View10, { style: styles7.severityRow }, [
|
|
17343
17431
|
{ sev: "critical", color: colors.red },
|
|
17344
17432
|
{ sev: "high", color: colors.orange },
|
|
17345
17433
|
{ sev: "medium", color: colors.yellow },
|
|
@@ -17348,14 +17436,14 @@ function ReportScreen({ nav, prefill, autoCaptureUri, onAutoCaptureConsumed }) {
|
|
|
17348
17436
|
TouchableOpacity8,
|
|
17349
17437
|
{
|
|
17350
17438
|
key: sev,
|
|
17351
|
-
style: [
|
|
17439
|
+
style: [styles7.sevButton, severity === sev && { backgroundColor: `${color}30`, borderColor: color }],
|
|
17352
17440
|
onPress: () => setSeverity(sev)
|
|
17353
17441
|
},
|
|
17354
|
-
/* @__PURE__ */ React10.createElement(Text8, { style: [
|
|
17355
|
-
)))), isBugType && /* @__PURE__ */ React10.createElement(View10, { style:
|
|
17442
|
+
/* @__PURE__ */ React10.createElement(Text8, { style: [styles7.sevText, severity === sev && { color }] }, sev)
|
|
17443
|
+
)))), isBugType && /* @__PURE__ */ React10.createElement(View10, { style: styles7.section }, /* @__PURE__ */ React10.createElement(Text8, { style: shared.label }, "Category (optional)"), /* @__PURE__ */ React10.createElement(CategoryPicker, { value: category, onChange: setCategory, optional: true })), /* @__PURE__ */ React10.createElement(View10, { style: styles7.section }, /* @__PURE__ */ React10.createElement(Text8, { style: shared.label }, "What happened?"), /* @__PURE__ */ React10.createElement(
|
|
17356
17444
|
TextInput4,
|
|
17357
17445
|
{
|
|
17358
|
-
style:
|
|
17446
|
+
style: styles7.descInput,
|
|
17359
17447
|
value: description,
|
|
17360
17448
|
onChangeText: setDescription,
|
|
17361
17449
|
placeholder: "Describe the issue...",
|
|
@@ -17398,16 +17486,16 @@ function ReportScreen({ nav, prefill, autoCaptureUri, onAutoCaptureConsumed }) {
|
|
|
17398
17486
|
issue.title
|
|
17399
17487
|
),
|
|
17400
17488
|
/* @__PURE__ */ React10.createElement(Text8, { style: { fontSize: 11, color: colors.textMuted } }, issue.status)
|
|
17401
|
-
)))), isBugType && /* @__PURE__ */ React10.createElement(View10, { style:
|
|
17489
|
+
)))), isBugType && /* @__PURE__ */ React10.createElement(View10, { style: styles7.section }, /* @__PURE__ */ React10.createElement(Text8, { style: shared.label }, "Which screen?"), /* @__PURE__ */ React10.createElement(
|
|
17402
17490
|
TextInput4,
|
|
17403
17491
|
{
|
|
17404
|
-
style:
|
|
17492
|
+
style: styles7.screenInput,
|
|
17405
17493
|
value: affectedScreen,
|
|
17406
17494
|
onChangeText: setAffectedScreen,
|
|
17407
17495
|
placeholder: "e.g. Reservations, Settings...",
|
|
17408
17496
|
placeholderTextColor: colors.textMuted
|
|
17409
17497
|
}
|
|
17410
|
-
), /* @__PURE__ */ React10.createElement(Text8, { style:
|
|
17498
|
+
), /* @__PURE__ */ React10.createElement(Text8, { style: styles7.screenHint }, "Which screen or area was the bug on? (optional)")), /* @__PURE__ */ React10.createElement(
|
|
17411
17499
|
ImagePickerButtons,
|
|
17412
17500
|
{
|
|
17413
17501
|
images: images.images,
|
|
@@ -17417,7 +17505,7 @@ function ReportScreen({ nav, prefill, autoCaptureUri, onAutoCaptureConsumed }) {
|
|
|
17417
17505
|
onRemove: images.removeImage,
|
|
17418
17506
|
label: "Screenshots (optional)"
|
|
17419
17507
|
}
|
|
17420
|
-
), error && /* @__PURE__ */ React10.createElement(View10, { style:
|
|
17508
|
+
), error && /* @__PURE__ */ React10.createElement(View10, { style: styles7.errorBanner }, /* @__PURE__ */ React10.createElement(Text8, { style: styles7.errorText }, error)), /* @__PURE__ */ React10.createElement(
|
|
17421
17509
|
TouchableOpacity8,
|
|
17422
17510
|
{
|
|
17423
17511
|
style: [shared.primaryButton, (!description.trim() || submitting || images.isUploading) && shared.primaryButtonDisabled, { marginTop: 20 }],
|
|
@@ -17457,12 +17545,12 @@ import React11, { useEffect as useEffect7, useMemo as useMemo6 } from "react";
|
|
|
17457
17545
|
import { View as View11, Text as Text9, StyleSheet as StyleSheet11 } from "react-native";
|
|
17458
17546
|
function ReportSuccessScreen({ nav }) {
|
|
17459
17547
|
const { widgetColorScheme } = useBugBear();
|
|
17460
|
-
const
|
|
17548
|
+
const styles7 = useMemo6(() => createStyles6(), [widgetColorScheme]);
|
|
17461
17549
|
useEffect7(() => {
|
|
17462
17550
|
const timer = setTimeout(() => nav.reset(), 2e3);
|
|
17463
17551
|
return () => clearTimeout(timer);
|
|
17464
17552
|
}, [nav]);
|
|
17465
|
-
return /* @__PURE__ */ React11.createElement(View11, { style:
|
|
17553
|
+
return /* @__PURE__ */ React11.createElement(View11, { style: styles7.container }, /* @__PURE__ */ React11.createElement(Text9, { style: styles7.emoji }, "\u{1F389}"), /* @__PURE__ */ React11.createElement(Text9, { style: styles7.title }, "Report submitted!"), /* @__PURE__ */ React11.createElement(Text9, { style: styles7.subtitle }, "Thank you for your feedback"));
|
|
17466
17554
|
}
|
|
17467
17555
|
function createStyles6() {
|
|
17468
17556
|
return StyleSheet11.create({
|
|
@@ -17478,7 +17566,7 @@ import React12, { useMemo as useMemo7, useState as useState9 } from "react";
|
|
|
17478
17566
|
import { View as View12, Text as Text10, TouchableOpacity as TouchableOpacity9, ScrollView as ScrollView3, StyleSheet as StyleSheet12, Linking as Linking3 } from "react-native";
|
|
17479
17567
|
function MessageListScreen({ nav }) {
|
|
17480
17568
|
const { threads, unreadCount, refreshThreads, dashboardUrl, isLoading, widgetColorScheme } = useBugBear();
|
|
17481
|
-
const
|
|
17569
|
+
const styles7 = useMemo7(() => createStyles7(), [widgetColorScheme]);
|
|
17482
17570
|
const [activeFilter, setActiveFilter] = useState9("all");
|
|
17483
17571
|
const filteredThreads = threads.filter((thread) => {
|
|
17484
17572
|
if (activeFilter === "all") return true;
|
|
@@ -17496,10 +17584,10 @@ function MessageListScreen({ nav }) {
|
|
|
17496
17584
|
return /* @__PURE__ */ React12.createElement(View12, null, /* @__PURE__ */ React12.createElement(
|
|
17497
17585
|
TouchableOpacity9,
|
|
17498
17586
|
{
|
|
17499
|
-
style:
|
|
17587
|
+
style: styles7.newMsgButton,
|
|
17500
17588
|
onPress: () => nav.push({ name: "COMPOSE_MESSAGE" })
|
|
17501
17589
|
},
|
|
17502
|
-
/* @__PURE__ */ React12.createElement(Text10, { style:
|
|
17590
|
+
/* @__PURE__ */ React12.createElement(Text10, { style: styles7.newMsgText }, "\u2709\uFE0F New Message")
|
|
17503
17591
|
), /* @__PURE__ */ React12.createElement(
|
|
17504
17592
|
ScrollView3,
|
|
17505
17593
|
{
|
|
@@ -17544,20 +17632,20 @@ function MessageListScreen({ nav }) {
|
|
|
17544
17632
|
TouchableOpacity9,
|
|
17545
17633
|
{
|
|
17546
17634
|
key: thread.id,
|
|
17547
|
-
style: [
|
|
17635
|
+
style: [styles7.threadItem, thread.unreadCount > 0 && styles7.threadItemUnread],
|
|
17548
17636
|
onPress: () => nav.push({ name: "THREAD_DETAIL", thread })
|
|
17549
17637
|
},
|
|
17550
|
-
/* @__PURE__ */ React12.createElement(View12, { style:
|
|
17551
|
-
/* @__PURE__ */ React12.createElement(View12, { style:
|
|
17638
|
+
/* @__PURE__ */ React12.createElement(View12, { style: styles7.threadLeft }, /* @__PURE__ */ React12.createElement(Text10, { style: styles7.threadIcon }, getThreadTypeIcon(thread.threadType)), /* @__PURE__ */ React12.createElement(View12, { style: styles7.threadInfo }, /* @__PURE__ */ React12.createElement(View12, { style: styles7.threadTitleRow }, thread.isPinned && /* @__PURE__ */ React12.createElement(Text10, { style: styles7.pinIcon }, "\u{1F4CC}"), /* @__PURE__ */ React12.createElement(Text10, { style: styles7.threadSubject, numberOfLines: 1 }, thread.subject || "No subject")), thread.threadType === "report" && thread.reporterName && /* @__PURE__ */ React12.createElement(Text10, { style: { fontSize: 11, color: colors.textMuted } }, "Reported by: ", thread.reporterName), thread.lastMessage && /* @__PURE__ */ React12.createElement(Text10, { style: styles7.threadPreview, numberOfLines: 1 }, thread.lastMessage.senderName, ": ", thread.lastMessage.content))),
|
|
17639
|
+
/* @__PURE__ */ React12.createElement(View12, { style: styles7.threadRight }, /* @__PURE__ */ React12.createElement(Text10, { style: styles7.threadTime }, formatRelativeTime(thread.lastMessageAt)), thread.unreadCount > 0 && /* @__PURE__ */ React12.createElement(View12, { style: styles7.unreadBadge }, /* @__PURE__ */ React12.createElement(Text10, { style: styles7.unreadText }, thread.unreadCount)), thread.priority !== "normal" && /* @__PURE__ */ React12.createElement(View12, { style: [styles7.priorityDot, { backgroundColor: getPriorityColor(thread.priority) }] }))
|
|
17552
17640
|
))), dashboardUrl && /* @__PURE__ */ React12.createElement(
|
|
17553
17641
|
TouchableOpacity9,
|
|
17554
17642
|
{
|
|
17555
|
-
style:
|
|
17643
|
+
style: styles7.dashboardLink,
|
|
17556
17644
|
onPress: () => Linking3.openURL(`${dashboardUrl}/discussions`),
|
|
17557
17645
|
activeOpacity: 0.7
|
|
17558
17646
|
},
|
|
17559
|
-
/* @__PURE__ */ React12.createElement(Text10, { style:
|
|
17560
|
-
), /* @__PURE__ */ React12.createElement(View12, { style:
|
|
17647
|
+
/* @__PURE__ */ React12.createElement(Text10, { style: styles7.dashboardLinkText }, "\u{1F310}", " View on Dashboard ", "\u2192")
|
|
17648
|
+
), /* @__PURE__ */ React12.createElement(View12, { style: styles7.footer }, /* @__PURE__ */ React12.createElement(Text10, { style: styles7.footerText }, filteredThreads.length, " thread", filteredThreads.length !== 1 ? "s" : "", " \xB7 ", unreadCount, " unread"), /* @__PURE__ */ React12.createElement(TouchableOpacity9, { onPress: refreshThreads }, /* @__PURE__ */ React12.createElement(Text10, { style: styles7.refreshText }, "\u21BB Refresh"))));
|
|
17561
17649
|
}
|
|
17562
17650
|
function createStyles7() {
|
|
17563
17651
|
return StyleSheet12.create({
|
|
@@ -17590,7 +17678,7 @@ import React13, { useState as useState10, useEffect as useEffect8, useMemo as us
|
|
|
17590
17678
|
import { View as View13, Text as Text11, TouchableOpacity as TouchableOpacity10, TextInput as TextInput5, StyleSheet as StyleSheet13, Image as Image2 } from "react-native";
|
|
17591
17679
|
function ThreadDetailScreen({ thread, nav }) {
|
|
17592
17680
|
const { getThreadMessages, sendMessage, markAsRead, uploadImage, widgetColorScheme } = useBugBear();
|
|
17593
|
-
const
|
|
17681
|
+
const styles7 = useMemo8(() => createStyles8(), [widgetColorScheme]);
|
|
17594
17682
|
const [messages, setMessages] = useState10([]);
|
|
17595
17683
|
const [loading, setLoading] = useState10(true);
|
|
17596
17684
|
const [replyText, setReplyText] = useState10("");
|
|
@@ -17642,20 +17730,20 @@ function ThreadDetailScreen({ thread, nav }) {
|
|
|
17642
17730
|
}
|
|
17643
17731
|
setSending(false);
|
|
17644
17732
|
};
|
|
17645
|
-
return /* @__PURE__ */ React13.createElement(View13, { style:
|
|
17733
|
+
return /* @__PURE__ */ React13.createElement(View13, { style: styles7.container }, /* @__PURE__ */ React13.createElement(View13, { style: styles7.header }, /* @__PURE__ */ React13.createElement(Text11, { style: styles7.headerIcon }, getThreadTypeIcon(thread.threadType)), /* @__PURE__ */ React13.createElement(Text11, { style: styles7.headerSubject, numberOfLines: 2 }, thread.subject || "No subject")), loading ? /* @__PURE__ */ React13.createElement(View13, { style: styles7.loadingContainer }, /* @__PURE__ */ React13.createElement(Text11, { style: styles7.loadingText }, "Loading messages...")) : /* @__PURE__ */ React13.createElement(View13, { style: styles7.messagesContainer }, messages.map((msg) => /* @__PURE__ */ React13.createElement(
|
|
17646
17734
|
View13,
|
|
17647
17735
|
{
|
|
17648
17736
|
key: msg.id,
|
|
17649
|
-
style: [
|
|
17737
|
+
style: [styles7.bubble, msg.senderType === "tester" ? styles7.bubbleTester : styles7.bubbleAdmin]
|
|
17650
17738
|
},
|
|
17651
|
-
/* @__PURE__ */ React13.createElement(Text11, { style: [
|
|
17652
|
-
/* @__PURE__ */ React13.createElement(Text11, { style: [
|
|
17653
|
-
msg.attachments && msg.attachments.length > 0 && /* @__PURE__ */ React13.createElement(View13, { style:
|
|
17654
|
-
/* @__PURE__ */ React13.createElement(Text11, { style: [
|
|
17655
|
-
))), sendError && /* @__PURE__ */ React13.createElement(View13, { style:
|
|
17739
|
+
/* @__PURE__ */ React13.createElement(Text11, { style: [styles7.sender, msg.senderType === "tester" && styles7.senderTester] }, msg.senderType === "tester" ? "You" : msg.senderName),
|
|
17740
|
+
/* @__PURE__ */ React13.createElement(Text11, { style: [styles7.content, msg.senderType === "tester" && styles7.contentTester] }, msg.content),
|
|
17741
|
+
msg.attachments && msg.attachments.length > 0 && /* @__PURE__ */ React13.createElement(View13, { style: styles7.attachments }, msg.attachments.filter((a) => a.type === "image").map((att, idx) => /* @__PURE__ */ React13.createElement(Image2, { key: idx, source: { uri: att.url }, style: styles7.attachmentImage, resizeMode: "cover" }))),
|
|
17742
|
+
/* @__PURE__ */ React13.createElement(Text11, { style: [styles7.time, msg.senderType === "tester" && styles7.timeTester] }, formatMessageTime(msg.createdAt))
|
|
17743
|
+
))), sendError && /* @__PURE__ */ React13.createElement(View13, { style: styles7.errorBar }, /* @__PURE__ */ React13.createElement(Text11, { style: styles7.errorText }, "Failed to send. Tap Send to retry.")), replyImages.images.length > 0 && /* @__PURE__ */ React13.createElement(View13, { style: styles7.replyPreview }, /* @__PURE__ */ React13.createElement(ImagePreviewStrip, { images: replyImages.images, onRemove: replyImages.removeImage })), /* @__PURE__ */ React13.createElement(View13, { style: styles7.composer }, IMAGE_PICKER_AVAILABLE && /* @__PURE__ */ React13.createElement(TouchableOpacity10, { style: styles7.attachBtn, onPress: replyImages.pickFromGallery, disabled: replyImages.images.length >= 3 }, /* @__PURE__ */ React13.createElement(Text11, { style: styles7.attachBtnText }, "\u{1F4CE}")), /* @__PURE__ */ React13.createElement(
|
|
17656
17744
|
TextInput5,
|
|
17657
17745
|
{
|
|
17658
|
-
style:
|
|
17746
|
+
style: styles7.replyInput,
|
|
17659
17747
|
value: replyText,
|
|
17660
17748
|
onChangeText: setReplyText,
|
|
17661
17749
|
placeholder: "Type a reply...",
|
|
@@ -17666,11 +17754,11 @@ function ThreadDetailScreen({ thread, nav }) {
|
|
|
17666
17754
|
), /* @__PURE__ */ React13.createElement(
|
|
17667
17755
|
TouchableOpacity10,
|
|
17668
17756
|
{
|
|
17669
|
-
style: [
|
|
17757
|
+
style: [styles7.sendBtn, (!replyText.trim() && replyImages.images.length === 0 || sending || replyImages.isUploading) && styles7.sendBtnDisabled],
|
|
17670
17758
|
onPress: handleSend,
|
|
17671
17759
|
disabled: !replyText.trim() && replyImages.images.length === 0 || sending || replyImages.isUploading
|
|
17672
17760
|
},
|
|
17673
|
-
/* @__PURE__ */ React13.createElement(Text11, { style:
|
|
17761
|
+
/* @__PURE__ */ React13.createElement(Text11, { style: styles7.sendBtnText }, sending ? "..." : "Send")
|
|
17674
17762
|
)));
|
|
17675
17763
|
}
|
|
17676
17764
|
function createStyles8() {
|
|
@@ -17711,7 +17799,7 @@ import React14, { useState as useState11, useMemo as useMemo9 } from "react";
|
|
|
17711
17799
|
import { View as View14, Text as Text12, TextInput as TextInput6, TouchableOpacity as TouchableOpacity11, StyleSheet as StyleSheet14 } from "react-native";
|
|
17712
17800
|
function ComposeMessageScreen({ nav }) {
|
|
17713
17801
|
const { createThread, uploadImage, widgetColorScheme } = useBugBear();
|
|
17714
|
-
const
|
|
17802
|
+
const styles7 = useMemo9(() => createStyles9(), [widgetColorScheme]);
|
|
17715
17803
|
const [subject, setSubject] = useState11("");
|
|
17716
17804
|
const [message, setMessage] = useState11("");
|
|
17717
17805
|
const [sending, setSending] = useState11(false);
|
|
@@ -17730,10 +17818,10 @@ function ComposeMessageScreen({ nav }) {
|
|
|
17730
17818
|
nav.pop();
|
|
17731
17819
|
}
|
|
17732
17820
|
};
|
|
17733
|
-
return /* @__PURE__ */ React14.createElement(View14, null, /* @__PURE__ */ React14.createElement(View14, { style:
|
|
17821
|
+
return /* @__PURE__ */ React14.createElement(View14, null, /* @__PURE__ */ React14.createElement(View14, { style: styles7.header }, /* @__PURE__ */ React14.createElement(Text12, { style: styles7.title }, "New Message"), /* @__PURE__ */ React14.createElement(Text12, { style: styles7.subtitle }, "Send a message to the QA team")), /* @__PURE__ */ React14.createElement(View14, { style: styles7.form }, /* @__PURE__ */ React14.createElement(Text12, { style: shared.label }, "Subject"), /* @__PURE__ */ React14.createElement(
|
|
17734
17822
|
TextInput6,
|
|
17735
17823
|
{
|
|
17736
|
-
style:
|
|
17824
|
+
style: styles7.subjectInput,
|
|
17737
17825
|
value: subject,
|
|
17738
17826
|
onChangeText: setSubject,
|
|
17739
17827
|
placeholder: "What's this about?",
|
|
@@ -17743,7 +17831,7 @@ function ComposeMessageScreen({ nav }) {
|
|
|
17743
17831
|
), /* @__PURE__ */ React14.createElement(Text12, { style: [shared.label, { marginTop: 16 }] }, "Message"), /* @__PURE__ */ React14.createElement(
|
|
17744
17832
|
TextInput6,
|
|
17745
17833
|
{
|
|
17746
|
-
style:
|
|
17834
|
+
style: styles7.messageInput,
|
|
17747
17835
|
value: message,
|
|
17748
17836
|
onChangeText: setMessage,
|
|
17749
17837
|
placeholder: "Write your message...",
|
|
@@ -17788,7 +17876,7 @@ import React15, { useState as useState12, useEffect as useEffect9, useMemo as us
|
|
|
17788
17876
|
import { View as View15, Text as Text13, TouchableOpacity as TouchableOpacity12, TextInput as TextInput7, StyleSheet as StyleSheet15 } from "react-native";
|
|
17789
17877
|
function ProfileScreen({ nav }) {
|
|
17790
17878
|
const { testerInfo, assignments, updateTesterProfile, refreshTesterInfo, widgetColorScheme } = useBugBear();
|
|
17791
|
-
const
|
|
17879
|
+
const styles7 = useMemo10(() => createStyles10(), [widgetColorScheme]);
|
|
17792
17880
|
const [editing, setEditing] = useState12(false);
|
|
17793
17881
|
const [name, setName] = useState12(testerInfo?.name || "");
|
|
17794
17882
|
const [additionalEmails, setAdditionalEmails] = useState12(testerInfo?.additionalEmails || []);
|
|
@@ -17839,13 +17927,13 @@ function ProfileScreen({ nav }) {
|
|
|
17839
17927
|
return /* @__PURE__ */ React15.createElement(View15, { style: shared.emptyState }, /* @__PURE__ */ React15.createElement(Text13, { style: shared.emptyEmoji }, "\u{1F464}"), /* @__PURE__ */ React15.createElement(Text13, { style: shared.emptyTitle }, "No profile found"));
|
|
17840
17928
|
}
|
|
17841
17929
|
if (editing) {
|
|
17842
|
-
return /* @__PURE__ */ React15.createElement(View15, null, /* @__PURE__ */ React15.createElement(View15, { style:
|
|
17930
|
+
return /* @__PURE__ */ React15.createElement(View15, null, /* @__PURE__ */ React15.createElement(View15, { style: styles7.editHeader }, /* @__PURE__ */ React15.createElement(Text13, { style: styles7.editTitle }, "Edit Profile"), /* @__PURE__ */ React15.createElement(TouchableOpacity12, { onPress: () => {
|
|
17843
17931
|
setEditing(false);
|
|
17844
17932
|
setNewEmailInput("");
|
|
17845
|
-
} }, /* @__PURE__ */ React15.createElement(Text13, { style:
|
|
17933
|
+
} }, /* @__PURE__ */ React15.createElement(Text13, { style: styles7.cancelText }, "Cancel"))), /* @__PURE__ */ React15.createElement(View15, { style: styles7.field }, /* @__PURE__ */ React15.createElement(Text13, { style: shared.label }, "Name"), /* @__PURE__ */ React15.createElement(TextInput7, { style: styles7.input, value: name, onChangeText: setName, placeholder: "Your name", placeholderTextColor: colors.textMuted })), /* @__PURE__ */ React15.createElement(View15, { style: styles7.field }, /* @__PURE__ */ React15.createElement(Text13, { style: shared.label }, "Primary Email"), /* @__PURE__ */ React15.createElement(Text13, { style: styles7.emailFixed }, testerInfo.email)), /* @__PURE__ */ React15.createElement(View15, { style: styles7.field }, /* @__PURE__ */ React15.createElement(Text13, { style: shared.label }, "Additional Emails"), additionalEmails.map((email) => /* @__PURE__ */ React15.createElement(View15, { key: email, style: styles7.emailRow }, /* @__PURE__ */ React15.createElement(Text13, { style: styles7.emailText }, email), /* @__PURE__ */ React15.createElement(TouchableOpacity12, { onPress: () => setAdditionalEmails(additionalEmails.filter((e) => e !== email)) }, /* @__PURE__ */ React15.createElement(Text13, { style: styles7.removeEmail }, "\u2715")))), /* @__PURE__ */ React15.createElement(View15, { style: styles7.addEmailRow }, /* @__PURE__ */ React15.createElement(
|
|
17846
17934
|
TextInput7,
|
|
17847
17935
|
{
|
|
17848
|
-
style: [
|
|
17936
|
+
style: [styles7.input, { flex: 1, marginRight: 8 }],
|
|
17849
17937
|
value: newEmailInput,
|
|
17850
17938
|
onChangeText: setNewEmailInput,
|
|
17851
17939
|
placeholder: "Add email",
|
|
@@ -17853,17 +17941,17 @@ function ProfileScreen({ nav }) {
|
|
|
17853
17941
|
keyboardType: "email-address",
|
|
17854
17942
|
autoCapitalize: "none"
|
|
17855
17943
|
}
|
|
17856
|
-
), /* @__PURE__ */ React15.createElement(TouchableOpacity12, { style:
|
|
17944
|
+
), /* @__PURE__ */ React15.createElement(TouchableOpacity12, { style: styles7.addButton, onPress: handleAddEmail }, /* @__PURE__ */ React15.createElement(Text13, { style: styles7.addButtonText }, "Add")))), /* @__PURE__ */ React15.createElement(View15, { style: styles7.field }, /* @__PURE__ */ React15.createElement(Text13, { style: shared.label }, "Testing Platforms"), /* @__PURE__ */ React15.createElement(View15, { 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__ */ React15.createElement(
|
|
17857
17945
|
TouchableOpacity12,
|
|
17858
17946
|
{
|
|
17859
17947
|
key,
|
|
17860
|
-
style: [
|
|
17948
|
+
style: [styles7.platformBtn, platforms.includes(key) && styles7.platformBtnActive],
|
|
17861
17949
|
onPress: () => setPlatforms((prev) => prev.includes(key) ? prev.filter((p) => p !== key) : [...prev, key])
|
|
17862
17950
|
},
|
|
17863
|
-
/* @__PURE__ */ React15.createElement(Text13, { style: [
|
|
17951
|
+
/* @__PURE__ */ React15.createElement(Text13, { style: [styles7.platformText, platforms.includes(key) && styles7.platformTextActive] }, label)
|
|
17864
17952
|
)))), /* @__PURE__ */ React15.createElement(TouchableOpacity12, { style: [shared.primaryButton, { marginTop: 20 }], onPress: handleSave, disabled: saving }, /* @__PURE__ */ React15.createElement(Text13, { style: shared.primaryButtonText }, saving ? "Saving..." : "Save Profile")));
|
|
17865
17953
|
}
|
|
17866
|
-
return /* @__PURE__ */ React15.createElement(View15, null, /* @__PURE__ */ React15.createElement(View15, { style:
|
|
17954
|
+
return /* @__PURE__ */ React15.createElement(View15, null, /* @__PURE__ */ React15.createElement(View15, { style: styles7.profileCard }, /* @__PURE__ */ React15.createElement(View15, { style: styles7.avatar }, /* @__PURE__ */ React15.createElement(Text13, { style: styles7.avatarText }, testerInfo.name.charAt(0).toUpperCase())), /* @__PURE__ */ React15.createElement(Text13, { style: styles7.profileName }, testerInfo.name), /* @__PURE__ */ React15.createElement(Text13, { style: styles7.profileEmail }, testerInfo.email)), /* @__PURE__ */ React15.createElement(View15, { style: styles7.statsRow }, /* @__PURE__ */ React15.createElement(View15, { style: styles7.statItem }, /* @__PURE__ */ React15.createElement(Text13, { style: styles7.statNumber }, completedCount), /* @__PURE__ */ React15.createElement(Text13, { style: styles7.statLabel }, "Completed")), /* @__PURE__ */ React15.createElement(View15, { style: styles7.statDivider }), /* @__PURE__ */ React15.createElement(View15, { style: styles7.statItem }, /* @__PURE__ */ React15.createElement(Text13, { style: styles7.statNumber }, assignments.length), /* @__PURE__ */ React15.createElement(Text13, { style: styles7.statLabel }, "Total Assigned"))), /* @__PURE__ */ React15.createElement(TouchableOpacity12, { onPress: () => setShowDetails(!showDetails), style: styles7.detailsToggle }, /* @__PURE__ */ React15.createElement(Text13, { style: styles7.detailsToggleText }, showDetails ? "\u25BC" : "\u25B6", " Details")), showDetails && /* @__PURE__ */ React15.createElement(View15, { style: styles7.detailsSection }, additionalEmails.length > 0 && /* @__PURE__ */ React15.createElement(View15, { style: styles7.detailBlock }, /* @__PURE__ */ React15.createElement(Text13, { style: styles7.detailLabel }, "Additional Emails"), additionalEmails.map((e) => /* @__PURE__ */ React15.createElement(Text13, { key: e, style: styles7.detailValue }, e))), platforms.length > 0 && /* @__PURE__ */ React15.createElement(View15, { style: styles7.detailBlock }, /* @__PURE__ */ React15.createElement(Text13, { style: styles7.detailLabel }, "Platforms"), /* @__PURE__ */ React15.createElement(View15, { style: styles7.platformTags }, platforms.map((p) => /* @__PURE__ */ React15.createElement(View15, { key: p, style: styles7.platformTag }, /* @__PURE__ */ React15.createElement(Text13, { style: styles7.platformTagText }, p === "ios" ? "\u{1F4F1} iOS" : p === "android" ? "\u{1F916} Android" : "\u{1F310} Web")))))), /* @__PURE__ */ React15.createElement(
|
|
17867
17955
|
TouchableOpacity12,
|
|
17868
17956
|
{
|
|
17869
17957
|
style: [shared.primaryButton, { marginTop: 20 }],
|
|
@@ -17921,7 +18009,7 @@ var CATEGORIES = ["open", "done", "reopened"];
|
|
|
17921
18009
|
var SEVERITY_ORDER2 = { critical: 0, high: 1, medium: 2, low: 3 };
|
|
17922
18010
|
function IssueListScreen({ nav, category }) {
|
|
17923
18011
|
const { client, widgetColorScheme } = useBugBear();
|
|
17924
|
-
const
|
|
18012
|
+
const styles7 = useMemo11(() => createStyles11(), [widgetColorScheme]);
|
|
17925
18013
|
const CATEGORY_CONFIG = useMemo11(() => ({
|
|
17926
18014
|
open: { label: "Open", accent: colors.orange, emptyIcon: "\u2705", emptyText: "No open issues" },
|
|
17927
18015
|
done: { label: "Done", accent: colors.green, emptyIcon: "\u{1F389}", emptyText: "No completed issues yet" },
|
|
@@ -17991,7 +18079,7 @@ function IssueListScreen({ nav, category }) {
|
|
|
17991
18079
|
const searchFilteredIssues = debouncedQuery ? sortedIssues.filter(
|
|
17992
18080
|
(issue) => (issue.title || "").toLowerCase().includes(debouncedQuery.toLowerCase()) || (issue.description || "").toLowerCase().includes(debouncedQuery.toLowerCase())
|
|
17993
18081
|
) : sortedIssues;
|
|
17994
|
-
return /* @__PURE__ */ React16.createElement(View16, null, /* @__PURE__ */ React16.createElement(View16, { style:
|
|
18082
|
+
return /* @__PURE__ */ React16.createElement(View16, null, /* @__PURE__ */ React16.createElement(View16, { style: styles7.tabBar }, CATEGORIES.map((cat) => {
|
|
17995
18083
|
const catConfig = CATEGORY_CONFIG[cat];
|
|
17996
18084
|
const isActive = activeCategory === cat;
|
|
17997
18085
|
const count = counts?.[cat];
|
|
@@ -18000,7 +18088,7 @@ function IssueListScreen({ nav, category }) {
|
|
|
18000
18088
|
{
|
|
18001
18089
|
key: cat,
|
|
18002
18090
|
style: [
|
|
18003
|
-
|
|
18091
|
+
styles7.tab,
|
|
18004
18092
|
{ borderBottomColor: isActive ? catConfig.accent : "transparent" }
|
|
18005
18093
|
],
|
|
18006
18094
|
onPress: () => {
|
|
@@ -18010,20 +18098,20 @@ function IssueListScreen({ nav, category }) {
|
|
|
18010
18098
|
activeOpacity: 0.7
|
|
18011
18099
|
},
|
|
18012
18100
|
/* @__PURE__ */ React16.createElement(Text14, { style: [
|
|
18013
|
-
|
|
18101
|
+
styles7.tabLabel,
|
|
18014
18102
|
isActive && { fontWeight: "600", color: colors.textPrimary }
|
|
18015
18103
|
] }, catConfig.label),
|
|
18016
18104
|
count !== void 0 && /* @__PURE__ */ React16.createElement(View16, { style: [
|
|
18017
|
-
|
|
18105
|
+
styles7.countBadge,
|
|
18018
18106
|
{
|
|
18019
18107
|
backgroundColor: isActive ? catConfig.accent + "18" : colors.card
|
|
18020
18108
|
}
|
|
18021
18109
|
] }, /* @__PURE__ */ React16.createElement(Text14, { style: [
|
|
18022
|
-
|
|
18110
|
+
styles7.countText,
|
|
18023
18111
|
{ color: isActive ? catConfig.accent : colors.textDim }
|
|
18024
18112
|
] }, count))
|
|
18025
18113
|
);
|
|
18026
|
-
})), /* @__PURE__ */ React16.createElement(View16, { style:
|
|
18114
|
+
})), /* @__PURE__ */ React16.createElement(View16, { style: styles7.sortRow }, [
|
|
18027
18115
|
{ key: "severity", label: "Severity" },
|
|
18028
18116
|
{ key: "recent", label: "Recent" }
|
|
18029
18117
|
].map((s2) => /* @__PURE__ */ React16.createElement(
|
|
@@ -18031,14 +18119,14 @@ function IssueListScreen({ nav, category }) {
|
|
|
18031
18119
|
{
|
|
18032
18120
|
key: s2.key,
|
|
18033
18121
|
style: [
|
|
18034
|
-
|
|
18035
|
-
sortMode === s2.key &&
|
|
18122
|
+
styles7.sortBtn,
|
|
18123
|
+
sortMode === s2.key && styles7.sortBtnActive
|
|
18036
18124
|
],
|
|
18037
18125
|
onPress: () => setSortMode(s2.key)
|
|
18038
18126
|
},
|
|
18039
18127
|
/* @__PURE__ */ React16.createElement(Text14, { style: [
|
|
18040
|
-
|
|
18041
|
-
sortMode === s2.key &&
|
|
18128
|
+
styles7.sortBtnText,
|
|
18129
|
+
sortMode === s2.key && styles7.sortBtnTextActive
|
|
18042
18130
|
] }, s2.label)
|
|
18043
18131
|
))), /* @__PURE__ */ React16.createElement(View16, { style: { paddingHorizontal: 16, paddingBottom: 12 } }, /* @__PURE__ */ React16.createElement(
|
|
18044
18132
|
TextInput8,
|
|
@@ -18058,18 +18146,18 @@ function IssueListScreen({ nav, category }) {
|
|
|
18058
18146
|
fontSize: 13
|
|
18059
18147
|
}
|
|
18060
18148
|
}
|
|
18061
|
-
)), loading ? /* @__PURE__ */ React16.createElement(IssueListScreenSkeleton, null) : searchFilteredIssues.length === 0 ? /* @__PURE__ */ React16.createElement(View16, { style:
|
|
18149
|
+
)), loading ? /* @__PURE__ */ React16.createElement(IssueListScreenSkeleton, null) : searchFilteredIssues.length === 0 ? /* @__PURE__ */ React16.createElement(View16, { style: styles7.emptyContainer }, /* @__PURE__ */ React16.createElement(Text14, { style: styles7.emptyIcon }, debouncedQuery ? "\u{1F50D}" : config.emptyIcon), /* @__PURE__ */ React16.createElement(Text14, { style: styles7.emptyText }, debouncedQuery ? "No matching issues" : config.emptyText)) : searchFilteredIssues.map((issue) => /* @__PURE__ */ React16.createElement(
|
|
18062
18150
|
TouchableOpacity13,
|
|
18063
18151
|
{
|
|
18064
18152
|
key: issue.id,
|
|
18065
|
-
style:
|
|
18153
|
+
style: styles7.issueCard,
|
|
18066
18154
|
onPress: () => nav.push({ name: "ISSUE_DETAIL", issue }),
|
|
18067
18155
|
activeOpacity: 0.7
|
|
18068
18156
|
},
|
|
18069
|
-
/* @__PURE__ */ React16.createElement(View16, { style:
|
|
18070
|
-
/* @__PURE__ */ React16.createElement(View16, { style:
|
|
18071
|
-
activeCategory === "done" && issue.verifiedByName && /* @__PURE__ */ React16.createElement(View16, { style:
|
|
18072
|
-
activeCategory === "reopened" && issue.originalBugTitle && /* @__PURE__ */ React16.createElement(View16, { style:
|
|
18157
|
+
/* @__PURE__ */ React16.createElement(View16, { style: styles7.topRow }, issue.severity && /* @__PURE__ */ React16.createElement(View16, { style: [styles7.severityDot, { backgroundColor: SEVERITY_COLORS[issue.severity] || colors.textDim }] }), /* @__PURE__ */ React16.createElement(Text14, { style: styles7.issueTitle, numberOfLines: 1 }, issue.title)),
|
|
18158
|
+
/* @__PURE__ */ React16.createElement(View16, { style: styles7.bottomRow }, issue.route && /* @__PURE__ */ React16.createElement(Text14, { style: styles7.routeText, numberOfLines: 1 }, issue.route), /* @__PURE__ */ React16.createElement(Text14, { style: styles7.timeText }, formatRelativeTime(issue.updatedAt))),
|
|
18159
|
+
activeCategory === "done" && issue.verifiedByName && /* @__PURE__ */ React16.createElement(View16, { style: styles7.verifiedBadge }, /* @__PURE__ */ React16.createElement(Text14, { style: styles7.verifiedBadgeText }, "\u2714", " Verified by ", issue.verifiedByName)),
|
|
18160
|
+
activeCategory === "reopened" && issue.originalBugTitle && /* @__PURE__ */ React16.createElement(View16, { style: styles7.reopenedBadge }, /* @__PURE__ */ React16.createElement(Text14, { style: styles7.reopenedBadgeText, numberOfLines: 1 }, "\u{1F504}", " Retest of: ", issue.originalBugTitle))
|
|
18073
18161
|
)));
|
|
18074
18162
|
}
|
|
18075
18163
|
function createStyles11() {
|
|
@@ -18228,7 +18316,7 @@ import { View as View17, Text as Text15, Image as Image3, StyleSheet as StyleShe
|
|
|
18228
18316
|
var DONE_STATUSES = ["verified", "resolved", "closed", "reviewed"];
|
|
18229
18317
|
function IssueDetailScreen({ nav, issue }) {
|
|
18230
18318
|
const { dashboardUrl, widgetColorScheme, reopenReport } = useBugBear();
|
|
18231
|
-
const
|
|
18319
|
+
const styles7 = useMemo12(() => createStyles12(), [widgetColorScheme]);
|
|
18232
18320
|
const [showReopenForm, setShowReopenForm] = useState14(false);
|
|
18233
18321
|
const [reopenReason, setReopenReason] = useState14("");
|
|
18234
18322
|
const [isSubmitting, setIsSubmitting] = useState14(false);
|
|
@@ -18270,44 +18358,44 @@ function IssueDetailScreen({ nav, issue }) {
|
|
|
18270
18358
|
setReopenError(result.error || "Failed to reopen");
|
|
18271
18359
|
}
|
|
18272
18360
|
}, [reopenReason, reopenReport, issue.id]);
|
|
18273
|
-
return /* @__PURE__ */ React17.createElement(View17, null, /* @__PURE__ */ React17.createElement(View17, { style:
|
|
18361
|
+
return /* @__PURE__ */ React17.createElement(View17, null, /* @__PURE__ */ React17.createElement(View17, { style: styles7.badgeRow }, /* @__PURE__ */ React17.createElement(View17, { style: [styles7.badge, { backgroundColor: wasReopened ? colors.yellowDark : statusConfig.bg }] }, /* @__PURE__ */ React17.createElement(Text15, { style: [styles7.badgeText, { color: wasReopened ? colors.yellowLight : statusConfig.color }] }, wasReopened ? "Reopened" : statusConfig.label)), severityConfig && /* @__PURE__ */ React17.createElement(View17, { style: [styles7.badge, { backgroundColor: severityConfig.bg }] }, /* @__PURE__ */ React17.createElement(Text15, { style: [styles7.badgeText, { color: severityConfig.color }] }, severityConfig.label))), /* @__PURE__ */ React17.createElement(Text15, { style: styles7.title }, issue.title), issue.route && /* @__PURE__ */ React17.createElement(Text15, { style: styles7.route }, issue.route), issue.description && /* @__PURE__ */ React17.createElement(View17, { style: styles7.descriptionCard }, /* @__PURE__ */ React17.createElement(Text15, { style: styles7.descriptionText }, issue.description)), wasReopened && /* @__PURE__ */ React17.createElement(View17, { style: styles7.reopenedCard }, /* @__PURE__ */ React17.createElement(View17, { style: styles7.reopenedRow }, /* @__PURE__ */ React17.createElement(Text15, { style: styles7.reopenedIcon }, "\u{1F504}"), /* @__PURE__ */ React17.createElement(Text15, { style: styles7.reopenedText }, "Issue reopened \u2014 your team has been notified"))), issue.verifiedByName && !wasReopened && /* @__PURE__ */ React17.createElement(View17, { style: styles7.verifiedCard }, /* @__PURE__ */ React17.createElement(View17, { style: styles7.verifiedHeader }, /* @__PURE__ */ React17.createElement(Text15, { style: styles7.verifiedIcon }, "\u2705"), /* @__PURE__ */ React17.createElement(Text15, { style: styles7.verifiedTitle }, "Retesting Proof")), /* @__PURE__ */ React17.createElement(Text15, { 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__ */ React17.createElement(View17, { style: styles7.originalBugCard }, /* @__PURE__ */ React17.createElement(View17, { style: styles7.originalBugHeader }, /* @__PURE__ */ React17.createElement(Text15, { style: styles7.originalBugIcon }, "\u{1F504}"), /* @__PURE__ */ React17.createElement(Text15, { style: styles7.originalBugTitleText }, "Original Bug")), /* @__PURE__ */ React17.createElement(Text15, { style: styles7.originalBugBody }, "Retest of: ", issue.originalBugTitle)), isDone && !wasReopened && !showReopenForm && /* @__PURE__ */ React17.createElement(
|
|
18274
18362
|
TouchableOpacity14,
|
|
18275
18363
|
{
|
|
18276
|
-
style:
|
|
18364
|
+
style: styles7.reopenButton,
|
|
18277
18365
|
onPress: () => setShowReopenForm(true),
|
|
18278
18366
|
activeOpacity: 0.7
|
|
18279
18367
|
},
|
|
18280
|
-
/* @__PURE__ */ React17.createElement(Text15, { style:
|
|
18281
|
-
), showReopenForm && !wasReopened && /* @__PURE__ */ React17.createElement(View17, { style:
|
|
18368
|
+
/* @__PURE__ */ React17.createElement(Text15, { style: styles7.reopenButtonText }, "\u{1F504}", " Not Fixed \u2014 Reopen Issue")
|
|
18369
|
+
), showReopenForm && !wasReopened && /* @__PURE__ */ React17.createElement(View17, { style: styles7.reopenForm }, /* @__PURE__ */ React17.createElement(Text15, { style: styles7.reopenFormTitle }, "Why isn't this fixed?"), /* @__PURE__ */ React17.createElement(
|
|
18282
18370
|
TextInput9,
|
|
18283
18371
|
{
|
|
18284
18372
|
value: reopenReason,
|
|
18285
18373
|
onChangeText: setReopenReason,
|
|
18286
18374
|
placeholder: "Describe what you're still seeing...",
|
|
18287
18375
|
placeholderTextColor: colors.textMuted,
|
|
18288
|
-
style:
|
|
18376
|
+
style: styles7.reopenInput,
|
|
18289
18377
|
multiline: true,
|
|
18290
18378
|
autoFocus: true
|
|
18291
18379
|
}
|
|
18292
|
-
), reopenError && /* @__PURE__ */ React17.createElement(Text15, { style:
|
|
18380
|
+
), reopenError && /* @__PURE__ */ React17.createElement(Text15, { style: styles7.reopenErrorText }, reopenError), /* @__PURE__ */ React17.createElement(View17, { style: styles7.reopenActions }, /* @__PURE__ */ React17.createElement(
|
|
18293
18381
|
TouchableOpacity14,
|
|
18294
18382
|
{
|
|
18295
18383
|
style: [
|
|
18296
|
-
|
|
18297
|
-
(!reopenReason.trim() || isSubmitting) &&
|
|
18384
|
+
styles7.reopenSubmitButton,
|
|
18385
|
+
(!reopenReason.trim() || isSubmitting) && styles7.reopenSubmitDisabled
|
|
18298
18386
|
],
|
|
18299
18387
|
onPress: handleReopen,
|
|
18300
18388
|
disabled: isSubmitting || !reopenReason.trim(),
|
|
18301
18389
|
activeOpacity: 0.7
|
|
18302
18390
|
},
|
|
18303
18391
|
isSubmitting ? /* @__PURE__ */ React17.createElement(ActivityIndicator2, { size: "small", color: "#fff" }) : /* @__PURE__ */ React17.createElement(Text15, { style: [
|
|
18304
|
-
|
|
18305
|
-
!reopenReason.trim() &&
|
|
18392
|
+
styles7.reopenSubmitText,
|
|
18393
|
+
!reopenReason.trim() && styles7.reopenSubmitTextDisabled
|
|
18306
18394
|
] }, "Reopen Issue")
|
|
18307
18395
|
), /* @__PURE__ */ React17.createElement(
|
|
18308
18396
|
TouchableOpacity14,
|
|
18309
18397
|
{
|
|
18310
|
-
style:
|
|
18398
|
+
style: styles7.reopenCancelButton,
|
|
18311
18399
|
onPress: () => {
|
|
18312
18400
|
setShowReopenForm(false);
|
|
18313
18401
|
setReopenReason("");
|
|
@@ -18316,7 +18404,7 @@ function IssueDetailScreen({ nav, issue }) {
|
|
|
18316
18404
|
disabled: isSubmitting,
|
|
18317
18405
|
activeOpacity: 0.7
|
|
18318
18406
|
},
|
|
18319
|
-
/* @__PURE__ */ React17.createElement(Text15, { style:
|
|
18407
|
+
/* @__PURE__ */ React17.createElement(Text15, { style: styles7.reopenCancelText }, "Cancel")
|
|
18320
18408
|
))), issue.status === "ready_to_test" && (issue.fixCommitSha || issue.resolutionNotes) && /* @__PURE__ */ React17.createElement(View17, { style: {
|
|
18321
18409
|
backgroundColor: "rgba(59, 130, 246, 0.1)",
|
|
18322
18410
|
borderWidth: 1,
|
|
@@ -18324,14 +18412,14 @@ function IssueDetailScreen({ nav, issue }) {
|
|
|
18324
18412
|
borderRadius: 8,
|
|
18325
18413
|
padding: 12,
|
|
18326
18414
|
marginBottom: 12
|
|
18327
|
-
} }, /* @__PURE__ */ React17.createElement(View17, { style: { flexDirection: "row", alignItems: "center", gap: 6, marginBottom: 8 } }, /* @__PURE__ */ React17.createElement(Text15, { style: { fontSize: 13 } }, "\u{1F527}"), /* @__PURE__ */ React17.createElement(Text15, { style: { fontSize: 12, fontWeight: "600", color: "#60a5fa" } }, "Fix Details")), issue.resolutionNotes ? /* @__PURE__ */ React17.createElement(Text15, { style: { fontSize: 12, color: colors.textSecondary, marginBottom: 6, lineHeight: 17 } }, issue.resolutionNotes) : null, issue.fixCommitSha ? /* @__PURE__ */ React17.createElement(Text15, { 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__ */ React17.createElement(Text15, { 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__ */ React17.createElement(View17, { style:
|
|
18415
|
+
} }, /* @__PURE__ */ React17.createElement(View17, { style: { flexDirection: "row", alignItems: "center", gap: 6, marginBottom: 8 } }, /* @__PURE__ */ React17.createElement(Text15, { style: { fontSize: 13 } }, "\u{1F527}"), /* @__PURE__ */ React17.createElement(Text15, { style: { fontSize: 12, fontWeight: "600", color: "#60a5fa" } }, "Fix Details")), issue.resolutionNotes ? /* @__PURE__ */ React17.createElement(Text15, { style: { fontSize: 12, color: colors.textSecondary, marginBottom: 6, lineHeight: 17 } }, issue.resolutionNotes) : null, issue.fixCommitSha ? /* @__PURE__ */ React17.createElement(Text15, { 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__ */ React17.createElement(Text15, { 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__ */ React17.createElement(View17, { style: styles7.screenshotSection }, /* @__PURE__ */ React17.createElement(Text15, { style: styles7.screenshotLabel }, "Screenshots (", issue.screenshotUrls.length, ")"), /* @__PURE__ */ React17.createElement(View17, { style: styles7.screenshotRow }, issue.screenshotUrls.map((url, i) => /* @__PURE__ */ React17.createElement(TouchableOpacity14, { key: i, onPress: () => Linking4.openURL(url), activeOpacity: 0.7 }, /* @__PURE__ */ React17.createElement(Image3, { source: { uri: url }, style: styles7.screenshotThumb }))))), /* @__PURE__ */ React17.createElement(View17, { style: styles7.metaSection }, issue.reporterName && /* @__PURE__ */ React17.createElement(Text15, { style: styles7.metaText }, "Reported by ", issue.reporterName), /* @__PURE__ */ React17.createElement(Text15, { style: styles7.metaTextSmall }, "Created ", formatRelativeTime(issue.createdAt), " ", "\xB7", " Updated ", formatRelativeTime(issue.updatedAt))), dashboardUrl && /* @__PURE__ */ React17.createElement(
|
|
18328
18416
|
TouchableOpacity14,
|
|
18329
18417
|
{
|
|
18330
|
-
style:
|
|
18418
|
+
style: styles7.dashboardLink,
|
|
18331
18419
|
onPress: () => Linking4.openURL(`${dashboardUrl}/reports`),
|
|
18332
18420
|
activeOpacity: 0.7
|
|
18333
18421
|
},
|
|
18334
|
-
/* @__PURE__ */ React17.createElement(Text15, { style:
|
|
18422
|
+
/* @__PURE__ */ React17.createElement(Text15, { style: styles7.dashboardLinkText }, "\u{1F310}", " View on Dashboard ", "\u2192")
|
|
18335
18423
|
));
|
|
18336
18424
|
}
|
|
18337
18425
|
function createStyles12() {
|
|
@@ -18588,7 +18676,7 @@ import React18, { useState as useState15, useMemo as useMemo13 } from "react";
|
|
|
18588
18676
|
import { View as View18, Text as Text16, TextInput as TextInput10, TouchableOpacity as TouchableOpacity15, StyleSheet as StyleSheet18, Keyboard as Keyboard2 } from "react-native";
|
|
18589
18677
|
function SessionStartScreen({ nav }) {
|
|
18590
18678
|
const { startSession, assignments, widgetColorScheme } = useBugBear();
|
|
18591
|
-
const
|
|
18679
|
+
const styles7 = useMemo13(() => createStyles13(), [widgetColorScheme]);
|
|
18592
18680
|
const [focusArea, setFocusArea] = useState15("");
|
|
18593
18681
|
const [isStarting, setIsStarting] = useState15(false);
|
|
18594
18682
|
const [error, setError] = useState15(null);
|
|
@@ -18615,35 +18703,35 @@ function SessionStartScreen({ nav }) {
|
|
|
18615
18703
|
setIsStarting(false);
|
|
18616
18704
|
}
|
|
18617
18705
|
};
|
|
18618
|
-
return /* @__PURE__ */ React18.createElement(View18, null, /* @__PURE__ */ React18.createElement(View18, { style:
|
|
18706
|
+
return /* @__PURE__ */ React18.createElement(View18, null, /* @__PURE__ */ React18.createElement(View18, { style: styles7.header }, /* @__PURE__ */ React18.createElement(Text16, { style: styles7.headerIcon }, "\u{1F50D}"), /* @__PURE__ */ React18.createElement(Text16, { style: styles7.headerDesc }, "Start an exploratory QA session. Log findings as you go \u2014 bugs, concerns, suggestions, or questions.")), /* @__PURE__ */ React18.createElement(View18, { style: styles7.inputSection }, /* @__PURE__ */ React18.createElement(Text16, { style: styles7.label }, "What are you testing?"), /* @__PURE__ */ React18.createElement(
|
|
18619
18707
|
TextInput10,
|
|
18620
18708
|
{
|
|
18621
18709
|
value: focusArea,
|
|
18622
18710
|
onChangeText: setFocusArea,
|
|
18623
18711
|
placeholder: "e.g. Checkout flow, Settings page...",
|
|
18624
18712
|
placeholderTextColor: colors.textMuted,
|
|
18625
|
-
style:
|
|
18713
|
+
style: styles7.input,
|
|
18626
18714
|
returnKeyType: "done",
|
|
18627
18715
|
onSubmitEditing: handleStart
|
|
18628
18716
|
}
|
|
18629
|
-
)), trackNames.length > 0 && /* @__PURE__ */ React18.createElement(View18, { style:
|
|
18717
|
+
)), trackNames.length > 0 && /* @__PURE__ */ React18.createElement(View18, { style: styles7.chipsSection }, /* @__PURE__ */ React18.createElement(Text16, { style: styles7.chipsLabel }, "Quick pick:"), /* @__PURE__ */ React18.createElement(View18, { style: styles7.chipsRow }, trackNames.map((name) => /* @__PURE__ */ React18.createElement(
|
|
18630
18718
|
TouchableOpacity15,
|
|
18631
18719
|
{
|
|
18632
18720
|
key: name,
|
|
18633
|
-
style: [
|
|
18721
|
+
style: [styles7.chip, focusArea === name && styles7.chipActive],
|
|
18634
18722
|
onPress: () => setFocusArea(name),
|
|
18635
18723
|
activeOpacity: 0.7
|
|
18636
18724
|
},
|
|
18637
|
-
/* @__PURE__ */ React18.createElement(Text16, { style: [
|
|
18638
|
-
)))), error && /* @__PURE__ */ React18.createElement(View18, { style:
|
|
18725
|
+
/* @__PURE__ */ React18.createElement(Text16, { style: [styles7.chipText, focusArea === name && styles7.chipTextActive] }, name)
|
|
18726
|
+
)))), error && /* @__PURE__ */ React18.createElement(View18, { style: styles7.errorBox }, /* @__PURE__ */ React18.createElement(Text16, { style: styles7.errorText }, error)), /* @__PURE__ */ React18.createElement(
|
|
18639
18727
|
TouchableOpacity15,
|
|
18640
18728
|
{
|
|
18641
|
-
style: [
|
|
18729
|
+
style: [styles7.startBtn, isStarting && styles7.startBtnDisabled],
|
|
18642
18730
|
onPress: handleStart,
|
|
18643
18731
|
disabled: isStarting,
|
|
18644
18732
|
activeOpacity: 0.8
|
|
18645
18733
|
},
|
|
18646
|
-
/* @__PURE__ */ React18.createElement(Text16, { style:
|
|
18734
|
+
/* @__PURE__ */ React18.createElement(Text16, { style: styles7.startBtnText }, isStarting ? "Starting..." : "\u25B6 Start Session")
|
|
18647
18735
|
));
|
|
18648
18736
|
}
|
|
18649
18737
|
function createStyles13() {
|
|
@@ -18752,7 +18840,7 @@ import React19, { useState as useState16, useEffect as useEffect11, useRef as us
|
|
|
18752
18840
|
import { View as View19, Text as Text17, TouchableOpacity as TouchableOpacity16, StyleSheet as StyleSheet19 } from "react-native";
|
|
18753
18841
|
function SessionActiveScreen({ nav }) {
|
|
18754
18842
|
const { activeSession, sessionFindings, endSession, refreshSession, widgetColorScheme } = useBugBear();
|
|
18755
|
-
const
|
|
18843
|
+
const styles7 = useMemo14(() => createStyles14(), [widgetColorScheme]);
|
|
18756
18844
|
const FINDING_TYPE_CONFIG = useMemo14(() => ({
|
|
18757
18845
|
bug: { icon: "\u{1F41B}", label: "Bug", color: colors.red },
|
|
18758
18846
|
concern: { icon: "\u26A0\uFE0F", label: "Concern", color: colors.amber },
|
|
@@ -18794,30 +18882,38 @@ function SessionActiveScreen({ nav }) {
|
|
|
18794
18882
|
}
|
|
18795
18883
|
};
|
|
18796
18884
|
if (!activeSession) {
|
|
18797
|
-
return /* @__PURE__ */ React19.createElement(View19, { style:
|
|
18885
|
+
return /* @__PURE__ */ React19.createElement(View19, { style: styles7.emptyContainer }, /* @__PURE__ */ React19.createElement(Text17, { style: styles7.emptyText }, "No active session"), /* @__PURE__ */ React19.createElement(TouchableOpacity16, { onPress: () => nav.replace({ name: "SESSION_START" }) }, /* @__PURE__ */ React19.createElement(Text17, { style: styles7.emptyLink }, "Start a new session")));
|
|
18798
18886
|
}
|
|
18799
18887
|
const renderFinding = (finding) => {
|
|
18800
18888
|
const config = FINDING_TYPE_CONFIG[finding.type] || FINDING_TYPE_CONFIG.bug;
|
|
18801
|
-
return /* @__PURE__ */ React19.createElement(View19, { key: finding.id, style:
|
|
18889
|
+
return /* @__PURE__ */ React19.createElement(View19, { key: finding.id, style: styles7.findingRow }, /* @__PURE__ */ React19.createElement(Text17, { style: styles7.findingIcon }, config.icon), /* @__PURE__ */ React19.createElement(View19, { style: styles7.findingContent }, /* @__PURE__ */ React19.createElement(Text17, { style: styles7.findingTitle, numberOfLines: 1 }, finding.title), /* @__PURE__ */ React19.createElement(View19, { style: styles7.findingMeta }, /* @__PURE__ */ React19.createElement(Text17, { style: [styles7.findingType, { color: config.color }] }, config.label), /* @__PURE__ */ React19.createElement(Text17, { style: styles7.findingSeverity }, finding.severity), finding.convertedToBugId && /* @__PURE__ */ React19.createElement(Text17, { style: styles7.findingConverted }, "\u2192 Bug filed"))));
|
|
18802
18890
|
};
|
|
18803
|
-
return /* @__PURE__ */ React19.createElement(View19, null, /* @__PURE__ */ React19.createElement(View19, { style:
|
|
18891
|
+
return /* @__PURE__ */ React19.createElement(View19, null, /* @__PURE__ */ React19.createElement(View19, { style: styles7.timerCard }, /* @__PURE__ */ React19.createElement(View19, { style: styles7.recordingRow }, /* @__PURE__ */ React19.createElement(View19, { style: styles7.recordingDot }), /* @__PURE__ */ React19.createElement(Text17, { style: styles7.recordingLabel }, "Recording")), /* @__PURE__ */ React19.createElement(Text17, { style: styles7.timerText }, formatTimer(elapsed)), activeSession.focusArea ? /* @__PURE__ */ React19.createElement(Text17, { style: styles7.focusArea }, activeSession.focusArea) : null), /* @__PURE__ */ React19.createElement(View19, { style: styles7.actionRow }, /* @__PURE__ */ React19.createElement(
|
|
18804
18892
|
TouchableOpacity16,
|
|
18805
18893
|
{
|
|
18806
|
-
style:
|
|
18894
|
+
style: styles7.addFindingBtn,
|
|
18807
18895
|
onPress: () => nav.push({ name: "SESSION_FINDING" }),
|
|
18808
18896
|
activeOpacity: 0.8
|
|
18809
18897
|
},
|
|
18810
|
-
/* @__PURE__ */ React19.createElement(Text17, { style:
|
|
18898
|
+
/* @__PURE__ */ React19.createElement(Text17, { style: styles7.addFindingText }, "+ Add Finding")
|
|
18899
|
+
), nav.minimizeToAdHoc && /* @__PURE__ */ React19.createElement(
|
|
18900
|
+
TouchableOpacity16,
|
|
18901
|
+
{
|
|
18902
|
+
style: styles7.minimizeBtn,
|
|
18903
|
+
onPress: nav.minimizeToAdHoc,
|
|
18904
|
+
activeOpacity: 0.8
|
|
18905
|
+
},
|
|
18906
|
+
/* @__PURE__ */ React19.createElement(Text17, { style: styles7.minimizeBtnText }, "\u2199")
|
|
18811
18907
|
), /* @__PURE__ */ React19.createElement(
|
|
18812
18908
|
TouchableOpacity16,
|
|
18813
18909
|
{
|
|
18814
|
-
style: [
|
|
18910
|
+
style: [styles7.endBtn, isEnding && styles7.endBtnDisabled],
|
|
18815
18911
|
onPress: handleEnd,
|
|
18816
18912
|
disabled: isEnding,
|
|
18817
18913
|
activeOpacity: 0.8
|
|
18818
18914
|
},
|
|
18819
|
-
/* @__PURE__ */ React19.createElement(Text17, { style:
|
|
18820
|
-
)), /* @__PURE__ */ React19.createElement(Text17, { style:
|
|
18915
|
+
/* @__PURE__ */ React19.createElement(Text17, { style: styles7.endBtnText }, isEnding ? "..." : "End")
|
|
18916
|
+
)), /* @__PURE__ */ React19.createElement(Text17, { style: styles7.sectionTitle }, "Findings (", sessionFindings.length, ")"), sessionFindings.length === 0 ? /* @__PURE__ */ React19.createElement(View19, { style: styles7.emptyFindings }, /* @__PURE__ */ React19.createElement(Text17, { style: styles7.emptyFindingsIcon }, "\u{1F4CB}"), /* @__PURE__ */ React19.createElement(Text17, { style: styles7.emptyFindingsText }, 'No findings yet. Tap "Add Finding" to log something.')) : /* @__PURE__ */ React19.createElement(View19, { style: styles7.findingsList }, sessionFindings.map(renderFinding)));
|
|
18821
18917
|
}
|
|
18822
18918
|
function createStyles14() {
|
|
18823
18919
|
return StyleSheet19.create({
|
|
@@ -18894,6 +18990,21 @@ function createStyles14() {
|
|
|
18894
18990
|
fontWeight: "600",
|
|
18895
18991
|
color: colors.blueLight
|
|
18896
18992
|
},
|
|
18993
|
+
minimizeBtn: {
|
|
18994
|
+
paddingVertical: 12,
|
|
18995
|
+
paddingHorizontal: 16,
|
|
18996
|
+
backgroundColor: colors.card,
|
|
18997
|
+
borderWidth: 1,
|
|
18998
|
+
borderColor: colors.border,
|
|
18999
|
+
borderRadius: 10,
|
|
19000
|
+
alignItems: "center",
|
|
19001
|
+
justifyContent: "center"
|
|
19002
|
+
},
|
|
19003
|
+
minimizeBtnText: {
|
|
19004
|
+
fontSize: 14,
|
|
19005
|
+
fontWeight: "600",
|
|
19006
|
+
color: colors.textSecondary
|
|
19007
|
+
},
|
|
18897
19008
|
endBtn: {
|
|
18898
19009
|
paddingVertical: 12,
|
|
18899
19010
|
paddingHorizontal: 16,
|
|
@@ -18995,7 +19106,7 @@ var FINDING_TYPES = [
|
|
|
18995
19106
|
];
|
|
18996
19107
|
function SessionFindingScreen({ nav }) {
|
|
18997
19108
|
const { addFinding, widgetColorScheme } = useBugBear();
|
|
18998
|
-
const
|
|
19109
|
+
const styles7 = useMemo15(() => createStyles15(), [widgetColorScheme]);
|
|
18999
19110
|
const SEVERITIES = useMemo15(() => [
|
|
19000
19111
|
{ value: "critical", label: "Critical", color: colors.red },
|
|
19001
19112
|
{ value: "high", label: "High", color: colors.orange },
|
|
@@ -19027,46 +19138,46 @@ function SessionFindingScreen({ nav }) {
|
|
|
19027
19138
|
}
|
|
19028
19139
|
};
|
|
19029
19140
|
const canSubmit = title.trim().length > 0 && !isSubmitting;
|
|
19030
|
-
return /* @__PURE__ */ React20.createElement(View20, null, /* @__PURE__ */ React20.createElement(View20, { style:
|
|
19141
|
+
return /* @__PURE__ */ React20.createElement(View20, null, /* @__PURE__ */ React20.createElement(View20, { style: styles7.section }, /* @__PURE__ */ React20.createElement(Text18, { style: styles7.sectionLabel }, "Type"), /* @__PURE__ */ React20.createElement(View20, { style: styles7.typeRow }, FINDING_TYPES.map((ft) => /* @__PURE__ */ React20.createElement(
|
|
19031
19142
|
TouchableOpacity17,
|
|
19032
19143
|
{
|
|
19033
19144
|
key: ft.value,
|
|
19034
|
-
style: [
|
|
19145
|
+
style: [styles7.typePill, type === ft.value && styles7.typePillActive],
|
|
19035
19146
|
onPress: () => setType(ft.value),
|
|
19036
19147
|
activeOpacity: 0.7
|
|
19037
19148
|
},
|
|
19038
|
-
/* @__PURE__ */ React20.createElement(Text18, { style:
|
|
19039
|
-
/* @__PURE__ */ React20.createElement(Text18, { style: [
|
|
19040
|
-
)))), /* @__PURE__ */ React20.createElement(View20, { style:
|
|
19149
|
+
/* @__PURE__ */ React20.createElement(Text18, { style: styles7.typePillIcon }, ft.icon),
|
|
19150
|
+
/* @__PURE__ */ React20.createElement(Text18, { style: [styles7.typePillLabel, type === ft.value && styles7.typePillLabelActive] }, ft.label)
|
|
19151
|
+
)))), /* @__PURE__ */ React20.createElement(View20, { style: styles7.section }, /* @__PURE__ */ React20.createElement(Text18, { style: styles7.sectionLabel }, "Severity"), /* @__PURE__ */ React20.createElement(View20, { style: styles7.severityRow }, SEVERITIES.map((s2) => /* @__PURE__ */ React20.createElement(
|
|
19041
19152
|
TouchableOpacity17,
|
|
19042
19153
|
{
|
|
19043
19154
|
key: s2.value,
|
|
19044
19155
|
style: [
|
|
19045
|
-
|
|
19156
|
+
styles7.severityPill,
|
|
19046
19157
|
severity === s2.value && { backgroundColor: `${s2.color}20`, borderColor: s2.color }
|
|
19047
19158
|
],
|
|
19048
19159
|
onPress: () => setSeverity(s2.value),
|
|
19049
19160
|
activeOpacity: 0.7
|
|
19050
19161
|
},
|
|
19051
|
-
/* @__PURE__ */ React20.createElement(Text18, { style: [
|
|
19052
|
-
)))), /* @__PURE__ */ React20.createElement(View20, { style:
|
|
19162
|
+
/* @__PURE__ */ React20.createElement(Text18, { style: [styles7.severityText, severity === s2.value && { color: s2.color }] }, s2.label)
|
|
19163
|
+
)))), /* @__PURE__ */ React20.createElement(View20, { style: styles7.inputSection }, /* @__PURE__ */ React20.createElement(
|
|
19053
19164
|
TextInput11,
|
|
19054
19165
|
{
|
|
19055
19166
|
value: title,
|
|
19056
19167
|
onChangeText: setTitle,
|
|
19057
19168
|
placeholder: "What did you find?",
|
|
19058
19169
|
placeholderTextColor: colors.textMuted,
|
|
19059
|
-
style:
|
|
19170
|
+
style: styles7.titleInput,
|
|
19060
19171
|
returnKeyType: "next"
|
|
19061
19172
|
}
|
|
19062
|
-
)), /* @__PURE__ */ React20.createElement(View20, { style:
|
|
19173
|
+
)), /* @__PURE__ */ React20.createElement(View20, { style: styles7.inputSection }, /* @__PURE__ */ React20.createElement(
|
|
19063
19174
|
TextInput11,
|
|
19064
19175
|
{
|
|
19065
19176
|
value: description,
|
|
19066
19177
|
onChangeText: setDescription,
|
|
19067
19178
|
placeholder: "Details (optional)",
|
|
19068
19179
|
placeholderTextColor: colors.textMuted,
|
|
19069
|
-
style:
|
|
19180
|
+
style: styles7.descInput,
|
|
19070
19181
|
multiline: true,
|
|
19071
19182
|
numberOfLines: 3,
|
|
19072
19183
|
textAlignVertical: "top"
|
|
@@ -19074,12 +19185,12 @@ function SessionFindingScreen({ nav }) {
|
|
|
19074
19185
|
)), /* @__PURE__ */ React20.createElement(
|
|
19075
19186
|
TouchableOpacity17,
|
|
19076
19187
|
{
|
|
19077
|
-
style: [
|
|
19188
|
+
style: [styles7.submitBtn, !canSubmit && styles7.submitBtnDisabled],
|
|
19078
19189
|
onPress: handleSubmit,
|
|
19079
19190
|
disabled: !canSubmit,
|
|
19080
19191
|
activeOpacity: 0.8
|
|
19081
19192
|
},
|
|
19082
|
-
/* @__PURE__ */ React20.createElement(Text18, { style: [
|
|
19193
|
+
/* @__PURE__ */ React20.createElement(Text18, { style: [styles7.submitBtnText, !canSubmit && styles7.submitBtnTextDisabled] }, isSubmitting ? "Saving..." : "Save Finding")
|
|
19083
19194
|
));
|
|
19084
19195
|
}
|
|
19085
19196
|
function createStyles15() {
|
|
@@ -19464,10 +19575,376 @@ var styles4 = StyleSheet21.create({
|
|
|
19464
19575
|
}
|
|
19465
19576
|
});
|
|
19466
19577
|
|
|
19467
|
-
// src/
|
|
19578
|
+
// src/widget/AdHocOverlay.tsx
|
|
19579
|
+
import React22, { useState as useState19, useEffect as useEffect13, useCallback as useCallback7, useRef as useRef8 } from "react";
|
|
19580
|
+
import {
|
|
19581
|
+
View as View22,
|
|
19582
|
+
Text as Text20,
|
|
19583
|
+
TextInput as TextInput12,
|
|
19584
|
+
TouchableOpacity as TouchableOpacity19,
|
|
19585
|
+
StyleSheet as StyleSheet22,
|
|
19586
|
+
Animated as Animated4,
|
|
19587
|
+
PanResponder as PanResponder2,
|
|
19588
|
+
Dimensions as Dimensions3,
|
|
19589
|
+
Platform as Platform6,
|
|
19590
|
+
Keyboard as Keyboard4
|
|
19591
|
+
} from "react-native";
|
|
19468
19592
|
var screenWidth2 = Dimensions3.get("window").width;
|
|
19469
19593
|
var screenHeight2 = Dimensions3.get("window").height;
|
|
19594
|
+
var OVERLAY_WIDTH = 280;
|
|
19595
|
+
var OVERLAY_MARGIN = 16;
|
|
19596
|
+
var MIN_Y2 = 80;
|
|
19470
19597
|
var BOTTOM_SAFE_PADDING2 = Platform6.OS === "ios" ? 34 : 24;
|
|
19598
|
+
var SAFE_MAX_Y2 = screenHeight2 - 200 - BOTTOM_SAFE_PADDING2;
|
|
19599
|
+
function AdHocOverlay({ sessionId, focusArea, startedAt, onExpand, onComplete }) {
|
|
19600
|
+
const { client, addFinding, endSession, activeSession } = useBugBear();
|
|
19601
|
+
const [inputMode, setInputMode] = useState19("closed");
|
|
19602
|
+
const [inputText, setInputText] = useState19("");
|
|
19603
|
+
const [isSubmitting, setIsSubmitting] = useState19(false);
|
|
19604
|
+
const [flashMessage, setFlashMessage] = useState19(null);
|
|
19605
|
+
const [elapsedTime, setElapsedTime] = useState19(0);
|
|
19606
|
+
const inputRef = useRef8(null);
|
|
19607
|
+
const screenshotRef = useRef8(null);
|
|
19608
|
+
const mountAnim = useRef8(new Animated4.Value(0)).current;
|
|
19609
|
+
useEffect13(() => {
|
|
19610
|
+
Animated4.spring(mountAnim, { toValue: 1, useNativeDriver: true, tension: 80, friction: 10 }).start();
|
|
19611
|
+
}, []);
|
|
19612
|
+
const pan = useRef8(new Animated4.ValueXY({
|
|
19613
|
+
x: screenWidth2 - OVERLAY_WIDTH - OVERLAY_MARGIN,
|
|
19614
|
+
y: SAFE_MAX_Y2
|
|
19615
|
+
})).current;
|
|
19616
|
+
const panResponder = useRef8(
|
|
19617
|
+
PanResponder2.create({
|
|
19618
|
+
onStartShouldSetPanResponder: () => true,
|
|
19619
|
+
onMoveShouldSetPanResponder: (_, gs) => Math.abs(gs.dx) > 5 || Math.abs(gs.dy) > 5,
|
|
19620
|
+
onPanResponderGrant: () => {
|
|
19621
|
+
pan.setOffset({
|
|
19622
|
+
x: Math.max(OVERLAY_MARGIN, Math.min(getAnimatedValue(pan.x), screenWidth2 - OVERLAY_WIDTH - OVERLAY_MARGIN)),
|
|
19623
|
+
y: Math.max(MIN_Y2, Math.min(getAnimatedValue(pan.y), SAFE_MAX_Y2))
|
|
19624
|
+
});
|
|
19625
|
+
pan.setValue({ x: 0, y: 0 });
|
|
19626
|
+
},
|
|
19627
|
+
onPanResponderMove: Animated4.event(
|
|
19628
|
+
[null, { dx: pan.x, dy: pan.y }],
|
|
19629
|
+
{ useNativeDriver: false }
|
|
19630
|
+
),
|
|
19631
|
+
onPanResponderRelease: () => {
|
|
19632
|
+
pan.flattenOffset();
|
|
19633
|
+
const currentX = getAnimatedValue(pan.x);
|
|
19634
|
+
const currentY = getAnimatedValue(pan.y);
|
|
19635
|
+
const snapX = currentX < screenWidth2 / 2 ? OVERLAY_MARGIN : screenWidth2 - OVERLAY_WIDTH - OVERLAY_MARGIN;
|
|
19636
|
+
const snapY = Math.max(MIN_Y2, Math.min(currentY, SAFE_MAX_Y2));
|
|
19637
|
+
Animated4.spring(pan, {
|
|
19638
|
+
toValue: { x: snapX, y: snapY },
|
|
19639
|
+
useNativeDriver: false,
|
|
19640
|
+
friction: 7,
|
|
19641
|
+
tension: 40
|
|
19642
|
+
}).start();
|
|
19643
|
+
}
|
|
19644
|
+
})
|
|
19645
|
+
).current;
|
|
19646
|
+
useEffect13(() => {
|
|
19647
|
+
const startTime = new Date(startedAt).getTime();
|
|
19648
|
+
setElapsedTime(Math.floor((Date.now() - startTime) / 1e3));
|
|
19649
|
+
const interval = setInterval(() => {
|
|
19650
|
+
setElapsedTime(Math.floor((Date.now() - startTime) / 1e3));
|
|
19651
|
+
}, 1e3);
|
|
19652
|
+
return () => clearInterval(interval);
|
|
19653
|
+
}, [startedAt]);
|
|
19654
|
+
useEffect13(() => {
|
|
19655
|
+
if (inputMode !== "closed") {
|
|
19656
|
+
setTimeout(() => inputRef.current?.focus(), 50);
|
|
19657
|
+
}
|
|
19658
|
+
}, [inputMode]);
|
|
19659
|
+
const handleOpenInput = useCallback7(async (mode) => {
|
|
19660
|
+
Keyboard4.dismiss();
|
|
19661
|
+
const uri = await captureAppScreen();
|
|
19662
|
+
screenshotRef.current = uri;
|
|
19663
|
+
setInputMode(mode);
|
|
19664
|
+
setInputText("");
|
|
19665
|
+
}, []);
|
|
19666
|
+
const handleCancel = useCallback7(() => {
|
|
19667
|
+
Keyboard4.dismiss();
|
|
19668
|
+
setInputMode("closed");
|
|
19669
|
+
setInputText("");
|
|
19670
|
+
screenshotRef.current = null;
|
|
19671
|
+
}, []);
|
|
19672
|
+
const handleSend = useCallback7(async () => {
|
|
19673
|
+
if (!inputText.trim() || isSubmitting) return;
|
|
19674
|
+
Keyboard4.dismiss();
|
|
19675
|
+
setIsSubmitting(true);
|
|
19676
|
+
try {
|
|
19677
|
+
let screenshotUrl;
|
|
19678
|
+
if (screenshotRef.current && client) {
|
|
19679
|
+
screenshotUrl = await client.uploadImageFromUri(screenshotRef.current) || void 0;
|
|
19680
|
+
}
|
|
19681
|
+
const enhanced = contextCapture.getEnhancedContext();
|
|
19682
|
+
await addFinding({
|
|
19683
|
+
type: inputMode === "bug" ? "bug" : "concern",
|
|
19684
|
+
title: inputText.trim(),
|
|
19685
|
+
severity: inputMode === "bug" ? "medium" : "observation",
|
|
19686
|
+
screenshotUrl,
|
|
19687
|
+
consoleLogs: enhanced.consoleLogs,
|
|
19688
|
+
networkSnapshot: enhanced.networkRequests
|
|
19689
|
+
});
|
|
19690
|
+
setFlashMessage("Saved!");
|
|
19691
|
+
setInputMode("closed");
|
|
19692
|
+
setInputText("");
|
|
19693
|
+
screenshotRef.current = null;
|
|
19694
|
+
setTimeout(() => setFlashMessage(null), 1500);
|
|
19695
|
+
} finally {
|
|
19696
|
+
setIsSubmitting(false);
|
|
19697
|
+
}
|
|
19698
|
+
}, [inputText, isSubmitting, inputMode, client, addFinding]);
|
|
19699
|
+
const handleComplete = useCallback7(async () => {
|
|
19700
|
+
if (isSubmitting) return;
|
|
19701
|
+
Keyboard4.dismiss();
|
|
19702
|
+
setIsSubmitting(true);
|
|
19703
|
+
try {
|
|
19704
|
+
const result = await endSession();
|
|
19705
|
+
if (result.success) {
|
|
19706
|
+
const mins = activeSession?.durationMinutes ?? Math.round(elapsedTime / 60);
|
|
19707
|
+
const findings = activeSession?.findingsCount ?? 0;
|
|
19708
|
+
setFlashMessage(`Session complete! ${mins} min, ${findings} finding${findings !== 1 ? "s" : ""}`);
|
|
19709
|
+
setTimeout(() => {
|
|
19710
|
+
setFlashMessage(null);
|
|
19711
|
+
onComplete();
|
|
19712
|
+
}, 2e3);
|
|
19713
|
+
}
|
|
19714
|
+
} finally {
|
|
19715
|
+
setIsSubmitting(false);
|
|
19716
|
+
}
|
|
19717
|
+
}, [isSubmitting, endSession, activeSession, elapsedTime, onComplete]);
|
|
19718
|
+
return /* @__PURE__ */ React22.createElement(
|
|
19719
|
+
Animated4.View,
|
|
19720
|
+
{
|
|
19721
|
+
style: [
|
|
19722
|
+
styles5.container,
|
|
19723
|
+
{
|
|
19724
|
+
opacity: mountAnim,
|
|
19725
|
+
transform: [
|
|
19726
|
+
...pan.getTranslateTransform(),
|
|
19727
|
+
{ scale: mountAnim.interpolate({ inputRange: [0, 1], outputRange: [0.8, 1] }) }
|
|
19728
|
+
]
|
|
19729
|
+
}
|
|
19730
|
+
],
|
|
19731
|
+
...panResponder.panHandlers
|
|
19732
|
+
},
|
|
19733
|
+
/* @__PURE__ */ React22.createElement(View22, { style: styles5.header }, /* @__PURE__ */ React22.createElement(View22, { style: styles5.headerLeft }, /* @__PURE__ */ React22.createElement(Text20, { style: styles5.headerLabel }, "Ad Hoc"), focusArea ? /* @__PURE__ */ React22.createElement(Text20, { style: styles5.focusText, numberOfLines: 1 }, "\xB7 ", focusArea) : null, /* @__PURE__ */ React22.createElement(Text20, { style: styles5.timer }, formatElapsedTime(elapsedTime))), /* @__PURE__ */ React22.createElement(TouchableOpacity19, { onPress: onExpand, style: styles5.expandButton }, /* @__PURE__ */ React22.createElement(Text20, { style: styles5.expandText }, "\u2197"))),
|
|
19734
|
+
flashMessage ? /* @__PURE__ */ React22.createElement(View22, { style: styles5.flash }, /* @__PURE__ */ React22.createElement(Text20, { style: styles5.flashText }, flashMessage)) : null,
|
|
19735
|
+
inputMode !== "closed" && !flashMessage ? /* @__PURE__ */ React22.createElement(View22, { style: styles5.inputArea }, /* @__PURE__ */ React22.createElement(
|
|
19736
|
+
TextInput12,
|
|
19737
|
+
{
|
|
19738
|
+
ref: inputRef,
|
|
19739
|
+
value: inputText,
|
|
19740
|
+
onChangeText: setInputText,
|
|
19741
|
+
placeholder: inputMode === "bug" ? "What went wrong?" : "What did you notice?",
|
|
19742
|
+
placeholderTextColor: colors.textDim,
|
|
19743
|
+
multiline: true,
|
|
19744
|
+
numberOfLines: 2,
|
|
19745
|
+
style: styles5.textInput
|
|
19746
|
+
}
|
|
19747
|
+
), /* @__PURE__ */ React22.createElement(View22, { style: styles5.inputActions }, /* @__PURE__ */ React22.createElement(TouchableOpacity19, { onPress: handleCancel }, /* @__PURE__ */ React22.createElement(Text20, { style: styles5.cancelText }, "Cancel")), /* @__PURE__ */ React22.createElement(
|
|
19748
|
+
TouchableOpacity19,
|
|
19749
|
+
{
|
|
19750
|
+
onPress: handleSend,
|
|
19751
|
+
disabled: !inputText.trim() || isSubmitting,
|
|
19752
|
+
style: [
|
|
19753
|
+
styles5.sendBtn,
|
|
19754
|
+
{ backgroundColor: inputMode === "bug" ? colors.red : colors.blue },
|
|
19755
|
+
(!inputText.trim() || isSubmitting) && { opacity: 0.5 }
|
|
19756
|
+
]
|
|
19757
|
+
},
|
|
19758
|
+
/* @__PURE__ */ React22.createElement(Text20, { style: styles5.sendText }, isSubmitting ? "Sending..." : "Send \u2192")
|
|
19759
|
+
))) : null,
|
|
19760
|
+
inputMode === "closed" && !flashMessage ? /* @__PURE__ */ React22.createElement(View22, { style: styles5.actions }, /* @__PURE__ */ React22.createElement(
|
|
19761
|
+
TouchableOpacity19,
|
|
19762
|
+
{
|
|
19763
|
+
style: [styles5.feedbackBtn, isSubmitting && { opacity: 0.5 }],
|
|
19764
|
+
onPress: () => handleOpenInput("feedback"),
|
|
19765
|
+
disabled: isSubmitting
|
|
19766
|
+
},
|
|
19767
|
+
/* @__PURE__ */ React22.createElement(Text20, { style: styles5.feedbackText }, "Feedback")
|
|
19768
|
+
), /* @__PURE__ */ React22.createElement(
|
|
19769
|
+
TouchableOpacity19,
|
|
19770
|
+
{
|
|
19771
|
+
style: [styles5.bugBtn, isSubmitting && { opacity: 0.5 }],
|
|
19772
|
+
onPress: () => handleOpenInput("bug"),
|
|
19773
|
+
disabled: isSubmitting
|
|
19774
|
+
},
|
|
19775
|
+
/* @__PURE__ */ React22.createElement(Text20, { style: styles5.bugText }, "Bug")
|
|
19776
|
+
), /* @__PURE__ */ React22.createElement(
|
|
19777
|
+
TouchableOpacity19,
|
|
19778
|
+
{
|
|
19779
|
+
style: [styles5.completeBtn, isSubmitting && { opacity: 0.5 }],
|
|
19780
|
+
onPress: handleComplete,
|
|
19781
|
+
disabled: isSubmitting
|
|
19782
|
+
},
|
|
19783
|
+
/* @__PURE__ */ React22.createElement(Text20, { style: styles5.completeText }, "Complete")
|
|
19784
|
+
)) : null
|
|
19785
|
+
);
|
|
19786
|
+
}
|
|
19787
|
+
var styles5 = StyleSheet22.create({
|
|
19788
|
+
container: {
|
|
19789
|
+
position: "absolute",
|
|
19790
|
+
width: OVERLAY_WIDTH,
|
|
19791
|
+
zIndex: 9999,
|
|
19792
|
+
backgroundColor: colors.bg,
|
|
19793
|
+
borderRadius: 12,
|
|
19794
|
+
borderWidth: 1,
|
|
19795
|
+
borderColor: colors.border,
|
|
19796
|
+
shadowColor: "#000",
|
|
19797
|
+
shadowOffset: { width: 0, height: 8 },
|
|
19798
|
+
shadowOpacity: 0.4,
|
|
19799
|
+
shadowRadius: 16,
|
|
19800
|
+
elevation: 20,
|
|
19801
|
+
overflow: "hidden"
|
|
19802
|
+
},
|
|
19803
|
+
header: {
|
|
19804
|
+
backgroundColor: colors.bgDarker,
|
|
19805
|
+
paddingVertical: 6,
|
|
19806
|
+
paddingHorizontal: 12,
|
|
19807
|
+
flexDirection: "row",
|
|
19808
|
+
alignItems: "center",
|
|
19809
|
+
justifyContent: "space-between",
|
|
19810
|
+
borderBottomWidth: 1,
|
|
19811
|
+
borderBottomColor: colors.border
|
|
19812
|
+
},
|
|
19813
|
+
headerLeft: {
|
|
19814
|
+
flexDirection: "row",
|
|
19815
|
+
alignItems: "center",
|
|
19816
|
+
gap: 6,
|
|
19817
|
+
flex: 1
|
|
19818
|
+
},
|
|
19819
|
+
headerLabel: {
|
|
19820
|
+
fontSize: 11,
|
|
19821
|
+
color: colors.textMuted,
|
|
19822
|
+
fontWeight: "600"
|
|
19823
|
+
},
|
|
19824
|
+
focusText: {
|
|
19825
|
+
fontSize: 10,
|
|
19826
|
+
color: colors.textDim,
|
|
19827
|
+
maxWidth: 100
|
|
19828
|
+
},
|
|
19829
|
+
timer: {
|
|
19830
|
+
fontSize: 10,
|
|
19831
|
+
color: colors.green,
|
|
19832
|
+
fontWeight: "600",
|
|
19833
|
+
fontVariant: ["tabular-nums"]
|
|
19834
|
+
},
|
|
19835
|
+
expandButton: {
|
|
19836
|
+
paddingVertical: 2,
|
|
19837
|
+
paddingHorizontal: 4
|
|
19838
|
+
},
|
|
19839
|
+
expandText: {
|
|
19840
|
+
fontSize: 12,
|
|
19841
|
+
color: colors.blue,
|
|
19842
|
+
fontWeight: "500"
|
|
19843
|
+
},
|
|
19844
|
+
flash: {
|
|
19845
|
+
paddingVertical: 6,
|
|
19846
|
+
paddingHorizontal: 12,
|
|
19847
|
+
backgroundColor: colors.greenDark,
|
|
19848
|
+
alignItems: "center"
|
|
19849
|
+
},
|
|
19850
|
+
flashText: {
|
|
19851
|
+
fontSize: 12,
|
|
19852
|
+
fontWeight: "600",
|
|
19853
|
+
color: colors.greenLight
|
|
19854
|
+
},
|
|
19855
|
+
inputArea: {
|
|
19856
|
+
padding: 8,
|
|
19857
|
+
paddingHorizontal: 10
|
|
19858
|
+
},
|
|
19859
|
+
textInput: {
|
|
19860
|
+
backgroundColor: colors.card,
|
|
19861
|
+
borderWidth: 1,
|
|
19862
|
+
borderColor: colors.border,
|
|
19863
|
+
borderRadius: 8,
|
|
19864
|
+
padding: 6,
|
|
19865
|
+
paddingHorizontal: 8,
|
|
19866
|
+
color: colors.textPrimary,
|
|
19867
|
+
fontSize: 12,
|
|
19868
|
+
lineHeight: 16,
|
|
19869
|
+
minHeight: 40,
|
|
19870
|
+
textAlignVertical: "top"
|
|
19871
|
+
},
|
|
19872
|
+
inputActions: {
|
|
19873
|
+
flexDirection: "row",
|
|
19874
|
+
justifyContent: "space-between",
|
|
19875
|
+
marginTop: 6
|
|
19876
|
+
},
|
|
19877
|
+
cancelText: {
|
|
19878
|
+
fontSize: 11,
|
|
19879
|
+
color: colors.textMuted,
|
|
19880
|
+
paddingVertical: 4,
|
|
19881
|
+
paddingHorizontal: 8
|
|
19882
|
+
},
|
|
19883
|
+
sendBtn: {
|
|
19884
|
+
paddingVertical: 4,
|
|
19885
|
+
paddingHorizontal: 14,
|
|
19886
|
+
borderRadius: 6
|
|
19887
|
+
},
|
|
19888
|
+
sendText: {
|
|
19889
|
+
fontSize: 11,
|
|
19890
|
+
fontWeight: "600",
|
|
19891
|
+
color: "#fff"
|
|
19892
|
+
},
|
|
19893
|
+
actions: {
|
|
19894
|
+
flexDirection: "row",
|
|
19895
|
+
gap: 6,
|
|
19896
|
+
padding: 8,
|
|
19897
|
+
paddingHorizontal: 10,
|
|
19898
|
+
paddingBottom: 10
|
|
19899
|
+
},
|
|
19900
|
+
feedbackBtn: {
|
|
19901
|
+
flex: 1,
|
|
19902
|
+
paddingVertical: 8,
|
|
19903
|
+
borderRadius: 8,
|
|
19904
|
+
backgroundColor: colors.blueDark,
|
|
19905
|
+
borderWidth: 1,
|
|
19906
|
+
borderColor: `${colors.blue}40`,
|
|
19907
|
+
alignItems: "center"
|
|
19908
|
+
},
|
|
19909
|
+
feedbackText: {
|
|
19910
|
+
fontSize: 11,
|
|
19911
|
+
fontWeight: "600",
|
|
19912
|
+
color: colors.blueLight
|
|
19913
|
+
},
|
|
19914
|
+
bugBtn: {
|
|
19915
|
+
flex: 1,
|
|
19916
|
+
paddingVertical: 8,
|
|
19917
|
+
borderRadius: 8,
|
|
19918
|
+
backgroundColor: colors.redDark,
|
|
19919
|
+
borderWidth: 1,
|
|
19920
|
+
borderColor: colors.red,
|
|
19921
|
+
alignItems: "center"
|
|
19922
|
+
},
|
|
19923
|
+
bugText: {
|
|
19924
|
+
fontSize: 11,
|
|
19925
|
+
fontWeight: "600",
|
|
19926
|
+
color: colors.redLight
|
|
19927
|
+
},
|
|
19928
|
+
completeBtn: {
|
|
19929
|
+
flex: 1,
|
|
19930
|
+
paddingVertical: 8,
|
|
19931
|
+
borderRadius: 8,
|
|
19932
|
+
backgroundColor: colors.greenDark,
|
|
19933
|
+
borderWidth: 1,
|
|
19934
|
+
borderColor: colors.green,
|
|
19935
|
+
alignItems: "center"
|
|
19936
|
+
},
|
|
19937
|
+
completeText: {
|
|
19938
|
+
fontSize: 11,
|
|
19939
|
+
fontWeight: "600",
|
|
19940
|
+
color: colors.greenLight
|
|
19941
|
+
}
|
|
19942
|
+
});
|
|
19943
|
+
|
|
19944
|
+
// src/BugBearButton.tsx
|
|
19945
|
+
var screenWidth3 = Dimensions4.get("window").width;
|
|
19946
|
+
var screenHeight3 = Dimensions4.get("window").height;
|
|
19947
|
+
var BOTTOM_SAFE_PADDING3 = Platform7.OS === "ios" ? 34 : 24;
|
|
19471
19948
|
function BugBearButton({
|
|
19472
19949
|
position = "bottom-right",
|
|
19473
19950
|
buttonStyle,
|
|
@@ -19477,20 +19954,20 @@ function BugBearButton({
|
|
|
19477
19954
|
minY = 100,
|
|
19478
19955
|
maxYOffset = 160
|
|
19479
19956
|
}) {
|
|
19480
|
-
const { shouldShowWidget, testerInfo, isLoading, unreadCount, assignments, widgetMode, widgetColorScheme } = useBugBear();
|
|
19957
|
+
const { shouldShowWidget, testerInfo, isLoading, unreadCount, assignments, widgetMode, widgetColorScheme, activeSession, startSession } = useBugBear();
|
|
19481
19958
|
const { currentScreen, canGoBack, push, pop, replace, reset } = useNavigation();
|
|
19482
|
-
const [viewMode, setViewMode] =
|
|
19483
|
-
const [miniRunnerAssignmentId, setMiniRunnerAssignmentId] =
|
|
19484
|
-
const panelAnim =
|
|
19485
|
-
const
|
|
19959
|
+
const [viewMode, setViewMode] = useState20("closed");
|
|
19960
|
+
const [miniRunnerAssignmentId, setMiniRunnerAssignmentId] = useState20(null);
|
|
19961
|
+
const panelAnim = useRef9(new Animated5.Value(0)).current;
|
|
19962
|
+
const styles7 = useMemo16(() => createStyles16(), [widgetColorScheme]);
|
|
19486
19963
|
const panelVisible = viewMode === "panel";
|
|
19487
|
-
const screenCaptureRef =
|
|
19964
|
+
const screenCaptureRef = useRef9(null);
|
|
19488
19965
|
const openPanel = () => {
|
|
19489
19966
|
captureAppScreen().then((uri) => {
|
|
19490
19967
|
screenCaptureRef.current = uri;
|
|
19491
19968
|
});
|
|
19492
19969
|
setViewMode("panel");
|
|
19493
|
-
|
|
19970
|
+
Animated5.spring(panelAnim, {
|
|
19494
19971
|
toValue: 1,
|
|
19495
19972
|
useNativeDriver: true,
|
|
19496
19973
|
friction: 8,
|
|
@@ -19498,8 +19975,8 @@ function BugBearButton({
|
|
|
19498
19975
|
}).start();
|
|
19499
19976
|
};
|
|
19500
19977
|
const closePanel = () => {
|
|
19501
|
-
|
|
19502
|
-
|
|
19978
|
+
Keyboard5.dismiss();
|
|
19979
|
+
Animated5.timing(panelAnim, {
|
|
19503
19980
|
toValue: 0,
|
|
19504
19981
|
duration: 250,
|
|
19505
19982
|
useNativeDriver: true
|
|
@@ -19509,26 +19986,26 @@ function BugBearButton({
|
|
|
19509
19986
|
};
|
|
19510
19987
|
const buttonSize = 56;
|
|
19511
19988
|
const margin = 16;
|
|
19512
|
-
const safeMaxY =
|
|
19989
|
+
const safeMaxY = screenHeight3 - maxYOffset - BOTTOM_SAFE_PADDING3;
|
|
19513
19990
|
const getInitialPosition = () => {
|
|
19514
19991
|
if (initialX !== void 0 && initialY !== void 0) {
|
|
19515
19992
|
return { x: initialX, y: initialY };
|
|
19516
19993
|
}
|
|
19517
|
-
const x = position === "bottom-right" ?
|
|
19518
|
-
const y =
|
|
19994
|
+
const x = position === "bottom-right" ? screenWidth3 - buttonSize - margin : margin;
|
|
19995
|
+
const y = screenHeight3 - maxYOffset - BOTTOM_SAFE_PADDING3;
|
|
19519
19996
|
return { x, y };
|
|
19520
19997
|
};
|
|
19521
19998
|
const initialPos = getInitialPosition();
|
|
19522
|
-
const pan =
|
|
19523
|
-
const isDragging =
|
|
19524
|
-
const panResponder =
|
|
19525
|
-
|
|
19999
|
+
const pan = useRef9(new Animated5.ValueXY(initialPos)).current;
|
|
20000
|
+
const isDragging = useRef9(false);
|
|
20001
|
+
const panResponder = useRef9(
|
|
20002
|
+
PanResponder3.create({
|
|
19526
20003
|
onStartShouldSetPanResponder: () => draggable,
|
|
19527
20004
|
onMoveShouldSetPanResponder: (_, gs) => draggable && (Math.abs(gs.dx) > 5 || Math.abs(gs.dy) > 5),
|
|
19528
20005
|
onPanResponderGrant: () => {
|
|
19529
20006
|
isDragging.current = false;
|
|
19530
20007
|
pan.setOffset({
|
|
19531
|
-
x: Math.max(margin, Math.min(getAnimatedValue(pan.x),
|
|
20008
|
+
x: Math.max(margin, Math.min(getAnimatedValue(pan.x), screenWidth3 - buttonSize - margin)),
|
|
19532
20009
|
y: Math.max(minY, Math.min(getAnimatedValue(pan.y), safeMaxY))
|
|
19533
20010
|
});
|
|
19534
20011
|
pan.setValue({ x: 0, y: 0 });
|
|
@@ -19537,7 +20014,7 @@ function BugBearButton({
|
|
|
19537
20014
|
if (Math.abs(gs.dx) > 5 || Math.abs(gs.dy) > 5) {
|
|
19538
20015
|
isDragging.current = true;
|
|
19539
20016
|
}
|
|
19540
|
-
|
|
20017
|
+
Animated5.event(
|
|
19541
20018
|
[null, { dx: pan.x, dy: pan.y }],
|
|
19542
20019
|
{ useNativeDriver: false }
|
|
19543
20020
|
)(_, gs);
|
|
@@ -19546,9 +20023,9 @@ function BugBearButton({
|
|
|
19546
20023
|
pan.flattenOffset();
|
|
19547
20024
|
const currentX = getAnimatedValue(pan.x);
|
|
19548
20025
|
const currentY = getAnimatedValue(pan.y);
|
|
19549
|
-
const snapX = currentX <
|
|
20026
|
+
const snapX = currentX < screenWidth3 / 2 ? margin : screenWidth3 - buttonSize - margin;
|
|
19550
20027
|
const snapY = Math.max(minY, Math.min(currentY, safeMaxY));
|
|
19551
|
-
|
|
20028
|
+
Animated5.spring(pan, {
|
|
19552
20029
|
toValue: { x: snapX, y: snapY },
|
|
19553
20030
|
useNativeDriver: false,
|
|
19554
20031
|
friction: 7,
|
|
@@ -19563,11 +20040,11 @@ function BugBearButton({
|
|
|
19563
20040
|
).current;
|
|
19564
20041
|
const pendingTests = widgetMode === "qa" ? assignments.filter((a) => a.status === "pending" || a.status === "in_progress").length : 0;
|
|
19565
20042
|
const badgeCount = pendingTests + unreadCount;
|
|
19566
|
-
|
|
19567
|
-
if (!panelVisible ||
|
|
20043
|
+
useEffect14(() => {
|
|
20044
|
+
if (!panelVisible || Platform7.OS !== "android") return;
|
|
19568
20045
|
const handler = BackHandler.addEventListener("hardwareBackPress", () => {
|
|
19569
20046
|
if (canGoBack) {
|
|
19570
|
-
|
|
20047
|
+
Keyboard5.dismiss();
|
|
19571
20048
|
pop();
|
|
19572
20049
|
} else {
|
|
19573
20050
|
closePanel();
|
|
@@ -19576,9 +20053,9 @@ function BugBearButton({
|
|
|
19576
20053
|
});
|
|
19577
20054
|
return () => handler.remove();
|
|
19578
20055
|
}, [panelVisible, canGoBack]);
|
|
19579
|
-
const startMiniRunner =
|
|
19580
|
-
|
|
19581
|
-
|
|
20056
|
+
const startMiniRunner = useCallback8((assignId) => {
|
|
20057
|
+
Keyboard5.dismiss();
|
|
20058
|
+
Animated5.timing(panelAnim, {
|
|
19582
20059
|
toValue: 0,
|
|
19583
20060
|
duration: 200,
|
|
19584
20061
|
useNativeDriver: true
|
|
@@ -19587,40 +20064,83 @@ function BugBearButton({
|
|
|
19587
20064
|
setViewMode("mini-runner");
|
|
19588
20065
|
});
|
|
19589
20066
|
}, [panelAnim]);
|
|
19590
|
-
const expandFromMiniRunner =
|
|
20067
|
+
const expandFromMiniRunner = useCallback8(() => {
|
|
19591
20068
|
setViewMode("panel");
|
|
19592
20069
|
if (miniRunnerAssignmentId) {
|
|
19593
20070
|
replace({ name: "TEST_DETAIL", testId: miniRunnerAssignmentId });
|
|
19594
20071
|
}
|
|
19595
20072
|
setMiniRunnerAssignmentId(null);
|
|
19596
|
-
|
|
20073
|
+
Animated5.spring(panelAnim, {
|
|
19597
20074
|
toValue: 1,
|
|
19598
20075
|
useNativeDriver: true,
|
|
19599
20076
|
friction: 8,
|
|
19600
20077
|
tension: 65
|
|
19601
20078
|
}).start();
|
|
19602
20079
|
}, [miniRunnerAssignmentId, replace, panelAnim]);
|
|
19603
|
-
const handleMiniRunnerAdvance =
|
|
20080
|
+
const handleMiniRunnerAdvance = useCallback8((nextId) => {
|
|
19604
20081
|
setMiniRunnerAssignmentId(nextId);
|
|
19605
20082
|
}, []);
|
|
19606
|
-
const handleMiniRunnerComplete =
|
|
20083
|
+
const handleMiniRunnerComplete = useCallback8(() => {
|
|
19607
20084
|
setMiniRunnerAssignmentId(null);
|
|
19608
20085
|
setViewMode("closed");
|
|
19609
20086
|
}, []);
|
|
19610
|
-
const handleMiniRunnerReport =
|
|
20087
|
+
const handleMiniRunnerReport = useCallback8((assignId, testCaseId) => {
|
|
19611
20088
|
setMiniRunnerAssignmentId(null);
|
|
19612
20089
|
setViewMode("panel");
|
|
19613
20090
|
replace({
|
|
19614
20091
|
name: "REPORT",
|
|
19615
20092
|
prefill: { type: "test_fail", assignmentId: assignId, testCaseId }
|
|
19616
20093
|
});
|
|
19617
|
-
|
|
20094
|
+
Animated5.spring(panelAnim, {
|
|
20095
|
+
toValue: 1,
|
|
20096
|
+
useNativeDriver: true,
|
|
20097
|
+
friction: 8,
|
|
20098
|
+
tension: 65
|
|
20099
|
+
}).start();
|
|
20100
|
+
}, [replace, panelAnim]);
|
|
20101
|
+
const startAdHoc = useCallback8(async (taskId, focusArea) => {
|
|
20102
|
+
Keyboard5.dismiss();
|
|
20103
|
+
const result = await startSession({
|
|
20104
|
+
sessionType: "ad_hoc",
|
|
20105
|
+
taskId,
|
|
20106
|
+
focusArea,
|
|
20107
|
+
platform: "ios"
|
|
20108
|
+
});
|
|
20109
|
+
if (result.success) {
|
|
20110
|
+
Animated5.timing(panelAnim, {
|
|
20111
|
+
toValue: 0,
|
|
20112
|
+
duration: 200,
|
|
20113
|
+
useNativeDriver: true
|
|
20114
|
+
}).start(() => {
|
|
20115
|
+
setViewMode("ad-hoc");
|
|
20116
|
+
});
|
|
20117
|
+
}
|
|
20118
|
+
}, [startSession, panelAnim]);
|
|
20119
|
+
const expandFromAdHoc = useCallback8(() => {
|
|
20120
|
+
setViewMode("panel");
|
|
20121
|
+
replace({ name: "SESSION_ACTIVE" });
|
|
20122
|
+
Animated5.spring(panelAnim, {
|
|
19618
20123
|
toValue: 1,
|
|
19619
20124
|
useNativeDriver: true,
|
|
19620
20125
|
friction: 8,
|
|
19621
20126
|
tension: 65
|
|
19622
20127
|
}).start();
|
|
19623
20128
|
}, [replace, panelAnim]);
|
|
20129
|
+
const handleAdHocComplete = useCallback8(() => {
|
|
20130
|
+
setViewMode("closed");
|
|
20131
|
+
}, []);
|
|
20132
|
+
const minimizeToAdHoc = useCallback8(() => {
|
|
20133
|
+
if (activeSession?.sessionType === "ad_hoc") {
|
|
20134
|
+
Keyboard5.dismiss();
|
|
20135
|
+
Animated5.timing(panelAnim, {
|
|
20136
|
+
toValue: 0,
|
|
20137
|
+
duration: 200,
|
|
20138
|
+
useNativeDriver: true
|
|
20139
|
+
}).start(() => {
|
|
20140
|
+
setViewMode("ad-hoc");
|
|
20141
|
+
});
|
|
20142
|
+
}
|
|
20143
|
+
}, [activeSession, panelAnim]);
|
|
19624
20144
|
if (!shouldShowWidget) return null;
|
|
19625
20145
|
const getHeaderTitle = () => {
|
|
19626
20146
|
switch (currentScreen.name) {
|
|
@@ -19663,41 +20183,43 @@ function BugBearButton({
|
|
|
19663
20183
|
};
|
|
19664
20184
|
const nav = {
|
|
19665
20185
|
push: (screen) => {
|
|
19666
|
-
|
|
20186
|
+
Keyboard5.dismiss();
|
|
19667
20187
|
push(screen);
|
|
19668
20188
|
},
|
|
19669
20189
|
pop: () => {
|
|
19670
|
-
|
|
20190
|
+
Keyboard5.dismiss();
|
|
19671
20191
|
pop();
|
|
19672
20192
|
},
|
|
19673
20193
|
replace: (screen) => {
|
|
19674
|
-
|
|
20194
|
+
Keyboard5.dismiss();
|
|
19675
20195
|
replace(screen);
|
|
19676
20196
|
},
|
|
19677
20197
|
reset: () => {
|
|
19678
|
-
|
|
20198
|
+
Keyboard5.dismiss();
|
|
19679
20199
|
reset();
|
|
19680
20200
|
},
|
|
19681
20201
|
canGoBack,
|
|
19682
20202
|
closeWidget: handleClose,
|
|
19683
|
-
startMiniRunner
|
|
20203
|
+
startMiniRunner,
|
|
20204
|
+
startAdHoc,
|
|
20205
|
+
minimizeToAdHoc: activeSession?.sessionType === "ad_hoc" ? minimizeToAdHoc : void 0
|
|
19684
20206
|
};
|
|
19685
20207
|
const QA_ONLY_SCREENS = ["TEST_DETAIL", "TEST_LIST", "TEST_FEEDBACK", "SESSION_START", "SESSION_ACTIVE", "SESSION_FINDING"];
|
|
19686
20208
|
const renderScreen = () => {
|
|
19687
20209
|
if (widgetMode === "feedback" && QA_ONLY_SCREENS.includes(currentScreen.name)) {
|
|
19688
|
-
return /* @__PURE__ */
|
|
20210
|
+
return /* @__PURE__ */ React23.createElement(HomeScreen, { nav });
|
|
19689
20211
|
}
|
|
19690
20212
|
switch (currentScreen.name) {
|
|
19691
20213
|
case "HOME":
|
|
19692
|
-
return /* @__PURE__ */
|
|
20214
|
+
return /* @__PURE__ */ React23.createElement(HomeScreen, { nav });
|
|
19693
20215
|
case "TEST_DETAIL":
|
|
19694
|
-
return /* @__PURE__ */
|
|
20216
|
+
return /* @__PURE__ */ React23.createElement(TestDetailScreen, { testId: currentScreen.testId, nav });
|
|
19695
20217
|
case "TEST_LIST":
|
|
19696
|
-
return /* @__PURE__ */
|
|
20218
|
+
return /* @__PURE__ */ React23.createElement(TestListScreen, { nav });
|
|
19697
20219
|
case "TEST_FEEDBACK":
|
|
19698
|
-
return /* @__PURE__ */
|
|
20220
|
+
return /* @__PURE__ */ React23.createElement(TestFeedbackScreen, { status: currentScreen.status, assignmentId: currentScreen.assignmentId, nav });
|
|
19699
20221
|
case "REPORT":
|
|
19700
|
-
return /* @__PURE__ */
|
|
20222
|
+
return /* @__PURE__ */ React23.createElement(
|
|
19701
20223
|
ReportScreen,
|
|
19702
20224
|
{
|
|
19703
20225
|
nav,
|
|
@@ -19709,30 +20231,30 @@ function BugBearButton({
|
|
|
19709
20231
|
}
|
|
19710
20232
|
);
|
|
19711
20233
|
case "REPORT_SUCCESS":
|
|
19712
|
-
return /* @__PURE__ */
|
|
20234
|
+
return /* @__PURE__ */ React23.createElement(ReportSuccessScreen, { nav });
|
|
19713
20235
|
case "MESSAGE_LIST":
|
|
19714
|
-
return /* @__PURE__ */
|
|
20236
|
+
return /* @__PURE__ */ React23.createElement(MessageListScreen, { nav });
|
|
19715
20237
|
case "THREAD_DETAIL":
|
|
19716
|
-
return /* @__PURE__ */
|
|
20238
|
+
return /* @__PURE__ */ React23.createElement(ThreadDetailScreen, { thread: currentScreen.thread, nav });
|
|
19717
20239
|
case "COMPOSE_MESSAGE":
|
|
19718
|
-
return /* @__PURE__ */
|
|
20240
|
+
return /* @__PURE__ */ React23.createElement(ComposeMessageScreen, { nav });
|
|
19719
20241
|
case "ISSUE_LIST":
|
|
19720
|
-
return /* @__PURE__ */
|
|
20242
|
+
return /* @__PURE__ */ React23.createElement(IssueListScreen, { nav, category: currentScreen.category });
|
|
19721
20243
|
case "ISSUE_DETAIL":
|
|
19722
|
-
return /* @__PURE__ */
|
|
20244
|
+
return /* @__PURE__ */ React23.createElement(IssueDetailScreen, { nav, issue: currentScreen.issue });
|
|
19723
20245
|
case "PROFILE":
|
|
19724
|
-
return /* @__PURE__ */
|
|
20246
|
+
return /* @__PURE__ */ React23.createElement(ProfileScreen, { nav });
|
|
19725
20247
|
case "SESSION_START":
|
|
19726
|
-
return /* @__PURE__ */
|
|
20248
|
+
return /* @__PURE__ */ React23.createElement(SessionStartScreen, { nav });
|
|
19727
20249
|
case "SESSION_ACTIVE":
|
|
19728
|
-
return /* @__PURE__ */
|
|
20250
|
+
return /* @__PURE__ */ React23.createElement(SessionActiveScreen, { nav });
|
|
19729
20251
|
case "SESSION_FINDING":
|
|
19730
|
-
return /* @__PURE__ */
|
|
20252
|
+
return /* @__PURE__ */ React23.createElement(SessionFindingScreen, { nav });
|
|
19731
20253
|
default:
|
|
19732
|
-
return /* @__PURE__ */
|
|
20254
|
+
return /* @__PURE__ */ React23.createElement(HomeScreen, { nav });
|
|
19733
20255
|
}
|
|
19734
20256
|
};
|
|
19735
|
-
return /* @__PURE__ */
|
|
20257
|
+
return /* @__PURE__ */ React23.createElement(React23.Fragment, null, viewMode === "mini-runner" && miniRunnerAssignmentId && /* @__PURE__ */ React23.createElement(
|
|
19736
20258
|
MiniTestRunner,
|
|
19737
20259
|
{
|
|
19738
20260
|
assignmentId: miniRunnerAssignmentId,
|
|
@@ -19741,61 +20263,70 @@ function BugBearButton({
|
|
|
19741
20263
|
onComplete: handleMiniRunnerComplete,
|
|
19742
20264
|
onNavigateToReport: handleMiniRunnerReport
|
|
19743
20265
|
}
|
|
19744
|
-
), viewMode === "
|
|
19745
|
-
|
|
20266
|
+
), viewMode === "ad-hoc" && activeSession && /* @__PURE__ */ React23.createElement(
|
|
20267
|
+
AdHocOverlay,
|
|
19746
20268
|
{
|
|
19747
|
-
|
|
20269
|
+
sessionId: activeSession.id,
|
|
20270
|
+
focusArea: activeSession.focusArea,
|
|
20271
|
+
startedAt: activeSession.startedAt,
|
|
20272
|
+
onExpand: expandFromAdHoc,
|
|
20273
|
+
onComplete: handleAdHocComplete
|
|
20274
|
+
}
|
|
20275
|
+
), viewMode === "closed" && /* @__PURE__ */ React23.createElement(
|
|
20276
|
+
Animated5.View,
|
|
20277
|
+
{
|
|
20278
|
+
style: [styles7.fabContainer, { transform: pan.getTranslateTransform() }, buttonStyle],
|
|
19748
20279
|
...panResponder.panHandlers
|
|
19749
20280
|
},
|
|
19750
|
-
/* @__PURE__ */
|
|
19751
|
-
|
|
20281
|
+
/* @__PURE__ */ React23.createElement(
|
|
20282
|
+
TouchableOpacity20,
|
|
19752
20283
|
{
|
|
19753
|
-
style:
|
|
20284
|
+
style: styles7.fab,
|
|
19754
20285
|
onPress: openPanel,
|
|
19755
20286
|
activeOpacity: draggable ? 1 : 0.7
|
|
19756
20287
|
},
|
|
19757
|
-
/* @__PURE__ */
|
|
19758
|
-
badgeCount > 0 && /* @__PURE__ */
|
|
20288
|
+
/* @__PURE__ */ React23.createElement(Image4, { source: { uri: BUGBEAR_LOGO_BASE64 }, style: styles7.fabIcon }),
|
|
20289
|
+
badgeCount > 0 && /* @__PURE__ */ React23.createElement(View23, { style: styles7.badge }, /* @__PURE__ */ React23.createElement(Text21, { style: styles7.badgeText }, badgeCount > 9 ? "9+" : badgeCount))
|
|
19759
20290
|
)
|
|
19760
|
-
), viewMode === "panel" && /* @__PURE__ */
|
|
20291
|
+
), viewMode === "panel" && /* @__PURE__ */ React23.createElement(View23, { style: styles7.panelWrapper, pointerEvents: "box-none" }, /* @__PURE__ */ React23.createElement(
|
|
19761
20292
|
KeyboardAvoidingView,
|
|
19762
20293
|
{
|
|
19763
|
-
behavior:
|
|
19764
|
-
style:
|
|
20294
|
+
behavior: Platform7.OS === "ios" ? "padding" : "height",
|
|
20295
|
+
style: styles7.panelKeyboardAvoid,
|
|
19765
20296
|
pointerEvents: "box-none"
|
|
19766
20297
|
},
|
|
19767
|
-
/* @__PURE__ */
|
|
19768
|
-
|
|
20298
|
+
/* @__PURE__ */ React23.createElement(
|
|
20299
|
+
Animated5.View,
|
|
19769
20300
|
{
|
|
19770
20301
|
style: [
|
|
19771
|
-
|
|
20302
|
+
styles7.panelContainer,
|
|
19772
20303
|
{
|
|
19773
20304
|
transform: [{
|
|
19774
20305
|
translateY: panelAnim.interpolate({
|
|
19775
20306
|
inputRange: [0, 1],
|
|
19776
|
-
outputRange: [
|
|
20307
|
+
outputRange: [screenHeight3, 0]
|
|
19777
20308
|
})
|
|
19778
20309
|
}]
|
|
19779
20310
|
}
|
|
19780
20311
|
]
|
|
19781
20312
|
},
|
|
19782
|
-
/* @__PURE__ */
|
|
19783
|
-
/* @__PURE__ */
|
|
19784
|
-
/* @__PURE__ */
|
|
20313
|
+
/* @__PURE__ */ React23.createElement(View23, { style: styles7.panelHandle }, /* @__PURE__ */ React23.createElement(View23, { style: styles7.panelHandleBar })),
|
|
20314
|
+
/* @__PURE__ */ React23.createElement(View23, { style: styles7.header }, /* @__PURE__ */ React23.createElement(View23, { style: styles7.headerLeft }, canGoBack ? /* @__PURE__ */ React23.createElement(TouchableOpacity20, { onPress: () => nav.pop(), style: styles7.backButton }, /* @__PURE__ */ React23.createElement(Text21, { style: styles7.backText }, "\u2190 Back")) : /* @__PURE__ */ React23.createElement(View23, { style: styles7.headerTitleRow }, /* @__PURE__ */ React23.createElement(Text21, { style: styles7.headerTitle }, "BugBear"), testerInfo && /* @__PURE__ */ React23.createElement(TouchableOpacity20, { onPress: () => push({ name: "PROFILE" }) }, /* @__PURE__ */ React23.createElement(Text21, { style: styles7.headerName }, testerInfo.name, " \u270E")))), getHeaderTitle() ? /* @__PURE__ */ React23.createElement(Text21, { style: styles7.headerScreenTitle, numberOfLines: 1 }, getHeaderTitle()) : null, /* @__PURE__ */ React23.createElement(View23, { style: styles7.headerActions }, currentScreen.name !== "HOME" && /* @__PURE__ */ React23.createElement(TouchableOpacity20, { onPress: () => nav.reset(), style: styles7.homeButton }, /* @__PURE__ */ React23.createElement(Text21, { style: styles7.homeIcon }, "\u2302")), /* @__PURE__ */ React23.createElement(TouchableOpacity20, { onPress: handleClose, style: styles7.closeButton }, /* @__PURE__ */ React23.createElement(Text21, { style: styles7.closeText }, "\u2715")))),
|
|
20315
|
+
/* @__PURE__ */ React23.createElement(
|
|
19785
20316
|
ScrollView4,
|
|
19786
20317
|
{
|
|
19787
|
-
style:
|
|
19788
|
-
contentContainerStyle:
|
|
20318
|
+
style: styles7.content,
|
|
20319
|
+
contentContainerStyle: styles7.contentContainer,
|
|
19789
20320
|
keyboardShouldPersistTaps: "handled",
|
|
19790
20321
|
showsVerticalScrollIndicator: false
|
|
19791
20322
|
},
|
|
19792
|
-
isLoading ? /* @__PURE__ */
|
|
20323
|
+
isLoading ? /* @__PURE__ */ React23.createElement(View23, { style: styles7.loadingContainer }, /* @__PURE__ */ React23.createElement(ActivityIndicator3, { size: "large", color: colors.blue }), /* @__PURE__ */ React23.createElement(Text21, { style: styles7.loadingText }, "Loading...")) : renderScreen()
|
|
19793
20324
|
)
|
|
19794
20325
|
)
|
|
19795
20326
|
)));
|
|
19796
20327
|
}
|
|
19797
20328
|
function createStyles16() {
|
|
19798
|
-
return
|
|
20329
|
+
return StyleSheet23.create({
|
|
19799
20330
|
// FAB
|
|
19800
20331
|
fabContainer: {
|
|
19801
20332
|
position: "absolute",
|
|
@@ -19954,7 +20485,7 @@ function createStyles16() {
|
|
|
19954
20485
|
},
|
|
19955
20486
|
contentContainer: {
|
|
19956
20487
|
padding: 16,
|
|
19957
|
-
paddingBottom:
|
|
20488
|
+
paddingBottom: Platform7.OS === "ios" ? 50 : 28
|
|
19958
20489
|
},
|
|
19959
20490
|
// Loading
|
|
19960
20491
|
loadingContainer: {
|
|
@@ -19970,8 +20501,8 @@ function createStyles16() {
|
|
|
19970
20501
|
}
|
|
19971
20502
|
|
|
19972
20503
|
// src/BugBearErrorBoundary.tsx
|
|
19973
|
-
import
|
|
19974
|
-
import { View as
|
|
20504
|
+
import React24, { Component } from "react";
|
|
20505
|
+
import { View as View24, Text as Text22, TouchableOpacity as TouchableOpacity21, StyleSheet as StyleSheet24 } from "react-native";
|
|
19975
20506
|
var BugBearErrorBoundary = class extends Component {
|
|
19976
20507
|
constructor(props) {
|
|
19977
20508
|
super(props);
|
|
@@ -20016,7 +20547,7 @@ var BugBearErrorBoundary = class extends Component {
|
|
|
20016
20547
|
if (fallback) {
|
|
20017
20548
|
return fallback;
|
|
20018
20549
|
}
|
|
20019
|
-
return /* @__PURE__ */
|
|
20550
|
+
return /* @__PURE__ */ React24.createElement(View24, { style: styles6.container }, /* @__PURE__ */ React24.createElement(Text22, { style: styles6.title }, "Something went wrong"), /* @__PURE__ */ React24.createElement(Text22, { style: styles6.message }, error.message), /* @__PURE__ */ React24.createElement(TouchableOpacity21, { style: styles6.button, onPress: this.reset }, /* @__PURE__ */ React24.createElement(Text22, { style: styles6.buttonText }, "Try Again")), /* @__PURE__ */ React24.createElement(Text22, { style: styles6.caption }, "The error has been captured by BugBear"));
|
|
20020
20551
|
}
|
|
20021
20552
|
return children;
|
|
20022
20553
|
}
|
|
@@ -20027,7 +20558,7 @@ function useErrorContext() {
|
|
|
20027
20558
|
getEnhancedContext: () => contextCapture.getEnhancedContext()
|
|
20028
20559
|
};
|
|
20029
20560
|
}
|
|
20030
|
-
var
|
|
20561
|
+
var styles6 = StyleSheet24.create({
|
|
20031
20562
|
container: {
|
|
20032
20563
|
padding: 20,
|
|
20033
20564
|
margin: 20,
|