@bbearai/react-native 0.9.1 → 0.9.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (3) hide show
  1. package/dist/index.js +766 -371
  2. package/dist/index.mjs +766 -371
  3. package/package.json +1 -1
package/dist/index.mjs CHANGED
@@ -15162,19 +15162,19 @@ function BugBearProvider({ config, children, appVersion, enabled = true }) {
15162
15162
  }
15163
15163
 
15164
15164
  // src/BugBearButton.tsx
15165
- import React21, { useState as useState18, useRef as useRef6, useEffect as useEffect12, useMemo as useMemo16 } from "react";
15165
+ import React22, { useState as useState19, useRef as useRef8, useEffect as useEffect13, useMemo as useMemo16, useCallback as useCallback7 } from "react";
15166
15166
  import {
15167
- View as View21,
15168
- Text as Text19,
15167
+ View as View22,
15168
+ Text as Text20,
15169
15169
  Image as Image4,
15170
- TouchableOpacity as TouchableOpacity18,
15170
+ TouchableOpacity as TouchableOpacity19,
15171
15171
  ScrollView as ScrollView4,
15172
- StyleSheet as StyleSheet21,
15173
- Dimensions as Dimensions2,
15172
+ StyleSheet as StyleSheet22,
15173
+ Dimensions as Dimensions3,
15174
15174
  KeyboardAvoidingView,
15175
15175
  Platform as Platform5,
15176
- PanResponder,
15177
- Animated as Animated2,
15176
+ PanResponder as PanResponder2,
15177
+ Animated as Animated4,
15178
15178
  ActivityIndicator as ActivityIndicator3,
15179
15179
  Keyboard as Keyboard4,
15180
15180
  BackHandler
@@ -15233,6 +15233,11 @@ async function captureAppScreen() {
15233
15233
  }
15234
15234
  }
15235
15235
 
15236
+ // src/widget/animatedUtils.ts
15237
+ function getAnimatedValue(value) {
15238
+ return value._value;
15239
+ }
15240
+
15236
15241
  // src/widget/screens/HomeScreen.tsx
15237
15242
  import React3, { useEffect as useEffect3, useState as useState2, useRef as useRef3, useMemo } from "react";
15238
15243
  import { View as View3, Text, TouchableOpacity, StyleSheet as StyleSheet3, Linking } from "react-native";
@@ -15317,7 +15322,7 @@ var s = StyleSheet2.create({
15317
15322
  // src/widget/screens/HomeScreen.tsx
15318
15323
  function HomeScreen({ nav }) {
15319
15324
  const { assignments, unreadCount, threads, refreshAssignments, refreshThreads, issueCounts, refreshIssueCounts, dashboardUrl, isLoading, activeSession, sessionFindings, refreshSession, widgetMode, widgetColorScheme } = useBugBear();
15320
- const styles5 = useMemo(() => createStyles(), [widgetColorScheme]);
15325
+ const styles6 = useMemo(() => createStyles(), [widgetColorScheme]);
15321
15326
  const [sessionElapsed, setSessionElapsed] = useState2(0);
15322
15327
  const timerRef = useRef3(null);
15323
15328
  useEffect3(() => {
@@ -15346,98 +15351,98 @@ function HomeScreen({ nav }) {
15346
15351
  return /* @__PURE__ */ React3.createElement(View3, null, unreadCount > 0 ? /* @__PURE__ */ React3.createElement(
15347
15352
  TouchableOpacity,
15348
15353
  {
15349
- style: [styles5.heroBanner, styles5.heroBannerMessages],
15354
+ style: [styles6.heroBanner, styles6.heroBannerMessages],
15350
15355
  onPress: () => nav.push({ name: "MESSAGE_LIST" }),
15351
15356
  activeOpacity: 0.8
15352
15357
  },
15353
- /* @__PURE__ */ React3.createElement(Text, { style: styles5.heroCount }, unreadCount),
15354
- /* @__PURE__ */ React3.createElement(Text, { style: styles5.heroLabel }, "unread message", unreadCount !== 1 ? "s" : ""),
15355
- /* @__PURE__ */ React3.createElement(Text, { style: styles5.heroAction }, "View Messages \u2192")
15356
- ) : /* @__PURE__ */ React3.createElement(View3, { style: [styles5.heroBanner, styles5.heroBannerClear] }, /* @__PURE__ */ React3.createElement(Text, { style: styles5.heroClearEmoji }, "\u{1F4AC}"), /* @__PURE__ */ React3.createElement(Text, { style: styles5.heroClearTitle }, "Help us improve"), /* @__PURE__ */ React3.createElement(Text, { style: styles5.heroClearSub }, "Report bugs, share ideas, and track your submissions")), /* @__PURE__ */ React3.createElement(View3, { style: styles5.actionGrid }, /* @__PURE__ */ React3.createElement(
15358
+ /* @__PURE__ */ React3.createElement(Text, { style: styles6.heroCount }, unreadCount),
15359
+ /* @__PURE__ */ React3.createElement(Text, { style: styles6.heroLabel }, "unread message", unreadCount !== 1 ? "s" : ""),
15360
+ /* @__PURE__ */ React3.createElement(Text, { style: styles6.heroAction }, "View Messages \u2192")
15361
+ ) : /* @__PURE__ */ React3.createElement(View3, { style: [styles6.heroBanner, styles6.heroBannerClear] }, /* @__PURE__ */ React3.createElement(Text, { style: styles6.heroClearEmoji }, "\u{1F4AC}"), /* @__PURE__ */ React3.createElement(Text, { style: styles6.heroClearTitle }, "Help us improve"), /* @__PURE__ */ React3.createElement(Text, { style: styles6.heroClearSub }, "Report bugs, share ideas, and track your submissions")), /* @__PURE__ */ React3.createElement(View3, { style: styles6.actionGrid }, /* @__PURE__ */ React3.createElement(
15357
15362
  TouchableOpacity,
15358
15363
  {
15359
- style: styles5.actionCard,
15364
+ style: styles6.actionCard,
15360
15365
  onPress: () => nav.push({ name: "REPORT", prefill: { type: "bug" } }),
15361
15366
  activeOpacity: 0.7
15362
15367
  },
15363
- /* @__PURE__ */ React3.createElement(Text, { style: styles5.actionIcon }, "\u{1F41B}"),
15364
- /* @__PURE__ */ React3.createElement(Text, { style: styles5.actionLabel }, "Report Bug")
15368
+ /* @__PURE__ */ React3.createElement(Text, { style: styles6.actionIcon }, "\u{1F41B}"),
15369
+ /* @__PURE__ */ React3.createElement(Text, { style: styles6.actionLabel }, "Report Bug")
15365
15370
  ), /* @__PURE__ */ React3.createElement(
15366
15371
  TouchableOpacity,
15367
15372
  {
15368
- style: styles5.actionCard,
15373
+ style: styles6.actionCard,
15369
15374
  onPress: () => nav.push({ name: "REPORT", prefill: { type: "feedback" } }),
15370
15375
  activeOpacity: 0.7
15371
15376
  },
15372
- /* @__PURE__ */ React3.createElement(Text, { style: styles5.actionIcon }, "\u{1F4A1}"),
15373
- /* @__PURE__ */ React3.createElement(Text, { style: styles5.actionLabel }, "Share Feedback")
15377
+ /* @__PURE__ */ React3.createElement(Text, { style: styles6.actionIcon }, "\u{1F4A1}"),
15378
+ /* @__PURE__ */ React3.createElement(Text, { style: styles6.actionLabel }, "Share Feedback")
15374
15379
  ), /* @__PURE__ */ React3.createElement(
15375
15380
  TouchableOpacity,
15376
15381
  {
15377
- style: styles5.actionCard,
15382
+ style: styles6.actionCard,
15378
15383
  onPress: () => nav.push({ name: "MESSAGE_LIST" }),
15379
15384
  activeOpacity: 0.7
15380
15385
  },
15381
- /* @__PURE__ */ React3.createElement(Text, { style: styles5.actionIcon }, "\u{1F4AC}"),
15382
- /* @__PURE__ */ React3.createElement(Text, { style: styles5.actionLabel }, "Messages"),
15383
- unreadCount > 0 && /* @__PURE__ */ React3.createElement(View3, { style: [styles5.actionBadge, styles5.actionBadgeMsg] }, /* @__PURE__ */ React3.createElement(Text, { style: styles5.actionBadgeText }, unreadCount))
15386
+ /* @__PURE__ */ React3.createElement(Text, { style: styles6.actionIcon }, "\u{1F4AC}"),
15387
+ /* @__PURE__ */ React3.createElement(Text, { style: styles6.actionLabel }, "Messages"),
15388
+ unreadCount > 0 && /* @__PURE__ */ React3.createElement(View3, { style: [styles6.actionBadge, styles6.actionBadgeMsg] }, /* @__PURE__ */ React3.createElement(Text, { style: styles6.actionBadgeText }, unreadCount))
15384
15389
  ), /* @__PURE__ */ React3.createElement(
15385
15390
  TouchableOpacity,
15386
15391
  {
15387
- style: styles5.actionCard,
15392
+ style: styles6.actionCard,
15388
15393
  onPress: () => nav.push({ name: "ISSUE_LIST", category: "open" }),
15389
15394
  activeOpacity: 0.7
15390
15395
  },
15391
- /* @__PURE__ */ React3.createElement(Text, { style: styles5.actionIcon }, "\u{1F4CB}"),
15392
- /* @__PURE__ */ React3.createElement(Text, { style: styles5.actionLabel }, "My Issues"),
15393
- issueCounts.open > 0 && /* @__PURE__ */ React3.createElement(View3, { style: [styles5.actionBadge, styles5.actionBadgeIssue] }, /* @__PURE__ */ React3.createElement(Text, { style: styles5.actionBadgeText }, issueCounts.open))
15394
- )), /* @__PURE__ */ React3.createElement(View3, { style: styles5.issueGrid }, /* @__PURE__ */ React3.createElement(
15396
+ /* @__PURE__ */ React3.createElement(Text, { style: styles6.actionIcon }, "\u{1F4CB}"),
15397
+ /* @__PURE__ */ React3.createElement(Text, { style: styles6.actionLabel }, "My Issues"),
15398
+ issueCounts.open > 0 && /* @__PURE__ */ React3.createElement(View3, { style: [styles6.actionBadge, styles6.actionBadgeIssue] }, /* @__PURE__ */ React3.createElement(Text, { style: styles6.actionBadgeText }, issueCounts.open))
15399
+ )), /* @__PURE__ */ React3.createElement(View3, { style: styles6.issueGrid }, /* @__PURE__ */ React3.createElement(
15395
15400
  TouchableOpacity,
15396
15401
  {
15397
- style: [styles5.issueCard, styles5.issueCardOpen],
15402
+ style: [styles6.issueCard, styles6.issueCardOpen],
15398
15403
  onPress: () => nav.push({ name: "ISSUE_LIST", category: "open" }),
15399
15404
  activeOpacity: 0.7
15400
15405
  },
15401
- /* @__PURE__ */ React3.createElement(Text, { style: styles5.issueCountOpen }, issueCounts.open),
15402
- /* @__PURE__ */ React3.createElement(Text, { style: styles5.issueLabel }, "Open")
15406
+ /* @__PURE__ */ React3.createElement(Text, { style: styles6.issueCountOpen }, issueCounts.open),
15407
+ /* @__PURE__ */ React3.createElement(Text, { style: styles6.issueLabel }, "Open")
15403
15408
  ), /* @__PURE__ */ React3.createElement(
15404
15409
  TouchableOpacity,
15405
15410
  {
15406
- style: [styles5.issueCard, styles5.issueCardDone],
15411
+ style: [styles6.issueCard, styles6.issueCardDone],
15407
15412
  onPress: () => nav.push({ name: "ISSUE_LIST", category: "done" }),
15408
15413
  activeOpacity: 0.7
15409
15414
  },
15410
- /* @__PURE__ */ React3.createElement(Text, { style: styles5.issueCountDone }, issueCounts.done),
15411
- /* @__PURE__ */ React3.createElement(Text, { style: styles5.issueLabel }, "Done")
15415
+ /* @__PURE__ */ React3.createElement(Text, { style: styles6.issueCountDone }, issueCounts.done),
15416
+ /* @__PURE__ */ React3.createElement(Text, { style: styles6.issueLabel }, "Done")
15412
15417
  ), /* @__PURE__ */ React3.createElement(
15413
15418
  TouchableOpacity,
15414
15419
  {
15415
- style: [styles5.issueCard, styles5.issueCardReopened],
15420
+ style: [styles6.issueCard, styles6.issueCardReopened],
15416
15421
  onPress: () => nav.push({ name: "ISSUE_LIST", category: "reopened" }),
15417
15422
  activeOpacity: 0.7
15418
15423
  },
15419
- /* @__PURE__ */ React3.createElement(Text, { style: styles5.issueCountReopened }, issueCounts.reopened),
15420
- /* @__PURE__ */ React3.createElement(Text, { style: styles5.issueLabel }, "Reopened")
15424
+ /* @__PURE__ */ React3.createElement(Text, { style: styles6.issueCountReopened }, issueCounts.reopened),
15425
+ /* @__PURE__ */ React3.createElement(Text, { style: styles6.issueLabel }, "Reopened")
15421
15426
  )), dashboardUrl && /* @__PURE__ */ React3.createElement(
15422
15427
  TouchableOpacity,
15423
15428
  {
15424
- style: styles5.webAppLink,
15429
+ style: styles6.webAppLink,
15425
15430
  onPress: () => Linking.openURL(dashboardUrl),
15426
15431
  activeOpacity: 0.7
15427
15432
  },
15428
- /* @__PURE__ */ React3.createElement(Text, { style: styles5.webAppIcon }, "\u{1F310}"),
15429
- /* @__PURE__ */ React3.createElement(View3, { style: styles5.webAppTextWrap }, /* @__PURE__ */ React3.createElement(Text, { style: styles5.webAppTitle }, "Open Web Dashboard"), /* @__PURE__ */ React3.createElement(Text, { style: styles5.webAppSub }, "View your submissions & updates")),
15430
- /* @__PURE__ */ React3.createElement(Text, { style: styles5.webAppArrow }, "\u2192")
15433
+ /* @__PURE__ */ React3.createElement(Text, { style: styles6.webAppIcon }, "\u{1F310}"),
15434
+ /* @__PURE__ */ React3.createElement(View3, { style: styles6.webAppTextWrap }, /* @__PURE__ */ React3.createElement(Text, { style: styles6.webAppTitle }, "Open Web Dashboard"), /* @__PURE__ */ React3.createElement(Text, { style: styles6.webAppSub }, "View your submissions & updates")),
15435
+ /* @__PURE__ */ React3.createElement(Text, { style: styles6.webAppArrow }, "\u2192")
15431
15436
  ), /* @__PURE__ */ React3.createElement(
15432
15437
  TouchableOpacity,
15433
15438
  {
15434
- style: styles5.refreshButton,
15439
+ style: styles6.refreshButton,
15435
15440
  onPress: () => {
15436
15441
  refreshThreads();
15437
15442
  refreshIssueCounts();
15438
15443
  }
15439
15444
  },
15440
- /* @__PURE__ */ React3.createElement(Text, { style: styles5.refreshText }, "\u21BB Refresh")
15445
+ /* @__PURE__ */ React3.createElement(Text, { style: styles6.refreshText }, "\u21BB Refresh")
15441
15446
  ));
15442
15447
  }
15443
15448
  const formatTimer = (s2) => {
@@ -15454,130 +15459,130 @@ function HomeScreen({ nav }) {
15454
15459
  return /* @__PURE__ */ React3.createElement(View3, null, pendingCount > 0 ? /* @__PURE__ */ React3.createElement(
15455
15460
  TouchableOpacity,
15456
15461
  {
15457
- style: [styles5.heroBanner, styles5.heroBannerTests],
15462
+ style: [styles6.heroBanner, styles6.heroBannerTests],
15458
15463
  onPress: () => nav.push({ name: "TEST_DETAIL" }),
15459
15464
  activeOpacity: 0.8
15460
15465
  },
15461
- /* @__PURE__ */ React3.createElement(Text, { style: styles5.heroCount }, pendingCount),
15462
- /* @__PURE__ */ React3.createElement(Text, { style: styles5.heroLabel }, "test", pendingCount !== 1 ? "s" : "", " waiting"),
15463
- retestCount > 0 && /* @__PURE__ */ React3.createElement(View3, { style: styles5.retestPill }, /* @__PURE__ */ React3.createElement(Text, { style: styles5.retestPillText }, "\u{1F504} ", retestCount, " retest", retestCount !== 1 ? "s" : "")),
15464
- /* @__PURE__ */ React3.createElement(Text, { style: styles5.heroAction }, "Start Testing \u2192")
15466
+ /* @__PURE__ */ React3.createElement(Text, { style: styles6.heroCount }, pendingCount),
15467
+ /* @__PURE__ */ React3.createElement(Text, { style: styles6.heroLabel }, "test", pendingCount !== 1 ? "s" : "", " waiting"),
15468
+ retestCount > 0 && /* @__PURE__ */ React3.createElement(View3, { style: styles6.retestPill }, /* @__PURE__ */ React3.createElement(Text, { style: styles6.retestPillText }, "\u{1F504} ", retestCount, " retest", retestCount !== 1 ? "s" : "")),
15469
+ /* @__PURE__ */ React3.createElement(Text, { style: styles6.heroAction }, "Start Testing \u2192")
15465
15470
  ) : unreadCount > 0 ? /* @__PURE__ */ React3.createElement(
15466
15471
  TouchableOpacity,
15467
15472
  {
15468
- style: [styles5.heroBanner, styles5.heroBannerMessages],
15473
+ style: [styles6.heroBanner, styles6.heroBannerMessages],
15469
15474
  onPress: () => nav.push({ name: "MESSAGE_LIST" }),
15470
15475
  activeOpacity: 0.8
15471
15476
  },
15472
- /* @__PURE__ */ React3.createElement(Text, { style: styles5.heroCount }, unreadCount),
15473
- /* @__PURE__ */ React3.createElement(Text, { style: styles5.heroLabel }, "unread message", unreadCount !== 1 ? "s" : ""),
15474
- /* @__PURE__ */ React3.createElement(Text, { style: styles5.heroAction }, "View Messages \u2192")
15475
- ) : /* @__PURE__ */ React3.createElement(View3, { style: [styles5.heroBanner, styles5.heroBannerClear] }, /* @__PURE__ */ React3.createElement(Text, { style: styles5.heroClearEmoji }, "\u2705"), /* @__PURE__ */ React3.createElement(Text, { style: styles5.heroClearTitle }, "All caught up!"), totalTests > 0 && /* @__PURE__ */ React3.createElement(Text, { style: styles5.heroClearSub }, completedCount, "/", totalTests, " tests completed")), activeSession && activeSession.status === "active" ? /* @__PURE__ */ React3.createElement(
15477
+ /* @__PURE__ */ React3.createElement(Text, { style: styles6.heroCount }, unreadCount),
15478
+ /* @__PURE__ */ React3.createElement(Text, { style: styles6.heroLabel }, "unread message", unreadCount !== 1 ? "s" : ""),
15479
+ /* @__PURE__ */ React3.createElement(Text, { style: styles6.heroAction }, "View Messages \u2192")
15480
+ ) : /* @__PURE__ */ React3.createElement(View3, { style: [styles6.heroBanner, styles6.heroBannerClear] }, /* @__PURE__ */ React3.createElement(Text, { style: styles6.heroClearEmoji }, "\u2705"), /* @__PURE__ */ React3.createElement(Text, { style: styles6.heroClearTitle }, "All caught up!"), totalTests > 0 && /* @__PURE__ */ React3.createElement(Text, { style: styles6.heroClearSub }, completedCount, "/", totalTests, " tests completed")), activeSession && activeSession.status === "active" ? /* @__PURE__ */ React3.createElement(
15476
15481
  TouchableOpacity,
15477
15482
  {
15478
- style: styles5.sessionCardActive,
15483
+ style: styles6.sessionCardActive,
15479
15484
  onPress: () => nav.push({ name: "SESSION_ACTIVE" }),
15480
15485
  activeOpacity: 0.8
15481
15486
  },
15482
- /* @__PURE__ */ React3.createElement(View3, { style: styles5.sessionDot }),
15483
- /* @__PURE__ */ React3.createElement(View3, { style: styles5.sessionCardContent }, /* @__PURE__ */ React3.createElement(Text, { style: styles5.sessionCardTitle, numberOfLines: 1 }, activeSession.focusArea || "QA Session"), /* @__PURE__ */ React3.createElement(Text, { style: styles5.sessionCardMeta }, formatTimer(sessionElapsed), " \xB7 ", sessionFindings.length, " finding", sessionFindings.length !== 1 ? "s" : "")),
15484
- /* @__PURE__ */ React3.createElement(Text, { style: styles5.sessionCardAction }, "Resume \u2192")
15487
+ /* @__PURE__ */ React3.createElement(View3, { style: styles6.sessionDot }),
15488
+ /* @__PURE__ */ React3.createElement(View3, { style: styles6.sessionCardContent }, /* @__PURE__ */ React3.createElement(Text, { style: styles6.sessionCardTitle, numberOfLines: 1 }, activeSession.focusArea || "QA Session"), /* @__PURE__ */ React3.createElement(Text, { style: styles6.sessionCardMeta }, formatTimer(sessionElapsed), " \xB7 ", sessionFindings.length, " finding", sessionFindings.length !== 1 ? "s" : "")),
15489
+ /* @__PURE__ */ React3.createElement(Text, { style: styles6.sessionCardAction }, "Resume \u2192")
15485
15490
  ) : /* @__PURE__ */ React3.createElement(
15486
15491
  TouchableOpacity,
15487
15492
  {
15488
- style: styles5.sessionCardInactive,
15493
+ style: styles6.sessionCardInactive,
15489
15494
  onPress: () => nav.push({ name: "SESSION_START" }),
15490
15495
  activeOpacity: 0.7
15491
15496
  },
15492
- /* @__PURE__ */ React3.createElement(Text, { style: styles5.sessionCardIcon }, "\u{1F50D}"),
15493
- /* @__PURE__ */ React3.createElement(Text, { style: styles5.sessionCardLabel }, "Start QA Session"),
15494
- /* @__PURE__ */ React3.createElement(Text, { style: styles5.sessionCardArrow }, "\u2192")
15495
- ), /* @__PURE__ */ React3.createElement(View3, { style: styles5.actionGrid }, /* @__PURE__ */ React3.createElement(
15497
+ /* @__PURE__ */ React3.createElement(Text, { style: styles6.sessionCardIcon }, "\u{1F50D}"),
15498
+ /* @__PURE__ */ React3.createElement(Text, { style: styles6.sessionCardLabel }, "Start QA Session"),
15499
+ /* @__PURE__ */ React3.createElement(Text, { style: styles6.sessionCardArrow }, "\u2192")
15500
+ ), /* @__PURE__ */ React3.createElement(View3, { style: styles6.actionGrid }, /* @__PURE__ */ React3.createElement(
15496
15501
  TouchableOpacity,
15497
15502
  {
15498
- style: styles5.actionCard,
15503
+ style: styles6.actionCard,
15499
15504
  onPress: () => nav.push({ name: "TEST_LIST" }),
15500
15505
  activeOpacity: 0.7
15501
15506
  },
15502
- /* @__PURE__ */ React3.createElement(Text, { style: styles5.actionIcon }, "\u2705"),
15503
- /* @__PURE__ */ React3.createElement(Text, { style: styles5.actionLabel }, "Tests"),
15504
- pendingCount > 0 && /* @__PURE__ */ React3.createElement(View3, { style: styles5.actionBadge }, /* @__PURE__ */ React3.createElement(Text, { style: styles5.actionBadgeText }, pendingCount))
15507
+ /* @__PURE__ */ React3.createElement(Text, { style: styles6.actionIcon }, "\u2705"),
15508
+ /* @__PURE__ */ React3.createElement(Text, { style: styles6.actionLabel }, "Tests"),
15509
+ pendingCount > 0 && /* @__PURE__ */ React3.createElement(View3, { style: styles6.actionBadge }, /* @__PURE__ */ React3.createElement(Text, { style: styles6.actionBadgeText }, pendingCount))
15505
15510
  ), /* @__PURE__ */ React3.createElement(
15506
15511
  TouchableOpacity,
15507
15512
  {
15508
- style: styles5.actionCard,
15513
+ style: styles6.actionCard,
15509
15514
  onPress: () => nav.push({ name: "REPORT", prefill: { type: "bug" } }),
15510
15515
  activeOpacity: 0.7
15511
15516
  },
15512
- /* @__PURE__ */ React3.createElement(Text, { style: styles5.actionIcon }, "\u{1F41B}"),
15513
- /* @__PURE__ */ React3.createElement(Text, { style: styles5.actionLabel }, "Report Bug")
15517
+ /* @__PURE__ */ React3.createElement(Text, { style: styles6.actionIcon }, "\u{1F41B}"),
15518
+ /* @__PURE__ */ React3.createElement(Text, { style: styles6.actionLabel }, "Report Bug")
15514
15519
  ), /* @__PURE__ */ React3.createElement(
15515
15520
  TouchableOpacity,
15516
15521
  {
15517
- style: styles5.actionCard,
15522
+ style: styles6.actionCard,
15518
15523
  onPress: () => nav.push({ name: "REPORT", prefill: { type: "feedback" } }),
15519
15524
  activeOpacity: 0.7
15520
15525
  },
15521
- /* @__PURE__ */ React3.createElement(Text, { style: styles5.actionIcon }, "\u{1F4A1}"),
15522
- /* @__PURE__ */ React3.createElement(Text, { style: styles5.actionLabel }, "Feedback")
15526
+ /* @__PURE__ */ React3.createElement(Text, { style: styles6.actionIcon }, "\u{1F4A1}"),
15527
+ /* @__PURE__ */ React3.createElement(Text, { style: styles6.actionLabel }, "Feedback")
15523
15528
  ), /* @__PURE__ */ React3.createElement(
15524
15529
  TouchableOpacity,
15525
15530
  {
15526
- style: styles5.actionCard,
15531
+ style: styles6.actionCard,
15527
15532
  onPress: () => nav.push({ name: "MESSAGE_LIST" }),
15528
15533
  activeOpacity: 0.7
15529
15534
  },
15530
- /* @__PURE__ */ React3.createElement(Text, { style: styles5.actionIcon }, "\u{1F4AC}"),
15531
- /* @__PURE__ */ React3.createElement(Text, { style: styles5.actionLabel }, "Messages"),
15532
- unreadCount > 0 && /* @__PURE__ */ React3.createElement(View3, { style: [styles5.actionBadge, styles5.actionBadgeMsg] }, /* @__PURE__ */ React3.createElement(Text, { style: styles5.actionBadgeText }, unreadCount))
15533
- )), /* @__PURE__ */ React3.createElement(View3, { style: styles5.issueGrid }, /* @__PURE__ */ React3.createElement(
15535
+ /* @__PURE__ */ React3.createElement(Text, { style: styles6.actionIcon }, "\u{1F4AC}"),
15536
+ /* @__PURE__ */ React3.createElement(Text, { style: styles6.actionLabel }, "Messages"),
15537
+ unreadCount > 0 && /* @__PURE__ */ React3.createElement(View3, { style: [styles6.actionBadge, styles6.actionBadgeMsg] }, /* @__PURE__ */ React3.createElement(Text, { style: styles6.actionBadgeText }, unreadCount))
15538
+ )), /* @__PURE__ */ React3.createElement(View3, { style: styles6.issueGrid }, /* @__PURE__ */ React3.createElement(
15534
15539
  TouchableOpacity,
15535
15540
  {
15536
- style: [styles5.issueCard, styles5.issueCardOpen],
15541
+ style: [styles6.issueCard, styles6.issueCardOpen],
15537
15542
  onPress: () => nav.push({ name: "ISSUE_LIST", category: "open" }),
15538
15543
  activeOpacity: 0.7
15539
15544
  },
15540
- /* @__PURE__ */ React3.createElement(Text, { style: styles5.issueCountOpen }, issueCounts.open),
15541
- /* @__PURE__ */ React3.createElement(Text, { style: styles5.issueLabel }, "Open")
15545
+ /* @__PURE__ */ React3.createElement(Text, { style: styles6.issueCountOpen }, issueCounts.open),
15546
+ /* @__PURE__ */ React3.createElement(Text, { style: styles6.issueLabel }, "Open")
15542
15547
  ), /* @__PURE__ */ React3.createElement(
15543
15548
  TouchableOpacity,
15544
15549
  {
15545
- style: [styles5.issueCard, styles5.issueCardDone],
15550
+ style: [styles6.issueCard, styles6.issueCardDone],
15546
15551
  onPress: () => nav.push({ name: "ISSUE_LIST", category: "done" }),
15547
15552
  activeOpacity: 0.7
15548
15553
  },
15549
- /* @__PURE__ */ React3.createElement(Text, { style: styles5.issueCountDone }, issueCounts.done),
15550
- /* @__PURE__ */ React3.createElement(Text, { style: styles5.issueLabel }, "Done")
15554
+ /* @__PURE__ */ React3.createElement(Text, { style: styles6.issueCountDone }, issueCounts.done),
15555
+ /* @__PURE__ */ React3.createElement(Text, { style: styles6.issueLabel }, "Done")
15551
15556
  ), /* @__PURE__ */ React3.createElement(
15552
15557
  TouchableOpacity,
15553
15558
  {
15554
- style: [styles5.issueCard, styles5.issueCardReopened],
15559
+ style: [styles6.issueCard, styles6.issueCardReopened],
15555
15560
  onPress: () => nav.push({ name: "ISSUE_LIST", category: "reopened" }),
15556
15561
  activeOpacity: 0.7
15557
15562
  },
15558
- /* @__PURE__ */ React3.createElement(Text, { style: styles5.issueCountReopened }, issueCounts.reopened),
15559
- /* @__PURE__ */ React3.createElement(Text, { style: styles5.issueLabel }, "Reopened")
15560
- )), totalTests > 0 && /* @__PURE__ */ React3.createElement(View3, { style: styles5.progressSection }, /* @__PURE__ */ React3.createElement(View3, { style: styles5.progressBar }, /* @__PURE__ */ React3.createElement(View3, { style: [styles5.progressFill, { width: `${Math.round(completedCount / totalTests * 100)}%` }] })), /* @__PURE__ */ React3.createElement(Text, { style: styles5.progressText }, completedCount, "/", totalTests, " tests completed")), dashboardUrl && /* @__PURE__ */ React3.createElement(
15563
+ /* @__PURE__ */ React3.createElement(Text, { style: styles6.issueCountReopened }, issueCounts.reopened),
15564
+ /* @__PURE__ */ React3.createElement(Text, { style: styles6.issueLabel }, "Reopened")
15565
+ )), totalTests > 0 && /* @__PURE__ */ React3.createElement(View3, { style: styles6.progressSection }, /* @__PURE__ */ React3.createElement(View3, { style: styles6.progressBar }, /* @__PURE__ */ React3.createElement(View3, { style: [styles6.progressFill, { width: `${Math.round(completedCount / totalTests * 100)}%` }] })), /* @__PURE__ */ React3.createElement(Text, { style: styles6.progressText }, completedCount, "/", totalTests, " tests completed")), dashboardUrl && /* @__PURE__ */ React3.createElement(
15561
15566
  TouchableOpacity,
15562
15567
  {
15563
- style: styles5.webAppLink,
15568
+ style: styles6.webAppLink,
15564
15569
  onPress: () => Linking.openURL(dashboardUrl),
15565
15570
  activeOpacity: 0.7
15566
15571
  },
15567
- /* @__PURE__ */ React3.createElement(Text, { style: styles5.webAppIcon }, "\u{1F310}"),
15568
- /* @__PURE__ */ React3.createElement(View3, { style: styles5.webAppTextWrap }, /* @__PURE__ */ React3.createElement(Text, { style: styles5.webAppTitle }, "Open Web Dashboard"), /* @__PURE__ */ React3.createElement(Text, { style: styles5.webAppSub }, "View analytics, history & more")),
15569
- /* @__PURE__ */ React3.createElement(Text, { style: styles5.webAppArrow }, "\u2192")
15572
+ /* @__PURE__ */ React3.createElement(Text, { style: styles6.webAppIcon }, "\u{1F310}"),
15573
+ /* @__PURE__ */ React3.createElement(View3, { style: styles6.webAppTextWrap }, /* @__PURE__ */ React3.createElement(Text, { style: styles6.webAppTitle }, "Open Web Dashboard"), /* @__PURE__ */ React3.createElement(Text, { style: styles6.webAppSub }, "View analytics, history & more")),
15574
+ /* @__PURE__ */ React3.createElement(Text, { style: styles6.webAppArrow }, "\u2192")
15570
15575
  ), /* @__PURE__ */ React3.createElement(
15571
15576
  TouchableOpacity,
15572
15577
  {
15573
- style: styles5.refreshButton,
15578
+ style: styles6.refreshButton,
15574
15579
  onPress: () => {
15575
15580
  refreshAssignments();
15576
15581
  refreshThreads();
15577
15582
  refreshIssueCounts();
15578
15583
  }
15579
15584
  },
15580
- /* @__PURE__ */ React3.createElement(Text, { style: styles5.refreshText }, "\u21BB Refresh")
15585
+ /* @__PURE__ */ React3.createElement(Text, { style: styles6.refreshText }, "\u21BB Refresh")
15581
15586
  ));
15582
15587
  }
15583
15588
  function createStyles() {
@@ -15871,11 +15876,11 @@ function createStyles() {
15871
15876
  }
15872
15877
 
15873
15878
  // src/widget/screens/TestDetailScreen.tsx
15874
- import React4, { useState as useState3, useEffect as useEffect4, useCallback as useCallback2, useMemo as useMemo2 } from "react";
15875
- import { View as View4, Text as Text2, TouchableOpacity as TouchableOpacity2, StyleSheet as StyleSheet4, Modal, TextInput, Keyboard } from "react-native";
15879
+ import React4, { useState as useState3, useEffect as useEffect4, useCallback as useCallback2, useMemo as useMemo2, useRef as useRef4 } from "react";
15880
+ import { View as View4, Text as Text2, TouchableOpacity as TouchableOpacity2, StyleSheet as StyleSheet4, Modal, TextInput, Keyboard, Animated as Animated2 } from "react-native";
15876
15881
  function TestDetailScreen({ testId, nav }) {
15877
15882
  const { client, assignments, currentAssignment, refreshAssignments, getDeviceInfo, onNavigate, widgetColorScheme } = useBugBear();
15878
- const styles5 = useMemo2(() => createStyles2(), [widgetColorScheme]);
15883
+ const styles6 = useMemo2(() => createStyles2(), [widgetColorScheme]);
15879
15884
  const displayedAssignment = testId ? assignments.find((a) => a.id === testId) || currentAssignment : currentAssignment;
15880
15885
  const [showSteps, setShowSteps] = useState3(true);
15881
15886
  const [showDetails, setShowDetails] = useState3(false);
@@ -15886,6 +15891,20 @@ function TestDetailScreen({ testId, nav }) {
15886
15891
  const [skipNotes, setSkipNotes] = useState3("");
15887
15892
  const [skipping, setSkipping] = useState3(false);
15888
15893
  const [isSubmitting, setIsSubmitting] = useState3(false);
15894
+ const [feedbackToastAssignmentId, setFeedbackToastAssignmentId] = useState3(null);
15895
+ const toastTimerRef = useRef4(null);
15896
+ const toastSlideAnim = useRef4(new Animated2.Value(80)).current;
15897
+ useEffect4(() => {
15898
+ return () => {
15899
+ if (toastTimerRef.current) clearTimeout(toastTimerRef.current);
15900
+ };
15901
+ }, []);
15902
+ useEffect4(() => {
15903
+ if (feedbackToastAssignmentId) {
15904
+ toastSlideAnim.setValue(80);
15905
+ Animated2.spring(toastSlideAnim, { toValue: 0, useNativeDriver: true, tension: 80, friction: 10 }).start();
15906
+ }
15907
+ }, [feedbackToastAssignmentId]);
15889
15908
  useEffect4(() => {
15890
15909
  setCriteriaResults({});
15891
15910
  setShowSteps(true);
@@ -15923,13 +15942,34 @@ function TestDetailScreen({ testId, nav }) {
15923
15942
  Keyboard.dismiss();
15924
15943
  setIsSubmitting(true);
15925
15944
  try {
15926
- await client.passAssignment(displayedAssignment.id);
15945
+ const passedId = displayedAssignment.id;
15946
+ const testCaseId = displayedAssignment.testCase.id;
15947
+ await client.passAssignment(passedId);
15948
+ client.submitTestFeedback({
15949
+ testCaseId,
15950
+ assignmentId: passedId,
15951
+ feedback: { rating: 5 }
15952
+ }).catch(() => {
15953
+ });
15927
15954
  await refreshAssignments();
15928
- nav.replace({ name: "TEST_FEEDBACK", status: "passed", assignmentId: displayedAssignment.id });
15955
+ setFeedbackToastAssignmentId(passedId);
15956
+ if (toastTimerRef.current) clearTimeout(toastTimerRef.current);
15957
+ toastTimerRef.current = setTimeout(() => setFeedbackToastAssignmentId(null), 4e3);
15958
+ const currentIdx = assignments.indexOf(displayedAssignment);
15959
+ const remaining = assignments.filter(
15960
+ (a) => (a.status === "pending" || a.status === "in_progress") && a.id !== passedId
15961
+ );
15962
+ if (remaining.length > 0) {
15963
+ const nextAfterCurrent = remaining.find((a) => assignments.indexOf(a) > currentIdx);
15964
+ const nextTest = nextAfterCurrent || remaining[0];
15965
+ nav.replace({ name: "TEST_DETAIL", testId: nextTest.id });
15966
+ } else {
15967
+ nav.reset();
15968
+ }
15929
15969
  } finally {
15930
15970
  setIsSubmitting(false);
15931
15971
  }
15932
- }, [client, displayedAssignment, refreshAssignments, nav, isSubmitting]);
15972
+ }, [client, displayedAssignment, refreshAssignments, nav, isSubmitting, assignments]);
15933
15973
  const handleFail = useCallback2(async () => {
15934
15974
  if (!client || !displayedAssignment || isSubmitting) return;
15935
15975
  Keyboard.dismiss();
@@ -16018,7 +16058,7 @@ function TestDetailScreen({ testId, nav }) {
16018
16058
  const steps = testCase.steps;
16019
16059
  const info = templateInfo[template] || templateInfo.steps;
16020
16060
  const rubricMode = testCase.track?.rubricMode || "pass_fail";
16021
- return /* @__PURE__ */ React4.createElement(View4, { style: styles5.container }, /* @__PURE__ */ React4.createElement(View4, { style: styles5.topRow }, /* @__PURE__ */ React4.createElement(View4, { style: styles5.positionInfo }, /* @__PURE__ */ React4.createElement(Text2, { style: styles5.positionText }, "Test ", currentIndex + 1, " of ", allTests.length), displayedAssignment.status === "in_progress" && assignmentElapsedTime > 0 && /* @__PURE__ */ React4.createElement(View4, { style: styles5.timerBadge }, /* @__PURE__ */ React4.createElement(Text2, { style: styles5.timerText }, formatElapsedTime(assignmentElapsedTime)))), /* @__PURE__ */ React4.createElement(TouchableOpacity2, { onPress: () => nav.push({ name: "TEST_LIST" }) }, /* @__PURE__ */ React4.createElement(Text2, { style: styles5.viewAllLink }, "View All \u2192"))), displayedAssignment.isVerification && /* @__PURE__ */ React4.createElement(View4, { style: styles5.retestBanner }, /* @__PURE__ */ React4.createElement(Text2, { style: styles5.retestIcon }, "\u{1F504}"), /* @__PURE__ */ React4.createElement(Text2, { style: styles5.retestLabel }, "Retest"), /* @__PURE__ */ React4.createElement(Text2, { style: styles5.retestSub }, "\u2014 Verify bug fix")), /* @__PURE__ */ React4.createElement(Text2, { style: styles5.testTitle }, testCase.title), testCase.key && /* @__PURE__ */ React4.createElement(Text2, { style: styles5.testKey }, testCase.key), /* @__PURE__ */ React4.createElement(TouchableOpacity2, { onPress: () => setShowSteps(!showSteps), style: styles5.sectionHeader }, /* @__PURE__ */ React4.createElement(Text2, { style: styles5.sectionHeaderText }, showSteps ? "\u25BC" : "\u25B6", " ", info.icon, " ", template === "freeform" ? "Instructions" : `${steps.length} ${template === "checklist" ? "items" : template === "rubric" ? "criteria" : "steps"}`)), showSteps && /* @__PURE__ */ React4.createElement(View4, { style: styles5.templateContent }, template === "steps" && steps.map((step, idx) => /* @__PURE__ */ React4.createElement(View4, { key: idx, style: styles5.step }, /* @__PURE__ */ React4.createElement(View4, { style: styles5.stepNumber }, /* @__PURE__ */ React4.createElement(Text2, { style: styles5.stepNumberText }, step.stepNumber)), /* @__PURE__ */ React4.createElement(View4, { style: styles5.stepBody }, /* @__PURE__ */ React4.createElement(Text2, { style: styles5.stepAction }, step.action), step.expectedResult && /* @__PURE__ */ React4.createElement(Text2, { style: styles5.stepExpected }, "\u2192 ", step.expectedResult)))), template === "checklist" && /* @__PURE__ */ React4.createElement(React4.Fragment, null, steps.map((step, idx) => /* @__PURE__ */ React4.createElement(
16061
+ return /* @__PURE__ */ React4.createElement(View4, { style: styles6.container }, /* @__PURE__ */ React4.createElement(View4, { style: styles6.topRow }, /* @__PURE__ */ React4.createElement(View4, { style: styles6.positionInfo }, /* @__PURE__ */ React4.createElement(Text2, { style: styles6.positionText }, "Test ", currentIndex + 1, " of ", allTests.length), displayedAssignment.status === "in_progress" && assignmentElapsedTime > 0 && /* @__PURE__ */ React4.createElement(View4, { style: styles6.timerBadge }, /* @__PURE__ */ React4.createElement(Text2, { style: styles6.timerText }, formatElapsedTime(assignmentElapsedTime)))), /* @__PURE__ */ React4.createElement(TouchableOpacity2, { onPress: () => nav.push({ name: "TEST_LIST" }) }, /* @__PURE__ */ React4.createElement(Text2, { style: styles6.viewAllLink }, "View All \u2192"))), displayedAssignment.isVerification && /* @__PURE__ */ React4.createElement(View4, { style: styles6.retestBanner }, /* @__PURE__ */ React4.createElement(Text2, { style: styles6.retestIcon }, "\u{1F504}"), /* @__PURE__ */ React4.createElement(Text2, { style: styles6.retestLabel }, "Retest"), /* @__PURE__ */ React4.createElement(Text2, { style: styles6.retestSub }, "\u2014 Verify bug fix")), /* @__PURE__ */ React4.createElement(Text2, { style: styles6.testTitle }, testCase.title), testCase.key && /* @__PURE__ */ React4.createElement(Text2, { style: styles6.testKey }, testCase.key), /* @__PURE__ */ React4.createElement(TouchableOpacity2, { onPress: () => setShowSteps(!showSteps), style: styles6.sectionHeader }, /* @__PURE__ */ React4.createElement(Text2, { style: styles6.sectionHeaderText }, showSteps ? "\u25BC" : "\u25B6", " ", info.icon, " ", template === "freeform" ? "Instructions" : `${steps.length} ${template === "checklist" ? "items" : template === "rubric" ? "criteria" : "steps"}`)), showSteps && /* @__PURE__ */ React4.createElement(View4, { style: styles6.templateContent }, template === "steps" && steps.map((step, idx) => /* @__PURE__ */ React4.createElement(View4, { key: idx, style: styles6.step }, /* @__PURE__ */ React4.createElement(View4, { style: styles6.stepNumber }, /* @__PURE__ */ React4.createElement(Text2, { style: styles6.stepNumberText }, step.stepNumber)), /* @__PURE__ */ React4.createElement(View4, { style: styles6.stepBody }, /* @__PURE__ */ React4.createElement(Text2, { style: styles6.stepAction }, step.action), step.expectedResult && /* @__PURE__ */ React4.createElement(Text2, { style: styles6.stepExpected }, "\u2192 ", step.expectedResult)))), template === "checklist" && /* @__PURE__ */ React4.createElement(React4.Fragment, null, steps.map((step, idx) => /* @__PURE__ */ React4.createElement(
16022
16062
  TouchableOpacity2,
16023
16063
  {
16024
16064
  key: idx,
@@ -16028,76 +16068,95 @@ function TestDetailScreen({ testId, nav }) {
16028
16068
  else next[idx] = true;
16029
16069
  return next;
16030
16070
  }),
16031
- style: [styles5.checklistItem, criteriaResults[idx] === true && styles5.checklistItemChecked]
16071
+ style: [styles6.checklistItem, criteriaResults[idx] === true && styles6.checklistItemChecked]
16032
16072
  },
16033
- /* @__PURE__ */ React4.createElement(View4, { style: [styles5.checkbox, criteriaResults[idx] === true && styles5.checkboxChecked] }, criteriaResults[idx] === true && /* @__PURE__ */ React4.createElement(Text2, { style: styles5.checkmark }, "\u2713")),
16034
- /* @__PURE__ */ React4.createElement(Text2, { style: [styles5.checklistText, criteriaResults[idx] === true && styles5.checklistTextDone] }, step.action)
16035
- )), Object.keys(criteriaResults).length > 0 && /* @__PURE__ */ React4.createElement(TouchableOpacity2, { onPress: () => setCriteriaResults({}), style: styles5.resetRow }, /* @__PURE__ */ React4.createElement(Text2, { style: styles5.resetText }, "\u21BA Reset"))), template === "rubric" && steps.map((step, idx) => /* @__PURE__ */ React4.createElement(View4, { key: idx, style: styles5.rubricItem }, /* @__PURE__ */ React4.createElement(Text2, { style: styles5.rubricTitle }, idx + 1, ". ", step.action), step.expectedResult && /* @__PURE__ */ React4.createElement(Text2, { style: styles5.rubricExpected }, step.expectedResult), rubricMode === "pass_fail" ? /* @__PURE__ */ React4.createElement(View4, { style: styles5.passFailRow }, /* @__PURE__ */ React4.createElement(
16073
+ /* @__PURE__ */ React4.createElement(View4, { style: [styles6.checkbox, criteriaResults[idx] === true && styles6.checkboxChecked] }, criteriaResults[idx] === true && /* @__PURE__ */ React4.createElement(Text2, { style: styles6.checkmark }, "\u2713")),
16074
+ /* @__PURE__ */ React4.createElement(Text2, { style: [styles6.checklistText, criteriaResults[idx] === true && styles6.checklistTextDone] }, step.action)
16075
+ )), Object.keys(criteriaResults).length > 0 && /* @__PURE__ */ React4.createElement(TouchableOpacity2, { onPress: () => setCriteriaResults({}), style: styles6.resetRow }, /* @__PURE__ */ React4.createElement(Text2, { style: styles6.resetText }, "\u21BA Reset"))), template === "rubric" && steps.map((step, idx) => /* @__PURE__ */ React4.createElement(View4, { key: idx, style: styles6.rubricItem }, /* @__PURE__ */ React4.createElement(Text2, { style: styles6.rubricTitle }, idx + 1, ". ", step.action), step.expectedResult && /* @__PURE__ */ React4.createElement(Text2, { style: styles6.rubricExpected }, step.expectedResult), rubricMode === "pass_fail" ? /* @__PURE__ */ React4.createElement(View4, { style: styles6.passFailRow }, /* @__PURE__ */ React4.createElement(
16036
16076
  TouchableOpacity2,
16037
16077
  {
16038
16078
  onPress: () => setCriteriaResults((prev) => ({ ...prev, [idx]: true })),
16039
- style: [styles5.pfButton, criteriaResults[idx] === true && styles5.pfButtonPass]
16079
+ style: [styles6.pfButton, criteriaResults[idx] === true && styles6.pfButtonPass]
16040
16080
  },
16041
- /* @__PURE__ */ React4.createElement(Text2, { style: [styles5.pfButtonText, criteriaResults[idx] === true && styles5.pfButtonTextActive] }, "\u2713 Pass")
16081
+ /* @__PURE__ */ React4.createElement(Text2, { style: [styles6.pfButtonText, criteriaResults[idx] === true && styles6.pfButtonTextActive] }, "\u2713 Pass")
16042
16082
  ), /* @__PURE__ */ React4.createElement(
16043
16083
  TouchableOpacity2,
16044
16084
  {
16045
16085
  onPress: () => setCriteriaResults((prev) => ({ ...prev, [idx]: false })),
16046
- style: [styles5.pfButton, criteriaResults[idx] === false && styles5.pfButtonFail]
16086
+ style: [styles6.pfButton, criteriaResults[idx] === false && styles6.pfButtonFail]
16047
16087
  },
16048
- /* @__PURE__ */ React4.createElement(Text2, { style: [styles5.pfButtonText, criteriaResults[idx] === false && styles5.pfButtonTextActive] }, "\u2717 Fail")
16049
- )) : /* @__PURE__ */ React4.createElement(View4, { style: styles5.ratingRow }, [1, 2, 3, 4, 5].map((n) => /* @__PURE__ */ React4.createElement(
16088
+ /* @__PURE__ */ React4.createElement(Text2, { style: [styles6.pfButtonText, criteriaResults[idx] === false && styles6.pfButtonTextActive] }, "\u2717 Fail")
16089
+ )) : /* @__PURE__ */ React4.createElement(View4, { style: styles6.ratingRow }, [1, 2, 3, 4, 5].map((n) => /* @__PURE__ */ React4.createElement(
16050
16090
  TouchableOpacity2,
16051
16091
  {
16052
16092
  key: n,
16053
16093
  onPress: () => setCriteriaResults((prev) => ({ ...prev, [idx]: n })),
16054
- style: [styles5.ratingBtn, criteriaResults[idx] === n && styles5.ratingBtnActive]
16094
+ style: [styles6.ratingBtn, criteriaResults[idx] === n && styles6.ratingBtnActive]
16055
16095
  },
16056
- /* @__PURE__ */ React4.createElement(Text2, { style: [styles5.ratingBtnText, criteriaResults[idx] === n && styles5.ratingBtnTextActive] }, n)
16057
- ))))), template === "freeform" && /* @__PURE__ */ React4.createElement(View4, { style: styles5.freeformBox }, /* @__PURE__ */ React4.createElement(Text2, { style: styles5.freeformText }, "Review the area and note:"), /* @__PURE__ */ React4.createElement(Text2, { style: styles5.freeformBullet }, "\u2022 What works well"), /* @__PURE__ */ React4.createElement(Text2, { style: styles5.freeformBullet }, "\u2022 Issues or concerns"), /* @__PURE__ */ React4.createElement(Text2, { style: styles5.freeformBullet }, "\u2022 Suggestions"))), testCase.expectedResult && /* @__PURE__ */ React4.createElement(View4, { style: styles5.expectedBox }, /* @__PURE__ */ React4.createElement(Text2, { style: styles5.expectedLabel }, "\u2705 Expected Result"), /* @__PURE__ */ React4.createElement(Text2, { style: styles5.expectedText }, testCase.expectedResult)), testCase.targetRoute && onNavigate && /* @__PURE__ */ React4.createElement(
16096
+ /* @__PURE__ */ React4.createElement(Text2, { style: [styles6.ratingBtnText, criteriaResults[idx] === n && styles6.ratingBtnTextActive] }, n)
16097
+ ))))), template === "freeform" && /* @__PURE__ */ React4.createElement(View4, { style: styles6.freeformBox }, /* @__PURE__ */ React4.createElement(Text2, { style: styles6.freeformText }, "Review the area and note:"), /* @__PURE__ */ React4.createElement(Text2, { style: styles6.freeformBullet }, "\u2022 What works well"), /* @__PURE__ */ React4.createElement(Text2, { style: styles6.freeformBullet }, "\u2022 Issues or concerns"), /* @__PURE__ */ React4.createElement(Text2, { style: styles6.freeformBullet }, "\u2022 Suggestions"))), testCase.expectedResult && /* @__PURE__ */ React4.createElement(View4, { style: styles6.expectedBox }, /* @__PURE__ */ React4.createElement(Text2, { style: styles6.expectedLabel }, "\u2705 Expected Result"), /* @__PURE__ */ React4.createElement(Text2, { style: styles6.expectedText }, testCase.expectedResult)), testCase.targetRoute && onNavigate && /* @__PURE__ */ React4.createElement(
16058
16098
  TouchableOpacity2,
16059
16099
  {
16060
- style: styles5.navigateButton,
16100
+ style: styles6.navigateButton,
16061
16101
  onPress: () => {
16062
16102
  Keyboard.dismiss();
16063
16103
  onNavigate(testCase.targetRoute);
16064
16104
  nav.closeWidget?.();
16065
16105
  }
16066
16106
  },
16067
- /* @__PURE__ */ React4.createElement(Text2, { style: styles5.navigateText }, "\u{1F9ED} Go to test location")
16068
- ), /* @__PURE__ */ React4.createElement(TouchableOpacity2, { onPress: () => setShowDetails(!showDetails), style: styles5.detailsToggle }, /* @__PURE__ */ React4.createElement(Text2, { style: styles5.detailsToggleText }, showDetails ? "\u25BC" : "\u25B6", " Details")), showDetails && /* @__PURE__ */ React4.createElement(View4, { style: styles5.detailsSection }, testCase.key && /* @__PURE__ */ React4.createElement(Text2, { style: styles5.detailMeta }, testCase.key, " \xB7 ", testCase.priority, " \xB7 ", info.name), testCase.track && /* @__PURE__ */ React4.createElement(Text2, { style: styles5.detailMeta }, testCase.track.icon, " ", testCase.track.name), testCase.description && /* @__PURE__ */ React4.createElement(Text2, { style: styles5.detailDesc }, testCase.description), testCase.group && /* @__PURE__ */ React4.createElement(View4, { style: styles5.folderProgress }, /* @__PURE__ */ React4.createElement(Text2, { style: styles5.folderName }, "\u{1F4C1} ", testCase.group.name))), displayedAssignment.status === "passed" || displayedAssignment.status === "failed" || displayedAssignment.status === "skipped" || displayedAssignment.status === "blocked" ? /* @__PURE__ */ React4.createElement(React4.Fragment, null, /* @__PURE__ */ React4.createElement(View4, { style: [
16069
- styles5.completedBanner,
16070
- displayedAssignment.status === "passed" && styles5.completedBannerPass,
16071
- displayedAssignment.status === "failed" && styles5.completedBannerFail
16072
- ] }, /* @__PURE__ */ React4.createElement(Text2, { style: styles5.completedIcon }, displayedAssignment.status === "passed" ? "\u2705" : displayedAssignment.status === "failed" ? "\u274C" : displayedAssignment.status === "skipped" ? "\u23ED" : "\u{1F6AB}"), /* @__PURE__ */ React4.createElement(Text2, { style: [
16073
- styles5.completedLabel,
16107
+ /* @__PURE__ */ React4.createElement(Text2, { style: styles6.navigateText }, "\u{1F9ED} Go to test location")
16108
+ ), /* @__PURE__ */ React4.createElement(TouchableOpacity2, { onPress: () => setShowDetails(!showDetails), style: styles6.detailsToggle }, /* @__PURE__ */ React4.createElement(Text2, { style: styles6.detailsToggleText }, showDetails ? "\u25BC" : "\u25B6", " Details")), showDetails && /* @__PURE__ */ React4.createElement(View4, { style: styles6.detailsSection }, testCase.key && /* @__PURE__ */ React4.createElement(Text2, { style: styles6.detailMeta }, testCase.key, " \xB7 ", testCase.priority, " \xB7 ", info.name), testCase.track && /* @__PURE__ */ React4.createElement(Text2, { style: styles6.detailMeta }, testCase.track.icon, " ", testCase.track.name), testCase.description && /* @__PURE__ */ React4.createElement(Text2, { style: styles6.detailDesc }, testCase.description), testCase.group && /* @__PURE__ */ React4.createElement(View4, { style: styles6.folderProgress }, /* @__PURE__ */ React4.createElement(Text2, { style: styles6.folderName }, "\u{1F4C1} ", testCase.group.name))), displayedAssignment.status === "in_progress" && nav.startMiniRunner && /* @__PURE__ */ React4.createElement(
16109
+ TouchableOpacity2,
16110
+ {
16111
+ style: styles6.startTestBtn,
16112
+ onPress: () => nav.startMiniRunner(displayedAssignment.id)
16113
+ },
16114
+ /* @__PURE__ */ React4.createElement(Text2, { style: styles6.startTestText }, "\u25B6 Start Test")
16115
+ ), displayedAssignment.status === "passed" || displayedAssignment.status === "failed" || displayedAssignment.status === "skipped" || displayedAssignment.status === "blocked" ? /* @__PURE__ */ React4.createElement(React4.Fragment, null, /* @__PURE__ */ React4.createElement(View4, { style: [
16116
+ styles6.completedBanner,
16117
+ displayedAssignment.status === "passed" && styles6.completedBannerPass,
16118
+ displayedAssignment.status === "failed" && styles6.completedBannerFail
16119
+ ] }, /* @__PURE__ */ React4.createElement(Text2, { style: styles6.completedIcon }, displayedAssignment.status === "passed" ? "\u2705" : displayedAssignment.status === "failed" ? "\u274C" : displayedAssignment.status === "skipped" ? "\u23ED" : "\u{1F6AB}"), /* @__PURE__ */ React4.createElement(Text2, { style: [
16120
+ styles6.completedLabel,
16074
16121
  displayedAssignment.status === "passed" && { color: colors.green },
16075
16122
  displayedAssignment.status === "failed" && { color: colors.redLight }
16076
- ] }, "Marked as ", displayedAssignment.status.charAt(0).toUpperCase() + displayedAssignment.status.slice(1))), !(displayedAssignment.isVerification && (displayedAssignment.status === "passed" || displayedAssignment.status === "failed")) && /* @__PURE__ */ React4.createElement(View4, { style: [styles5.actionButtons, { marginTop: 4 }] }, /* @__PURE__ */ React4.createElement(
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: [styles6.actionButtons, { marginTop: 4 }] }, /* @__PURE__ */ React4.createElement(
16077
16124
  TouchableOpacity2,
16078
16125
  {
16079
- style: [styles5.actionBtn, styles5.reopenBtn, isSubmitting && { opacity: 0.5 }],
16126
+ style: [styles6.actionBtn, styles6.reopenBtn, isSubmitting && { opacity: 0.5 }],
16080
16127
  onPress: handleReopen,
16081
16128
  disabled: isSubmitting
16082
16129
  },
16083
- /* @__PURE__ */ React4.createElement(Text2, { style: styles5.reopenBtnText }, isSubmitting ? "Reopening..." : "\u{1F504} Reopen Test")
16130
+ /* @__PURE__ */ React4.createElement(Text2, { style: styles6.reopenBtnText }, isSubmitting ? "Reopening..." : "\u{1F504} Reopen Test")
16084
16131
  ), displayedAssignment.status === "passed" && /* @__PURE__ */ React4.createElement(
16085
16132
  TouchableOpacity2,
16086
16133
  {
16087
- style: [styles5.actionBtn, styles5.failBtn, isSubmitting && { opacity: 0.5 }],
16134
+ style: [styles6.actionBtn, styles6.failBtn, isSubmitting && { opacity: 0.5 }],
16088
16135
  onPress: () => handleChangeResult("failed"),
16089
16136
  disabled: isSubmitting
16090
16137
  },
16091
- /* @__PURE__ */ React4.createElement(Text2, { style: styles5.failBtnText }, "Change to Fail")
16138
+ /* @__PURE__ */ React4.createElement(Text2, { style: styles6.failBtnText }, "Change to Fail")
16092
16139
  ), displayedAssignment.status === "failed" && /* @__PURE__ */ React4.createElement(
16093
16140
  TouchableOpacity2,
16094
16141
  {
16095
- style: [styles5.actionBtn, styles5.passBtn, isSubmitting && { opacity: 0.5 }],
16142
+ style: [styles6.actionBtn, styles6.passBtn, isSubmitting && { opacity: 0.5 }],
16096
16143
  onPress: () => handleChangeResult("passed"),
16097
16144
  disabled: isSubmitting
16098
16145
  },
16099
- /* @__PURE__ */ React4.createElement(Text2, { style: styles5.passBtnText }, "Change to Pass")
16100
- ))) : /* @__PURE__ */ React4.createElement(View4, { style: styles5.actionButtons }, /* @__PURE__ */ React4.createElement(TouchableOpacity2, { style: [styles5.actionBtn, styles5.failBtn, isSubmitting && { opacity: 0.5 }], onPress: handleFail, disabled: isSubmitting }, /* @__PURE__ */ React4.createElement(Text2, { style: styles5.failBtnText }, isSubmitting ? displayedAssignment.isVerification ? "Reporting..." : "Failing..." : displayedAssignment.isVerification ? "\u2717 Still Broken" : "Fail")), /* @__PURE__ */ React4.createElement(TouchableOpacity2, { style: [styles5.actionBtn, styles5.skipBtn, isSubmitting && { opacity: 0.5 }], onPress: () => setShowSkipModal(true), disabled: isSubmitting }, /* @__PURE__ */ React4.createElement(Text2, { style: styles5.skipBtnText }, "Skip")), /* @__PURE__ */ React4.createElement(TouchableOpacity2, { style: [styles5.actionBtn, styles5.passBtn, isSubmitting && { opacity: 0.5 }], onPress: handlePass, disabled: isSubmitting }, /* @__PURE__ */ React4.createElement(Text2, { style: styles5.passBtnText }, isSubmitting ? displayedAssignment.isVerification ? "Verifying..." : "Passing..." : displayedAssignment.isVerification ? "\u2713 Fix Verified" : "Pass"))), /* @__PURE__ */ React4.createElement(Modal, { visible: showSkipModal, transparent: true, animationType: "fade" }, /* @__PURE__ */ React4.createElement(View4, { style: styles5.modalOverlay }, /* @__PURE__ */ React4.createElement(View4, { style: styles5.modalContent }, /* @__PURE__ */ React4.createElement(Text2, { style: styles5.modalTitle }, "Skip this test?"), /* @__PURE__ */ React4.createElement(Text2, { style: styles5.modalSubtitle }, "Select a reason:"), [
16146
+ /* @__PURE__ */ React4.createElement(Text2, { style: styles6.passBtnText }, "Change to Pass")
16147
+ ))) : /* @__PURE__ */ React4.createElement(View4, { style: styles6.actionButtons }, /* @__PURE__ */ React4.createElement(TouchableOpacity2, { style: [styles6.actionBtn, styles6.failBtn, isSubmitting && { opacity: 0.5 }], onPress: handleFail, disabled: isSubmitting }, /* @__PURE__ */ React4.createElement(Text2, { style: styles6.failBtnText }, isSubmitting ? displayedAssignment.isVerification ? "Reporting..." : "Failing..." : displayedAssignment.isVerification ? "\u2717 Still Broken" : "Fail")), /* @__PURE__ */ React4.createElement(TouchableOpacity2, { style: [styles6.actionBtn, styles6.skipBtn, isSubmitting && { opacity: 0.5 }], onPress: () => setShowSkipModal(true), disabled: isSubmitting }, /* @__PURE__ */ React4.createElement(Text2, { style: styles6.skipBtnText }, "Skip")), /* @__PURE__ */ React4.createElement(TouchableOpacity2, { style: [styles6.actionBtn, styles6.passBtn, isSubmitting && { opacity: 0.5 }], onPress: handlePass, disabled: isSubmitting }, /* @__PURE__ */ React4.createElement(Text2, { style: styles6.passBtnText }, isSubmitting ? displayedAssignment.isVerification ? "Verifying..." : "Passing..." : displayedAssignment.isVerification ? "\u2713 Fix Verified" : "Pass"))), feedbackToastAssignmentId && /* @__PURE__ */ React4.createElement(Animated2.View, { style: [styles6.passToast, { transform: [{ translateY: toastSlideAnim }] }] }, /* @__PURE__ */ React4.createElement(View4, { style: styles6.passToastContent }, /* @__PURE__ */ React4.createElement(Text2, { style: styles6.passToastIcon }, "\u2705"), /* @__PURE__ */ React4.createElement(Text2, { style: styles6.passToastText }, "Test passed!")), /* @__PURE__ */ React4.createElement(
16148
+ TouchableOpacity2,
16149
+ {
16150
+ style: styles6.passToastButton,
16151
+ onPress: () => {
16152
+ if (toastTimerRef.current) clearTimeout(toastTimerRef.current);
16153
+ const toastId = feedbackToastAssignmentId;
16154
+ setFeedbackToastAssignmentId(null);
16155
+ nav.push({ name: "TEST_FEEDBACK", status: "passed", assignmentId: toastId });
16156
+ }
16157
+ },
16158
+ /* @__PURE__ */ React4.createElement(Text2, { style: styles6.passToastButtonText }, "Rate this test")
16159
+ )), /* @__PURE__ */ React4.createElement(Modal, { visible: showSkipModal, transparent: true, animationType: "fade" }, /* @__PURE__ */ React4.createElement(View4, { style: styles6.modalOverlay }, /* @__PURE__ */ React4.createElement(View4, { style: styles6.modalContent }, /* @__PURE__ */ React4.createElement(Text2, { style: styles6.modalTitle }, "Skip this test?"), /* @__PURE__ */ React4.createElement(Text2, { style: styles6.modalSubtitle }, "Select a reason:"), [
16101
16160
  { reason: "blocked", label: "\u{1F6AB} Blocked by a bug" },
16102
16161
  { reason: "not_ready", label: "\u{1F6A7} Feature not ready" },
16103
16162
  { reason: "dependency", label: "\u{1F517} Needs another test first" },
@@ -16106,32 +16165,32 @@ function TestDetailScreen({ testId, nav }) {
16106
16165
  TouchableOpacity2,
16107
16166
  {
16108
16167
  key: reason,
16109
- style: [styles5.skipOption, selectedSkipReason === reason && styles5.skipOptionActive],
16168
+ style: [styles6.skipOption, selectedSkipReason === reason && styles6.skipOptionActive],
16110
16169
  onPress: () => setSelectedSkipReason(reason)
16111
16170
  },
16112
- /* @__PURE__ */ React4.createElement(Text2, { style: [styles5.skipOptionText, selectedSkipReason === reason && styles5.skipOptionTextActive] }, label)
16171
+ /* @__PURE__ */ React4.createElement(Text2, { style: [styles6.skipOptionText, selectedSkipReason === reason && styles6.skipOptionTextActive] }, label)
16113
16172
  )), /* @__PURE__ */ React4.createElement(
16114
16173
  TextInput,
16115
16174
  {
16116
- style: styles5.skipNotes,
16175
+ style: styles6.skipNotes,
16117
16176
  value: skipNotes,
16118
16177
  onChangeText: setSkipNotes,
16119
16178
  placeholder: "Additional notes (optional)",
16120
16179
  placeholderTextColor: colors.textMuted,
16121
16180
  multiline: true
16122
16181
  }
16123
- ), /* @__PURE__ */ React4.createElement(View4, { style: styles5.skipActions }, /* @__PURE__ */ React4.createElement(TouchableOpacity2, { style: styles5.skipCancel, onPress: () => {
16182
+ ), /* @__PURE__ */ React4.createElement(View4, { style: styles6.skipActions }, /* @__PURE__ */ React4.createElement(TouchableOpacity2, { style: styles6.skipCancel, onPress: () => {
16124
16183
  setShowSkipModal(false);
16125
16184
  setSelectedSkipReason(null);
16126
16185
  setSkipNotes("");
16127
- } }, /* @__PURE__ */ React4.createElement(Text2, { style: styles5.skipCancelText }, "Cancel")), /* @__PURE__ */ React4.createElement(
16186
+ } }, /* @__PURE__ */ React4.createElement(Text2, { style: styles6.skipCancelText }, "Cancel")), /* @__PURE__ */ React4.createElement(
16128
16187
  TouchableOpacity2,
16129
16188
  {
16130
- style: [styles5.skipConfirm, !selectedSkipReason && { opacity: 0.4 }],
16189
+ style: [styles6.skipConfirm, !selectedSkipReason && { opacity: 0.4 }],
16131
16190
  onPress: handleSkip,
16132
16191
  disabled: !selectedSkipReason || skipping
16133
16192
  },
16134
- /* @__PURE__ */ React4.createElement(Text2, { style: styles5.skipConfirmText }, skipping ? "Skipping..." : "Skip Test")
16193
+ /* @__PURE__ */ React4.createElement(Text2, { style: styles6.skipConfirmText }, skipping ? "Skipping..." : "Skip Test")
16135
16194
  ))))));
16136
16195
  }
16137
16196
  function createStyles2() {
@@ -16234,7 +16293,17 @@ function createStyles2() {
16234
16293
  skipCancel: { flex: 1, paddingVertical: 12, borderRadius: 10, alignItems: "center", backgroundColor: colors.card },
16235
16294
  skipCancelText: { fontSize: 14, color: colors.textSecondary },
16236
16295
  skipConfirm: { flex: 1, paddingVertical: 12, borderRadius: 10, alignItems: "center", backgroundColor: colors.yellow },
16237
- skipConfirmText: { fontSize: 14, fontWeight: "600", color: colors.onBright }
16296
+ skipConfirmText: { fontSize: 14, fontWeight: "600", color: colors.onBright },
16297
+ // Start test button
16298
+ startTestBtn: { backgroundColor: colors.blueDark, borderRadius: 10, padding: 12, borderWidth: 1, borderColor: colors.blue, alignItems: "center", marginBottom: 8 },
16299
+ startTestText: { fontSize: 14, fontWeight: "600", color: colors.blueLight },
16300
+ // Instant pass toast
16301
+ passToast: { position: "absolute", bottom: 16, left: 16, right: 16, flexDirection: "row", alignItems: "center", justifyContent: "space-between", backgroundColor: colors.greenDark, borderWidth: 1, borderColor: colors.green, borderRadius: 10, paddingVertical: 10, paddingHorizontal: 14, zIndex: 1e4 },
16302
+ passToastContent: { flexDirection: "row", alignItems: "center", gap: 8 },
16303
+ passToastIcon: { fontSize: 14 },
16304
+ passToastText: { fontSize: 13, fontWeight: "600", color: colors.green },
16305
+ passToastButton: { borderWidth: 1, borderColor: colors.green, borderRadius: 8, paddingVertical: 4, paddingHorizontal: 10 },
16306
+ passToastButtonText: { fontSize: 12, fontWeight: "500", color: colors.green }
16238
16307
  });
16239
16308
  }
16240
16309
 
@@ -16243,7 +16312,7 @@ import React5, { useState as useState4, useMemo as useMemo3, useCallback as useC
16243
16312
  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";
16244
16313
  function TestListScreen({ nav }) {
16245
16314
  const { assignments, currentAssignment, refreshAssignments, dashboardUrl, isLoading, widgetColorScheme } = useBugBear();
16246
- const styles5 = useMemo3(() => createStyles3(), [widgetColorScheme]);
16315
+ const styles6 = useMemo3(() => createStyles3(), [widgetColorScheme]);
16247
16316
  const [filter, setFilter] = useState4("all");
16248
16317
  const [roleFilter, setRoleFilter] = useState4(null);
16249
16318
  const [trackFilter, setTrackFilter] = useState4(null);
@@ -16335,18 +16404,18 @@ function TestListScreen({ nav }) {
16335
16404
  return true;
16336
16405
  }, [platformFilter, roleFilter, trackFilter, searchQuery, filter]);
16337
16406
  if (isLoading) return /* @__PURE__ */ React5.createElement(TestListScreenSkeleton, null);
16338
- return /* @__PURE__ */ React5.createElement(View5, null, /* @__PURE__ */ React5.createElement(View5, { style: styles5.filterBar }, [
16407
+ return /* @__PURE__ */ React5.createElement(View5, null, /* @__PURE__ */ React5.createElement(View5, { style: styles6.filterBar }, [
16339
16408
  { key: "all", label: "All", count: assignments.length },
16340
16409
  { key: "todo", label: "To Do", count: assignments.filter((a) => !a.isVerification && (a.status === "pending" || a.status === "in_progress" || a.status === "failed")).length },
16341
16410
  { key: "retest", label: "Retest", count: assignments.filter((a) => !!a.isVerification && (a.status === "pending" || a.status === "in_progress")).length },
16342
16411
  { key: "done", label: "Done", count: assignments.filter((a) => a.status === "passed" || a.status === "skipped" || a.status === "blocked").length }
16343
- ].map((f) => /* @__PURE__ */ React5.createElement(TouchableOpacity3, { key: f.key, style: [styles5.filterBtn, filter === f.key && styles5.filterBtnActive], onPress: () => setFilter(f.key) }, /* @__PURE__ */ React5.createElement(Text3, { style: [styles5.filterBtnText, filter === f.key && styles5.filterBtnTextActive] }, f.label, " (", f.count, ")")))), availableRoles.length >= 2 && /* @__PURE__ */ React5.createElement(View5, { style: styles5.roleSection }, /* @__PURE__ */ React5.createElement(ScrollView, { horizontal: true, showsHorizontalScrollIndicator: false, style: styles5.roleBar }, /* @__PURE__ */ React5.createElement(
16412
+ ].map((f) => /* @__PURE__ */ React5.createElement(TouchableOpacity3, { key: f.key, style: [styles6.filterBtn, filter === f.key && styles6.filterBtnActive], onPress: () => setFilter(f.key) }, /* @__PURE__ */ React5.createElement(Text3, { style: [styles6.filterBtnText, filter === f.key && styles6.filterBtnTextActive] }, f.label, " (", f.count, ")")))), availableRoles.length >= 2 && /* @__PURE__ */ React5.createElement(View5, { style: styles6.roleSection }, /* @__PURE__ */ React5.createElement(ScrollView, { horizontal: true, showsHorizontalScrollIndicator: false, style: styles6.roleBar }, /* @__PURE__ */ React5.createElement(
16344
16413
  TouchableOpacity3,
16345
16414
  {
16346
- style: [styles5.roleBtn, !roleFilter && styles5.roleBtnActive],
16415
+ style: [styles6.roleBtn, !roleFilter && styles6.roleBtnActive],
16347
16416
  onPress: () => setRoleFilter(null)
16348
16417
  },
16349
- /* @__PURE__ */ React5.createElement(Text3, { style: [styles5.roleBtnText, !roleFilter && styles5.roleBtnTextActive] }, "All Roles")
16418
+ /* @__PURE__ */ React5.createElement(Text3, { style: [styles6.roleBtnText, !roleFilter && styles6.roleBtnTextActive] }, "All Roles")
16350
16419
  ), availableRoles.map((role) => {
16351
16420
  const isActive = roleFilter === role.id;
16352
16421
  return /* @__PURE__ */ React5.createElement(
@@ -16354,30 +16423,30 @@ function TestListScreen({ nav }) {
16354
16423
  {
16355
16424
  key: role.id,
16356
16425
  style: [
16357
- styles5.roleBtn,
16426
+ styles6.roleBtn,
16358
16427
  isActive && { backgroundColor: role.color + "20", borderColor: role.color + "60", borderWidth: 1 }
16359
16428
  ],
16360
16429
  onPress: () => setRoleFilter(isActive ? null : role.id)
16361
16430
  },
16362
- /* @__PURE__ */ React5.createElement(View5, { style: [styles5.roleDot, { backgroundColor: role.color }] }),
16363
- /* @__PURE__ */ React5.createElement(Text3, { style: [styles5.roleBtnText, isActive && { color: role.color, fontWeight: "600" }] }, role.name)
16431
+ /* @__PURE__ */ React5.createElement(View5, { style: [styles6.roleDot, { backgroundColor: role.color }] }),
16432
+ /* @__PURE__ */ React5.createElement(Text3, { style: [styles6.roleBtnText, isActive && { color: role.color, fontWeight: "600" }] }, role.name)
16364
16433
  );
16365
- })), selectedRole?.loginHint && /* @__PURE__ */ React5.createElement(View5, { style: [styles5.loginHint, { backgroundColor: selectedRole.color + "10", borderColor: selectedRole.color + "30" }] }, /* @__PURE__ */ React5.createElement(Text3, { style: styles5.loginHintText }, "Log in as: ", selectedRole.loginHint))), /* @__PURE__ */ React5.createElement(View5, { style: styles5.searchContainer }, /* @__PURE__ */ React5.createElement(
16434
+ })), selectedRole?.loginHint && /* @__PURE__ */ React5.createElement(View5, { style: [styles6.loginHint, { backgroundColor: selectedRole.color + "10", borderColor: selectedRole.color + "30" }] }, /* @__PURE__ */ React5.createElement(Text3, { style: styles6.loginHintText }, "Log in as: ", selectedRole.loginHint))), /* @__PURE__ */ React5.createElement(View5, { style: styles6.searchContainer }, /* @__PURE__ */ React5.createElement(
16366
16435
  TextInput2,
16367
16436
  {
16368
16437
  value: searchQuery,
16369
16438
  onChangeText: setSearchQuery,
16370
16439
  placeholder: "Search tests...",
16371
16440
  placeholderTextColor: colors.textMuted,
16372
- style: styles5.searchInput
16441
+ style: styles6.searchInput
16373
16442
  }
16374
- )), /* @__PURE__ */ React5.createElement(ScrollView, { horizontal: true, showsHorizontalScrollIndicator: false, style: styles5.platformBar }, /* @__PURE__ */ React5.createElement(
16443
+ )), /* @__PURE__ */ React5.createElement(ScrollView, { horizontal: true, showsHorizontalScrollIndicator: false, style: styles6.platformBar }, /* @__PURE__ */ React5.createElement(
16375
16444
  TouchableOpacity3,
16376
16445
  {
16377
- style: [styles5.platformBtn, !platformFilter && styles5.platformBtnActive],
16446
+ style: [styles6.platformBtn, !platformFilter && styles6.platformBtnActive],
16378
16447
  onPress: () => setPlatformFilter(null)
16379
16448
  },
16380
- /* @__PURE__ */ React5.createElement(Text3, { style: [styles5.platformBtnText, !platformFilter && styles5.platformBtnTextActive] }, "All")
16449
+ /* @__PURE__ */ React5.createElement(Text3, { style: [styles6.platformBtnText, !platformFilter && styles6.platformBtnTextActive] }, "All")
16381
16450
  ), [
16382
16451
  { key: "web", label: "Web", icon: "\u{1F310}" },
16383
16452
  { key: "ios", label: "iOS", icon: "\u{1F4F1}" },
@@ -16389,32 +16458,32 @@ function TestListScreen({ nav }) {
16389
16458
  {
16390
16459
  key: p.key,
16391
16460
  style: [
16392
- styles5.platformBtn,
16461
+ styles6.platformBtn,
16393
16462
  isActive && { backgroundColor: colors.blue + "20", borderColor: colors.blue + "60", borderWidth: 1 }
16394
16463
  ],
16395
16464
  onPress: () => setPlatformFilter(isActive ? null : p.key)
16396
16465
  },
16397
- /* @__PURE__ */ React5.createElement(Text3, { style: [styles5.platformBtnText, isActive && { color: colors.blue, fontWeight: "600" }] }, p.icon, " ", p.label)
16466
+ /* @__PURE__ */ React5.createElement(Text3, { style: [styles6.platformBtnText, isActive && { color: colors.blue, fontWeight: "600" }] }, p.icon, " ", p.label)
16398
16467
  );
16399
- })), /* @__PURE__ */ React5.createElement(View5, { style: styles5.trackSortRow }, availableTracks.length >= 2 && /* @__PURE__ */ React5.createElement(ScrollView, { horizontal: true, showsHorizontalScrollIndicator: false, style: { flex: 1 } }, /* @__PURE__ */ React5.createElement(
16468
+ })), /* @__PURE__ */ React5.createElement(View5, { style: styles6.trackSortRow }, availableTracks.length >= 2 && /* @__PURE__ */ React5.createElement(ScrollView, { horizontal: true, showsHorizontalScrollIndicator: false, style: { flex: 1 } }, /* @__PURE__ */ React5.createElement(
16400
16469
  TouchableOpacity3,
16401
16470
  {
16402
- style: [styles5.trackBtn, !trackFilter && styles5.trackBtnActive],
16471
+ style: [styles6.trackBtn, !trackFilter && styles6.trackBtnActive],
16403
16472
  onPress: () => setTrackFilter(null)
16404
16473
  },
16405
- /* @__PURE__ */ React5.createElement(Text3, { style: [styles5.trackBtnText, !trackFilter && styles5.trackBtnTextActive] }, "All Tracks")
16474
+ /* @__PURE__ */ React5.createElement(Text3, { style: [styles6.trackBtnText, !trackFilter && styles6.trackBtnTextActive] }, "All Tracks")
16406
16475
  ), availableTracks.map((track) => {
16407
16476
  const isActive = trackFilter === track.id;
16408
16477
  return /* @__PURE__ */ React5.createElement(
16409
16478
  TouchableOpacity3,
16410
16479
  {
16411
16480
  key: track.id,
16412
- style: [styles5.trackBtn, isActive && { backgroundColor: track.color + "20", borderColor: track.color + "60", borderWidth: 1 }],
16481
+ style: [styles6.trackBtn, isActive && { backgroundColor: track.color + "20", borderColor: track.color + "60", borderWidth: 1 }],
16413
16482
  onPress: () => setTrackFilter(isActive ? null : track.id)
16414
16483
  },
16415
- /* @__PURE__ */ React5.createElement(Text3, { style: [styles5.trackBtnText, isActive && { color: track.color, fontWeight: "600" }] }, track.icon, " ", track.name)
16484
+ /* @__PURE__ */ React5.createElement(Text3, { style: [styles6.trackBtnText, isActive && { color: track.color, fontWeight: "600" }] }, track.icon, " ", track.name)
16416
16485
  );
16417
- })), /* @__PURE__ */ React5.createElement(View5, { style: styles5.sortGroup }, [
16486
+ })), /* @__PURE__ */ React5.createElement(View5, { style: styles6.sortGroup }, [
16418
16487
  { key: "priority", label: "\u2195 Priority" },
16419
16488
  { key: "recent", label: "\u{1F550} Recent" },
16420
16489
  { key: "alpha", label: "A-Z" }
@@ -16422,41 +16491,41 @@ function TestListScreen({ nav }) {
16422
16491
  TouchableOpacity3,
16423
16492
  {
16424
16493
  key: s2.key,
16425
- style: [styles5.sortBtn, sortMode === s2.key && styles5.sortBtnActive],
16494
+ style: [styles6.sortBtn, sortMode === s2.key && styles6.sortBtnActive],
16426
16495
  onPress: () => setSortMode(s2.key)
16427
16496
  },
16428
- /* @__PURE__ */ React5.createElement(Text3, { style: [styles5.sortBtnText, sortMode === s2.key && styles5.sortBtnTextActive] }, s2.label)
16497
+ /* @__PURE__ */ React5.createElement(Text3, { style: [styles6.sortBtnText, sortMode === s2.key && styles6.sortBtnTextActive] }, s2.label)
16429
16498
  )))), groupedAssignments.map((folder) => {
16430
16499
  const folderId = folder.group?.id || "ungrouped";
16431
16500
  const isCollapsed = collapsedFolders.has(folderId);
16432
16501
  const filtered = folder.assignments.filter(filterAssignment);
16433
16502
  if (filtered.length === 0 && filter !== "all") return null;
16434
- return /* @__PURE__ */ React5.createElement(View5, { key: folderId, style: styles5.folder }, /* @__PURE__ */ React5.createElement(TouchableOpacity3, { style: styles5.folderHeader, onPress: () => toggleFolder(folderId) }, /* @__PURE__ */ React5.createElement(Text3, { style: styles5.folderToggle }, isCollapsed ? "\u25B6" : "\u25BC"), /* @__PURE__ */ React5.createElement(Text3, { style: styles5.folderName, numberOfLines: 1 }, folder.group?.name || "Ungrouped"), /* @__PURE__ */ React5.createElement(View5, { style: styles5.folderProgress }, /* @__PURE__ */ React5.createElement(View5, { style: [styles5.folderProgressFill, { width: `${folder.stats.total > 0 ? Math.round((folder.stats.passed + folder.stats.failed) / folder.stats.total * 100) : 0}%` }] })), /* @__PURE__ */ React5.createElement(Text3, { style: styles5.folderCount }, folder.stats.passed + folder.stats.failed, "/", folder.stats.total)), !isCollapsed && filtered.map((assignment) => {
16503
+ return /* @__PURE__ */ React5.createElement(View5, { key: folderId, style: styles6.folder }, /* @__PURE__ */ React5.createElement(TouchableOpacity3, { style: styles6.folderHeader, onPress: () => toggleFolder(folderId) }, /* @__PURE__ */ React5.createElement(Text3, { style: styles6.folderToggle }, isCollapsed ? "\u25B6" : "\u25BC"), /* @__PURE__ */ React5.createElement(Text3, { style: styles6.folderName, numberOfLines: 1 }, folder.group?.name || "Ungrouped"), /* @__PURE__ */ React5.createElement(View5, { style: styles6.folderProgress }, /* @__PURE__ */ React5.createElement(View5, { style: [styles6.folderProgressFill, { width: `${folder.stats.total > 0 ? Math.round((folder.stats.passed + folder.stats.failed) / folder.stats.total * 100) : 0}%` }] })), /* @__PURE__ */ React5.createElement(Text3, { style: styles6.folderCount }, folder.stats.passed + folder.stats.failed, "/", folder.stats.total)), !isCollapsed && filtered.map((assignment) => {
16435
16504
  const badge = getStatusBadge(assignment.status);
16436
16505
  const isCurrent = currentAssignment?.id === assignment.id;
16437
16506
  return /* @__PURE__ */ React5.createElement(
16438
16507
  TouchableOpacity3,
16439
16508
  {
16440
16509
  key: assignment.id,
16441
- style: [styles5.testItem, isCurrent && styles5.testItemCurrent],
16510
+ style: [styles6.testItem, isCurrent && styles6.testItemCurrent],
16442
16511
  onPress: () => nav.push({ name: "TEST_DETAIL", testId: assignment.id })
16443
16512
  },
16444
- /* @__PURE__ */ React5.createElement(Text3, { style: styles5.testBadge }, badge.icon),
16445
- /* @__PURE__ */ React5.createElement(View5, { style: styles5.testInfo }, /* @__PURE__ */ React5.createElement(Text3, { style: styles5.testTitle, numberOfLines: 1 }, assignment.testCase.title), /* @__PURE__ */ React5.createElement(View5, { style: styles5.testMetaRow }, assignment.isVerification && /* @__PURE__ */ React5.createElement(View5, { style: [
16446
- styles5.retestTag,
16513
+ /* @__PURE__ */ React5.createElement(Text3, { style: styles6.testBadge }, badge.icon),
16514
+ /* @__PURE__ */ React5.createElement(View5, { style: styles6.testInfo }, /* @__PURE__ */ React5.createElement(Text3, { style: styles6.testTitle, numberOfLines: 1 }, assignment.testCase.title), /* @__PURE__ */ React5.createElement(View5, { style: styles6.testMetaRow }, assignment.isVerification && /* @__PURE__ */ React5.createElement(View5, { style: [
16515
+ styles6.retestTag,
16447
16516
  assignment.status === "passed" && { backgroundColor: colors.greenDark, borderColor: colors.greenBorder }
16448
16517
  ] }, /* @__PURE__ */ React5.createElement(Text3, { style: [
16449
- styles5.retestTagText,
16518
+ styles6.retestTagText,
16450
16519
  assignment.status === "passed" && { color: colors.greenLight }
16451
- ] }, assignment.status === "passed" ? "Verified" : "Retest")), /* @__PURE__ */ React5.createElement(Text3, { style: styles5.testMeta }, assignment.testCase.testKey, " \xB7 ", assignment.testCase.priority), assignment.testCase.role && /* @__PURE__ */ React5.createElement(View5, { style: styles5.roleBadgeRow }, /* @__PURE__ */ React5.createElement(Text3, { style: styles5.testMeta }, " \xB7 "), /* @__PURE__ */ React5.createElement(View5, { style: [styles5.roleBadgeDot, { backgroundColor: assignment.testCase.role.color }] }), /* @__PURE__ */ React5.createElement(Text3, { style: [styles5.testMeta, { color: assignment.testCase.role.color, fontWeight: "500" }] }, assignment.testCase.role.name)))),
16520
+ ] }, assignment.status === "passed" ? "Verified" : "Retest")), /* @__PURE__ */ React5.createElement(Text3, { style: styles6.testMeta }, assignment.testCase.testKey, " \xB7 ", assignment.testCase.priority), assignment.testCase.role && /* @__PURE__ */ React5.createElement(View5, { style: styles6.roleBadgeRow }, /* @__PURE__ */ React5.createElement(Text3, { style: styles6.testMeta }, " \xB7 "), /* @__PURE__ */ React5.createElement(View5, { style: [styles6.roleBadgeDot, { backgroundColor: assignment.testCase.role.color }] }), /* @__PURE__ */ React5.createElement(Text3, { style: [styles6.testMeta, { color: assignment.testCase.role.color, fontWeight: "500" }] }, assignment.testCase.role.name)))),
16452
16521
  /* @__PURE__ */ React5.createElement(View5, { style: [
16453
- styles5.statusPill,
16522
+ styles6.statusPill,
16454
16523
  {
16455
16524
  backgroundColor: assignment.status === "passed" ? colors.greenDark : assignment.status === "failed" ? colors.redSurface : assignment.status === "in_progress" ? colors.blueSurface : colors.card,
16456
16525
  borderColor: assignment.status === "passed" ? colors.greenBorder : assignment.status === "failed" ? colors.redDark : assignment.status === "in_progress" ? colors.blueDark : colors.border
16457
16526
  }
16458
16527
  ] }, /* @__PURE__ */ React5.createElement(Text3, { style: [
16459
- styles5.statusPillText,
16528
+ styles6.statusPillText,
16460
16529
  {
16461
16530
  color: assignment.status === "passed" ? colors.greenMed : assignment.status === "failed" ? colors.redMed : assignment.status === "in_progress" ? colors.blueLight : colors.zincLight
16462
16531
  }
@@ -16466,12 +16535,12 @@ function TestListScreen({ nav }) {
16466
16535
  }), dashboardUrl && /* @__PURE__ */ React5.createElement(
16467
16536
  TouchableOpacity3,
16468
16537
  {
16469
- style: styles5.dashboardLink,
16538
+ style: styles6.dashboardLink,
16470
16539
  onPress: () => Linking2.openURL(`${dashboardUrl}/test-cases`),
16471
16540
  activeOpacity: 0.7
16472
16541
  },
16473
- /* @__PURE__ */ React5.createElement(Text3, { style: styles5.dashboardLinkText }, "\u{1F310}", " Manage on Dashboard ", "\u2192")
16474
- ), /* @__PURE__ */ React5.createElement(TouchableOpacity3, { style: styles5.refreshBtn, onPress: refreshAssignments }, /* @__PURE__ */ React5.createElement(Text3, { style: styles5.refreshText }, "\u21BB", " Refresh")));
16542
+ /* @__PURE__ */ React5.createElement(Text3, { style: styles6.dashboardLinkText }, "\u{1F310}", " Manage on Dashboard ", "\u2192")
16543
+ ), /* @__PURE__ */ React5.createElement(TouchableOpacity3, { style: styles6.refreshBtn, onPress: refreshAssignments }, /* @__PURE__ */ React5.createElement(Text3, { style: styles6.refreshText }, "\u21BB", " Refresh")));
16475
16544
  }
16476
16545
  function createStyles3() {
16477
16546
  return StyleSheet5.create({
@@ -16791,7 +16860,7 @@ var styles2 = StyleSheet7.create({
16791
16860
  // src/widget/screens/TestFeedbackScreen.tsx
16792
16861
  function TestFeedbackScreen({ status, assignmentId, nav }) {
16793
16862
  const { client, assignments, refreshAssignments, uploadImage, widgetColorScheme } = useBugBear();
16794
- const styles5 = useMemo4(() => createStyles4(), [widgetColorScheme]);
16863
+ const styles6 = useMemo4(() => createStyles4(), [widgetColorScheme]);
16795
16864
  const images = useImageAttachments(uploadImage, 3, "screenshots");
16796
16865
  const [rating, setRating] = useState6(5);
16797
16866
  const [note, setNote] = useState6("");
@@ -16851,7 +16920,7 @@ function TestFeedbackScreen({ status, assignmentId, nav }) {
16851
16920
  }
16852
16921
  }
16853
16922
  };
16854
- return /* @__PURE__ */ React8.createElement(View8, { style: styles5.container }, /* @__PURE__ */ React8.createElement(Text6, { style: styles5.header }, status === "passed" ? "\u2705 Test Passed!" : "\u274C Test Failed"), /* @__PURE__ */ React8.createElement(Text6, { style: styles5.subheader }, "Rate this test case"), /* @__PURE__ */ React8.createElement(View8, { style: styles5.starRow }, [1, 2, 3, 4, 5].map((n) => /* @__PURE__ */ React8.createElement(TouchableOpacity6, { key: n, onPress: () => setRating(n), style: styles5.starButton }, /* @__PURE__ */ React8.createElement(Text6, { style: [styles5.star, n <= rating && styles5.starActive] }, n <= rating ? "\u2605" : "\u2606")))), showFlags && /* @__PURE__ */ React8.createElement(View8, { style: styles5.flagsSection }, /* @__PURE__ */ React8.createElement(Text6, { style: styles5.flagsLabel }, "What could be improved?"), [
16923
+ return /* @__PURE__ */ React8.createElement(View8, { style: styles6.container }, /* @__PURE__ */ React8.createElement(Text6, { style: styles6.header }, status === "passed" ? "\u2705 Test Passed!" : "\u274C Test Failed"), /* @__PURE__ */ React8.createElement(Text6, { style: styles6.subheader }, "Rate this test case"), /* @__PURE__ */ React8.createElement(View8, { style: styles6.starRow }, [1, 2, 3, 4, 5].map((n) => /* @__PURE__ */ React8.createElement(TouchableOpacity6, { key: n, onPress: () => setRating(n), style: styles6.starButton }, /* @__PURE__ */ React8.createElement(Text6, { style: [styles6.star, n <= rating && styles6.starActive] }, n <= rating ? "\u2605" : "\u2606")))), showFlags && /* @__PURE__ */ React8.createElement(View8, { style: styles6.flagsSection }, /* @__PURE__ */ React8.createElement(Text6, { style: styles6.flagsLabel }, "What could be improved?"), [
16855
16924
  { key: "isOutdated", label: "Test is outdated" },
16856
16925
  { key: "needsMoreDetail", label: "Needs more detail" },
16857
16926
  { key: "stepsUnclear", label: "Steps are unclear" },
@@ -16860,15 +16929,15 @@ function TestFeedbackScreen({ status, assignmentId, nav }) {
16860
16929
  TouchableOpacity6,
16861
16930
  {
16862
16931
  key,
16863
- style: [styles5.flagItem, flags[key] && styles5.flagItemActive],
16932
+ style: [styles6.flagItem, flags[key] && styles6.flagItemActive],
16864
16933
  onPress: () => setFlags((prev) => ({ ...prev, [key]: !prev[key] }))
16865
16934
  },
16866
- /* @__PURE__ */ React8.createElement(View8, { style: [styles5.flagCheck, flags[key] && styles5.flagCheckActive] }, flags[key] && /* @__PURE__ */ React8.createElement(Text6, { style: styles5.flagCheckmark }, "\u2713")),
16867
- /* @__PURE__ */ React8.createElement(Text6, { style: [styles5.flagText, flags[key] && styles5.flagTextActive] }, label)
16935
+ /* @__PURE__ */ React8.createElement(View8, { style: [styles6.flagCheck, flags[key] && styles6.flagCheckActive] }, flags[key] && /* @__PURE__ */ React8.createElement(Text6, { style: styles6.flagCheckmark }, "\u2713")),
16936
+ /* @__PURE__ */ React8.createElement(Text6, { style: [styles6.flagText, flags[key] && styles6.flagTextActive] }, label)
16868
16937
  ))), /* @__PURE__ */ React8.createElement(
16869
16938
  TextInput3,
16870
16939
  {
16871
- style: styles5.noteInput,
16940
+ style: styles6.noteInput,
16872
16941
  value: note,
16873
16942
  onChangeText: setNote,
16874
16943
  placeholder: "Add a note (optional)",
@@ -16885,7 +16954,7 @@ function TestFeedbackScreen({ status, assignmentId, nav }) {
16885
16954
  onRemove: images.removeImage,
16886
16955
  label: "Screenshots (optional)"
16887
16956
  }
16888
- ), /* @__PURE__ */ React8.createElement(View8, { style: styles5.actions }, /* @__PURE__ */ React8.createElement(TouchableOpacity6, { style: styles5.skipButton, onPress: handleSkip }, /* @__PURE__ */ React8.createElement(Text6, { style: styles5.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"))));
16957
+ ), /* @__PURE__ */ React8.createElement(View8, { style: styles6.actions }, /* @__PURE__ */ React8.createElement(TouchableOpacity6, { style: styles6.skipButton, onPress: handleSkip }, /* @__PURE__ */ React8.createElement(Text6, { style: styles6.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"))));
16889
16958
  }
16890
16959
  function createStyles4() {
16891
16960
  return StyleSheet8.create({
@@ -16913,7 +16982,7 @@ function createStyles4() {
16913
16982
  }
16914
16983
 
16915
16984
  // src/widget/screens/ReportScreen.tsx
16916
- import React10, { useState as useState8, useRef as useRef4, useEffect as useEffect6, useMemo as useMemo5 } from "react";
16985
+ import React10, { useState as useState8, useRef as useRef5, useEffect as useEffect6, useMemo as useMemo5 } from "react";
16917
16986
  import { View as View10, Text as Text8, TouchableOpacity as TouchableOpacity8, TextInput as TextInput4, StyleSheet as StyleSheet10 } from "react-native";
16918
16987
 
16919
16988
  // src/widget/CategoryPicker.tsx
@@ -17074,7 +17143,7 @@ var styles3 = StyleSheet9.create({
17074
17143
  // src/widget/screens/ReportScreen.tsx
17075
17144
  function ReportScreen({ nav, prefill, autoCaptureUri, onAutoCaptureConsumed }) {
17076
17145
  const { client, getDeviceInfo, uploadImage, refreshAssignments, widgetColorScheme } = useBugBear();
17077
- const styles5 = useMemo5(() => createStyles5(), [widgetColorScheme]);
17146
+ const styles6 = useMemo5(() => createStyles5(), [widgetColorScheme]);
17078
17147
  const [reportType, setReportType] = useState8(prefill?.type || "bug");
17079
17148
  const [severity, setSeverity] = useState8("medium");
17080
17149
  const [category, setCategory] = useState8(null);
@@ -17084,9 +17153,9 @@ function ReportScreen({ nav, prefill, autoCaptureUri, onAutoCaptureConsumed }) {
17084
17153
  const [affectedScreen, setAffectedScreen] = useState8("");
17085
17154
  const [submitting, setSubmitting] = useState8(false);
17086
17155
  const [error, setError] = useState8(null);
17087
- const submittingRef = useRef4(false);
17156
+ const submittingRef = useRef5(false);
17088
17157
  const images = useImageAttachments(uploadImage, 5, "screenshots");
17089
- const hasConsumedCapture = useRef4(false);
17158
+ const hasConsumedCapture = useRef5(false);
17090
17159
  useEffect6(() => {
17091
17160
  if (autoCaptureUri && !hasConsumedCapture.current) {
17092
17161
  hasConsumedCapture.current = true;
@@ -17180,7 +17249,7 @@ function ReportScreen({ nav, prefill, autoCaptureUri, onAutoCaptureConsumed }) {
17180
17249
  submittingRef.current = false;
17181
17250
  }
17182
17251
  };
17183
- return /* @__PURE__ */ React10.createElement(View10, null, isRetestFailure ? /* @__PURE__ */ React10.createElement(React10.Fragment, null, /* @__PURE__ */ React10.createElement(View10, { style: styles5.retestBanner }, /* @__PURE__ */ React10.createElement(Text8, { style: styles5.retestIcon }, "\u{1F504}"), /* @__PURE__ */ React10.createElement(View10, null, /* @__PURE__ */ React10.createElement(Text8, { style: styles5.retestTitle }, "Bug Still Present"), /* @__PURE__ */ React10.createElement(Text8, { style: styles5.retestSubtitle }, "The fix did not resolve this issue"))), /* @__PURE__ */ React10.createElement(View10, { style: styles5.section }, /* @__PURE__ */ React10.createElement(Text8, { style: shared.label }, "Severity"), /* @__PURE__ */ React10.createElement(View10, { style: styles5.severityRow }, [
17252
+ return /* @__PURE__ */ React10.createElement(View10, null, isRetestFailure ? /* @__PURE__ */ React10.createElement(React10.Fragment, null, /* @__PURE__ */ React10.createElement(View10, { style: styles6.retestBanner }, /* @__PURE__ */ React10.createElement(Text8, { style: styles6.retestIcon }, "\u{1F504}"), /* @__PURE__ */ React10.createElement(View10, null, /* @__PURE__ */ React10.createElement(Text8, { style: styles6.retestTitle }, "Bug Still Present"), /* @__PURE__ */ React10.createElement(Text8, { style: styles6.retestSubtitle }, "The fix did not resolve this issue"))), /* @__PURE__ */ React10.createElement(View10, { style: styles6.section }, /* @__PURE__ */ React10.createElement(Text8, { style: shared.label }, "Severity"), /* @__PURE__ */ React10.createElement(View10, { style: styles6.severityRow }, [
17184
17253
  { sev: "critical", color: colors.red },
17185
17254
  { sev: "high", color: colors.orange },
17186
17255
  { sev: "medium", color: colors.yellow },
@@ -17189,14 +17258,14 @@ function ReportScreen({ nav, prefill, autoCaptureUri, onAutoCaptureConsumed }) {
17189
17258
  TouchableOpacity8,
17190
17259
  {
17191
17260
  key: sev,
17192
- style: [styles5.sevButton, severity === sev && { backgroundColor: `${color}30`, borderColor: color }],
17261
+ style: [styles6.sevButton, severity === sev && { backgroundColor: `${color}30`, borderColor: color }],
17193
17262
  onPress: () => setSeverity(sev)
17194
17263
  },
17195
- /* @__PURE__ */ React10.createElement(Text8, { style: [styles5.sevText, severity === sev && { color }] }, sev)
17196
- )))), /* @__PURE__ */ React10.createElement(View10, { style: styles5.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: styles5.section }, /* @__PURE__ */ React10.createElement(Text8, { style: shared.label }, "What went wrong?"), /* @__PURE__ */ React10.createElement(
17264
+ /* @__PURE__ */ React10.createElement(Text8, { style: [styles6.sevText, severity === sev && { color }] }, sev)
17265
+ )))), /* @__PURE__ */ React10.createElement(View10, { style: styles6.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: styles6.section }, /* @__PURE__ */ React10.createElement(Text8, { style: shared.label }, "What went wrong?"), /* @__PURE__ */ React10.createElement(
17197
17266
  TextInput4,
17198
17267
  {
17199
- style: styles5.descInput,
17268
+ style: styles6.descInput,
17200
17269
  value: description,
17201
17270
  onChangeText: setDescription,
17202
17271
  placeholder: "Describe what you observed. What still doesn't work?",
@@ -17249,15 +17318,15 @@ function ReportScreen({ nav, prefill, autoCaptureUri, onAutoCaptureConsumed }) {
17249
17318
  onRemove: images.removeImage,
17250
17319
  label: "Attachments (optional)"
17251
17320
  }
17252
- ), error && /* @__PURE__ */ React10.createElement(View10, { style: styles5.errorBanner }, /* @__PURE__ */ React10.createElement(Text8, { style: styles5.errorText }, error)), /* @__PURE__ */ React10.createElement(
17321
+ ), error && /* @__PURE__ */ React10.createElement(View10, { style: styles6.errorBanner }, /* @__PURE__ */ React10.createElement(Text8, { style: styles6.errorText }, error)), /* @__PURE__ */ React10.createElement(
17253
17322
  TouchableOpacity8,
17254
17323
  {
17255
- style: [shared.primaryButton, styles5.retestSubmitButton, (!description.trim() || submitting || images.isUploading) && shared.primaryButtonDisabled, { marginTop: 20 }],
17324
+ style: [shared.primaryButton, styles6.retestSubmitButton, (!description.trim() || submitting || images.isUploading) && shared.primaryButtonDisabled, { marginTop: 20 }],
17256
17325
  onPress: handleSubmit,
17257
17326
  disabled: !description.trim() || submitting || images.isUploading
17258
17327
  },
17259
17328
  /* @__PURE__ */ React10.createElement(Text8, { style: shared.primaryButtonText }, images.isUploading ? "Uploading images..." : submitting ? "Submitting..." : error ? "Retry" : "Submit Failed Retest")
17260
- )) : /* @__PURE__ */ React10.createElement(React10.Fragment, null, /* @__PURE__ */ React10.createElement(Text8, { style: shared.label }, "What are you reporting?"), /* @__PURE__ */ React10.createElement(View10, { style: styles5.typeRow }, [
17329
+ )) : /* @__PURE__ */ React10.createElement(React10.Fragment, null, /* @__PURE__ */ React10.createElement(Text8, { style: shared.label }, "What are you reporting?"), /* @__PURE__ */ React10.createElement(View10, { style: styles6.typeRow }, [
17261
17330
  { type: "bug", label: "Bug", icon: "\u{1F41B}" },
17262
17331
  { type: "feedback", label: "Feedback", icon: "\u{1F4A1}" },
17263
17332
  { type: "suggestion", label: "Idea", icon: "\u2728" }
@@ -17265,12 +17334,12 @@ function ReportScreen({ nav, prefill, autoCaptureUri, onAutoCaptureConsumed }) {
17265
17334
  TouchableOpacity8,
17266
17335
  {
17267
17336
  key: type,
17268
- style: [styles5.typeCard, reportType === type && styles5.typeCardActive],
17337
+ style: [styles6.typeCard, reportType === type && styles6.typeCardActive],
17269
17338
  onPress: () => setReportType(type)
17270
17339
  },
17271
- /* @__PURE__ */ React10.createElement(Text8, { style: styles5.typeIcon }, icon),
17272
- /* @__PURE__ */ React10.createElement(Text8, { style: [styles5.typeLabel, reportType === type && styles5.typeLabelActive] }, label)
17273
- ))), isBugType && /* @__PURE__ */ React10.createElement(View10, { style: styles5.section }, /* @__PURE__ */ React10.createElement(Text8, { style: shared.label }, "Severity"), /* @__PURE__ */ React10.createElement(View10, { style: styles5.severityRow }, [
17340
+ /* @__PURE__ */ React10.createElement(Text8, { style: styles6.typeIcon }, icon),
17341
+ /* @__PURE__ */ React10.createElement(Text8, { style: [styles6.typeLabel, reportType === type && styles6.typeLabelActive] }, label)
17342
+ ))), isBugType && /* @__PURE__ */ React10.createElement(View10, { style: styles6.section }, /* @__PURE__ */ React10.createElement(Text8, { style: shared.label }, "Severity"), /* @__PURE__ */ React10.createElement(View10, { style: styles6.severityRow }, [
17274
17343
  { sev: "critical", color: colors.red },
17275
17344
  { sev: "high", color: colors.orange },
17276
17345
  { sev: "medium", color: colors.yellow },
@@ -17279,14 +17348,14 @@ function ReportScreen({ nav, prefill, autoCaptureUri, onAutoCaptureConsumed }) {
17279
17348
  TouchableOpacity8,
17280
17349
  {
17281
17350
  key: sev,
17282
- style: [styles5.sevButton, severity === sev && { backgroundColor: `${color}30`, borderColor: color }],
17351
+ style: [styles6.sevButton, severity === sev && { backgroundColor: `${color}30`, borderColor: color }],
17283
17352
  onPress: () => setSeverity(sev)
17284
17353
  },
17285
- /* @__PURE__ */ React10.createElement(Text8, { style: [styles5.sevText, severity === sev && { color }] }, sev)
17286
- )))), isBugType && /* @__PURE__ */ React10.createElement(View10, { style: styles5.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: styles5.section }, /* @__PURE__ */ React10.createElement(Text8, { style: shared.label }, "What happened?"), /* @__PURE__ */ React10.createElement(
17354
+ /* @__PURE__ */ React10.createElement(Text8, { style: [styles6.sevText, severity === sev && { color }] }, sev)
17355
+ )))), isBugType && /* @__PURE__ */ React10.createElement(View10, { style: styles6.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: styles6.section }, /* @__PURE__ */ React10.createElement(Text8, { style: shared.label }, "What happened?"), /* @__PURE__ */ React10.createElement(
17287
17356
  TextInput4,
17288
17357
  {
17289
- style: styles5.descInput,
17358
+ style: styles6.descInput,
17290
17359
  value: description,
17291
17360
  onChangeText: setDescription,
17292
17361
  placeholder: "Describe the issue...",
@@ -17329,16 +17398,16 @@ function ReportScreen({ nav, prefill, autoCaptureUri, onAutoCaptureConsumed }) {
17329
17398
  issue.title
17330
17399
  ),
17331
17400
  /* @__PURE__ */ React10.createElement(Text8, { style: { fontSize: 11, color: colors.textMuted } }, issue.status)
17332
- )))), isBugType && /* @__PURE__ */ React10.createElement(View10, { style: styles5.section }, /* @__PURE__ */ React10.createElement(Text8, { style: shared.label }, "Which screen?"), /* @__PURE__ */ React10.createElement(
17401
+ )))), isBugType && /* @__PURE__ */ React10.createElement(View10, { style: styles6.section }, /* @__PURE__ */ React10.createElement(Text8, { style: shared.label }, "Which screen?"), /* @__PURE__ */ React10.createElement(
17333
17402
  TextInput4,
17334
17403
  {
17335
- style: styles5.screenInput,
17404
+ style: styles6.screenInput,
17336
17405
  value: affectedScreen,
17337
17406
  onChangeText: setAffectedScreen,
17338
17407
  placeholder: "e.g. Reservations, Settings...",
17339
17408
  placeholderTextColor: colors.textMuted
17340
17409
  }
17341
- ), /* @__PURE__ */ React10.createElement(Text8, { style: styles5.screenHint }, "Which screen or area was the bug on? (optional)")), /* @__PURE__ */ React10.createElement(
17410
+ ), /* @__PURE__ */ React10.createElement(Text8, { style: styles6.screenHint }, "Which screen or area was the bug on? (optional)")), /* @__PURE__ */ React10.createElement(
17342
17411
  ImagePickerButtons,
17343
17412
  {
17344
17413
  images: images.images,
@@ -17348,7 +17417,7 @@ function ReportScreen({ nav, prefill, autoCaptureUri, onAutoCaptureConsumed }) {
17348
17417
  onRemove: images.removeImage,
17349
17418
  label: "Screenshots (optional)"
17350
17419
  }
17351
- ), error && /* @__PURE__ */ React10.createElement(View10, { style: styles5.errorBanner }, /* @__PURE__ */ React10.createElement(Text8, { style: styles5.errorText }, error)), /* @__PURE__ */ React10.createElement(
17420
+ ), error && /* @__PURE__ */ React10.createElement(View10, { style: styles6.errorBanner }, /* @__PURE__ */ React10.createElement(Text8, { style: styles6.errorText }, error)), /* @__PURE__ */ React10.createElement(
17352
17421
  TouchableOpacity8,
17353
17422
  {
17354
17423
  style: [shared.primaryButton, (!description.trim() || submitting || images.isUploading) && shared.primaryButtonDisabled, { marginTop: 20 }],
@@ -17388,12 +17457,12 @@ import React11, { useEffect as useEffect7, useMemo as useMemo6 } from "react";
17388
17457
  import { View as View11, Text as Text9, StyleSheet as StyleSheet11 } from "react-native";
17389
17458
  function ReportSuccessScreen({ nav }) {
17390
17459
  const { widgetColorScheme } = useBugBear();
17391
- const styles5 = useMemo6(() => createStyles6(), [widgetColorScheme]);
17460
+ const styles6 = useMemo6(() => createStyles6(), [widgetColorScheme]);
17392
17461
  useEffect7(() => {
17393
17462
  const timer = setTimeout(() => nav.reset(), 2e3);
17394
17463
  return () => clearTimeout(timer);
17395
17464
  }, [nav]);
17396
- return /* @__PURE__ */ React11.createElement(View11, { style: styles5.container }, /* @__PURE__ */ React11.createElement(Text9, { style: styles5.emoji }, "\u{1F389}"), /* @__PURE__ */ React11.createElement(Text9, { style: styles5.title }, "Report submitted!"), /* @__PURE__ */ React11.createElement(Text9, { style: styles5.subtitle }, "Thank you for your feedback"));
17465
+ return /* @__PURE__ */ React11.createElement(View11, { style: styles6.container }, /* @__PURE__ */ React11.createElement(Text9, { style: styles6.emoji }, "\u{1F389}"), /* @__PURE__ */ React11.createElement(Text9, { style: styles6.title }, "Report submitted!"), /* @__PURE__ */ React11.createElement(Text9, { style: styles6.subtitle }, "Thank you for your feedback"));
17397
17466
  }
17398
17467
  function createStyles6() {
17399
17468
  return StyleSheet11.create({
@@ -17409,7 +17478,7 @@ import React12, { useMemo as useMemo7, useState as useState9 } from "react";
17409
17478
  import { View as View12, Text as Text10, TouchableOpacity as TouchableOpacity9, ScrollView as ScrollView3, StyleSheet as StyleSheet12, Linking as Linking3 } from "react-native";
17410
17479
  function MessageListScreen({ nav }) {
17411
17480
  const { threads, unreadCount, refreshThreads, dashboardUrl, isLoading, widgetColorScheme } = useBugBear();
17412
- const styles5 = useMemo7(() => createStyles7(), [widgetColorScheme]);
17481
+ const styles6 = useMemo7(() => createStyles7(), [widgetColorScheme]);
17413
17482
  const [activeFilter, setActiveFilter] = useState9("all");
17414
17483
  const filteredThreads = threads.filter((thread) => {
17415
17484
  if (activeFilter === "all") return true;
@@ -17427,10 +17496,10 @@ function MessageListScreen({ nav }) {
17427
17496
  return /* @__PURE__ */ React12.createElement(View12, null, /* @__PURE__ */ React12.createElement(
17428
17497
  TouchableOpacity9,
17429
17498
  {
17430
- style: styles5.newMsgButton,
17499
+ style: styles6.newMsgButton,
17431
17500
  onPress: () => nav.push({ name: "COMPOSE_MESSAGE" })
17432
17501
  },
17433
- /* @__PURE__ */ React12.createElement(Text10, { style: styles5.newMsgText }, "\u2709\uFE0F New Message")
17502
+ /* @__PURE__ */ React12.createElement(Text10, { style: styles6.newMsgText }, "\u2709\uFE0F New Message")
17434
17503
  ), /* @__PURE__ */ React12.createElement(
17435
17504
  ScrollView3,
17436
17505
  {
@@ -17475,20 +17544,20 @@ function MessageListScreen({ nav }) {
17475
17544
  TouchableOpacity9,
17476
17545
  {
17477
17546
  key: thread.id,
17478
- style: [styles5.threadItem, thread.unreadCount > 0 && styles5.threadItemUnread],
17547
+ style: [styles6.threadItem, thread.unreadCount > 0 && styles6.threadItemUnread],
17479
17548
  onPress: () => nav.push({ name: "THREAD_DETAIL", thread })
17480
17549
  },
17481
- /* @__PURE__ */ React12.createElement(View12, { style: styles5.threadLeft }, /* @__PURE__ */ React12.createElement(Text10, { style: styles5.threadIcon }, getThreadTypeIcon(thread.threadType)), /* @__PURE__ */ React12.createElement(View12, { style: styles5.threadInfo }, /* @__PURE__ */ React12.createElement(View12, { style: styles5.threadTitleRow }, thread.isPinned && /* @__PURE__ */ React12.createElement(Text10, { style: styles5.pinIcon }, "\u{1F4CC}"), /* @__PURE__ */ React12.createElement(Text10, { style: styles5.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: styles5.threadPreview, numberOfLines: 1 }, thread.lastMessage.senderName, ": ", thread.lastMessage.content))),
17482
- /* @__PURE__ */ React12.createElement(View12, { style: styles5.threadRight }, /* @__PURE__ */ React12.createElement(Text10, { style: styles5.threadTime }, formatRelativeTime(thread.lastMessageAt)), thread.unreadCount > 0 && /* @__PURE__ */ React12.createElement(View12, { style: styles5.unreadBadge }, /* @__PURE__ */ React12.createElement(Text10, { style: styles5.unreadText }, thread.unreadCount)), thread.priority !== "normal" && /* @__PURE__ */ React12.createElement(View12, { style: [styles5.priorityDot, { backgroundColor: getPriorityColor(thread.priority) }] }))
17550
+ /* @__PURE__ */ React12.createElement(View12, { style: styles6.threadLeft }, /* @__PURE__ */ React12.createElement(Text10, { style: styles6.threadIcon }, getThreadTypeIcon(thread.threadType)), /* @__PURE__ */ React12.createElement(View12, { style: styles6.threadInfo }, /* @__PURE__ */ React12.createElement(View12, { style: styles6.threadTitleRow }, thread.isPinned && /* @__PURE__ */ React12.createElement(Text10, { style: styles6.pinIcon }, "\u{1F4CC}"), /* @__PURE__ */ React12.createElement(Text10, { style: styles6.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: styles6.threadPreview, numberOfLines: 1 }, thread.lastMessage.senderName, ": ", thread.lastMessage.content))),
17551
+ /* @__PURE__ */ React12.createElement(View12, { style: styles6.threadRight }, /* @__PURE__ */ React12.createElement(Text10, { style: styles6.threadTime }, formatRelativeTime(thread.lastMessageAt)), thread.unreadCount > 0 && /* @__PURE__ */ React12.createElement(View12, { style: styles6.unreadBadge }, /* @__PURE__ */ React12.createElement(Text10, { style: styles6.unreadText }, thread.unreadCount)), thread.priority !== "normal" && /* @__PURE__ */ React12.createElement(View12, { style: [styles6.priorityDot, { backgroundColor: getPriorityColor(thread.priority) }] }))
17483
17552
  ))), dashboardUrl && /* @__PURE__ */ React12.createElement(
17484
17553
  TouchableOpacity9,
17485
17554
  {
17486
- style: styles5.dashboardLink,
17555
+ style: styles6.dashboardLink,
17487
17556
  onPress: () => Linking3.openURL(`${dashboardUrl}/discussions`),
17488
17557
  activeOpacity: 0.7
17489
17558
  },
17490
- /* @__PURE__ */ React12.createElement(Text10, { style: styles5.dashboardLinkText }, "\u{1F310}", " View on Dashboard ", "\u2192")
17491
- ), /* @__PURE__ */ React12.createElement(View12, { style: styles5.footer }, /* @__PURE__ */ React12.createElement(Text10, { style: styles5.footerText }, filteredThreads.length, " thread", filteredThreads.length !== 1 ? "s" : "", " \xB7 ", unreadCount, " unread"), /* @__PURE__ */ React12.createElement(TouchableOpacity9, { onPress: refreshThreads }, /* @__PURE__ */ React12.createElement(Text10, { style: styles5.refreshText }, "\u21BB Refresh"))));
17559
+ /* @__PURE__ */ React12.createElement(Text10, { style: styles6.dashboardLinkText }, "\u{1F310}", " View on Dashboard ", "\u2192")
17560
+ ), /* @__PURE__ */ React12.createElement(View12, { style: styles6.footer }, /* @__PURE__ */ React12.createElement(Text10, { style: styles6.footerText }, filteredThreads.length, " thread", filteredThreads.length !== 1 ? "s" : "", " \xB7 ", unreadCount, " unread"), /* @__PURE__ */ React12.createElement(TouchableOpacity9, { onPress: refreshThreads }, /* @__PURE__ */ React12.createElement(Text10, { style: styles6.refreshText }, "\u21BB Refresh"))));
17492
17561
  }
17493
17562
  function createStyles7() {
17494
17563
  return StyleSheet12.create({
@@ -17521,7 +17590,7 @@ import React13, { useState as useState10, useEffect as useEffect8, useMemo as us
17521
17590
  import { View as View13, Text as Text11, TouchableOpacity as TouchableOpacity10, TextInput as TextInput5, StyleSheet as StyleSheet13, Image as Image2 } from "react-native";
17522
17591
  function ThreadDetailScreen({ thread, nav }) {
17523
17592
  const { getThreadMessages, sendMessage, markAsRead, uploadImage, widgetColorScheme } = useBugBear();
17524
- const styles5 = useMemo8(() => createStyles8(), [widgetColorScheme]);
17593
+ const styles6 = useMemo8(() => createStyles8(), [widgetColorScheme]);
17525
17594
  const [messages, setMessages] = useState10([]);
17526
17595
  const [loading, setLoading] = useState10(true);
17527
17596
  const [replyText, setReplyText] = useState10("");
@@ -17573,20 +17642,20 @@ function ThreadDetailScreen({ thread, nav }) {
17573
17642
  }
17574
17643
  setSending(false);
17575
17644
  };
17576
- return /* @__PURE__ */ React13.createElement(View13, { style: styles5.container }, /* @__PURE__ */ React13.createElement(View13, { style: styles5.header }, /* @__PURE__ */ React13.createElement(Text11, { style: styles5.headerIcon }, getThreadTypeIcon(thread.threadType)), /* @__PURE__ */ React13.createElement(Text11, { style: styles5.headerSubject, numberOfLines: 2 }, thread.subject || "No subject")), loading ? /* @__PURE__ */ React13.createElement(View13, { style: styles5.loadingContainer }, /* @__PURE__ */ React13.createElement(Text11, { style: styles5.loadingText }, "Loading messages...")) : /* @__PURE__ */ React13.createElement(View13, { style: styles5.messagesContainer }, messages.map((msg) => /* @__PURE__ */ React13.createElement(
17645
+ return /* @__PURE__ */ React13.createElement(View13, { style: styles6.container }, /* @__PURE__ */ React13.createElement(View13, { style: styles6.header }, /* @__PURE__ */ React13.createElement(Text11, { style: styles6.headerIcon }, getThreadTypeIcon(thread.threadType)), /* @__PURE__ */ React13.createElement(Text11, { style: styles6.headerSubject, numberOfLines: 2 }, thread.subject || "No subject")), loading ? /* @__PURE__ */ React13.createElement(View13, { style: styles6.loadingContainer }, /* @__PURE__ */ React13.createElement(Text11, { style: styles6.loadingText }, "Loading messages...")) : /* @__PURE__ */ React13.createElement(View13, { style: styles6.messagesContainer }, messages.map((msg) => /* @__PURE__ */ React13.createElement(
17577
17646
  View13,
17578
17647
  {
17579
17648
  key: msg.id,
17580
- style: [styles5.bubble, msg.senderType === "tester" ? styles5.bubbleTester : styles5.bubbleAdmin]
17649
+ style: [styles6.bubble, msg.senderType === "tester" ? styles6.bubbleTester : styles6.bubbleAdmin]
17581
17650
  },
17582
- /* @__PURE__ */ React13.createElement(Text11, { style: [styles5.sender, msg.senderType === "tester" && styles5.senderTester] }, msg.senderType === "tester" ? "You" : msg.senderName),
17583
- /* @__PURE__ */ React13.createElement(Text11, { style: [styles5.content, msg.senderType === "tester" && styles5.contentTester] }, msg.content),
17584
- msg.attachments && msg.attachments.length > 0 && /* @__PURE__ */ React13.createElement(View13, { style: styles5.attachments }, msg.attachments.filter((a) => a.type === "image").map((att, idx) => /* @__PURE__ */ React13.createElement(Image2, { key: idx, source: { uri: att.url }, style: styles5.attachmentImage, resizeMode: "cover" }))),
17585
- /* @__PURE__ */ React13.createElement(Text11, { style: [styles5.time, msg.senderType === "tester" && styles5.timeTester] }, formatMessageTime(msg.createdAt))
17586
- ))), sendError && /* @__PURE__ */ React13.createElement(View13, { style: styles5.errorBar }, /* @__PURE__ */ React13.createElement(Text11, { style: styles5.errorText }, "Failed to send. Tap Send to retry.")), replyImages.images.length > 0 && /* @__PURE__ */ React13.createElement(View13, { style: styles5.replyPreview }, /* @__PURE__ */ React13.createElement(ImagePreviewStrip, { images: replyImages.images, onRemove: replyImages.removeImage })), /* @__PURE__ */ React13.createElement(View13, { style: styles5.composer }, IMAGE_PICKER_AVAILABLE && /* @__PURE__ */ React13.createElement(TouchableOpacity10, { style: styles5.attachBtn, onPress: replyImages.pickFromGallery, disabled: replyImages.images.length >= 3 }, /* @__PURE__ */ React13.createElement(Text11, { style: styles5.attachBtnText }, "\u{1F4CE}")), /* @__PURE__ */ React13.createElement(
17651
+ /* @__PURE__ */ React13.createElement(Text11, { style: [styles6.sender, msg.senderType === "tester" && styles6.senderTester] }, msg.senderType === "tester" ? "You" : msg.senderName),
17652
+ /* @__PURE__ */ React13.createElement(Text11, { style: [styles6.content, msg.senderType === "tester" && styles6.contentTester] }, msg.content),
17653
+ msg.attachments && msg.attachments.length > 0 && /* @__PURE__ */ React13.createElement(View13, { style: styles6.attachments }, msg.attachments.filter((a) => a.type === "image").map((att, idx) => /* @__PURE__ */ React13.createElement(Image2, { key: idx, source: { uri: att.url }, style: styles6.attachmentImage, resizeMode: "cover" }))),
17654
+ /* @__PURE__ */ React13.createElement(Text11, { style: [styles6.time, msg.senderType === "tester" && styles6.timeTester] }, formatMessageTime(msg.createdAt))
17655
+ ))), sendError && /* @__PURE__ */ React13.createElement(View13, { style: styles6.errorBar }, /* @__PURE__ */ React13.createElement(Text11, { style: styles6.errorText }, "Failed to send. Tap Send to retry.")), replyImages.images.length > 0 && /* @__PURE__ */ React13.createElement(View13, { style: styles6.replyPreview }, /* @__PURE__ */ React13.createElement(ImagePreviewStrip, { images: replyImages.images, onRemove: replyImages.removeImage })), /* @__PURE__ */ React13.createElement(View13, { style: styles6.composer }, IMAGE_PICKER_AVAILABLE && /* @__PURE__ */ React13.createElement(TouchableOpacity10, { style: styles6.attachBtn, onPress: replyImages.pickFromGallery, disabled: replyImages.images.length >= 3 }, /* @__PURE__ */ React13.createElement(Text11, { style: styles6.attachBtnText }, "\u{1F4CE}")), /* @__PURE__ */ React13.createElement(
17587
17656
  TextInput5,
17588
17657
  {
17589
- style: styles5.replyInput,
17658
+ style: styles6.replyInput,
17590
17659
  value: replyText,
17591
17660
  onChangeText: setReplyText,
17592
17661
  placeholder: "Type a reply...",
@@ -17597,11 +17666,11 @@ function ThreadDetailScreen({ thread, nav }) {
17597
17666
  ), /* @__PURE__ */ React13.createElement(
17598
17667
  TouchableOpacity10,
17599
17668
  {
17600
- style: [styles5.sendBtn, (!replyText.trim() && replyImages.images.length === 0 || sending || replyImages.isUploading) && styles5.sendBtnDisabled],
17669
+ style: [styles6.sendBtn, (!replyText.trim() && replyImages.images.length === 0 || sending || replyImages.isUploading) && styles6.sendBtnDisabled],
17601
17670
  onPress: handleSend,
17602
17671
  disabled: !replyText.trim() && replyImages.images.length === 0 || sending || replyImages.isUploading
17603
17672
  },
17604
- /* @__PURE__ */ React13.createElement(Text11, { style: styles5.sendBtnText }, sending ? "..." : "Send")
17673
+ /* @__PURE__ */ React13.createElement(Text11, { style: styles6.sendBtnText }, sending ? "..." : "Send")
17605
17674
  )));
17606
17675
  }
17607
17676
  function createStyles8() {
@@ -17642,7 +17711,7 @@ import React14, { useState as useState11, useMemo as useMemo9 } from "react";
17642
17711
  import { View as View14, Text as Text12, TextInput as TextInput6, TouchableOpacity as TouchableOpacity11, StyleSheet as StyleSheet14 } from "react-native";
17643
17712
  function ComposeMessageScreen({ nav }) {
17644
17713
  const { createThread, uploadImage, widgetColorScheme } = useBugBear();
17645
- const styles5 = useMemo9(() => createStyles9(), [widgetColorScheme]);
17714
+ const styles6 = useMemo9(() => createStyles9(), [widgetColorScheme]);
17646
17715
  const [subject, setSubject] = useState11("");
17647
17716
  const [message, setMessage] = useState11("");
17648
17717
  const [sending, setSending] = useState11(false);
@@ -17661,10 +17730,10 @@ function ComposeMessageScreen({ nav }) {
17661
17730
  nav.pop();
17662
17731
  }
17663
17732
  };
17664
- return /* @__PURE__ */ React14.createElement(View14, null, /* @__PURE__ */ React14.createElement(View14, { style: styles5.header }, /* @__PURE__ */ React14.createElement(Text12, { style: styles5.title }, "New Message"), /* @__PURE__ */ React14.createElement(Text12, { style: styles5.subtitle }, "Send a message to the QA team")), /* @__PURE__ */ React14.createElement(View14, { style: styles5.form }, /* @__PURE__ */ React14.createElement(Text12, { style: shared.label }, "Subject"), /* @__PURE__ */ React14.createElement(
17733
+ return /* @__PURE__ */ React14.createElement(View14, null, /* @__PURE__ */ React14.createElement(View14, { style: styles6.header }, /* @__PURE__ */ React14.createElement(Text12, { style: styles6.title }, "New Message"), /* @__PURE__ */ React14.createElement(Text12, { style: styles6.subtitle }, "Send a message to the QA team")), /* @__PURE__ */ React14.createElement(View14, { style: styles6.form }, /* @__PURE__ */ React14.createElement(Text12, { style: shared.label }, "Subject"), /* @__PURE__ */ React14.createElement(
17665
17734
  TextInput6,
17666
17735
  {
17667
- style: styles5.subjectInput,
17736
+ style: styles6.subjectInput,
17668
17737
  value: subject,
17669
17738
  onChangeText: setSubject,
17670
17739
  placeholder: "What's this about?",
@@ -17674,7 +17743,7 @@ function ComposeMessageScreen({ nav }) {
17674
17743
  ), /* @__PURE__ */ React14.createElement(Text12, { style: [shared.label, { marginTop: 16 }] }, "Message"), /* @__PURE__ */ React14.createElement(
17675
17744
  TextInput6,
17676
17745
  {
17677
- style: styles5.messageInput,
17746
+ style: styles6.messageInput,
17678
17747
  value: message,
17679
17748
  onChangeText: setMessage,
17680
17749
  placeholder: "Write your message...",
@@ -17719,7 +17788,7 @@ import React15, { useState as useState12, useEffect as useEffect9, useMemo as us
17719
17788
  import { View as View15, Text as Text13, TouchableOpacity as TouchableOpacity12, TextInput as TextInput7, StyleSheet as StyleSheet15 } from "react-native";
17720
17789
  function ProfileScreen({ nav }) {
17721
17790
  const { testerInfo, assignments, updateTesterProfile, refreshTesterInfo, widgetColorScheme } = useBugBear();
17722
- const styles5 = useMemo10(() => createStyles10(), [widgetColorScheme]);
17791
+ const styles6 = useMemo10(() => createStyles10(), [widgetColorScheme]);
17723
17792
  const [editing, setEditing] = useState12(false);
17724
17793
  const [name, setName] = useState12(testerInfo?.name || "");
17725
17794
  const [additionalEmails, setAdditionalEmails] = useState12(testerInfo?.additionalEmails || []);
@@ -17770,13 +17839,13 @@ function ProfileScreen({ nav }) {
17770
17839
  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"));
17771
17840
  }
17772
17841
  if (editing) {
17773
- return /* @__PURE__ */ React15.createElement(View15, null, /* @__PURE__ */ React15.createElement(View15, { style: styles5.editHeader }, /* @__PURE__ */ React15.createElement(Text13, { style: styles5.editTitle }, "Edit Profile"), /* @__PURE__ */ React15.createElement(TouchableOpacity12, { onPress: () => {
17842
+ return /* @__PURE__ */ React15.createElement(View15, null, /* @__PURE__ */ React15.createElement(View15, { style: styles6.editHeader }, /* @__PURE__ */ React15.createElement(Text13, { style: styles6.editTitle }, "Edit Profile"), /* @__PURE__ */ React15.createElement(TouchableOpacity12, { onPress: () => {
17774
17843
  setEditing(false);
17775
17844
  setNewEmailInput("");
17776
- } }, /* @__PURE__ */ React15.createElement(Text13, { style: styles5.cancelText }, "Cancel"))), /* @__PURE__ */ React15.createElement(View15, { style: styles5.field }, /* @__PURE__ */ React15.createElement(Text13, { style: shared.label }, "Name"), /* @__PURE__ */ React15.createElement(TextInput7, { style: styles5.input, value: name, onChangeText: setName, placeholder: "Your name", placeholderTextColor: colors.textMuted })), /* @__PURE__ */ React15.createElement(View15, { style: styles5.field }, /* @__PURE__ */ React15.createElement(Text13, { style: shared.label }, "Primary Email"), /* @__PURE__ */ React15.createElement(Text13, { style: styles5.emailFixed }, testerInfo.email)), /* @__PURE__ */ React15.createElement(View15, { style: styles5.field }, /* @__PURE__ */ React15.createElement(Text13, { style: shared.label }, "Additional Emails"), additionalEmails.map((email) => /* @__PURE__ */ React15.createElement(View15, { key: email, style: styles5.emailRow }, /* @__PURE__ */ React15.createElement(Text13, { style: styles5.emailText }, email), /* @__PURE__ */ React15.createElement(TouchableOpacity12, { onPress: () => setAdditionalEmails(additionalEmails.filter((e) => e !== email)) }, /* @__PURE__ */ React15.createElement(Text13, { style: styles5.removeEmail }, "\u2715")))), /* @__PURE__ */ React15.createElement(View15, { style: styles5.addEmailRow }, /* @__PURE__ */ React15.createElement(
17845
+ } }, /* @__PURE__ */ React15.createElement(Text13, { style: styles6.cancelText }, "Cancel"))), /* @__PURE__ */ React15.createElement(View15, { style: styles6.field }, /* @__PURE__ */ React15.createElement(Text13, { style: shared.label }, "Name"), /* @__PURE__ */ React15.createElement(TextInput7, { style: styles6.input, value: name, onChangeText: setName, placeholder: "Your name", placeholderTextColor: colors.textMuted })), /* @__PURE__ */ React15.createElement(View15, { style: styles6.field }, /* @__PURE__ */ React15.createElement(Text13, { style: shared.label }, "Primary Email"), /* @__PURE__ */ React15.createElement(Text13, { style: styles6.emailFixed }, testerInfo.email)), /* @__PURE__ */ React15.createElement(View15, { style: styles6.field }, /* @__PURE__ */ React15.createElement(Text13, { style: shared.label }, "Additional Emails"), additionalEmails.map((email) => /* @__PURE__ */ React15.createElement(View15, { key: email, style: styles6.emailRow }, /* @__PURE__ */ React15.createElement(Text13, { style: styles6.emailText }, email), /* @__PURE__ */ React15.createElement(TouchableOpacity12, { onPress: () => setAdditionalEmails(additionalEmails.filter((e) => e !== email)) }, /* @__PURE__ */ React15.createElement(Text13, { style: styles6.removeEmail }, "\u2715")))), /* @__PURE__ */ React15.createElement(View15, { style: styles6.addEmailRow }, /* @__PURE__ */ React15.createElement(
17777
17846
  TextInput7,
17778
17847
  {
17779
- style: [styles5.input, { flex: 1, marginRight: 8 }],
17848
+ style: [styles6.input, { flex: 1, marginRight: 8 }],
17780
17849
  value: newEmailInput,
17781
17850
  onChangeText: setNewEmailInput,
17782
17851
  placeholder: "Add email",
@@ -17784,17 +17853,17 @@ function ProfileScreen({ nav }) {
17784
17853
  keyboardType: "email-address",
17785
17854
  autoCapitalize: "none"
17786
17855
  }
17787
- ), /* @__PURE__ */ React15.createElement(TouchableOpacity12, { style: styles5.addButton, onPress: handleAddEmail }, /* @__PURE__ */ React15.createElement(Text13, { style: styles5.addButtonText }, "Add")))), /* @__PURE__ */ React15.createElement(View15, { style: styles5.field }, /* @__PURE__ */ React15.createElement(Text13, { style: shared.label }, "Testing Platforms"), /* @__PURE__ */ React15.createElement(View15, { style: styles5.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(
17856
+ ), /* @__PURE__ */ React15.createElement(TouchableOpacity12, { style: styles6.addButton, onPress: handleAddEmail }, /* @__PURE__ */ React15.createElement(Text13, { style: styles6.addButtonText }, "Add")))), /* @__PURE__ */ React15.createElement(View15, { style: styles6.field }, /* @__PURE__ */ React15.createElement(Text13, { style: shared.label }, "Testing Platforms"), /* @__PURE__ */ React15.createElement(View15, { style: styles6.platformRow }, [{ key: "ios", label: "\u{1F4F1} iOS" }, { key: "android", label: "\u{1F916} Android" }, { key: "web", label: "\u{1F310} Web" }].map(({ key, label }) => /* @__PURE__ */ React15.createElement(
17788
17857
  TouchableOpacity12,
17789
17858
  {
17790
17859
  key,
17791
- style: [styles5.platformBtn, platforms.includes(key) && styles5.platformBtnActive],
17860
+ style: [styles6.platformBtn, platforms.includes(key) && styles6.platformBtnActive],
17792
17861
  onPress: () => setPlatforms((prev) => prev.includes(key) ? prev.filter((p) => p !== key) : [...prev, key])
17793
17862
  },
17794
- /* @__PURE__ */ React15.createElement(Text13, { style: [styles5.platformText, platforms.includes(key) && styles5.platformTextActive] }, label)
17863
+ /* @__PURE__ */ React15.createElement(Text13, { style: [styles6.platformText, platforms.includes(key) && styles6.platformTextActive] }, label)
17795
17864
  )))), /* @__PURE__ */ React15.createElement(TouchableOpacity12, { style: [shared.primaryButton, { marginTop: 20 }], onPress: handleSave, disabled: saving }, /* @__PURE__ */ React15.createElement(Text13, { style: shared.primaryButtonText }, saving ? "Saving..." : "Save Profile")));
17796
17865
  }
17797
- return /* @__PURE__ */ React15.createElement(View15, null, /* @__PURE__ */ React15.createElement(View15, { style: styles5.profileCard }, /* @__PURE__ */ React15.createElement(View15, { style: styles5.avatar }, /* @__PURE__ */ React15.createElement(Text13, { style: styles5.avatarText }, testerInfo.name.charAt(0).toUpperCase())), /* @__PURE__ */ React15.createElement(Text13, { style: styles5.profileName }, testerInfo.name), /* @__PURE__ */ React15.createElement(Text13, { style: styles5.profileEmail }, testerInfo.email)), /* @__PURE__ */ React15.createElement(View15, { style: styles5.statsRow }, /* @__PURE__ */ React15.createElement(View15, { style: styles5.statItem }, /* @__PURE__ */ React15.createElement(Text13, { style: styles5.statNumber }, completedCount), /* @__PURE__ */ React15.createElement(Text13, { style: styles5.statLabel }, "Completed")), /* @__PURE__ */ React15.createElement(View15, { style: styles5.statDivider }), /* @__PURE__ */ React15.createElement(View15, { style: styles5.statItem }, /* @__PURE__ */ React15.createElement(Text13, { style: styles5.statNumber }, assignments.length), /* @__PURE__ */ React15.createElement(Text13, { style: styles5.statLabel }, "Total Assigned"))), /* @__PURE__ */ React15.createElement(TouchableOpacity12, { onPress: () => setShowDetails(!showDetails), style: styles5.detailsToggle }, /* @__PURE__ */ React15.createElement(Text13, { style: styles5.detailsToggleText }, showDetails ? "\u25BC" : "\u25B6", " Details")), showDetails && /* @__PURE__ */ React15.createElement(View15, { style: styles5.detailsSection }, additionalEmails.length > 0 && /* @__PURE__ */ React15.createElement(View15, { style: styles5.detailBlock }, /* @__PURE__ */ React15.createElement(Text13, { style: styles5.detailLabel }, "Additional Emails"), additionalEmails.map((e) => /* @__PURE__ */ React15.createElement(Text13, { key: e, style: styles5.detailValue }, e))), platforms.length > 0 && /* @__PURE__ */ React15.createElement(View15, { style: styles5.detailBlock }, /* @__PURE__ */ React15.createElement(Text13, { style: styles5.detailLabel }, "Platforms"), /* @__PURE__ */ React15.createElement(View15, { style: styles5.platformTags }, platforms.map((p) => /* @__PURE__ */ React15.createElement(View15, { key: p, style: styles5.platformTag }, /* @__PURE__ */ React15.createElement(Text13, { style: styles5.platformTagText }, p === "ios" ? "\u{1F4F1} iOS" : p === "android" ? "\u{1F916} Android" : "\u{1F310} Web")))))), /* @__PURE__ */ React15.createElement(
17866
+ return /* @__PURE__ */ React15.createElement(View15, null, /* @__PURE__ */ React15.createElement(View15, { style: styles6.profileCard }, /* @__PURE__ */ React15.createElement(View15, { style: styles6.avatar }, /* @__PURE__ */ React15.createElement(Text13, { style: styles6.avatarText }, testerInfo.name.charAt(0).toUpperCase())), /* @__PURE__ */ React15.createElement(Text13, { style: styles6.profileName }, testerInfo.name), /* @__PURE__ */ React15.createElement(Text13, { style: styles6.profileEmail }, testerInfo.email)), /* @__PURE__ */ React15.createElement(View15, { style: styles6.statsRow }, /* @__PURE__ */ React15.createElement(View15, { style: styles6.statItem }, /* @__PURE__ */ React15.createElement(Text13, { style: styles6.statNumber }, completedCount), /* @__PURE__ */ React15.createElement(Text13, { style: styles6.statLabel }, "Completed")), /* @__PURE__ */ React15.createElement(View15, { style: styles6.statDivider }), /* @__PURE__ */ React15.createElement(View15, { style: styles6.statItem }, /* @__PURE__ */ React15.createElement(Text13, { style: styles6.statNumber }, assignments.length), /* @__PURE__ */ React15.createElement(Text13, { style: styles6.statLabel }, "Total Assigned"))), /* @__PURE__ */ React15.createElement(TouchableOpacity12, { onPress: () => setShowDetails(!showDetails), style: styles6.detailsToggle }, /* @__PURE__ */ React15.createElement(Text13, { style: styles6.detailsToggleText }, showDetails ? "\u25BC" : "\u25B6", " Details")), showDetails && /* @__PURE__ */ React15.createElement(View15, { style: styles6.detailsSection }, additionalEmails.length > 0 && /* @__PURE__ */ React15.createElement(View15, { style: styles6.detailBlock }, /* @__PURE__ */ React15.createElement(Text13, { style: styles6.detailLabel }, "Additional Emails"), additionalEmails.map((e) => /* @__PURE__ */ React15.createElement(Text13, { key: e, style: styles6.detailValue }, e))), platforms.length > 0 && /* @__PURE__ */ React15.createElement(View15, { style: styles6.detailBlock }, /* @__PURE__ */ React15.createElement(Text13, { style: styles6.detailLabel }, "Platforms"), /* @__PURE__ */ React15.createElement(View15, { style: styles6.platformTags }, platforms.map((p) => /* @__PURE__ */ React15.createElement(View15, { key: p, style: styles6.platformTag }, /* @__PURE__ */ React15.createElement(Text13, { style: styles6.platformTagText }, p === "ios" ? "\u{1F4F1} iOS" : p === "android" ? "\u{1F916} Android" : "\u{1F310} Web")))))), /* @__PURE__ */ React15.createElement(
17798
17867
  TouchableOpacity12,
17799
17868
  {
17800
17869
  style: [shared.primaryButton, { marginTop: 20 }],
@@ -17852,7 +17921,7 @@ var CATEGORIES = ["open", "done", "reopened"];
17852
17921
  var SEVERITY_ORDER2 = { critical: 0, high: 1, medium: 2, low: 3 };
17853
17922
  function IssueListScreen({ nav, category }) {
17854
17923
  const { client, widgetColorScheme } = useBugBear();
17855
- const styles5 = useMemo11(() => createStyles11(), [widgetColorScheme]);
17924
+ const styles6 = useMemo11(() => createStyles11(), [widgetColorScheme]);
17856
17925
  const CATEGORY_CONFIG = useMemo11(() => ({
17857
17926
  open: { label: "Open", accent: colors.orange, emptyIcon: "\u2705", emptyText: "No open issues" },
17858
17927
  done: { label: "Done", accent: colors.green, emptyIcon: "\u{1F389}", emptyText: "No completed issues yet" },
@@ -17922,7 +17991,7 @@ function IssueListScreen({ nav, category }) {
17922
17991
  const searchFilteredIssues = debouncedQuery ? sortedIssues.filter(
17923
17992
  (issue) => (issue.title || "").toLowerCase().includes(debouncedQuery.toLowerCase()) || (issue.description || "").toLowerCase().includes(debouncedQuery.toLowerCase())
17924
17993
  ) : sortedIssues;
17925
- return /* @__PURE__ */ React16.createElement(View16, null, /* @__PURE__ */ React16.createElement(View16, { style: styles5.tabBar }, CATEGORIES.map((cat) => {
17994
+ return /* @__PURE__ */ React16.createElement(View16, null, /* @__PURE__ */ React16.createElement(View16, { style: styles6.tabBar }, CATEGORIES.map((cat) => {
17926
17995
  const catConfig = CATEGORY_CONFIG[cat];
17927
17996
  const isActive = activeCategory === cat;
17928
17997
  const count = counts?.[cat];
@@ -17931,7 +18000,7 @@ function IssueListScreen({ nav, category }) {
17931
18000
  {
17932
18001
  key: cat,
17933
18002
  style: [
17934
- styles5.tab,
18003
+ styles6.tab,
17935
18004
  { borderBottomColor: isActive ? catConfig.accent : "transparent" }
17936
18005
  ],
17937
18006
  onPress: () => {
@@ -17941,20 +18010,20 @@ function IssueListScreen({ nav, category }) {
17941
18010
  activeOpacity: 0.7
17942
18011
  },
17943
18012
  /* @__PURE__ */ React16.createElement(Text14, { style: [
17944
- styles5.tabLabel,
18013
+ styles6.tabLabel,
17945
18014
  isActive && { fontWeight: "600", color: colors.textPrimary }
17946
18015
  ] }, catConfig.label),
17947
18016
  count !== void 0 && /* @__PURE__ */ React16.createElement(View16, { style: [
17948
- styles5.countBadge,
18017
+ styles6.countBadge,
17949
18018
  {
17950
18019
  backgroundColor: isActive ? catConfig.accent + "18" : colors.card
17951
18020
  }
17952
18021
  ] }, /* @__PURE__ */ React16.createElement(Text14, { style: [
17953
- styles5.countText,
18022
+ styles6.countText,
17954
18023
  { color: isActive ? catConfig.accent : colors.textDim }
17955
18024
  ] }, count))
17956
18025
  );
17957
- })), /* @__PURE__ */ React16.createElement(View16, { style: styles5.sortRow }, [
18026
+ })), /* @__PURE__ */ React16.createElement(View16, { style: styles6.sortRow }, [
17958
18027
  { key: "severity", label: "Severity" },
17959
18028
  { key: "recent", label: "Recent" }
17960
18029
  ].map((s2) => /* @__PURE__ */ React16.createElement(
@@ -17962,14 +18031,14 @@ function IssueListScreen({ nav, category }) {
17962
18031
  {
17963
18032
  key: s2.key,
17964
18033
  style: [
17965
- styles5.sortBtn,
17966
- sortMode === s2.key && styles5.sortBtnActive
18034
+ styles6.sortBtn,
18035
+ sortMode === s2.key && styles6.sortBtnActive
17967
18036
  ],
17968
18037
  onPress: () => setSortMode(s2.key)
17969
18038
  },
17970
18039
  /* @__PURE__ */ React16.createElement(Text14, { style: [
17971
- styles5.sortBtnText,
17972
- sortMode === s2.key && styles5.sortBtnTextActive
18040
+ styles6.sortBtnText,
18041
+ sortMode === s2.key && styles6.sortBtnTextActive
17973
18042
  ] }, s2.label)
17974
18043
  ))), /* @__PURE__ */ React16.createElement(View16, { style: { paddingHorizontal: 16, paddingBottom: 12 } }, /* @__PURE__ */ React16.createElement(
17975
18044
  TextInput8,
@@ -17989,18 +18058,18 @@ function IssueListScreen({ nav, category }) {
17989
18058
  fontSize: 13
17990
18059
  }
17991
18060
  }
17992
- )), loading ? /* @__PURE__ */ React16.createElement(IssueListScreenSkeleton, null) : searchFilteredIssues.length === 0 ? /* @__PURE__ */ React16.createElement(View16, { style: styles5.emptyContainer }, /* @__PURE__ */ React16.createElement(Text14, { style: styles5.emptyIcon }, debouncedQuery ? "\u{1F50D}" : config.emptyIcon), /* @__PURE__ */ React16.createElement(Text14, { style: styles5.emptyText }, debouncedQuery ? "No matching issues" : config.emptyText)) : searchFilteredIssues.map((issue) => /* @__PURE__ */ React16.createElement(
18061
+ )), loading ? /* @__PURE__ */ React16.createElement(IssueListScreenSkeleton, null) : searchFilteredIssues.length === 0 ? /* @__PURE__ */ React16.createElement(View16, { style: styles6.emptyContainer }, /* @__PURE__ */ React16.createElement(Text14, { style: styles6.emptyIcon }, debouncedQuery ? "\u{1F50D}" : config.emptyIcon), /* @__PURE__ */ React16.createElement(Text14, { style: styles6.emptyText }, debouncedQuery ? "No matching issues" : config.emptyText)) : searchFilteredIssues.map((issue) => /* @__PURE__ */ React16.createElement(
17993
18062
  TouchableOpacity13,
17994
18063
  {
17995
18064
  key: issue.id,
17996
- style: styles5.issueCard,
18065
+ style: styles6.issueCard,
17997
18066
  onPress: () => nav.push({ name: "ISSUE_DETAIL", issue }),
17998
18067
  activeOpacity: 0.7
17999
18068
  },
18000
- /* @__PURE__ */ React16.createElement(View16, { style: styles5.topRow }, issue.severity && /* @__PURE__ */ React16.createElement(View16, { style: [styles5.severityDot, { backgroundColor: SEVERITY_COLORS[issue.severity] || colors.textDim }] }), /* @__PURE__ */ React16.createElement(Text14, { style: styles5.issueTitle, numberOfLines: 1 }, issue.title)),
18001
- /* @__PURE__ */ React16.createElement(View16, { style: styles5.bottomRow }, issue.route && /* @__PURE__ */ React16.createElement(Text14, { style: styles5.routeText, numberOfLines: 1 }, issue.route), /* @__PURE__ */ React16.createElement(Text14, { style: styles5.timeText }, formatRelativeTime(issue.updatedAt))),
18002
- activeCategory === "done" && issue.verifiedByName && /* @__PURE__ */ React16.createElement(View16, { style: styles5.verifiedBadge }, /* @__PURE__ */ React16.createElement(Text14, { style: styles5.verifiedBadgeText }, "\u2714", " Verified by ", issue.verifiedByName)),
18003
- activeCategory === "reopened" && issue.originalBugTitle && /* @__PURE__ */ React16.createElement(View16, { style: styles5.reopenedBadge }, /* @__PURE__ */ React16.createElement(Text14, { style: styles5.reopenedBadgeText, numberOfLines: 1 }, "\u{1F504}", " Retest of: ", issue.originalBugTitle))
18069
+ /* @__PURE__ */ React16.createElement(View16, { style: styles6.topRow }, issue.severity && /* @__PURE__ */ React16.createElement(View16, { style: [styles6.severityDot, { backgroundColor: SEVERITY_COLORS[issue.severity] || colors.textDim }] }), /* @__PURE__ */ React16.createElement(Text14, { style: styles6.issueTitle, numberOfLines: 1 }, issue.title)),
18070
+ /* @__PURE__ */ React16.createElement(View16, { style: styles6.bottomRow }, issue.route && /* @__PURE__ */ React16.createElement(Text14, { style: styles6.routeText, numberOfLines: 1 }, issue.route), /* @__PURE__ */ React16.createElement(Text14, { style: styles6.timeText }, formatRelativeTime(issue.updatedAt))),
18071
+ activeCategory === "done" && issue.verifiedByName && /* @__PURE__ */ React16.createElement(View16, { style: styles6.verifiedBadge }, /* @__PURE__ */ React16.createElement(Text14, { style: styles6.verifiedBadgeText }, "\u2714", " Verified by ", issue.verifiedByName)),
18072
+ activeCategory === "reopened" && issue.originalBugTitle && /* @__PURE__ */ React16.createElement(View16, { style: styles6.reopenedBadge }, /* @__PURE__ */ React16.createElement(Text14, { style: styles6.reopenedBadgeText, numberOfLines: 1 }, "\u{1F504}", " Retest of: ", issue.originalBugTitle))
18004
18073
  )));
18005
18074
  }
18006
18075
  function createStyles11() {
@@ -18159,7 +18228,7 @@ import { View as View17, Text as Text15, Image as Image3, StyleSheet as StyleShe
18159
18228
  var DONE_STATUSES = ["verified", "resolved", "closed", "reviewed"];
18160
18229
  function IssueDetailScreen({ nav, issue }) {
18161
18230
  const { dashboardUrl, widgetColorScheme, reopenReport } = useBugBear();
18162
- const styles5 = useMemo12(() => createStyles12(), [widgetColorScheme]);
18231
+ const styles6 = useMemo12(() => createStyles12(), [widgetColorScheme]);
18163
18232
  const [showReopenForm, setShowReopenForm] = useState14(false);
18164
18233
  const [reopenReason, setReopenReason] = useState14("");
18165
18234
  const [isSubmitting, setIsSubmitting] = useState14(false);
@@ -18201,44 +18270,44 @@ function IssueDetailScreen({ nav, issue }) {
18201
18270
  setReopenError(result.error || "Failed to reopen");
18202
18271
  }
18203
18272
  }, [reopenReason, reopenReport, issue.id]);
18204
- return /* @__PURE__ */ React17.createElement(View17, null, /* @__PURE__ */ React17.createElement(View17, { style: styles5.badgeRow }, /* @__PURE__ */ React17.createElement(View17, { style: [styles5.badge, { backgroundColor: wasReopened ? colors.yellowDark : statusConfig.bg }] }, /* @__PURE__ */ React17.createElement(Text15, { style: [styles5.badgeText, { color: wasReopened ? colors.yellowLight : statusConfig.color }] }, wasReopened ? "Reopened" : statusConfig.label)), severityConfig && /* @__PURE__ */ React17.createElement(View17, { style: [styles5.badge, { backgroundColor: severityConfig.bg }] }, /* @__PURE__ */ React17.createElement(Text15, { style: [styles5.badgeText, { color: severityConfig.color }] }, severityConfig.label))), /* @__PURE__ */ React17.createElement(Text15, { style: styles5.title }, issue.title), issue.route && /* @__PURE__ */ React17.createElement(Text15, { style: styles5.route }, issue.route), issue.description && /* @__PURE__ */ React17.createElement(View17, { style: styles5.descriptionCard }, /* @__PURE__ */ React17.createElement(Text15, { style: styles5.descriptionText }, issue.description)), wasReopened && /* @__PURE__ */ React17.createElement(View17, { style: styles5.reopenedCard }, /* @__PURE__ */ React17.createElement(View17, { style: styles5.reopenedRow }, /* @__PURE__ */ React17.createElement(Text15, { style: styles5.reopenedIcon }, "\u{1F504}"), /* @__PURE__ */ React17.createElement(Text15, { style: styles5.reopenedText }, "Issue reopened \u2014 your team has been notified"))), issue.verifiedByName && !wasReopened && /* @__PURE__ */ React17.createElement(View17, { style: styles5.verifiedCard }, /* @__PURE__ */ React17.createElement(View17, { style: styles5.verifiedHeader }, /* @__PURE__ */ React17.createElement(Text15, { style: styles5.verifiedIcon }, "\u2705"), /* @__PURE__ */ React17.createElement(Text15, { style: styles5.verifiedTitle }, "Retesting Proof")), /* @__PURE__ */ React17.createElement(Text15, { style: styles5.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: styles5.originalBugCard }, /* @__PURE__ */ React17.createElement(View17, { style: styles5.originalBugHeader }, /* @__PURE__ */ React17.createElement(Text15, { style: styles5.originalBugIcon }, "\u{1F504}"), /* @__PURE__ */ React17.createElement(Text15, { style: styles5.originalBugTitleText }, "Original Bug")), /* @__PURE__ */ React17.createElement(Text15, { style: styles5.originalBugBody }, "Retest of: ", issue.originalBugTitle)), isDone && !wasReopened && !showReopenForm && /* @__PURE__ */ React17.createElement(
18273
+ return /* @__PURE__ */ React17.createElement(View17, null, /* @__PURE__ */ React17.createElement(View17, { style: styles6.badgeRow }, /* @__PURE__ */ React17.createElement(View17, { style: [styles6.badge, { backgroundColor: wasReopened ? colors.yellowDark : statusConfig.bg }] }, /* @__PURE__ */ React17.createElement(Text15, { style: [styles6.badgeText, { color: wasReopened ? colors.yellowLight : statusConfig.color }] }, wasReopened ? "Reopened" : statusConfig.label)), severityConfig && /* @__PURE__ */ React17.createElement(View17, { style: [styles6.badge, { backgroundColor: severityConfig.bg }] }, /* @__PURE__ */ React17.createElement(Text15, { style: [styles6.badgeText, { color: severityConfig.color }] }, severityConfig.label))), /* @__PURE__ */ React17.createElement(Text15, { style: styles6.title }, issue.title), issue.route && /* @__PURE__ */ React17.createElement(Text15, { style: styles6.route }, issue.route), issue.description && /* @__PURE__ */ React17.createElement(View17, { style: styles6.descriptionCard }, /* @__PURE__ */ React17.createElement(Text15, { style: styles6.descriptionText }, issue.description)), wasReopened && /* @__PURE__ */ React17.createElement(View17, { style: styles6.reopenedCard }, /* @__PURE__ */ React17.createElement(View17, { style: styles6.reopenedRow }, /* @__PURE__ */ React17.createElement(Text15, { style: styles6.reopenedIcon }, "\u{1F504}"), /* @__PURE__ */ React17.createElement(Text15, { style: styles6.reopenedText }, "Issue reopened \u2014 your team has been notified"))), issue.verifiedByName && !wasReopened && /* @__PURE__ */ React17.createElement(View17, { style: styles6.verifiedCard }, /* @__PURE__ */ React17.createElement(View17, { style: styles6.verifiedHeader }, /* @__PURE__ */ React17.createElement(Text15, { style: styles6.verifiedIcon }, "\u2705"), /* @__PURE__ */ React17.createElement(Text15, { style: styles6.verifiedTitle }, "Retesting Proof")), /* @__PURE__ */ React17.createElement(Text15, { style: styles6.verifiedBody }, "Verified by ", issue.verifiedByName, issue.verifiedAt && ` on ${new Date(issue.verifiedAt).toLocaleDateString(void 0, { month: "short", day: "numeric", year: "numeric" })}`)), issue.originalBugTitle && /* @__PURE__ */ React17.createElement(View17, { style: styles6.originalBugCard }, /* @__PURE__ */ React17.createElement(View17, { style: styles6.originalBugHeader }, /* @__PURE__ */ React17.createElement(Text15, { style: styles6.originalBugIcon }, "\u{1F504}"), /* @__PURE__ */ React17.createElement(Text15, { style: styles6.originalBugTitleText }, "Original Bug")), /* @__PURE__ */ React17.createElement(Text15, { style: styles6.originalBugBody }, "Retest of: ", issue.originalBugTitle)), isDone && !wasReopened && !showReopenForm && /* @__PURE__ */ React17.createElement(
18205
18274
  TouchableOpacity14,
18206
18275
  {
18207
- style: styles5.reopenButton,
18276
+ style: styles6.reopenButton,
18208
18277
  onPress: () => setShowReopenForm(true),
18209
18278
  activeOpacity: 0.7
18210
18279
  },
18211
- /* @__PURE__ */ React17.createElement(Text15, { style: styles5.reopenButtonText }, "\u{1F504}", " Not Fixed \u2014 Reopen Issue")
18212
- ), showReopenForm && !wasReopened && /* @__PURE__ */ React17.createElement(View17, { style: styles5.reopenForm }, /* @__PURE__ */ React17.createElement(Text15, { style: styles5.reopenFormTitle }, "Why isn't this fixed?"), /* @__PURE__ */ React17.createElement(
18280
+ /* @__PURE__ */ React17.createElement(Text15, { style: styles6.reopenButtonText }, "\u{1F504}", " Not Fixed \u2014 Reopen Issue")
18281
+ ), showReopenForm && !wasReopened && /* @__PURE__ */ React17.createElement(View17, { style: styles6.reopenForm }, /* @__PURE__ */ React17.createElement(Text15, { style: styles6.reopenFormTitle }, "Why isn't this fixed?"), /* @__PURE__ */ React17.createElement(
18213
18282
  TextInput9,
18214
18283
  {
18215
18284
  value: reopenReason,
18216
18285
  onChangeText: setReopenReason,
18217
18286
  placeholder: "Describe what you're still seeing...",
18218
18287
  placeholderTextColor: colors.textMuted,
18219
- style: styles5.reopenInput,
18288
+ style: styles6.reopenInput,
18220
18289
  multiline: true,
18221
18290
  autoFocus: true
18222
18291
  }
18223
- ), reopenError && /* @__PURE__ */ React17.createElement(Text15, { style: styles5.reopenErrorText }, reopenError), /* @__PURE__ */ React17.createElement(View17, { style: styles5.reopenActions }, /* @__PURE__ */ React17.createElement(
18292
+ ), reopenError && /* @__PURE__ */ React17.createElement(Text15, { style: styles6.reopenErrorText }, reopenError), /* @__PURE__ */ React17.createElement(View17, { style: styles6.reopenActions }, /* @__PURE__ */ React17.createElement(
18224
18293
  TouchableOpacity14,
18225
18294
  {
18226
18295
  style: [
18227
- styles5.reopenSubmitButton,
18228
- (!reopenReason.trim() || isSubmitting) && styles5.reopenSubmitDisabled
18296
+ styles6.reopenSubmitButton,
18297
+ (!reopenReason.trim() || isSubmitting) && styles6.reopenSubmitDisabled
18229
18298
  ],
18230
18299
  onPress: handleReopen,
18231
18300
  disabled: isSubmitting || !reopenReason.trim(),
18232
18301
  activeOpacity: 0.7
18233
18302
  },
18234
18303
  isSubmitting ? /* @__PURE__ */ React17.createElement(ActivityIndicator2, { size: "small", color: "#fff" }) : /* @__PURE__ */ React17.createElement(Text15, { style: [
18235
- styles5.reopenSubmitText,
18236
- !reopenReason.trim() && styles5.reopenSubmitTextDisabled
18304
+ styles6.reopenSubmitText,
18305
+ !reopenReason.trim() && styles6.reopenSubmitTextDisabled
18237
18306
  ] }, "Reopen Issue")
18238
18307
  ), /* @__PURE__ */ React17.createElement(
18239
18308
  TouchableOpacity14,
18240
18309
  {
18241
- style: styles5.reopenCancelButton,
18310
+ style: styles6.reopenCancelButton,
18242
18311
  onPress: () => {
18243
18312
  setShowReopenForm(false);
18244
18313
  setReopenReason("");
@@ -18247,7 +18316,7 @@ function IssueDetailScreen({ nav, issue }) {
18247
18316
  disabled: isSubmitting,
18248
18317
  activeOpacity: 0.7
18249
18318
  },
18250
- /* @__PURE__ */ React17.createElement(Text15, { style: styles5.reopenCancelText }, "Cancel")
18319
+ /* @__PURE__ */ React17.createElement(Text15, { style: styles6.reopenCancelText }, "Cancel")
18251
18320
  ))), issue.status === "ready_to_test" && (issue.fixCommitSha || issue.resolutionNotes) && /* @__PURE__ */ React17.createElement(View17, { style: {
18252
18321
  backgroundColor: "rgba(59, 130, 246, 0.1)",
18253
18322
  borderWidth: 1,
@@ -18255,14 +18324,14 @@ function IssueDetailScreen({ nav, issue }) {
18255
18324
  borderRadius: 8,
18256
18325
  padding: 12,
18257
18326
  marginBottom: 12
18258
- } }, /* @__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: styles5.screenshotSection }, /* @__PURE__ */ React17.createElement(Text15, { style: styles5.screenshotLabel }, "Screenshots (", issue.screenshotUrls.length, ")"), /* @__PURE__ */ React17.createElement(View17, { style: styles5.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: styles5.screenshotThumb }))))), /* @__PURE__ */ React17.createElement(View17, { style: styles5.metaSection }, issue.reporterName && /* @__PURE__ */ React17.createElement(Text15, { style: styles5.metaText }, "Reported by ", issue.reporterName), /* @__PURE__ */ React17.createElement(Text15, { style: styles5.metaTextSmall }, "Created ", formatRelativeTime(issue.createdAt), " ", "\xB7", " Updated ", formatRelativeTime(issue.updatedAt))), dashboardUrl && /* @__PURE__ */ React17.createElement(
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: styles6.screenshotSection }, /* @__PURE__ */ React17.createElement(Text15, { style: styles6.screenshotLabel }, "Screenshots (", issue.screenshotUrls.length, ")"), /* @__PURE__ */ React17.createElement(View17, { style: styles6.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: styles6.screenshotThumb }))))), /* @__PURE__ */ React17.createElement(View17, { style: styles6.metaSection }, issue.reporterName && /* @__PURE__ */ React17.createElement(Text15, { style: styles6.metaText }, "Reported by ", issue.reporterName), /* @__PURE__ */ React17.createElement(Text15, { style: styles6.metaTextSmall }, "Created ", formatRelativeTime(issue.createdAt), " ", "\xB7", " Updated ", formatRelativeTime(issue.updatedAt))), dashboardUrl && /* @__PURE__ */ React17.createElement(
18259
18328
  TouchableOpacity14,
18260
18329
  {
18261
- style: styles5.dashboardLink,
18330
+ style: styles6.dashboardLink,
18262
18331
  onPress: () => Linking4.openURL(`${dashboardUrl}/reports`),
18263
18332
  activeOpacity: 0.7
18264
18333
  },
18265
- /* @__PURE__ */ React17.createElement(Text15, { style: styles5.dashboardLinkText }, "\u{1F310}", " View on Dashboard ", "\u2192")
18334
+ /* @__PURE__ */ React17.createElement(Text15, { style: styles6.dashboardLinkText }, "\u{1F310}", " View on Dashboard ", "\u2192")
18266
18335
  ));
18267
18336
  }
18268
18337
  function createStyles12() {
@@ -18519,7 +18588,7 @@ import React18, { useState as useState15, useMemo as useMemo13 } from "react";
18519
18588
  import { View as View18, Text as Text16, TextInput as TextInput10, TouchableOpacity as TouchableOpacity15, StyleSheet as StyleSheet18, Keyboard as Keyboard2 } from "react-native";
18520
18589
  function SessionStartScreen({ nav }) {
18521
18590
  const { startSession, assignments, widgetColorScheme } = useBugBear();
18522
- const styles5 = useMemo13(() => createStyles13(), [widgetColorScheme]);
18591
+ const styles6 = useMemo13(() => createStyles13(), [widgetColorScheme]);
18523
18592
  const [focusArea, setFocusArea] = useState15("");
18524
18593
  const [isStarting, setIsStarting] = useState15(false);
18525
18594
  const [error, setError] = useState15(null);
@@ -18546,35 +18615,35 @@ function SessionStartScreen({ nav }) {
18546
18615
  setIsStarting(false);
18547
18616
  }
18548
18617
  };
18549
- return /* @__PURE__ */ React18.createElement(View18, null, /* @__PURE__ */ React18.createElement(View18, { style: styles5.header }, /* @__PURE__ */ React18.createElement(Text16, { style: styles5.headerIcon }, "\u{1F50D}"), /* @__PURE__ */ React18.createElement(Text16, { style: styles5.headerDesc }, "Start an exploratory QA session. Log findings as you go \u2014 bugs, concerns, suggestions, or questions.")), /* @__PURE__ */ React18.createElement(View18, { style: styles5.inputSection }, /* @__PURE__ */ React18.createElement(Text16, { style: styles5.label }, "What are you testing?"), /* @__PURE__ */ React18.createElement(
18618
+ return /* @__PURE__ */ React18.createElement(View18, null, /* @__PURE__ */ React18.createElement(View18, { style: styles6.header }, /* @__PURE__ */ React18.createElement(Text16, { style: styles6.headerIcon }, "\u{1F50D}"), /* @__PURE__ */ React18.createElement(Text16, { style: styles6.headerDesc }, "Start an exploratory QA session. Log findings as you go \u2014 bugs, concerns, suggestions, or questions.")), /* @__PURE__ */ React18.createElement(View18, { style: styles6.inputSection }, /* @__PURE__ */ React18.createElement(Text16, { style: styles6.label }, "What are you testing?"), /* @__PURE__ */ React18.createElement(
18550
18619
  TextInput10,
18551
18620
  {
18552
18621
  value: focusArea,
18553
18622
  onChangeText: setFocusArea,
18554
18623
  placeholder: "e.g. Checkout flow, Settings page...",
18555
18624
  placeholderTextColor: colors.textMuted,
18556
- style: styles5.input,
18625
+ style: styles6.input,
18557
18626
  returnKeyType: "done",
18558
18627
  onSubmitEditing: handleStart
18559
18628
  }
18560
- )), trackNames.length > 0 && /* @__PURE__ */ React18.createElement(View18, { style: styles5.chipsSection }, /* @__PURE__ */ React18.createElement(Text16, { style: styles5.chipsLabel }, "Quick pick:"), /* @__PURE__ */ React18.createElement(View18, { style: styles5.chipsRow }, trackNames.map((name) => /* @__PURE__ */ React18.createElement(
18629
+ )), trackNames.length > 0 && /* @__PURE__ */ React18.createElement(View18, { style: styles6.chipsSection }, /* @__PURE__ */ React18.createElement(Text16, { style: styles6.chipsLabel }, "Quick pick:"), /* @__PURE__ */ React18.createElement(View18, { style: styles6.chipsRow }, trackNames.map((name) => /* @__PURE__ */ React18.createElement(
18561
18630
  TouchableOpacity15,
18562
18631
  {
18563
18632
  key: name,
18564
- style: [styles5.chip, focusArea === name && styles5.chipActive],
18633
+ style: [styles6.chip, focusArea === name && styles6.chipActive],
18565
18634
  onPress: () => setFocusArea(name),
18566
18635
  activeOpacity: 0.7
18567
18636
  },
18568
- /* @__PURE__ */ React18.createElement(Text16, { style: [styles5.chipText, focusArea === name && styles5.chipTextActive] }, name)
18569
- )))), error && /* @__PURE__ */ React18.createElement(View18, { style: styles5.errorBox }, /* @__PURE__ */ React18.createElement(Text16, { style: styles5.errorText }, error)), /* @__PURE__ */ React18.createElement(
18637
+ /* @__PURE__ */ React18.createElement(Text16, { style: [styles6.chipText, focusArea === name && styles6.chipTextActive] }, name)
18638
+ )))), error && /* @__PURE__ */ React18.createElement(View18, { style: styles6.errorBox }, /* @__PURE__ */ React18.createElement(Text16, { style: styles6.errorText }, error)), /* @__PURE__ */ React18.createElement(
18570
18639
  TouchableOpacity15,
18571
18640
  {
18572
- style: [styles5.startBtn, isStarting && styles5.startBtnDisabled],
18641
+ style: [styles6.startBtn, isStarting && styles6.startBtnDisabled],
18573
18642
  onPress: handleStart,
18574
18643
  disabled: isStarting,
18575
18644
  activeOpacity: 0.8
18576
18645
  },
18577
- /* @__PURE__ */ React18.createElement(Text16, { style: styles5.startBtnText }, isStarting ? "Starting..." : "\u25B6 Start Session")
18646
+ /* @__PURE__ */ React18.createElement(Text16, { style: styles6.startBtnText }, isStarting ? "Starting..." : "\u25B6 Start Session")
18578
18647
  ));
18579
18648
  }
18580
18649
  function createStyles13() {
@@ -18679,11 +18748,11 @@ function createStyles13() {
18679
18748
  }
18680
18749
 
18681
18750
  // src/widget/screens/SessionActiveScreen.tsx
18682
- import React19, { useState as useState16, useEffect as useEffect11, useRef as useRef5, useMemo as useMemo14 } from "react";
18751
+ import React19, { useState as useState16, useEffect as useEffect11, useRef as useRef6, useMemo as useMemo14 } from "react";
18683
18752
  import { View as View19, Text as Text17, TouchableOpacity as TouchableOpacity16, StyleSheet as StyleSheet19 } from "react-native";
18684
18753
  function SessionActiveScreen({ nav }) {
18685
18754
  const { activeSession, sessionFindings, endSession, refreshSession, widgetColorScheme } = useBugBear();
18686
- const styles5 = useMemo14(() => createStyles14(), [widgetColorScheme]);
18755
+ const styles6 = useMemo14(() => createStyles14(), [widgetColorScheme]);
18687
18756
  const FINDING_TYPE_CONFIG = useMemo14(() => ({
18688
18757
  bug: { icon: "\u{1F41B}", label: "Bug", color: colors.red },
18689
18758
  concern: { icon: "\u26A0\uFE0F", label: "Concern", color: colors.amber },
@@ -18692,7 +18761,7 @@ function SessionActiveScreen({ nav }) {
18692
18761
  }), [widgetColorScheme]);
18693
18762
  const [isEnding, setIsEnding] = useState16(false);
18694
18763
  const [elapsed, setElapsed] = useState16(0);
18695
- const timerRef = useRef5(null);
18764
+ const timerRef = useRef6(null);
18696
18765
  useEffect11(() => {
18697
18766
  refreshSession();
18698
18767
  }, []);
@@ -18725,30 +18794,30 @@ function SessionActiveScreen({ nav }) {
18725
18794
  }
18726
18795
  };
18727
18796
  if (!activeSession) {
18728
- return /* @__PURE__ */ React19.createElement(View19, { style: styles5.emptyContainer }, /* @__PURE__ */ React19.createElement(Text17, { style: styles5.emptyText }, "No active session"), /* @__PURE__ */ React19.createElement(TouchableOpacity16, { onPress: () => nav.replace({ name: "SESSION_START" }) }, /* @__PURE__ */ React19.createElement(Text17, { style: styles5.emptyLink }, "Start a new session")));
18797
+ return /* @__PURE__ */ React19.createElement(View19, { style: styles6.emptyContainer }, /* @__PURE__ */ React19.createElement(Text17, { style: styles6.emptyText }, "No active session"), /* @__PURE__ */ React19.createElement(TouchableOpacity16, { onPress: () => nav.replace({ name: "SESSION_START" }) }, /* @__PURE__ */ React19.createElement(Text17, { style: styles6.emptyLink }, "Start a new session")));
18729
18798
  }
18730
18799
  const renderFinding = (finding) => {
18731
18800
  const config = FINDING_TYPE_CONFIG[finding.type] || FINDING_TYPE_CONFIG.bug;
18732
- return /* @__PURE__ */ React19.createElement(View19, { key: finding.id, style: styles5.findingRow }, /* @__PURE__ */ React19.createElement(Text17, { style: styles5.findingIcon }, config.icon), /* @__PURE__ */ React19.createElement(View19, { style: styles5.findingContent }, /* @__PURE__ */ React19.createElement(Text17, { style: styles5.findingTitle, numberOfLines: 1 }, finding.title), /* @__PURE__ */ React19.createElement(View19, { style: styles5.findingMeta }, /* @__PURE__ */ React19.createElement(Text17, { style: [styles5.findingType, { color: config.color }] }, config.label), /* @__PURE__ */ React19.createElement(Text17, { style: styles5.findingSeverity }, finding.severity), finding.convertedToBugId && /* @__PURE__ */ React19.createElement(Text17, { style: styles5.findingConverted }, "\u2192 Bug filed"))));
18801
+ return /* @__PURE__ */ React19.createElement(View19, { key: finding.id, style: styles6.findingRow }, /* @__PURE__ */ React19.createElement(Text17, { style: styles6.findingIcon }, config.icon), /* @__PURE__ */ React19.createElement(View19, { style: styles6.findingContent }, /* @__PURE__ */ React19.createElement(Text17, { style: styles6.findingTitle, numberOfLines: 1 }, finding.title), /* @__PURE__ */ React19.createElement(View19, { style: styles6.findingMeta }, /* @__PURE__ */ React19.createElement(Text17, { style: [styles6.findingType, { color: config.color }] }, config.label), /* @__PURE__ */ React19.createElement(Text17, { style: styles6.findingSeverity }, finding.severity), finding.convertedToBugId && /* @__PURE__ */ React19.createElement(Text17, { style: styles6.findingConverted }, "\u2192 Bug filed"))));
18733
18802
  };
18734
- return /* @__PURE__ */ React19.createElement(View19, null, /* @__PURE__ */ React19.createElement(View19, { style: styles5.timerCard }, /* @__PURE__ */ React19.createElement(View19, { style: styles5.recordingRow }, /* @__PURE__ */ React19.createElement(View19, { style: styles5.recordingDot }), /* @__PURE__ */ React19.createElement(Text17, { style: styles5.recordingLabel }, "Recording")), /* @__PURE__ */ React19.createElement(Text17, { style: styles5.timerText }, formatTimer(elapsed)), activeSession.focusArea ? /* @__PURE__ */ React19.createElement(Text17, { style: styles5.focusArea }, activeSession.focusArea) : null), /* @__PURE__ */ React19.createElement(View19, { style: styles5.actionRow }, /* @__PURE__ */ React19.createElement(
18803
+ return /* @__PURE__ */ React19.createElement(View19, null, /* @__PURE__ */ React19.createElement(View19, { style: styles6.timerCard }, /* @__PURE__ */ React19.createElement(View19, { style: styles6.recordingRow }, /* @__PURE__ */ React19.createElement(View19, { style: styles6.recordingDot }), /* @__PURE__ */ React19.createElement(Text17, { style: styles6.recordingLabel }, "Recording")), /* @__PURE__ */ React19.createElement(Text17, { style: styles6.timerText }, formatTimer(elapsed)), activeSession.focusArea ? /* @__PURE__ */ React19.createElement(Text17, { style: styles6.focusArea }, activeSession.focusArea) : null), /* @__PURE__ */ React19.createElement(View19, { style: styles6.actionRow }, /* @__PURE__ */ React19.createElement(
18735
18804
  TouchableOpacity16,
18736
18805
  {
18737
- style: styles5.addFindingBtn,
18806
+ style: styles6.addFindingBtn,
18738
18807
  onPress: () => nav.push({ name: "SESSION_FINDING" }),
18739
18808
  activeOpacity: 0.8
18740
18809
  },
18741
- /* @__PURE__ */ React19.createElement(Text17, { style: styles5.addFindingText }, "+ Add Finding")
18810
+ /* @__PURE__ */ React19.createElement(Text17, { style: styles6.addFindingText }, "+ Add Finding")
18742
18811
  ), /* @__PURE__ */ React19.createElement(
18743
18812
  TouchableOpacity16,
18744
18813
  {
18745
- style: [styles5.endBtn, isEnding && styles5.endBtnDisabled],
18814
+ style: [styles6.endBtn, isEnding && styles6.endBtnDisabled],
18746
18815
  onPress: handleEnd,
18747
18816
  disabled: isEnding,
18748
18817
  activeOpacity: 0.8
18749
18818
  },
18750
- /* @__PURE__ */ React19.createElement(Text17, { style: styles5.endBtnText }, isEnding ? "..." : "End")
18751
- )), /* @__PURE__ */ React19.createElement(Text17, { style: styles5.sectionTitle }, "Findings (", sessionFindings.length, ")"), sessionFindings.length === 0 ? /* @__PURE__ */ React19.createElement(View19, { style: styles5.emptyFindings }, /* @__PURE__ */ React19.createElement(Text17, { style: styles5.emptyFindingsIcon }, "\u{1F4CB}"), /* @__PURE__ */ React19.createElement(Text17, { style: styles5.emptyFindingsText }, 'No findings yet. Tap "Add Finding" to log something.')) : /* @__PURE__ */ React19.createElement(View19, { style: styles5.findingsList }, sessionFindings.map(renderFinding)));
18819
+ /* @__PURE__ */ React19.createElement(Text17, { style: styles6.endBtnText }, isEnding ? "..." : "End")
18820
+ )), /* @__PURE__ */ React19.createElement(Text17, { style: styles6.sectionTitle }, "Findings (", sessionFindings.length, ")"), sessionFindings.length === 0 ? /* @__PURE__ */ React19.createElement(View19, { style: styles6.emptyFindings }, /* @__PURE__ */ React19.createElement(Text17, { style: styles6.emptyFindingsIcon }, "\u{1F4CB}"), /* @__PURE__ */ React19.createElement(Text17, { style: styles6.emptyFindingsText }, 'No findings yet. Tap "Add Finding" to log something.')) : /* @__PURE__ */ React19.createElement(View19, { style: styles6.findingsList }, sessionFindings.map(renderFinding)));
18752
18821
  }
18753
18822
  function createStyles14() {
18754
18823
  return StyleSheet19.create({
@@ -18926,7 +18995,7 @@ var FINDING_TYPES = [
18926
18995
  ];
18927
18996
  function SessionFindingScreen({ nav }) {
18928
18997
  const { addFinding, widgetColorScheme } = useBugBear();
18929
- const styles5 = useMemo15(() => createStyles15(), [widgetColorScheme]);
18998
+ const styles6 = useMemo15(() => createStyles15(), [widgetColorScheme]);
18930
18999
  const SEVERITIES = useMemo15(() => [
18931
19000
  { value: "critical", label: "Critical", color: colors.red },
18932
19001
  { value: "high", label: "High", color: colors.orange },
@@ -18958,46 +19027,46 @@ function SessionFindingScreen({ nav }) {
18958
19027
  }
18959
19028
  };
18960
19029
  const canSubmit = title.trim().length > 0 && !isSubmitting;
18961
- return /* @__PURE__ */ React20.createElement(View20, null, /* @__PURE__ */ React20.createElement(View20, { style: styles5.section }, /* @__PURE__ */ React20.createElement(Text18, { style: styles5.sectionLabel }, "Type"), /* @__PURE__ */ React20.createElement(View20, { style: styles5.typeRow }, FINDING_TYPES.map((ft) => /* @__PURE__ */ React20.createElement(
19030
+ return /* @__PURE__ */ React20.createElement(View20, null, /* @__PURE__ */ React20.createElement(View20, { style: styles6.section }, /* @__PURE__ */ React20.createElement(Text18, { style: styles6.sectionLabel }, "Type"), /* @__PURE__ */ React20.createElement(View20, { style: styles6.typeRow }, FINDING_TYPES.map((ft) => /* @__PURE__ */ React20.createElement(
18962
19031
  TouchableOpacity17,
18963
19032
  {
18964
19033
  key: ft.value,
18965
- style: [styles5.typePill, type === ft.value && styles5.typePillActive],
19034
+ style: [styles6.typePill, type === ft.value && styles6.typePillActive],
18966
19035
  onPress: () => setType(ft.value),
18967
19036
  activeOpacity: 0.7
18968
19037
  },
18969
- /* @__PURE__ */ React20.createElement(Text18, { style: styles5.typePillIcon }, ft.icon),
18970
- /* @__PURE__ */ React20.createElement(Text18, { style: [styles5.typePillLabel, type === ft.value && styles5.typePillLabelActive] }, ft.label)
18971
- )))), /* @__PURE__ */ React20.createElement(View20, { style: styles5.section }, /* @__PURE__ */ React20.createElement(Text18, { style: styles5.sectionLabel }, "Severity"), /* @__PURE__ */ React20.createElement(View20, { style: styles5.severityRow }, SEVERITIES.map((s2) => /* @__PURE__ */ React20.createElement(
19038
+ /* @__PURE__ */ React20.createElement(Text18, { style: styles6.typePillIcon }, ft.icon),
19039
+ /* @__PURE__ */ React20.createElement(Text18, { style: [styles6.typePillLabel, type === ft.value && styles6.typePillLabelActive] }, ft.label)
19040
+ )))), /* @__PURE__ */ React20.createElement(View20, { style: styles6.section }, /* @__PURE__ */ React20.createElement(Text18, { style: styles6.sectionLabel }, "Severity"), /* @__PURE__ */ React20.createElement(View20, { style: styles6.severityRow }, SEVERITIES.map((s2) => /* @__PURE__ */ React20.createElement(
18972
19041
  TouchableOpacity17,
18973
19042
  {
18974
19043
  key: s2.value,
18975
19044
  style: [
18976
- styles5.severityPill,
19045
+ styles6.severityPill,
18977
19046
  severity === s2.value && { backgroundColor: `${s2.color}20`, borderColor: s2.color }
18978
19047
  ],
18979
19048
  onPress: () => setSeverity(s2.value),
18980
19049
  activeOpacity: 0.7
18981
19050
  },
18982
- /* @__PURE__ */ React20.createElement(Text18, { style: [styles5.severityText, severity === s2.value && { color: s2.color }] }, s2.label)
18983
- )))), /* @__PURE__ */ React20.createElement(View20, { style: styles5.inputSection }, /* @__PURE__ */ React20.createElement(
19051
+ /* @__PURE__ */ React20.createElement(Text18, { style: [styles6.severityText, severity === s2.value && { color: s2.color }] }, s2.label)
19052
+ )))), /* @__PURE__ */ React20.createElement(View20, { style: styles6.inputSection }, /* @__PURE__ */ React20.createElement(
18984
19053
  TextInput11,
18985
19054
  {
18986
19055
  value: title,
18987
19056
  onChangeText: setTitle,
18988
19057
  placeholder: "What did you find?",
18989
19058
  placeholderTextColor: colors.textMuted,
18990
- style: styles5.titleInput,
19059
+ style: styles6.titleInput,
18991
19060
  returnKeyType: "next"
18992
19061
  }
18993
- )), /* @__PURE__ */ React20.createElement(View20, { style: styles5.inputSection }, /* @__PURE__ */ React20.createElement(
19062
+ )), /* @__PURE__ */ React20.createElement(View20, { style: styles6.inputSection }, /* @__PURE__ */ React20.createElement(
18994
19063
  TextInput11,
18995
19064
  {
18996
19065
  value: description,
18997
19066
  onChangeText: setDescription,
18998
19067
  placeholder: "Details (optional)",
18999
19068
  placeholderTextColor: colors.textMuted,
19000
- style: styles5.descInput,
19069
+ style: styles6.descInput,
19001
19070
  multiline: true,
19002
19071
  numberOfLines: 3,
19003
19072
  textAlignVertical: "top"
@@ -19005,12 +19074,12 @@ function SessionFindingScreen({ nav }) {
19005
19074
  )), /* @__PURE__ */ React20.createElement(
19006
19075
  TouchableOpacity17,
19007
19076
  {
19008
- style: [styles5.submitBtn, !canSubmit && styles5.submitBtnDisabled],
19077
+ style: [styles6.submitBtn, !canSubmit && styles6.submitBtnDisabled],
19009
19078
  onPress: handleSubmit,
19010
19079
  disabled: !canSubmit,
19011
19080
  activeOpacity: 0.8
19012
19081
  },
19013
- /* @__PURE__ */ React20.createElement(Text18, { style: [styles5.submitBtnText, !canSubmit && styles5.submitBtnTextDisabled] }, isSubmitting ? "Saving..." : "Save Finding")
19082
+ /* @__PURE__ */ React20.createElement(Text18, { style: [styles6.submitBtnText, !canSubmit && styles6.submitBtnTextDisabled] }, isSubmitting ? "Saving..." : "Save Finding")
19014
19083
  ));
19015
19084
  }
19016
19085
  function createStyles15() {
@@ -19122,9 +19191,278 @@ function createStyles15() {
19122
19191
  });
19123
19192
  }
19124
19193
 
19125
- // src/BugBearButton.tsx
19194
+ // src/widget/MiniTestRunner.tsx
19195
+ import React21, { useState as useState18, useEffect as useEffect12, useCallback as useCallback6, useRef as useRef7 } from "react";
19196
+ import { View as View21, Text as Text19, TouchableOpacity as TouchableOpacity18, StyleSheet as StyleSheet21, Animated as Animated3, PanResponder, Dimensions as Dimensions2 } from "react-native";
19126
19197
  var screenWidth = Dimensions2.get("window").width;
19127
19198
  var screenHeight = Dimensions2.get("window").height;
19199
+ var RUNNER_WIDTH = 280;
19200
+ function MiniTestRunner({ assignmentId, onExpand, onComplete, onAdvance, onNavigateToReport }) {
19201
+ const { client, assignments, refreshAssignments } = useBugBear();
19202
+ const assignment = assignments.find((a) => a.id === assignmentId);
19203
+ const [currentStepIndex, setCurrentStepIndex] = useState18(0);
19204
+ const [isSubmitting, setIsSubmitting] = useState18(false);
19205
+ const [elapsedTime, setElapsedTime] = useState18(0);
19206
+ const mountAnim = useRef7(new Animated3.Value(0)).current;
19207
+ useEffect12(() => {
19208
+ Animated3.spring(mountAnim, { toValue: 1, useNativeDriver: true, tension: 80, friction: 10 }).start();
19209
+ }, []);
19210
+ useEffect12(() => {
19211
+ setCurrentStepIndex(0);
19212
+ }, [assignmentId]);
19213
+ const pan = useRef7(new Animated3.ValueXY({
19214
+ x: screenWidth - RUNNER_WIDTH - 16,
19215
+ y: screenHeight - 220
19216
+ })).current;
19217
+ const panResponder = useRef7(
19218
+ PanResponder.create({
19219
+ onStartShouldSetPanResponder: () => true,
19220
+ onMoveShouldSetPanResponder: (_, gs) => Math.abs(gs.dx) > 5 || Math.abs(gs.dy) > 5,
19221
+ onPanResponderGrant: () => {
19222
+ pan.setOffset({
19223
+ x: getAnimatedValue(pan.x),
19224
+ y: getAnimatedValue(pan.y)
19225
+ });
19226
+ pan.setValue({ x: 0, y: 0 });
19227
+ },
19228
+ onPanResponderMove: Animated3.event(
19229
+ [null, { dx: pan.x, dy: pan.y }],
19230
+ { useNativeDriver: false }
19231
+ ),
19232
+ onPanResponderRelease: () => {
19233
+ pan.flattenOffset();
19234
+ const currentX = getAnimatedValue(pan.x);
19235
+ const currentY = getAnimatedValue(pan.y);
19236
+ const snapX = currentX < screenWidth / 2 ? 16 : screenWidth - RUNNER_WIDTH - 16;
19237
+ const snapY = Math.max(80, Math.min(currentY, screenHeight - 200));
19238
+ Animated3.spring(pan, {
19239
+ toValue: { x: snapX, y: snapY },
19240
+ useNativeDriver: false,
19241
+ friction: 7,
19242
+ tension: 40
19243
+ }).start();
19244
+ }
19245
+ })
19246
+ ).current;
19247
+ useEffect12(() => {
19248
+ if (!assignment?.startedAt) return;
19249
+ const startTime = new Date(assignment.startedAt).getTime();
19250
+ setElapsedTime(Math.floor((Date.now() - startTime) / 1e3));
19251
+ const interval = setInterval(() => {
19252
+ setElapsedTime(Math.floor((Date.now() - startTime) / 1e3));
19253
+ }, 1e3);
19254
+ return () => clearInterval(interval);
19255
+ }, [assignment?.startedAt]);
19256
+ const handlePass = useCallback6(async () => {
19257
+ if (!client || !assignment || isSubmitting) return;
19258
+ setIsSubmitting(true);
19259
+ try {
19260
+ const passedId = assignment.id;
19261
+ await client.passAssignment(passedId);
19262
+ client.submitTestFeedback({
19263
+ testCaseId: assignment.testCase.id,
19264
+ assignmentId: passedId,
19265
+ feedback: { rating: 5 }
19266
+ }).catch(() => {
19267
+ });
19268
+ await refreshAssignments();
19269
+ const remaining = assignments.filter(
19270
+ (a) => (a.status === "pending" || a.status === "in_progress") && a.id !== passedId
19271
+ );
19272
+ if (remaining.length > 0) {
19273
+ onAdvance(remaining[0].id);
19274
+ } else {
19275
+ onComplete();
19276
+ }
19277
+ } finally {
19278
+ setIsSubmitting(false);
19279
+ }
19280
+ }, [client, assignment, isSubmitting, refreshAssignments, assignments, onAdvance, onComplete]);
19281
+ const handleFail = useCallback6(async () => {
19282
+ if (!client || !assignment || isSubmitting) return;
19283
+ setIsSubmitting(true);
19284
+ try {
19285
+ await client.failAssignment(assignment.id);
19286
+ await refreshAssignments();
19287
+ onNavigateToReport(assignment.id, assignment.testCase.id);
19288
+ } finally {
19289
+ setIsSubmitting(false);
19290
+ }
19291
+ }, [client, assignment, isSubmitting, refreshAssignments, onNavigateToReport]);
19292
+ if (!assignment) return null;
19293
+ const testCase = assignment.testCase;
19294
+ const steps = testCase.steps;
19295
+ const totalSteps = steps.length;
19296
+ const currentStep = steps[currentStepIndex];
19297
+ return /* @__PURE__ */ React21.createElement(
19298
+ Animated3.View,
19299
+ {
19300
+ style: [
19301
+ styles4.container,
19302
+ { transform: pan.getTranslateTransform() },
19303
+ { opacity: mountAnim, transform: [...pan.getTranslateTransform(), { scale: mountAnim.interpolate({ inputRange: [0, 1], outputRange: [0.8, 1] }) }] }
19304
+ ],
19305
+ ...panResponder.panHandlers
19306
+ },
19307
+ /* @__PURE__ */ React21.createElement(View21, { style: styles4.header }, /* @__PURE__ */ React21.createElement(View21, { style: styles4.headerLeft }, /* @__PURE__ */ React21.createElement(Text19, { style: styles4.stepCounter }, "Step ", currentStepIndex + 1, " of ", totalSteps), elapsedTime > 0 && /* @__PURE__ */ React21.createElement(Text19, { style: styles4.timer }, formatElapsedTime(elapsedTime))), /* @__PURE__ */ React21.createElement(TouchableOpacity18, { onPress: onExpand, style: styles4.expandButton }, /* @__PURE__ */ React21.createElement(Text19, { style: styles4.expandText }, "\u2197 Expand"))),
19308
+ /* @__PURE__ */ React21.createElement(View21, { style: styles4.stepContent }, /* @__PURE__ */ React21.createElement(Text19, { style: styles4.stepAction, numberOfLines: 3 }, currentStep?.action || testCase.title), currentStep?.expectedResult && /* @__PURE__ */ React21.createElement(Text19, { style: styles4.stepExpected, numberOfLines: 1 }, "\u2192 ", currentStep.expectedResult)),
19309
+ totalSteps > 1 && /* @__PURE__ */ React21.createElement(View21, { style: styles4.stepNav }, /* @__PURE__ */ React21.createElement(
19310
+ TouchableOpacity18,
19311
+ {
19312
+ disabled: currentStepIndex === 0,
19313
+ onPress: () => setCurrentStepIndex((i) => i - 1)
19314
+ },
19315
+ /* @__PURE__ */ React21.createElement(Text19, { style: [styles4.stepNavText, currentStepIndex === 0 && styles4.stepNavDisabled] }, "\u25C0 Prev")
19316
+ ), /* @__PURE__ */ React21.createElement(
19317
+ TouchableOpacity18,
19318
+ {
19319
+ disabled: currentStepIndex >= totalSteps - 1,
19320
+ onPress: () => setCurrentStepIndex((i) => i + 1)
19321
+ },
19322
+ /* @__PURE__ */ React21.createElement(Text19, { style: [styles4.stepNavText, currentStepIndex >= totalSteps - 1 && styles4.stepNavDisabled] }, "Next \u25B6")
19323
+ )),
19324
+ /* @__PURE__ */ React21.createElement(View21, { style: styles4.actions }, /* @__PURE__ */ React21.createElement(
19325
+ TouchableOpacity18,
19326
+ {
19327
+ style: [styles4.failBtn, isSubmitting && { opacity: 0.5 }],
19328
+ onPress: handleFail,
19329
+ disabled: isSubmitting
19330
+ },
19331
+ /* @__PURE__ */ React21.createElement(Text19, { style: styles4.failText }, "Fail")
19332
+ ), /* @__PURE__ */ React21.createElement(
19333
+ TouchableOpacity18,
19334
+ {
19335
+ style: [styles4.passBtn, isSubmitting && { opacity: 0.5 }],
19336
+ onPress: handlePass,
19337
+ disabled: isSubmitting
19338
+ },
19339
+ /* @__PURE__ */ React21.createElement(Text19, { style: styles4.passText }, isSubmitting ? "Passing..." : "\u2713 Pass")
19340
+ ))
19341
+ );
19342
+ }
19343
+ var styles4 = StyleSheet21.create({
19344
+ container: {
19345
+ position: "absolute",
19346
+ width: RUNNER_WIDTH,
19347
+ zIndex: 9999,
19348
+ backgroundColor: colors.bg,
19349
+ borderRadius: 12,
19350
+ borderWidth: 1,
19351
+ borderColor: colors.border,
19352
+ shadowColor: "#000",
19353
+ shadowOffset: { width: 0, height: 8 },
19354
+ shadowOpacity: 0.4,
19355
+ shadowRadius: 16,
19356
+ elevation: 20,
19357
+ overflow: "hidden"
19358
+ },
19359
+ header: {
19360
+ backgroundColor: colors.bgDarker,
19361
+ paddingVertical: 6,
19362
+ paddingHorizontal: 12,
19363
+ flexDirection: "row",
19364
+ alignItems: "center",
19365
+ justifyContent: "space-between",
19366
+ borderBottomWidth: 1,
19367
+ borderBottomColor: colors.border
19368
+ },
19369
+ headerLeft: {
19370
+ flexDirection: "row",
19371
+ alignItems: "center",
19372
+ gap: 6
19373
+ },
19374
+ stepCounter: {
19375
+ fontSize: 11,
19376
+ color: colors.textMuted
19377
+ },
19378
+ timer: {
19379
+ fontSize: 10,
19380
+ color: colors.green,
19381
+ fontWeight: "600",
19382
+ fontVariant: ["tabular-nums"]
19383
+ },
19384
+ expandButton: {
19385
+ paddingVertical: 2,
19386
+ paddingHorizontal: 4
19387
+ },
19388
+ expandText: {
19389
+ fontSize: 12,
19390
+ color: colors.blue,
19391
+ fontWeight: "500"
19392
+ },
19393
+ stepContent: {
19394
+ paddingVertical: 8,
19395
+ paddingHorizontal: 12
19396
+ },
19397
+ stepAction: {
19398
+ fontSize: 13,
19399
+ color: colors.textPrimary,
19400
+ lineHeight: 18
19401
+ },
19402
+ stepExpected: {
19403
+ fontSize: 11,
19404
+ color: colors.textMuted,
19405
+ fontStyle: "italic",
19406
+ marginTop: 2
19407
+ },
19408
+ stepNav: {
19409
+ flexDirection: "row",
19410
+ justifyContent: "center",
19411
+ gap: 16,
19412
+ paddingBottom: 6,
19413
+ paddingHorizontal: 12
19414
+ },
19415
+ stepNavText: {
19416
+ fontSize: 12,
19417
+ color: colors.blue,
19418
+ paddingVertical: 2,
19419
+ paddingHorizontal: 6
19420
+ },
19421
+ stepNavDisabled: {
19422
+ color: colors.textDim
19423
+ },
19424
+ actions: {
19425
+ flexDirection: "row",
19426
+ gap: 6,
19427
+ paddingVertical: 6,
19428
+ paddingHorizontal: 10,
19429
+ paddingBottom: 10,
19430
+ borderTopWidth: 1,
19431
+ borderTopColor: colors.border
19432
+ },
19433
+ failBtn: {
19434
+ flex: 1,
19435
+ paddingVertical: 8,
19436
+ borderRadius: 8,
19437
+ backgroundColor: colors.redDark,
19438
+ borderWidth: 1,
19439
+ borderColor: colors.red,
19440
+ alignItems: "center"
19441
+ },
19442
+ failText: {
19443
+ fontSize: 12,
19444
+ fontWeight: "600",
19445
+ color: colors.redLight
19446
+ },
19447
+ passBtn: {
19448
+ flex: 2,
19449
+ paddingVertical: 8,
19450
+ borderRadius: 8,
19451
+ backgroundColor: colors.greenDark,
19452
+ borderWidth: 1,
19453
+ borderColor: colors.green,
19454
+ alignItems: "center"
19455
+ },
19456
+ passText: {
19457
+ fontSize: 12,
19458
+ fontWeight: "600",
19459
+ color: colors.greenLight
19460
+ }
19461
+ });
19462
+
19463
+ // src/BugBearButton.tsx
19464
+ var screenWidth2 = Dimensions3.get("window").width;
19465
+ var screenHeight2 = Dimensions3.get("window").height;
19128
19466
  function BugBearButton({
19129
19467
  position = "bottom-right",
19130
19468
  buttonStyle,
@@ -19136,16 +19474,18 @@ function BugBearButton({
19136
19474
  }) {
19137
19475
  const { shouldShowWidget, testerInfo, isLoading, unreadCount, assignments, widgetMode, widgetColorScheme } = useBugBear();
19138
19476
  const { currentScreen, canGoBack, push, pop, replace, reset } = useNavigation();
19139
- const [panelVisible, setPanelVisible] = useState18(false);
19140
- const panelAnim = useRef6(new Animated2.Value(0)).current;
19141
- const styles5 = useMemo16(() => createStyles16(), [widgetColorScheme]);
19142
- const screenCaptureRef = useRef6(null);
19477
+ const [viewMode, setViewMode] = useState19("closed");
19478
+ const [miniRunnerAssignmentId, setMiniRunnerAssignmentId] = useState19(null);
19479
+ const panelAnim = useRef8(new Animated4.Value(0)).current;
19480
+ const styles6 = useMemo16(() => createStyles16(), [widgetColorScheme]);
19481
+ const panelVisible = viewMode === "panel";
19482
+ const screenCaptureRef = useRef8(null);
19143
19483
  const openPanel = () => {
19144
19484
  captureAppScreen().then((uri) => {
19145
19485
  screenCaptureRef.current = uri;
19146
19486
  });
19147
- setPanelVisible(true);
19148
- Animated2.spring(panelAnim, {
19487
+ setViewMode("panel");
19488
+ Animated4.spring(panelAnim, {
19149
19489
  toValue: 1,
19150
19490
  useNativeDriver: true,
19151
19491
  friction: 8,
@@ -19154,12 +19494,12 @@ function BugBearButton({
19154
19494
  };
19155
19495
  const closePanel = () => {
19156
19496
  Keyboard4.dismiss();
19157
- Animated2.timing(panelAnim, {
19497
+ Animated4.timing(panelAnim, {
19158
19498
  toValue: 0,
19159
19499
  duration: 250,
19160
19500
  useNativeDriver: true
19161
19501
  }).start(() => {
19162
- setPanelVisible(false);
19502
+ setViewMode("closed");
19163
19503
  });
19164
19504
  };
19165
19505
  const getInitialPosition = () => {
@@ -19168,22 +19508,22 @@ function BugBearButton({
19168
19508
  if (initialX !== void 0 && initialY !== void 0) {
19169
19509
  return { x: initialX, y: initialY };
19170
19510
  }
19171
- const x = position === "bottom-right" ? screenWidth - buttonSize - margin : margin;
19172
- const y = screenHeight - 160;
19511
+ const x = position === "bottom-right" ? screenWidth2 - buttonSize - margin : margin;
19512
+ const y = screenHeight2 - 160;
19173
19513
  return { x, y };
19174
19514
  };
19175
19515
  const initialPos = getInitialPosition();
19176
- const pan = useRef6(new Animated2.ValueXY(initialPos)).current;
19177
- const isDragging = useRef6(false);
19178
- const panResponder = useRef6(
19179
- PanResponder.create({
19516
+ const pan = useRef8(new Animated4.ValueXY(initialPos)).current;
19517
+ const isDragging = useRef8(false);
19518
+ const panResponder = useRef8(
19519
+ PanResponder2.create({
19180
19520
  onStartShouldSetPanResponder: () => draggable,
19181
19521
  onMoveShouldSetPanResponder: (_, gs) => draggable && (Math.abs(gs.dx) > 5 || Math.abs(gs.dy) > 5),
19182
19522
  onPanResponderGrant: () => {
19183
19523
  isDragging.current = false;
19184
19524
  pan.setOffset({
19185
- x: pan.x._value,
19186
- y: pan.y._value
19525
+ x: getAnimatedValue(pan.x),
19526
+ y: getAnimatedValue(pan.y)
19187
19527
  });
19188
19528
  pan.setValue({ x: 0, y: 0 });
19189
19529
  },
@@ -19191,20 +19531,20 @@ function BugBearButton({
19191
19531
  if (Math.abs(gs.dx) > 5 || Math.abs(gs.dy) > 5) {
19192
19532
  isDragging.current = true;
19193
19533
  }
19194
- Animated2.event(
19534
+ Animated4.event(
19195
19535
  [null, { dx: pan.x, dy: pan.y }],
19196
19536
  { useNativeDriver: false }
19197
19537
  )(_, gs);
19198
19538
  },
19199
19539
  onPanResponderRelease: (_, gs) => {
19200
19540
  pan.flattenOffset();
19201
- const currentX = pan.x._value;
19202
- const currentY = pan.y._value;
19541
+ const currentX = getAnimatedValue(pan.x);
19542
+ const currentY = getAnimatedValue(pan.y);
19203
19543
  const buttonSize = 56;
19204
19544
  const margin = 16;
19205
- const snapX = currentX < screenWidth / 2 ? margin : screenWidth - buttonSize - margin;
19206
- const snapY = Math.max(minY, Math.min(currentY, screenHeight - maxYOffset));
19207
- Animated2.spring(pan, {
19545
+ const snapX = currentX < screenWidth2 / 2 ? margin : screenWidth2 - buttonSize - margin;
19546
+ const snapY = Math.max(minY, Math.min(currentY, screenHeight2 - maxYOffset));
19547
+ Animated4.spring(pan, {
19208
19548
  toValue: { x: snapX, y: snapY },
19209
19549
  useNativeDriver: false,
19210
19550
  friction: 7,
@@ -19219,7 +19559,7 @@ function BugBearButton({
19219
19559
  ).current;
19220
19560
  const pendingTests = widgetMode === "qa" ? assignments.filter((a) => a.status === "pending" || a.status === "in_progress").length : 0;
19221
19561
  const badgeCount = pendingTests + unreadCount;
19222
- useEffect12(() => {
19562
+ useEffect13(() => {
19223
19563
  if (!panelVisible || Platform5.OS !== "android") return;
19224
19564
  const handler = BackHandler.addEventListener("hardwareBackPress", () => {
19225
19565
  if (canGoBack) {
@@ -19232,6 +19572,51 @@ function BugBearButton({
19232
19572
  });
19233
19573
  return () => handler.remove();
19234
19574
  }, [panelVisible, canGoBack]);
19575
+ const startMiniRunner = useCallback7((assignId) => {
19576
+ Keyboard4.dismiss();
19577
+ Animated4.timing(panelAnim, {
19578
+ toValue: 0,
19579
+ duration: 200,
19580
+ useNativeDriver: true
19581
+ }).start(() => {
19582
+ setMiniRunnerAssignmentId(assignId);
19583
+ setViewMode("mini-runner");
19584
+ });
19585
+ }, [panelAnim]);
19586
+ const expandFromMiniRunner = useCallback7(() => {
19587
+ setViewMode("panel");
19588
+ if (miniRunnerAssignmentId) {
19589
+ replace({ name: "TEST_DETAIL", testId: miniRunnerAssignmentId });
19590
+ }
19591
+ setMiniRunnerAssignmentId(null);
19592
+ Animated4.spring(panelAnim, {
19593
+ toValue: 1,
19594
+ useNativeDriver: true,
19595
+ friction: 8,
19596
+ tension: 65
19597
+ }).start();
19598
+ }, [miniRunnerAssignmentId, replace, panelAnim]);
19599
+ const handleMiniRunnerAdvance = useCallback7((nextId) => {
19600
+ setMiniRunnerAssignmentId(nextId);
19601
+ }, []);
19602
+ const handleMiniRunnerComplete = useCallback7(() => {
19603
+ setMiniRunnerAssignmentId(null);
19604
+ setViewMode("closed");
19605
+ }, []);
19606
+ const handleMiniRunnerReport = useCallback7((assignId, testCaseId) => {
19607
+ setMiniRunnerAssignmentId(null);
19608
+ setViewMode("panel");
19609
+ replace({
19610
+ name: "REPORT",
19611
+ prefill: { type: "test_fail", assignmentId: assignId, testCaseId }
19612
+ });
19613
+ Animated4.spring(panelAnim, {
19614
+ toValue: 1,
19615
+ useNativeDriver: true,
19616
+ friction: 8,
19617
+ tension: 65
19618
+ }).start();
19619
+ }, [replace, panelAnim]);
19235
19620
  if (!shouldShowWidget) return null;
19236
19621
  const getHeaderTitle = () => {
19237
19622
  switch (currentScreen.name) {
@@ -19290,24 +19675,25 @@ function BugBearButton({
19290
19675
  reset();
19291
19676
  },
19292
19677
  canGoBack,
19293
- closeWidget: handleClose
19678
+ closeWidget: handleClose,
19679
+ startMiniRunner
19294
19680
  };
19295
19681
  const QA_ONLY_SCREENS = ["TEST_DETAIL", "TEST_LIST", "TEST_FEEDBACK", "SESSION_START", "SESSION_ACTIVE", "SESSION_FINDING"];
19296
19682
  const renderScreen = () => {
19297
19683
  if (widgetMode === "feedback" && QA_ONLY_SCREENS.includes(currentScreen.name)) {
19298
- return /* @__PURE__ */ React21.createElement(HomeScreen, { nav });
19684
+ return /* @__PURE__ */ React22.createElement(HomeScreen, { nav });
19299
19685
  }
19300
19686
  switch (currentScreen.name) {
19301
19687
  case "HOME":
19302
- return /* @__PURE__ */ React21.createElement(HomeScreen, { nav });
19688
+ return /* @__PURE__ */ React22.createElement(HomeScreen, { nav });
19303
19689
  case "TEST_DETAIL":
19304
- return /* @__PURE__ */ React21.createElement(TestDetailScreen, { testId: currentScreen.testId, nav });
19690
+ return /* @__PURE__ */ React22.createElement(TestDetailScreen, { testId: currentScreen.testId, nav });
19305
19691
  case "TEST_LIST":
19306
- return /* @__PURE__ */ React21.createElement(TestListScreen, { nav });
19692
+ return /* @__PURE__ */ React22.createElement(TestListScreen, { nav });
19307
19693
  case "TEST_FEEDBACK":
19308
- return /* @__PURE__ */ React21.createElement(TestFeedbackScreen, { status: currentScreen.status, assignmentId: currentScreen.assignmentId, nav });
19694
+ return /* @__PURE__ */ React22.createElement(TestFeedbackScreen, { status: currentScreen.status, assignmentId: currentScreen.assignmentId, nav });
19309
19695
  case "REPORT":
19310
- return /* @__PURE__ */ React21.createElement(
19696
+ return /* @__PURE__ */ React22.createElement(
19311
19697
  ReportScreen,
19312
19698
  {
19313
19699
  nav,
@@ -19319,84 +19705,93 @@ function BugBearButton({
19319
19705
  }
19320
19706
  );
19321
19707
  case "REPORT_SUCCESS":
19322
- return /* @__PURE__ */ React21.createElement(ReportSuccessScreen, { nav });
19708
+ return /* @__PURE__ */ React22.createElement(ReportSuccessScreen, { nav });
19323
19709
  case "MESSAGE_LIST":
19324
- return /* @__PURE__ */ React21.createElement(MessageListScreen, { nav });
19710
+ return /* @__PURE__ */ React22.createElement(MessageListScreen, { nav });
19325
19711
  case "THREAD_DETAIL":
19326
- return /* @__PURE__ */ React21.createElement(ThreadDetailScreen, { thread: currentScreen.thread, nav });
19712
+ return /* @__PURE__ */ React22.createElement(ThreadDetailScreen, { thread: currentScreen.thread, nav });
19327
19713
  case "COMPOSE_MESSAGE":
19328
- return /* @__PURE__ */ React21.createElement(ComposeMessageScreen, { nav });
19714
+ return /* @__PURE__ */ React22.createElement(ComposeMessageScreen, { nav });
19329
19715
  case "ISSUE_LIST":
19330
- return /* @__PURE__ */ React21.createElement(IssueListScreen, { nav, category: currentScreen.category });
19716
+ return /* @__PURE__ */ React22.createElement(IssueListScreen, { nav, category: currentScreen.category });
19331
19717
  case "ISSUE_DETAIL":
19332
- return /* @__PURE__ */ React21.createElement(IssueDetailScreen, { nav, issue: currentScreen.issue });
19718
+ return /* @__PURE__ */ React22.createElement(IssueDetailScreen, { nav, issue: currentScreen.issue });
19333
19719
  case "PROFILE":
19334
- return /* @__PURE__ */ React21.createElement(ProfileScreen, { nav });
19720
+ return /* @__PURE__ */ React22.createElement(ProfileScreen, { nav });
19335
19721
  case "SESSION_START":
19336
- return /* @__PURE__ */ React21.createElement(SessionStartScreen, { nav });
19722
+ return /* @__PURE__ */ React22.createElement(SessionStartScreen, { nav });
19337
19723
  case "SESSION_ACTIVE":
19338
- return /* @__PURE__ */ React21.createElement(SessionActiveScreen, { nav });
19724
+ return /* @__PURE__ */ React22.createElement(SessionActiveScreen, { nav });
19339
19725
  case "SESSION_FINDING":
19340
- return /* @__PURE__ */ React21.createElement(SessionFindingScreen, { nav });
19726
+ return /* @__PURE__ */ React22.createElement(SessionFindingScreen, { nav });
19341
19727
  default:
19342
- return /* @__PURE__ */ React21.createElement(HomeScreen, { nav });
19728
+ return /* @__PURE__ */ React22.createElement(HomeScreen, { nav });
19343
19729
  }
19344
19730
  };
19345
- return /* @__PURE__ */ React21.createElement(React21.Fragment, null, !panelVisible && /* @__PURE__ */ React21.createElement(
19346
- Animated2.View,
19731
+ return /* @__PURE__ */ React22.createElement(React22.Fragment, null, viewMode === "mini-runner" && miniRunnerAssignmentId && /* @__PURE__ */ React22.createElement(
19732
+ MiniTestRunner,
19347
19733
  {
19348
- style: [styles5.fabContainer, { transform: pan.getTranslateTransform() }, buttonStyle],
19734
+ assignmentId: miniRunnerAssignmentId,
19735
+ onExpand: expandFromMiniRunner,
19736
+ onAdvance: handleMiniRunnerAdvance,
19737
+ onComplete: handleMiniRunnerComplete,
19738
+ onNavigateToReport: handleMiniRunnerReport
19739
+ }
19740
+ ), viewMode === "closed" && /* @__PURE__ */ React22.createElement(
19741
+ Animated4.View,
19742
+ {
19743
+ style: [styles6.fabContainer, { transform: pan.getTranslateTransform() }, buttonStyle],
19349
19744
  ...panResponder.panHandlers
19350
19745
  },
19351
- /* @__PURE__ */ React21.createElement(
19352
- TouchableOpacity18,
19746
+ /* @__PURE__ */ React22.createElement(
19747
+ TouchableOpacity19,
19353
19748
  {
19354
- style: styles5.fab,
19749
+ style: styles6.fab,
19355
19750
  onPress: openPanel,
19356
19751
  activeOpacity: draggable ? 1 : 0.7
19357
19752
  },
19358
- /* @__PURE__ */ React21.createElement(Image4, { source: { uri: BUGBEAR_LOGO_BASE64 }, style: styles5.fabIcon }),
19359
- badgeCount > 0 && /* @__PURE__ */ React21.createElement(View21, { style: styles5.badge }, /* @__PURE__ */ React21.createElement(Text19, { style: styles5.badgeText }, badgeCount > 9 ? "9+" : badgeCount))
19753
+ /* @__PURE__ */ React22.createElement(Image4, { source: { uri: BUGBEAR_LOGO_BASE64 }, style: styles6.fabIcon }),
19754
+ badgeCount > 0 && /* @__PURE__ */ React22.createElement(View22, { style: styles6.badge }, /* @__PURE__ */ React22.createElement(Text20, { style: styles6.badgeText }, badgeCount > 9 ? "9+" : badgeCount))
19360
19755
  )
19361
- ), panelVisible && /* @__PURE__ */ React21.createElement(View21, { style: styles5.panelWrapper, pointerEvents: "box-none" }, /* @__PURE__ */ React21.createElement(
19756
+ ), viewMode === "panel" && /* @__PURE__ */ React22.createElement(View22, { style: styles6.panelWrapper, pointerEvents: "box-none" }, /* @__PURE__ */ React22.createElement(
19362
19757
  KeyboardAvoidingView,
19363
19758
  {
19364
19759
  behavior: Platform5.OS === "ios" ? "padding" : "height",
19365
- style: styles5.panelKeyboardAvoid,
19760
+ style: styles6.panelKeyboardAvoid,
19366
19761
  pointerEvents: "box-none"
19367
19762
  },
19368
- /* @__PURE__ */ React21.createElement(
19369
- Animated2.View,
19763
+ /* @__PURE__ */ React22.createElement(
19764
+ Animated4.View,
19370
19765
  {
19371
19766
  style: [
19372
- styles5.panelContainer,
19767
+ styles6.panelContainer,
19373
19768
  {
19374
19769
  transform: [{
19375
19770
  translateY: panelAnim.interpolate({
19376
19771
  inputRange: [0, 1],
19377
- outputRange: [screenHeight, 0]
19772
+ outputRange: [screenHeight2, 0]
19378
19773
  })
19379
19774
  }]
19380
19775
  }
19381
19776
  ]
19382
19777
  },
19383
- /* @__PURE__ */ React21.createElement(View21, { style: styles5.panelHandle }, /* @__PURE__ */ React21.createElement(View21, { style: styles5.panelHandleBar })),
19384
- /* @__PURE__ */ React21.createElement(View21, { style: styles5.header }, /* @__PURE__ */ React21.createElement(View21, { style: styles5.headerLeft }, canGoBack ? /* @__PURE__ */ React21.createElement(TouchableOpacity18, { onPress: () => nav.pop(), style: styles5.backButton }, /* @__PURE__ */ React21.createElement(Text19, { style: styles5.backText }, "\u2190 Back")) : /* @__PURE__ */ React21.createElement(View21, { style: styles5.headerTitleRow }, /* @__PURE__ */ React21.createElement(Text19, { style: styles5.headerTitle }, "BugBear"), testerInfo && /* @__PURE__ */ React21.createElement(TouchableOpacity18, { onPress: () => push({ name: "PROFILE" }) }, /* @__PURE__ */ React21.createElement(Text19, { style: styles5.headerName }, testerInfo.name, " \u270E")))), getHeaderTitle() ? /* @__PURE__ */ React21.createElement(Text19, { style: styles5.headerScreenTitle, numberOfLines: 1 }, getHeaderTitle()) : null, /* @__PURE__ */ React21.createElement(View21, { style: styles5.headerActions }, currentScreen.name !== "HOME" && /* @__PURE__ */ React21.createElement(TouchableOpacity18, { onPress: () => nav.reset(), style: styles5.homeButton }, /* @__PURE__ */ React21.createElement(Text19, { style: styles5.homeIcon }, "\u2302")), /* @__PURE__ */ React21.createElement(TouchableOpacity18, { onPress: handleClose, style: styles5.closeButton }, /* @__PURE__ */ React21.createElement(Text19, { style: styles5.closeText }, "\u2715")))),
19385
- /* @__PURE__ */ React21.createElement(
19778
+ /* @__PURE__ */ React22.createElement(View22, { style: styles6.panelHandle }, /* @__PURE__ */ React22.createElement(View22, { style: styles6.panelHandleBar })),
19779
+ /* @__PURE__ */ React22.createElement(View22, { style: styles6.header }, /* @__PURE__ */ React22.createElement(View22, { style: styles6.headerLeft }, canGoBack ? /* @__PURE__ */ React22.createElement(TouchableOpacity19, { onPress: () => nav.pop(), style: styles6.backButton }, /* @__PURE__ */ React22.createElement(Text20, { style: styles6.backText }, "\u2190 Back")) : /* @__PURE__ */ React22.createElement(View22, { style: styles6.headerTitleRow }, /* @__PURE__ */ React22.createElement(Text20, { style: styles6.headerTitle }, "BugBear"), testerInfo && /* @__PURE__ */ React22.createElement(TouchableOpacity19, { onPress: () => push({ name: "PROFILE" }) }, /* @__PURE__ */ React22.createElement(Text20, { style: styles6.headerName }, testerInfo.name, " \u270E")))), getHeaderTitle() ? /* @__PURE__ */ React22.createElement(Text20, { style: styles6.headerScreenTitle, numberOfLines: 1 }, getHeaderTitle()) : null, /* @__PURE__ */ React22.createElement(View22, { style: styles6.headerActions }, currentScreen.name !== "HOME" && /* @__PURE__ */ React22.createElement(TouchableOpacity19, { onPress: () => nav.reset(), style: styles6.homeButton }, /* @__PURE__ */ React22.createElement(Text20, { style: styles6.homeIcon }, "\u2302")), /* @__PURE__ */ React22.createElement(TouchableOpacity19, { onPress: handleClose, style: styles6.closeButton }, /* @__PURE__ */ React22.createElement(Text20, { style: styles6.closeText }, "\u2715")))),
19780
+ /* @__PURE__ */ React22.createElement(
19386
19781
  ScrollView4,
19387
19782
  {
19388
- style: styles5.content,
19389
- contentContainerStyle: styles5.contentContainer,
19783
+ style: styles6.content,
19784
+ contentContainerStyle: styles6.contentContainer,
19390
19785
  keyboardShouldPersistTaps: "handled",
19391
19786
  showsVerticalScrollIndicator: false
19392
19787
  },
19393
- isLoading ? /* @__PURE__ */ React21.createElement(View21, { style: styles5.loadingContainer }, /* @__PURE__ */ React21.createElement(ActivityIndicator3, { size: "large", color: colors.blue }), /* @__PURE__ */ React21.createElement(Text19, { style: styles5.loadingText }, "Loading...")) : renderScreen()
19788
+ isLoading ? /* @__PURE__ */ React22.createElement(View22, { style: styles6.loadingContainer }, /* @__PURE__ */ React22.createElement(ActivityIndicator3, { size: "large", color: colors.blue }), /* @__PURE__ */ React22.createElement(Text20, { style: styles6.loadingText }, "Loading...")) : renderScreen()
19394
19789
  )
19395
19790
  )
19396
19791
  )));
19397
19792
  }
19398
19793
  function createStyles16() {
19399
- return StyleSheet21.create({
19794
+ return StyleSheet22.create({
19400
19795
  // FAB
19401
19796
  fabContainer: {
19402
19797
  position: "absolute",
@@ -19571,8 +19966,8 @@ function createStyles16() {
19571
19966
  }
19572
19967
 
19573
19968
  // src/BugBearErrorBoundary.tsx
19574
- import React22, { Component } from "react";
19575
- import { View as View22, Text as Text20, TouchableOpacity as TouchableOpacity19, StyleSheet as StyleSheet22 } from "react-native";
19969
+ import React23, { Component } from "react";
19970
+ import { View as View23, Text as Text21, TouchableOpacity as TouchableOpacity20, StyleSheet as StyleSheet23 } from "react-native";
19576
19971
  var BugBearErrorBoundary = class extends Component {
19577
19972
  constructor(props) {
19578
19973
  super(props);
@@ -19617,7 +20012,7 @@ var BugBearErrorBoundary = class extends Component {
19617
20012
  if (fallback) {
19618
20013
  return fallback;
19619
20014
  }
19620
- return /* @__PURE__ */ React22.createElement(View22, { style: styles4.container }, /* @__PURE__ */ React22.createElement(Text20, { style: styles4.title }, "Something went wrong"), /* @__PURE__ */ React22.createElement(Text20, { style: styles4.message }, error.message), /* @__PURE__ */ React22.createElement(TouchableOpacity19, { style: styles4.button, onPress: this.reset }, /* @__PURE__ */ React22.createElement(Text20, { style: styles4.buttonText }, "Try Again")), /* @__PURE__ */ React22.createElement(Text20, { style: styles4.caption }, "The error has been captured by BugBear"));
20015
+ return /* @__PURE__ */ React23.createElement(View23, { style: styles5.container }, /* @__PURE__ */ React23.createElement(Text21, { style: styles5.title }, "Something went wrong"), /* @__PURE__ */ React23.createElement(Text21, { style: styles5.message }, error.message), /* @__PURE__ */ React23.createElement(TouchableOpacity20, { style: styles5.button, onPress: this.reset }, /* @__PURE__ */ React23.createElement(Text21, { style: styles5.buttonText }, "Try Again")), /* @__PURE__ */ React23.createElement(Text21, { style: styles5.caption }, "The error has been captured by BugBear"));
19621
20016
  }
19622
20017
  return children;
19623
20018
  }
@@ -19628,7 +20023,7 @@ function useErrorContext() {
19628
20023
  getEnhancedContext: () => contextCapture.getEnhancedContext()
19629
20024
  };
19630
20025
  }
19631
- var styles4 = StyleSheet22.create({
20026
+ var styles5 = StyleSheet23.create({
19632
20027
  container: {
19633
20028
  padding: 20,
19634
20029
  margin: 20,