@bbearai/react-native 0.5.4 → 0.5.6

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 +429 -203
  2. package/dist/index.mjs +409 -183
  3. package/package.json +1 -1
package/dist/index.js CHANGED
@@ -11394,6 +11394,7 @@ function shouldShowDeprecationWarning() {
11394
11394
  if (shouldShowDeprecationWarning()) console.warn("\u26A0\uFE0F Node.js 18 and below are deprecated and will no longer be supported in future versions of @supabase/supabase-js. Please upgrade to Node.js 20 or later. For more information, visit: https://github.com/orgs/supabase/discussions/37217");
11395
11395
 
11396
11396
  // ../core/dist/index.mjs
11397
+ var BUG_CATEGORIES = ["ui_ux", "functional", "crash", "security", "other"];
11397
11398
  var MAX_CONSOLE_LOGS = 50;
11398
11399
  var MAX_NETWORK_REQUESTS = 20;
11399
11400
  var MAX_NAVIGATION_HISTORY = 20;
@@ -11746,6 +11747,8 @@ var BugBearClient = class {
11746
11747
  title: report.title || this.generateTitle(report),
11747
11748
  description: report.description,
11748
11749
  severity: report.severity,
11750
+ category: report.category,
11751
+ // Bug category (ui, performance, crash, etc.)
11749
11752
  failed_at_step: report.failedAtStep,
11750
11753
  voice_audio_url: report.voiceAudioUrl,
11751
11754
  voice_transcript: report.voiceTranscript,
@@ -12334,6 +12337,9 @@ var BugBearClient = class {
12334
12337
  if (report.severity && !validSeverities.includes(report.severity)) {
12335
12338
  return `Invalid severity: ${report.severity}. Must be one of: ${validSeverities.join(", ")}`;
12336
12339
  }
12340
+ if (report.category && !BUG_CATEGORIES.includes(report.category)) {
12341
+ return `Invalid category: ${report.category}. Must be one of: ${BUG_CATEGORIES.join(", ")}`;
12342
+ }
12337
12343
  if (report.title && report.title.length > 500) {
12338
12344
  return "Title must be 500 characters or less";
12339
12345
  }
@@ -12406,6 +12412,10 @@ var BugBearClient = class {
12406
12412
  });
12407
12413
  if (error) {
12408
12414
  console.warn("BugBear: Rate limit check failed, allowing request", error.message);
12415
+ this.config.onError?.(new Error(`Rate limit check failed: ${error.message}`), {
12416
+ projectId: this.config.projectId,
12417
+ context: "rate_limit_check_failed_open"
12418
+ });
12409
12419
  return { allowed: true };
12410
12420
  }
12411
12421
  if (!data.allowed) {
@@ -12422,7 +12432,12 @@ var BugBearClient = class {
12422
12432
  resetAt: data.reset_at
12423
12433
  };
12424
12434
  } catch (err) {
12435
+ const message = err instanceof Error ? err.message : "Unknown rate limit error";
12425
12436
  console.warn("BugBear: Rate limit check error", err);
12437
+ this.config.onError?.(err instanceof Error ? err : new Error(message), {
12438
+ projectId: this.config.projectId,
12439
+ context: "rate_limit_check_failed_open"
12440
+ });
12426
12441
  return { allowed: true };
12427
12442
  }
12428
12443
  }
@@ -12486,6 +12501,9 @@ var BugBearClient = class {
12486
12501
  }
12487
12502
  return data ?? true;
12488
12503
  } catch (err) {
12504
+ const message = err instanceof Error ? err.message : "Unknown error checking QA status";
12505
+ console.error("BugBear: Error checking QA status", err);
12506
+ this.config.onError?.(err instanceof Error ? err : new Error(message), { projectId: this.config.projectId });
12489
12507
  return true;
12490
12508
  }
12491
12509
  }
@@ -12514,13 +12532,24 @@ var BugBearClient = class {
12514
12532
  upsert: false
12515
12533
  });
12516
12534
  if (error) {
12517
- console.error("BugBear: Failed to upload screenshot", formatPgError(error));
12535
+ const formattedError = formatPgError(error);
12536
+ const errorMessage = formattedError.message || "Failed to upload screenshot";
12537
+ console.error("BugBear: Failed to upload screenshot", formattedError);
12538
+ this.config.onError?.(new Error(errorMessage), {
12539
+ projectId: this.config.projectId,
12540
+ context: "screenshot_upload_failed"
12541
+ });
12518
12542
  return null;
12519
12543
  }
12520
12544
  const { data: { publicUrl } } = this.supabase.storage.from(bucket).getPublicUrl(path);
12521
12545
  return publicUrl;
12522
12546
  } catch (err) {
12547
+ const message = err instanceof Error ? err.message : "Unknown error uploading screenshot";
12523
12548
  console.error("BugBear: Error uploading screenshot", err);
12549
+ this.config.onError?.(err instanceof Error ? err : new Error(message), {
12550
+ projectId: this.config.projectId,
12551
+ context: "screenshot_upload_failed"
12552
+ });
12524
12553
  return null;
12525
12554
  }
12526
12555
  }
@@ -12545,13 +12574,24 @@ var BugBearClient = class {
12545
12574
  upsert: false
12546
12575
  });
12547
12576
  if (error) {
12548
- console.error("BugBear: Failed to upload image from URI", formatPgError(error));
12577
+ const formattedError = formatPgError(error);
12578
+ const errorMessage = formattedError.message || "Failed to upload image";
12579
+ console.error("BugBear: Failed to upload image from URI", formattedError);
12580
+ this.config.onError?.(new Error(errorMessage), {
12581
+ projectId: this.config.projectId,
12582
+ context: "image_upload_failed"
12583
+ });
12549
12584
  return null;
12550
12585
  }
12551
12586
  const { data: { publicUrl } } = this.supabase.storage.from(bucket).getPublicUrl(path);
12552
12587
  return publicUrl;
12553
12588
  } catch (err) {
12589
+ const message = err instanceof Error ? err.message : "Unknown error uploading image";
12554
12590
  console.error("BugBear: Error uploading image from URI", err);
12591
+ this.config.onError?.(err instanceof Error ? err : new Error(message), {
12592
+ projectId: this.config.projectId,
12593
+ context: "image_upload_failed"
12594
+ });
12555
12595
  return null;
12556
12596
  }
12557
12597
  }
@@ -13361,8 +13401,8 @@ function BugBearProvider({ config, children, appVersion, enabled = true }) {
13361
13401
  }
13362
13402
 
13363
13403
  // src/BugBearButton.tsx
13364
- var import_react18 = __toESM(require("react"));
13365
- var import_react_native17 = require("react-native");
13404
+ var import_react19 = __toESM(require("react"));
13405
+ var import_react_native18 = require("react-native");
13366
13406
 
13367
13407
  // src/widget/logo.ts
13368
13408
  var BUGBEAR_LOGO_BASE64 = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGAAAABgCAYAAADimHc4AAAAAXNSR0IArs4c6QAAAJhlWElmTU0AKgAAAAgABAEaAAUAAAABAAAAPgEbAAUAAAABAAAARgEoAAMAAAABAAIAAIdpAAQAAAABAAAATgAAAAAAAABIAAAAAQAAAEgAAAABAASQBAACAAAAFAAAAISgAQADAAAAAQABAACgAgAEAAAAAQAAAGCgAwAEAAAAAQAAAGAAAAAAMjAyNjowMToyNCAxNjoyMTozOABbbVCuAAAACXBIWXMAAAsTAAALEwEAmpwYAAACo2lUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iWE1QIENvcmUgNi4wLjAiPgogICA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPgogICAgICA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIgogICAgICAgICAgICB4bWxuczpJcHRjNHhtcEV4dD0iaHR0cDovL2lwdGMub3JnL3N0ZC9JcHRjNHhtcEV4dC8yMDA4LTAyLTI5LyIKICAgICAgICAgICAgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIj4KICAgICAgICAgPElwdGM0eG1wRXh0OkRpZ2l0YWxTb3VyY2VUeXBlPmh0dHA6Ly9jdi5pcHRjLm9yZy9uZXdzY29kZXMvZGlnaXRhbHNvdXJjZXR5cGUvdHJhaW5lZEFsZ29yaXRobWljTWVkaWE8L0lwdGM0eG1wRXh0OkRpZ2l0YWxTb3VyY2VUeXBlPgogICAgICAgICA8SXB0YzR4bXBFeHQ6RGlnSW1hZ2VHVUlEPmZjNzJlN2Q2LTYyYTEtNDE1ZS04MjY5LWM2NjA4MjY0OWRiMDwvSXB0YzR4bXBFeHQ6RGlnSW1hZ2VHVUlEPgogICAgICAgICA8eG1wOkNyZWF0ZURhdGU+MjAyNi0wMS0yNFQxNjoyMTozODwveG1wOkNyZWF0ZURhdGU+CiAgICAgIDwvcmRmOkRlc2NyaXB0aW9uPgogICA8L3JkZjpSREY+CjwveDp4bXBtZXRhPgri4oBIAAAq4ElEQVR4Ae19B3gd1bXuPzOnnyPpqFfLstxkuQM22MZgmsGAacFAILQb4F4ghRJqCp0ESEIgkAAJCRACOBhw6MTEFhgwxrhhIxdZltWt3s7R6bPfv+ZIhst79/ueLTlw82nj0Wkze/Zea+1V/rX2AIy0EQqMUGCEAiMUGKHACAVGKDBCgREKjFBghAIjFBihwAgFRigwQoERCoxQYIQCIxT4BlJAKWgLFiyw5ebmetPT09PkyMjISC0pKXHdfvvtugK0b+Cw/8chfaMHK8RM8fmy4/H4lLhSM8x4fIIJjIOpcqHg5azsPGQO/BphHkFoWqNuaLsMw9hh0/WNDodjR09PTxd/+0a2byQDnCnOiWbUXBSPm4tUQs0AVM4g9dxODaluwMNXF8mvawoJkj8SA/ojQG9IIRQdPNt6bdQM41Ob3fa6z+3+R2dnZ72m8aJvSPvGMKCgoMDT3t5+asxMXKzi5tGkj9dmABPyNcwao2H2GGDKKIXiLCDdo8Fpo/jzIHNAtWQxIRzX0BkE6tqBrQ3AJ7uBdbsVdu4lkxJyrtZtGPq7Npfx5JxZc96tqKiIy7dfZ/vaGSC6nFJ5QSyR+B5Vy1QhxqElGs48TMMplP2powCDmr29B6huA3a1aqjtANp6NQTCJuKUfruRXBXZaQqjMjWM43oZm62QmQbE4zq21AGvbwJeWqewuVa0FVlhM9a67PaHysvLl61fv57r5+tpXysDDIfjrEQs/jOK8HSHXcPpM3VceazCgkkmopTYD6t0vLNFw+odJnY2K3QE/v81R1aKhokFOo6aqOHk6cCc8bzWVHj3c+CxVTre2GQiFqdFt+mrPV7XnYHuwD+/SarpoIqDy+UqpV5+kTdRMumzDjPU+jt0pZ7T1M5f6uqWxYaakG85NELxgYOf7Q4Fj08hNUNp/iyl8VVP8Sff+ynyfA+3V8HG82Dp+eS1vMfkUbq641u62vMb3ucFQ318u00tnmkMnKcn7E774zk5ObkHdeL/j87/5SuAXsnZ0Xj8IZhmwZQiHb84h6pmlsLWGuCBN3W89KmJIFWL1QwqebcXmtsHuGh5bQ4gFoEK9AIhKnuTmsM0oeWXQLnoFClex88w49BE6UfFKndChfv3Td3v1XHuHB3Xn2hifCGw/BMdt/xNYXuTCd1m7Ezxeq+m1/Tuvgv+jd4Yus12JyUzIVJ/9fE2FXhCV52/19U1i2zK6xSJT0q75vYoLbtQYfREhTHlCmMnK23MJKWlU8oHzsnwu6g/KOVycCUgI9e6RisYo7SSiUorLOVqSd13/n9bEewj1a2pm7jSev+gqZ4/6Oq/jrPxXOlPDzndzh8qpf7lwnnweF1U5NYN/RmZYKZPV3+9yrDUzfJrbGpsrqiBATUj6iOvOEl0IXhWHpkwwTo0D3/jeWXjstRLjy5Ux88t+OI6fi9M1XX2w1fN4eRvuvI4DfUfS8rU334zX334l6PUO0/MUffdMF0dOTufvydV1KQiXb19E8ez1FB//k+bSvcmVZ/T6XxIAr6DR5R/Vc/0cjRDe0WINz7PUOvu0lXiL5r60ck2EmxA6u1OpeUUkfCTrEMrLVcaJVqu0VxuHh7r/eITxqnWisVq92OjVGaaU1149hT1zAML1BoS9/n7pqtZ5SnWeXLdZBJ2zR+mKrXmcKXeyFPqlVSllqcptaJIxT84VL308Bw1tiTdOp9elPrpWSIUvOYOQ43JSdoGh8vxzKJFi5wHk1QHdZmNGzfOWVNT81wikThrVqmBF78PpNKGXvx7Ha9tsBxzhrppUOn0G20UNtHnGoeUiEM17aEP+YV3uPDIYrx0x1h469fQx1foHXci5k0MALXb8btXu3Hv8ggaO5N9FmXqqPiZHSW5bnQ19cBF04GEAlcIxKxo9Lgc2emoUaU4/64mfLy+yaLxkiMM/OlyE02ddIMf0lDZYMLhsj8994i5lx2smOGgMUBwmTvvuutx0zQv06gZhAGZVMlVnOuulqSRpQcDMyufFCFlTCEeBVLe08gaHY1YNCsVr6/tRVlJGlbePwZZ3VsRi8ZhS/XBkZGCxk3NuGmZDSvqXcjP8yIcU6hv7EOuN4ynLzMw3m6iizzqYiDWTTvcm9CQR6GfUMJgjgssbtrRnjUd86+rQiMZJe2oSTqW/YAM7tdw6i81bG824XQ7Hgz3h68XNWedNIx/DhoDbDbbrfFE4h4rTB0YsM1uh/j7URKRMAO/5e1dHmjpWV94McKA1iYUp4Tx5nXpuOQ3rbjuuyU4p6QBkTC9Gl1Lwg9KR3V7DvZ683HoWB3pqXa6+Rp2ksF3P9uE5f+sx5WzNSzKNrGqQcPT28mMiAYfbe25ZRquPhY0L0BHLAV3vuvGE8tbOByOh2H13AkGXrueK6FLx8L7FJq7FHw+79WBQOB3w0h7q6uDwgC6mudEo9FneQd7yahUfOe0Uhw/JwfFeS5GrSY6emJYu7kNS1+twsr1fcmBpGUkVZHIWGMdjiwz8colOvbUxeDPtSHDEYKbwZUykwwQHMKeXwyjdy86a4NoIf3e3g68ulNHVbcNjR1UX5zdfLq6H9PFPDY/A4sK/WiPxPFsdSt+cFgYly7S8Wa1gWtfSKC1JwFNxhAJEdYLYeE0Ha9er1BRqeOMX0tgqPX7/f7jGbWvsQY8TH+ItgxvI/HPJ/GfYq+Oqy+ahmd/MROLZ8dR4miCP1KLlEgT8p1dOHSaAxefWoBpRSbWVobRTRBHE3+9l8BlPITZE2w4sTQBm6yWQAKp2RROaikbFbq4+wL+mP1d6G6No6ndg5veceGRj6II6U40d8Zw6SQN3znEjj9uimNhQSauL89Hjs+JsSkuTErxoLI3gPKMOFx+A799l5AQDYRGlcgAz4oxqpvi2NtD5pxiwsZV+e5W005UdnZpaelfyQQuxeFpw8oAj8czKxKJLKN343ngljm4+7t+uJo+RbRmF2JtHUj09iHWHUR3XS96atphi/dh2oxsLJoax8rNMbRxXlk+Ez8604NbznDwvCgSUfEsNdTXiwGlCskwoMgUk6oioRvo69GQku7G/GNKaFwNjCEWdMWZY/CPLWH0tIewp8/AjVMKkEObkZmfCXeaFy4ae7sWQboviFZiRS+so/FnwKcyGQizT83JoK+/Dxt2J5CbauCaRSY+3mUQDonnhkIhGxmxYnjIz9sNV0clTIhwcL9lAOO7/vIZuP4MhfCm9xBpbIMZlsiUn3sVAp2cLAng0E1EWvsQ3LEbE/39ePwcHX5CzKfPcODHR8WQr/UiGk6gjoTvoH0sKNaRkkk9Hxr0jKiOQiY21Tpw5oP9uOqubTCiJHhbDIm2Pfj9TWOwNubHKKcdo9M88GenwbDrsBNG9ef4ke4yQAwPNfR4rCZEF51FvIhWF3SDra9vZZS8jTbkwQsU/B4d4Ujke1lZWYckLxr632FbAf39/WfR3bxm2qRcPHtTNsxtn5BYcU6a86HkbqYEvbmJS3kzoeJdxO+7NRgEw9yOBD0bwje9CZgBDRU7EjhxTAJpmYrf6yS8Bg/DAJcLSCHaaYVsVAliq3W66xOpqtriduyqi6PcFkJjSwxvb0vgRws6cfoJE7BiC79nAmF0rt+CrGU10TNDf38dMjKieIWA3+Z6rrJMusL0UcVjs/4JQxIxhAMhC4G99mQKEMdTsc20c54FXAUv3HHHHUPmwLAxgCO/nbq5/J4rRmFaYgeizIrYHZyOZuCO13R8/8UECaNjXaOOt/eYPBQiQQ2FFLogYZ1gSIOd9q8ppGPRTOJqqSS4HISBfHx1kAEW8QemLA5LLKqhqTqOYjJib9yGm8/UsJCoZzZtRbDXxLyyTkw7ohx3vt6M2Vmp8FDke6kC+3rbYRiNiHsM3LcygQA8gD+T/ZMRX+pfc/L7YC+qmxMoyzdw4TyFpWs1tPeZ4x5+6KFV4XC4bqgcGBYGZGdn+4LB/ruz0+3+86Yl0FLbh7HFNJh0GW9+UcMj7+i4dFw+rhifgzOKM7AgLw2SPHluZxhdJPwUxgd9dIbi/eICEkaeKBkv6ni6lXuJ+1Mr0+kR2Rwkj3iMmoX1NzcSc+s3kWZXKKJBzyF6UUZ1dfPLGqHsBM6Z2YeMsaW494XtmEFG9Qf6YOq1SM+I4c/bDayuYq+5BfTXHBYthbHJ2/CNwTvLUusPYFuzhquO50qlsX77M6VzaKnxWOzFoa6CYbEBRA9PVMosKWAC5Ml3++DOoq7lZKuov5//ELhtZhFOL/ajMN3DQMiLsiwfrpmUj++V5eLlnQov79Jgo/RJWjHbT2KSISu2GTjhVxqm/kThmmUGmSFskJb8y9OpqknsqWQYXcYT55pw854S8XbGDdRrLvzlY2DBT7pwypgWTDkyG09V7UZmVi186WG8WGfHU2tomzKyGYNQ0kX381+y/+Q9rBjGx0lRHUlU/NwaHZfMJ6Np6KOR6CIKHiOJobVhWQEcwj00vpN6ggo9TI3fuIj5REpwxUZKdVcWTipOR2puOtJpCH30Qjw0igaN43iXDb30y1+p6ccJo5lmZEel4whJVxr49mMms+wO3HZpFi5a6EUKPxFFGpjtIIFkJVAqKf02yQ9zNqap02bYcfmSApxwRBpeWRtDe3Mb7v1uLh5YFcGezn78dYeBlzYloMTlFNUz2OtAt4OfOSd2Snsjy4JeUUO3ju8tZJzI1w93mnbakk7agorB8w/kdcgrwOv15nEgR4vkhGP0bHjQtlrIgh514OicVHjTffDR97bmx98MLusUMiK9MAsXluUh1XCgnioom/T4lDbiqmcSmDnRjY8ezMYPju7H6GgbYoEYiTsQhA0ag336guqJOsFy6qj2tHgUPZuqaYta8eataehTHti7avCTi/Px/FaFDQ2cdt4oEp83FCLLwb6UqBse/JRs8pmjVl4aIbsTG2tMvL9Nw7ePYG6ImBLzGmdNnjw5qbsGr9nP1yGvAErHSfQKLl40zUBeqoaqFoUzpuvIohMRbLXT189GZl4G50XCJFlgTUrGyUoFGkYDlS2dmFkQRo5Xw72reJ1uw9t3+lFidqDyk37sJIzQRHXW1SYJMeZo6A7uI5L1TohvsZf5Y2DPLqq/HQqtjCM8tPALaNSNRBQzSgys2WPH7mbGUVl5MgSL4JbuYaJHpFwSOOiRg4nnvm4rKrZQPGE2A0UHXdnLFii8uoEOQKfKjETCrzP2aUp2tv9/hcVDaiT+sdLB2bOAJYdrlqu3spLBJF1KpzsCNwMrwYCEYGJECdxbgioMiVLpN3X0Yk5xFMTbrDxwKz2ia053YSyj5c3roqivE1CU11BK+5gT3rGFDOqzerLoNkj4Qd6KKpffI2ENSwkj3PmWQsPOGFLJXCPYjh+dTvUHRr4ScVPCtQCJ3FBN+GM3HPR4nERi/V4fRpdOxNiJk5GfmQVnT3uSIZzDu1xBYqsWThGGKyMWi1nz54cDalxIB96WLFliLFv20uE2unezShX9ZVlQJv70kcKx9ETSXXF0m00I9GRaul8n8ROEEITw/YEIQc9Oxgl1OLwwbAFpqcR65ky1Y8khJtqJAbW1Ul2xxzAFM0Ekk+oY8bDCbmI+5YfwgzTSQUghHCZ7rXP8XIlLP1R4YpuwXcPWlymxo4Gi/DiOLQ1h/ow0VGyihIeDUME+5JRMwMyjTyLW5EdRSSkJnEBzYx0XQCeR8RgrwVgQUFeFqvUfMtCL4LMGA8eWKfz8NbrCscR82or7qQnkZvvdhsSAlStXMtOhxhamJ0tBnlqdhJnrOkz8fi3zriSSbutBd8dWruxCrggPcRxKUH+YUHCAsHITHFrUWhWMjWgngMuOYdTrCmPPbgWTBVZiE97bS+3A34uZ9j02j5LMubYRYs4pIMm/NG1ZXfJRYqodXEkiDN+58ELMmn8cHnvxCvxiSRR6pA/nz01BxQaKcTCGqUefjMmHH01mNyN7VAn2trZhy0cr0VK5Af1cJYp5Ck9aOsZMm4VDFy3B2jdexsdVIZzP1e6n89Qdipfn5eXxHavyDqANiNEBXMlLent7aclU6rhcDW66MJvrZPrJYykn+OhGGmbCxt7Ubno9OxjGb2M0WQXlqIHDX0upjlJViJchl9GTYR+zi+PQhUkM0rZ0GLhns8I/iWau2WtiabWJG9eY2BWgPaCtsbwU634yft5X/tEYe7kCNJe1LvD5559jyVmnYQdmoLaVsUUshiPyyHz+PP2401A6bTa2fvohsotKsKdqO1Yve5qS/h665x2C6IJ5MN1uhEIRbK54C500ROVHLsRjK0WVGhjLefOeBWYoxEDiwNqQVgCX3WgucW08YZMoBUoKpqRp9J1NQrp/pg6vqCImP8ZAWXoCKa4gXMTjJWMbploNhDSMyqNo85/HzViAoxGiircTITyxfA8ZQb/e4hC/n3vkfMyeMw+/fepBjCGMUEw742EW0kJHhYvCAPZlZ84hK00YoLBxw3rMOWwm2trasabYjuLCBJZ9EoUrt5Su8ShsWPUGckonoam2BrvWVqC1qwH6XT9BzhGHwUWorGn9BuCRP8ITSMWujWswbcEp2B4rJqxSj8mFOtbXJJz9iQTpgCqZ+/62ITGA7meR3LCE3lwPYYQOSqY0lZLOlBP1QHcbanr68LuNCet7B9ebg6KXQsWeR6N4PiHjEvr2QjSCkUgl0UwhOP910YjuZCLEwiDEQ2EbXVKCB+//OWtAY1j+j19hykRW6PKapBpKElwuFlV07GQdf9pByQh2oHbPHuv69XU2TKq149EKE6MO44r4fAMcPj/8GZmoqdyMvTXboN11K0rnz8Ebk48gbO7AVf4M/IXlL/p9j8GRnoc9W9YRGi/Ga5tqMTE/ST46IhYdrJvs558hqSDeK1smnEMPpqefeppSa0mrWEsJ7bMLoRWNocuXT1DHj6jdgwA9muaQwgVHGTiqhJ4NVY3430Eyz+EiUsr+pBRRWBZhilGuE29F2kt/W4pfPPAAIeowPmgG2uktDmYybTzFQ/fUQfeXNpsJIIUbFgYwejT9Vvb6y/Nc+NX1U7B6lx1dWhY9K+Yg2lsIb2cj0NeL1sqN0BedADXvcOzlYO6v3YFH6quxLUAodvpUJKZPoO/vIDTUA6lZ3dbqtFasjIuCOODTyqf9a0NaAVQXMjsaI2IsTPdFB9SFRgYQmkiORIqpUh0kQXpSUlsbYA/3Ymoh1Ut7spiNZKYtYOqvXkMpsSChvp96isEtG/+WTAYBJkTpJt5y443Wt0UpOvrIdEXr7XGwsKqdaOt2Dz6qT0NjkPlh9pFp68MJTNwffaIHS6ZEEGvcidfXhwhrj0Owi/kIFnN5vF50ULeHEmFoZ51CqJzgHMf+x8Zqds6RSfzCojBzWjnURmoZCpaKhdATcxOLElZbLXPwzf6+Do0BlpdIf580klpOi+YccLINvlL+kjqCTKB8k2BplFQXz6umzUilsUyl8ZWJNtbSzeQq2t3CmlCmCifQICutHn1aF5p9NnQHZSXwRuxnIjVcSTEha66Yn1f48fimInTH/eyfxkhFMX3esYgzen3+vdUY7V9PD8xES1eEkktcKSXBTFoT0gpG02010MMbm+PHQi8ZLf6uDMXyfgaGnRx3Ku0aJ6izT8VYgbk6ir6IDs/VkoJofdjPP0NiwOC9BgRF6MLGQSXHNfhz8lW+o/souEp30MRZT9KXzyPEO4GFbc6kHSCMw7JEA94CA5fP0HH/pNE0qC4EG3exGpr+d7Mdz3xgQ09zHA8voR4v1bF8ows/fp6BlY9Bg07LPtA2vfcWr3Wgv7kZReSw0uMsXWdcEibmT7DPpH8v9AsSHQ11tUGbewy9M5KD2JSEeTIVce1FqOS9ouqRb4VhyalQVUqQwkaZsmae/LR/f4fEAA6HM2ctJ22km6tAYADZLGFxwBr1wHt5sYbIP2SAFEQsZGXCVdMZlAWkSjlpgIvGU4fTUmf6ojA1Ds3uY9arn54TY4AUk/ncBE4tt7EsVKceNtBojkE5wbsTx9fgnR2MaGUAkubiPQIBRrok8oIyN46ZWYqOSBtC4RYwxoKDEmyNjJSMRSKISyLen2oNmzI+kCbkj0JpLgcVJ2ra0MyYhpNUdJP56jLoSdHbksYUbETW5YE0WdMH3Lj0aKGATrqDqYSGrQGJyAyu3f+2FDjYSD8UsfUjmcX61VlUH1wJcY5c3MbsQqoC1uCY/QmpQCDt4ohVb0K8eaeV0pTzJIegwjF47IykbZmI6W74/A789srRuGWhC+OpiW0E4uQ+1GUoy2UccWEB1Y8Nq5kbsFKSlFp6LdCYqpPVKE3yyyocZkVEbN931g/8XeodwXy2Vl0Lg7C18JcZZeS4Q5ZHJ+fRFg444NZV+/VnSCvAMLS9LERm/QzzpfQ+5AgSjk66JsnJJcWI3/GjIrilc/g/PEZDF4nNUEGKnaU0CHtrE5gyQ97TAyIDLOGzlrhcaFrCLUDYXibhrWuyksioSWK605245sLRuOjkMHY1hFHPvHDlli6cc1Iuxo9LoXEPYt32Xhy1mIbZQ5iBy0AkLx5l0p9GV5wGsEoCTY30j2lciF2xd55Arrd3QG2vgq2hBba0HMTCPfTcgjh0XByBSFIHMUlDpXhgTcZxwI2LtU4IXN3CgIheS54V/LC7GKVQpGuQB3IHwRr6CS1n65jKfG9drZxGWEFWNX/OpsvOzXXkHSNjfh7QwlYfUkLaTcb+4AUNh90FHH0fsPajbtiZs+VOF2vBiQ7wZXhw2KHZ+PbCXGQwrmhu7EZ8byeeea0RxbkJqjaFaazLjYm0czxhgRrIXIcEIc0t1PMBqJ3VUHvqkJCjqpoMaIde8QFXtxeJUB/v50SovRGncDNJNdFZaVwBpMOBtSExgNVve0ihRBXtn9B7It19q9FPT5JVPiXJaVkzGohCv4ZcYkdO1uk7WfDsoBckxqybSY4WgrpSuymXSH/WpWSP+N2fMZ/c38gEfkShtodZspf7serN3Qjubke8N0T1wVIV5qEjLb1Ys6Iaf6tUeGVnOn765xYktDDOn014ulFhdo5JNUiDSqmPEYwLUyichKZVJYOwAOEcjlH19HK19lnM0d/7CK7Pd8NGhDRChkVMA7PzezC/DKi0QGgtwlqoGpnpgTRO7cAbkzGRcDhyMeeecvnRVJV9koelVAj1JJU30ISW9NUsfD2FZf02loYU2akG+N0AsIwQ88FpZI6fQbRJXa8LWGM1rgp2WZCuMIMRdykhi0+44hoJTa/YFUfNnj70NnSjtbYb27d14JX32/HEVh/O+/GDOPV7d+PV19/CDybspeHWsLtaIZcMX9PALBmTRTqlX5H7zlQ/wvV7uProwk5nzEFPR+/qgfHWP+H8ZCuc/myEGIc4GRQGmhvw41PiGMcVe8dyy2nak5OdfR9xsQPSQkOyAd1s3Gr0eUfALPiMWaZ54wUOJsFkZ4pUNks0PGiQRc8yYPi8IYqt9TqOm8GEBv1OJ6sXwiS+kDtCbKizXZhC15SrRIA1g3le6UIKFFJyNExgbvZxRrWXLYuzXiiO5bu5y2U3bYRGA87zSiZNw/X3/wz9PT247fv/gYy+nUgQ1miWHALFzc3jSu4bu3dzF3pZnCsuqIvlF/5xU9BBaddaGKDxZkZbFwzWM8kcggzK3MyehXsJKpr9rMo2sL6WZoMQrWEzNjc0NNCaHVgbkgqSW9oN4wOh0IpKDdNGAWOySUpL3wswlJRi0iXZHBJxATOKFZ7fbeDql3iGRD1s8jdAIrWxcrqLEfLeBhZNsWJBcgjymxhmVrLDRkM/yojhjiVueiE2zM7ORxnh4gEICXuqt+GHl12IG6/6Lta+/0+U5Qg7uaI4U+lJapCmjTKQw9yDQBrhzmb0EYq2U7ozx8+EY3cD4hs3IdrciFBPKxL9vfBk5iFCByJMbGsCy1PKGcW//ZmMWtSjUSHvDrQNSQXJTan/wvF44tJgVNOvPB7ck6tZe3MtnT+ghoSAQgQrIiacYGcJ4bMfJxAkMc6bTSmnXs/KpjHlie0kfoSwBu0kyw651VS8Ha4CbvKgtFm9oLbGxNyJZESpHbHWQtx/6HE4gxLcSuN/Ym4x44UM7KG+ZjSBa4k51TCfkE7vSmKVOJn2TK2BVVUsc2e1g92TgkhXK6I8X1SMJ68YLlZrO8lUR2qGtYKDbY10mbkvje2S+TqOLweup0PQ0YeI2+26mbWwbdaPB/BnyAwoKSlp7+ruPbu918w+ldHrlAKFpz7guCV4Ee9C1BDJL/+orqBxItsbY/TwFJPaCoexFLxslI4Ei6Si3XFrX53klqQSnSqaRbvEmejWZ5AR4rd7fBoLq+i21iWw+Ah2ndODR9buRbGWh+8fciSza8W4aOwM9FEp5JR14JzxJpYzBphF2HtLD4u33gdW7xR1TayJApI3ZTZcGfno62hFsLmGFXvtlHYaW+aEQ50thMW5KVAyRcwHU27w2++IkAG/fpuRsM1Yd9rixQ9UVlbuW+T7y4MhM4CVwgmH3ZYTiycWOBnFXn6sYmGsjnpmxTShoPcLYyzGTSoWxE2VSmRuFEADY4gQk/ABIqSFrBe1OentUFSdDJclN0A+WgQXAUxhooVJNcLHOm0FPcf6BI6ZquOYoxJYzbz4q7t2YVtLG95oroSjrAW/ODOGVR8GUMfYoYdlhT95j/v96OYfOoYl7PTc4lxmPfT9jQTVJccl7imfR4GEN4WJGEbhLFe3KieCjDcZkR9XbuCG04CfLWOpZR3dV7v915999tma/SX6l88X7TDklpKSMqEvENxIWNqz9R5gVSVw7qMi8vyXX5IsfBJmsGkCAzB4Uk4XtNZGbjmlt0HJPvdwHfcdp+G2VTpWVJn43akaMlkFLYkZ5mcss+LgYsrM1bkhkl0Q1t6xjUaQfY4fzxLHCV70s2SiJWqH1GcVEKlcs7IHV/9dquqALe3clsqCqrU/ZbwVNDDjNhKQnta1i5044xBeQNT25bUKD7xCbCiVN5B6IbHq4lI31Vjq8/VrdUv/T2cfXGFd6en+aRRAWqsDb0NeAXJr6sAOw26bGuhPTEmjf38FV8Hbn+ncs8VVIAS3bMEAr8UaWkWwvJAhsHwr0WxjRxxtCRueXB21vIt1zSJ8ditTJviSoK1SPyqVIr0MgHqpmrpYR7qqQQpzGajVh1kVTT+eR/P2Hjz/Thg/ZupwZ7eJZn4ttJxOBpw0RuH+d4EN9azau8qB/5wfRQZd08K5C3DM3ExU7WzB5h1cpXRNRU1pHS10z8I4htJ/9zkm7lzOHDWT/Xan4+lgIPA8TxpSG6DKkPqwLk5NTT28t69vdb5fs2+8mxPczT1WD9I15My17AJmjsXBJxXEGLAlb0xXU7wcYguquTbpuhJ714jTC/ookIbLmQT6uL/dsgkpNKQzcjXMK2RMwGppxiBY16pjeyeLZhkb9LBkvY36v1uSOdaNeCcyXeO9jx+l4ZxxDOJoo8oYczx3HhO6tBEGsSjNk864ALjuxSgefZNvSkutkhXV0gAHxXTVrQZy00wcSuln3Nfv9XpmccsS1/rQGhfn8DTWh37icDqXNXdFv33337nr5BLuxTrcwPNrCO/Sy7AAHysu+PL9yBxhCtFFLa/YUkdiGxQxd9G9Gg1imMYwTC9psHWSuLXcZ/B35ppTeFoK1ZKdtqOfbmoHfyPP2Oi+MjWmJN0p8QhX2GRCINfOMrFshybFEOihA7B9hyAQTOLTTBnohGeUCys2c7mJfaJNUCL9ZPx3j7ZhbnkCFzysM/OXoBdnf3o4iC8jHXIcIJ1Io4ei3C7XbQzxu/9YYeLD7Tp+eb4UsvIW4hF10HXgZP6vJktBvhfmpLNQVrAIftaoa5RUpwkxyRCby8cYIIXVFVwhcg6h5z5qiibGDgJNtBHWNi0snNcSYDJcKdY1yftpKCdNBcn8hDQlgApJ5T20XcOuDkFegfxiA+/ssWEnDbuWmgKtvdlyFsqYm7j3XBOvr9Ox9GP2reuttHn3Jvsd+t9hsQGDw2CJXqfT5TAjkcQJG2s1XHk8q5fzNSz7lNExcXdLh3iIuw+oIblO4t7BJrwQGEOjzlXtTfzAQMeVahFeJwgmjLBeuVlAZz2pQSnXaTw18a5EzfC9SL4wSxInonoU4QVFyHYqGRAi+LeCuj+NDLh1pgRkrLQ4QkMZ/Xpfhovem42b8gQdpbpj1OuhR7b0ajoDHPLZD3OFUcVxy+r1gd7AqsExD/V1WBkggymbWPZpZ1fnvKbOxJg2Jk5uOI06lrVBUq5IrMHy5VmvyA8kvEg6CT7YhBXWpzYSn66q4fR+SYqTZ1nnCJMGiK5T2oUxBpliMHtmMUSS+AN9S8LfrSKYQxzpM0p7E2GJENXUIYQ1yohLRVjRvZe1/x0NCm/wsThbGKOIzy8jefhCA986wsSljxv4gDt3CD6+fsZpZ9w4FL9/cK6Dr8POgLa2toTP6/2YZdtL1u9WPj+fbnXjYoWWbgOf1pB8fMqJRXNJAgwQfx8P5I0UyLI41iBsYfNSbEnIJFcEqqY9sfD7wb0CnIZwRNoXfEx+HviOaRiM88UwPS2O1TRFDkKroqk2Mf7IZVDnEW1GQ17JB0H9/tOEtdlbLuUjc3DTWSbuflnHIyuYJ9P1OjoaZ/PhTt1f3GDo74adATIkcUvdbvd2BmdnV1QqY2I+V8KpzAGw0m2TPLGKQY1UH1ilzkJ0ITKbtRqIt4j0u+jsK64cmlX5RX6mro4wUGIQR6m2VMxXqS6nSVfymrwk2Se/LPFEsZbBWzYjbgHuGhjYVXChhZSNldzcRvVhAm39yXFce5IN919o4s8rWV75nHX/kMfjPo+I5yb2PKztoDBARsiq4Sqnx90VicRP5pYePnpMww3cc9veZ0tiRaKOJBcrMKfkWtk0sYaSIKd68eSMIv4SGFwkdGdNBl8sHeF/1ioQWENUzb7lY3WR/DNAfKtP/t7HbE2WI4Z66nA3C4hsZIi4lj4GYt8eq+GNahMbiUEJ125ZnCT+0g8Z1T/JfDUdKZfLeSV3gBI6HP520BggQ2Ud5jqHyxULhRPHvboRhAGojk434SVk8T5dwHiEbgwxBjGg1gOZBG/gYSfsafOmIy6/WQQmcklPSgkDxLCKeNO11L/MhEGp/xLxZTWYXGkJQh5u6hkBA2u4GzNEHCpCt5Ub9lHRCGzv4vYmbih88AIDt5xNLIvR+OVPclckfyfYdiM34z06/KT/F/VIPEdzuB03UboUN9qp+85nSPW8pt650bAeX8NhiOgpAnfM6jOzz/dEJJWveJJypOUopz+PR67SXSwCFVjU4H4kh8865DtHavbAOXLel460XGXz8tFmTl5n9ymfw1CsrFY5fFCTuMzkrHUvuV95oa5W3ZJ8XM3dS+zKsB6joyWoRq+T8fOc//3N5fFcQfGle6Gpi+YbqutxQ3U8ZrOeVCWM4Qz3He7cIuXJHZMkaHq+cpKYmoN4svisEjwbLIUjEzRn8uBqUfaULIsZwhAhvO5K5TUD58griXocGTA9Q1fEnqx7cf+y+v5Cm+rhk7vaH9PVeXOId3N8ZE7A5XVd8r+f6l+ZgTfNewLVRo0QexKl7i3rSVW6+uBnNnXCVIHQhDDJg66lsnv9JH6ORVgGVwMMEAIJE+xJAgtxBw9Ku0j8vs/yvZ2PP9NJWEvqB5msqZOmGWrNbfIAP129dp08JDB5f46vyufzLfjK0P99Pvrz/CVM4vxdCM30pbr4KEPtfpCE+KuuVtxsU2ccZlN8Oi4ZMUAsRkWabIMUtTCwAvYRkyrJIvAgAxze5GebK7lKRGVZDJW+GKk7NHXGobp692a5n6aqfmmoC+bZkiqJv3NcL2ZmZhb++1D7f5jJ7XyYEx/scSUTNDSBfEqNj48wO9XgIyWph/lIye0P2NRdS2zq8HEGn/v2JWYMMsUi6pe+l9BVDgtO+9L3PM/l0NWsUl3d9S1D7bxf7I+uqh801DUn2VSaJ8kgel21Lq/3kq9D33+tBoaPKx7V0dVxQyQUu5T+ii+NQdtibmu66Eg+uWoiw35CBjVEOtcwNyyPId5az8cSd8gDXJOl8FJmKGkGcZQkWyW7dDK472AU8yjlhfLIY7BQgPmCfNk+y+dQEPt5erXGp+iaxPNlkWldDqftj2mpab9mAEmw6l/fvlYGDE6Xj5+fHAwG/ysSjZ1LimaTMBibpzEDpeGEKeAGQNaGZlLISWTGaNZehF7mSeRh3QKmyn4CNyFlPgoIaUzaS+JG4rz6Tnl2tIZ/fK5h5ecmC8iE6GysamE26zk+QPYJBle7kl9+PX+/EQwYnHphYWERM0xnMog7m480m0X5JjmZ1SRhi5lMGZ+XjCWKMpjEZ1WDj99bmzmYMpPtTm0scWnoYtl7K3dsEvWU1WKVSiZvEDBs+hoW1i7N9Nte3bs3cMCJ9MHxDsfrN4oBgxMSXcxn8kxk9LkgEosdlYgnZhCXKObvzPJ/tVmqhF8OSLf1szUt1hFqtXabsYH/L4H3aGDfZ86i2ooBvtrF1/j5G8mAr9JDHn9JHV3EYLhUqVgpYYkCVjinUv1zo73hTMQSIaISQbqQfMweGoha1krZ5NixYxu/ziejf3UeI59HKDBCgREKjFBghAIjFBihwAgFRigwQoERCoxQYIQCIxQYocAIBUYoMEKBEQqMUGCEAl8TBf4Psyet2W9C97cAAAAASUVORK5CYII=";
@@ -14396,7 +14436,12 @@ function useImageAttachments(uploadFn, maxImages, bucket = "screenshots") {
14396
14436
  launchImageLibrary(
14397
14437
  { mediaType: "photo", quality: 0.7, maxWidth: 1920, maxHeight: 1920, selectionLimit: maxImages - images.length },
14398
14438
  async (response) => {
14399
- if (response.didCancel || response.errorCode || !response.assets) return;
14439
+ if (response.didCancel) return;
14440
+ if (response.errorCode) {
14441
+ console.error("BugBear: Image picker error", response.errorCode, response.errorMessage);
14442
+ return;
14443
+ }
14444
+ if (!response.assets) return;
14400
14445
  for (const asset of response.assets) {
14401
14446
  const uri = asset.uri;
14402
14447
  if (!uri) continue;
@@ -14410,6 +14455,11 @@ function useImageAttachments(uploadFn, maxImages, bucket = "screenshots") {
14410
14455
  setImages((prev) => prev.map(
14411
14456
  (img) => img.id === id ? { ...img, remoteUrl: url, status: url ? "done" : "error" } : img
14412
14457
  ));
14458
+ }).catch((err) => {
14459
+ console.error("BugBear: Image upload failed", err);
14460
+ setImages((prev) => prev.map(
14461
+ (img) => img.id === id ? { ...img, status: "error" } : img
14462
+ ));
14413
14463
  });
14414
14464
  }
14415
14465
  }
@@ -14420,7 +14470,12 @@ function useImageAttachments(uploadFn, maxImages, bucket = "screenshots") {
14420
14470
  launchCamera(
14421
14471
  { mediaType: "photo", quality: 0.7, maxWidth: 1920, maxHeight: 1920 },
14422
14472
  async (response) => {
14423
- if (response.didCancel || response.errorCode || !response.assets?.[0]) return;
14473
+ if (response.didCancel) return;
14474
+ if (response.errorCode) {
14475
+ console.error("BugBear: Camera error", response.errorCode, response.errorMessage);
14476
+ return;
14477
+ }
14478
+ if (!response.assets?.[0]) return;
14424
14479
  const asset = response.assets[0];
14425
14480
  const uri = asset.uri;
14426
14481
  if (!uri) return;
@@ -14434,6 +14489,11 @@ function useImageAttachments(uploadFn, maxImages, bucket = "screenshots") {
14434
14489
  setImages((prev) => prev.map(
14435
14490
  (img) => img.id === id ? { ...img, remoteUrl: url, status: url ? "done" : "error" } : img
14436
14491
  ));
14492
+ }).catch((err) => {
14493
+ console.error("BugBear: Image upload failed", err);
14494
+ setImages((prev) => prev.map(
14495
+ (img) => img.id === id ? { ...img, status: "error" } : img
14496
+ ));
14437
14497
  });
14438
14498
  }
14439
14499
  );
@@ -14698,20 +14758,185 @@ var styles6 = import_react_native8.StyleSheet.create({
14698
14758
  });
14699
14759
 
14700
14760
  // src/widget/screens/ReportScreen.tsx
14761
+ var import_react11 = __toESM(require("react"));
14762
+ var import_react_native10 = require("react-native");
14763
+
14764
+ // src/widget/CategoryPicker.tsx
14701
14765
  var import_react10 = __toESM(require("react"));
14702
14766
  var import_react_native9 = require("react-native");
14767
+ var categoryOptions = [
14768
+ { value: "ui_ux", label: "UI/UX", icon: "\u{1F3A8}" },
14769
+ { value: "functional", label: "Functional", icon: "\u2699\uFE0F" },
14770
+ { value: "crash", label: "Crash", icon: "\u{1F4A5}" },
14771
+ { value: "security", label: "Security", icon: "\u{1F510}" },
14772
+ { value: "other", label: "Other", icon: "\u{1F4DD}" }
14773
+ ];
14774
+ function CategoryPicker({ value, onChange, optional = true }) {
14775
+ const [modalVisible, setModalVisible] = (0, import_react10.useState)(false);
14776
+ const selectedOption = value ? categoryOptions.find((o) => o.value === value) : null;
14777
+ const handleSelect = (category) => {
14778
+ onChange(category);
14779
+ setModalVisible(false);
14780
+ };
14781
+ return /* @__PURE__ */ import_react10.default.createElement(import_react10.default.Fragment, null, /* @__PURE__ */ import_react10.default.createElement(
14782
+ import_react_native9.TouchableOpacity,
14783
+ {
14784
+ style: styles7.trigger,
14785
+ onPress: () => setModalVisible(true)
14786
+ },
14787
+ /* @__PURE__ */ import_react10.default.createElement(import_react_native9.Text, { style: selectedOption ? styles7.triggerTextSelected : styles7.triggerTextPlaceholder }, selectedOption ? `${selectedOption.icon} ${selectedOption.label}` : optional ? "Select category (optional)" : "Select category"),
14788
+ /* @__PURE__ */ import_react10.default.createElement(import_react_native9.Text, { style: styles7.chevron }, "\u25BC")
14789
+ ), /* @__PURE__ */ import_react10.default.createElement(
14790
+ import_react_native9.Modal,
14791
+ {
14792
+ visible: modalVisible,
14793
+ transparent: true,
14794
+ animationType: "fade",
14795
+ onRequestClose: () => setModalVisible(false)
14796
+ },
14797
+ /* @__PURE__ */ import_react10.default.createElement(
14798
+ import_react_native9.TouchableOpacity,
14799
+ {
14800
+ style: styles7.overlay,
14801
+ activeOpacity: 1,
14802
+ onPress: () => setModalVisible(false)
14803
+ },
14804
+ /* @__PURE__ */ import_react10.default.createElement(import_react_native9.View, { style: styles7.modal, onStartShouldSetResponder: () => true }, /* @__PURE__ */ import_react10.default.createElement(import_react_native9.Text, { style: styles7.modalTitle }, "Select Category"), optional && /* @__PURE__ */ import_react10.default.createElement(
14805
+ import_react_native9.TouchableOpacity,
14806
+ {
14807
+ style: [styles7.option, !value && styles7.optionSelected],
14808
+ onPress: () => handleSelect(null)
14809
+ },
14810
+ /* @__PURE__ */ import_react10.default.createElement(import_react_native9.Text, { style: styles7.optionText }, "\u2014 None \u2014")
14811
+ ), categoryOptions.map(({ value: optValue, label, icon }) => /* @__PURE__ */ import_react10.default.createElement(
14812
+ import_react_native9.TouchableOpacity,
14813
+ {
14814
+ key: optValue,
14815
+ style: [styles7.option, value === optValue && styles7.optionSelected],
14816
+ onPress: () => handleSelect(optValue)
14817
+ },
14818
+ /* @__PURE__ */ import_react10.default.createElement(import_react_native9.Text, { style: styles7.optionIcon }, icon),
14819
+ /* @__PURE__ */ import_react10.default.createElement(import_react_native9.Text, { style: styles7.optionText }, label),
14820
+ value === optValue && /* @__PURE__ */ import_react10.default.createElement(import_react_native9.Text, { style: styles7.checkmark }, "\u2713")
14821
+ )), /* @__PURE__ */ import_react10.default.createElement(
14822
+ import_react_native9.TouchableOpacity,
14823
+ {
14824
+ style: styles7.cancelButton,
14825
+ onPress: () => setModalVisible(false)
14826
+ },
14827
+ /* @__PURE__ */ import_react10.default.createElement(import_react_native9.Text, { style: styles7.cancelText }, "Cancel")
14828
+ ))
14829
+ )
14830
+ ));
14831
+ }
14832
+ var styles7 = import_react_native9.StyleSheet.create({
14833
+ trigger: {
14834
+ flexDirection: "row",
14835
+ alignItems: "center",
14836
+ justifyContent: "space-between",
14837
+ backgroundColor: colors.card,
14838
+ borderWidth: 1,
14839
+ borderColor: colors.border,
14840
+ borderRadius: 8,
14841
+ paddingHorizontal: 12,
14842
+ paddingVertical: 10
14843
+ },
14844
+ triggerTextSelected: {
14845
+ fontSize: 14,
14846
+ color: colors.textPrimary
14847
+ },
14848
+ triggerTextPlaceholder: {
14849
+ fontSize: 14,
14850
+ color: colors.textMuted
14851
+ },
14852
+ chevron: {
14853
+ fontSize: 10,
14854
+ color: colors.textMuted
14855
+ },
14856
+ overlay: {
14857
+ flex: 1,
14858
+ backgroundColor: "rgba(0, 0, 0, 0.6)",
14859
+ justifyContent: "center",
14860
+ alignItems: "center",
14861
+ padding: 24
14862
+ },
14863
+ modal: {
14864
+ width: "100%",
14865
+ maxWidth: 300,
14866
+ backgroundColor: colors.card,
14867
+ borderRadius: 16,
14868
+ padding: 8,
14869
+ borderWidth: 1,
14870
+ borderColor: colors.border
14871
+ },
14872
+ modalTitle: {
14873
+ fontSize: 16,
14874
+ fontWeight: "600",
14875
+ color: colors.textPrimary,
14876
+ textAlign: "center",
14877
+ paddingVertical: 12,
14878
+ borderBottomWidth: 1,
14879
+ borderBottomColor: colors.border,
14880
+ marginBottom: 4
14881
+ },
14882
+ option: {
14883
+ flexDirection: "row",
14884
+ alignItems: "center",
14885
+ paddingVertical: 14,
14886
+ paddingHorizontal: 16,
14887
+ borderRadius: 8
14888
+ },
14889
+ optionSelected: {
14890
+ backgroundColor: colors.blue + "20"
14891
+ },
14892
+ optionIcon: {
14893
+ fontSize: 18,
14894
+ marginRight: 12
14895
+ },
14896
+ optionText: {
14897
+ flex: 1,
14898
+ fontSize: 15,
14899
+ color: colors.textPrimary
14900
+ },
14901
+ checkmark: {
14902
+ fontSize: 16,
14903
+ color: colors.blue,
14904
+ fontWeight: "600"
14905
+ },
14906
+ cancelButton: {
14907
+ marginTop: 8,
14908
+ paddingVertical: 12,
14909
+ borderTopWidth: 1,
14910
+ borderTopColor: colors.border
14911
+ },
14912
+ cancelText: {
14913
+ fontSize: 15,
14914
+ color: colors.textMuted,
14915
+ textAlign: "center"
14916
+ }
14917
+ });
14918
+
14919
+ // src/widget/screens/ReportScreen.tsx
14703
14920
  function ReportScreen({ nav, prefill }) {
14704
14921
  const { client, getDeviceInfo, uploadImage, refreshAssignments } = useBugBear();
14705
- const [reportType, setReportType] = (0, import_react10.useState)(prefill?.type || "bug");
14706
- const [severity, setSeverity] = (0, import_react10.useState)("medium");
14707
- const [description, setDescription] = (0, import_react10.useState)("");
14708
- const [affectedScreen, setAffectedScreen] = (0, import_react10.useState)("");
14709
- const [submitting, setSubmitting] = (0, import_react10.useState)(false);
14710
- const [error, setError] = (0, import_react10.useState)(null);
14711
- const submittingRef = (0, import_react10.useRef)(false);
14922
+ const [reportType, setReportType] = (0, import_react11.useState)(prefill?.type || "bug");
14923
+ const [severity, setSeverity] = (0, import_react11.useState)("medium");
14924
+ const [category, setCategory] = (0, import_react11.useState)(null);
14925
+ const [description, setDescription] = (0, import_react11.useState)("");
14926
+ const [affectedScreen, setAffectedScreen] = (0, import_react11.useState)("");
14927
+ const [submitting, setSubmitting] = (0, import_react11.useState)(false);
14928
+ const [error, setError] = (0, import_react11.useState)(null);
14929
+ const submittingRef = (0, import_react11.useRef)(false);
14712
14930
  const images = useImageAttachments(uploadImage, 5, "screenshots");
14713
14931
  const isRetestFailure = prefill?.type === "test_fail";
14714
14932
  const isBugType = reportType === "bug" || reportType === "test_fail";
14933
+ (0, import_react11.useEffect)(() => {
14934
+ if (reportType === "feedback" || reportType === "suggestion") {
14935
+ setCategory("other");
14936
+ } else {
14937
+ setCategory(null);
14938
+ }
14939
+ }, [reportType]);
14715
14940
  const handleSubmit = async () => {
14716
14941
  if (!client || !description.trim()) return;
14717
14942
  if (submittingRef.current) return;
@@ -14729,6 +14954,7 @@ function ReportScreen({ nav, prefill }) {
14729
14954
  type: reportType,
14730
14955
  description: description.trim(),
14731
14956
  severity: isBugType ? severity : void 0,
14957
+ category: category || void 0,
14732
14958
  assignmentId: prefill?.assignmentId,
14733
14959
  testCaseId: prefill?.testCaseId,
14734
14960
  appContext,
@@ -14753,23 +14979,23 @@ function ReportScreen({ nav, prefill }) {
14753
14979
  submittingRef.current = false;
14754
14980
  }
14755
14981
  };
14756
- return /* @__PURE__ */ import_react10.default.createElement(import_react_native9.View, null, isRetestFailure ? /* @__PURE__ */ import_react10.default.createElement(import_react10.default.Fragment, null, /* @__PURE__ */ import_react10.default.createElement(import_react_native9.View, { style: styles7.retestBanner }, /* @__PURE__ */ import_react10.default.createElement(import_react_native9.Text, { style: styles7.retestIcon }, "\u{1F504}"), /* @__PURE__ */ import_react10.default.createElement(import_react_native9.View, null, /* @__PURE__ */ import_react10.default.createElement(import_react_native9.Text, { style: styles7.retestTitle }, "Bug Still Present"), /* @__PURE__ */ import_react10.default.createElement(import_react_native9.Text, { style: styles7.retestSubtitle }, "The fix did not resolve this issue"))), /* @__PURE__ */ import_react10.default.createElement(import_react_native9.View, { style: styles7.section }, /* @__PURE__ */ import_react10.default.createElement(import_react_native9.Text, { style: shared.label }, "Severity"), /* @__PURE__ */ import_react10.default.createElement(import_react_native9.View, { style: styles7.severityRow }, [
14982
+ return /* @__PURE__ */ import_react11.default.createElement(import_react_native10.View, null, isRetestFailure ? /* @__PURE__ */ import_react11.default.createElement(import_react11.default.Fragment, null, /* @__PURE__ */ import_react11.default.createElement(import_react_native10.View, { style: styles8.retestBanner }, /* @__PURE__ */ import_react11.default.createElement(import_react_native10.Text, { style: styles8.retestIcon }, "\u{1F504}"), /* @__PURE__ */ import_react11.default.createElement(import_react_native10.View, null, /* @__PURE__ */ import_react11.default.createElement(import_react_native10.Text, { style: styles8.retestTitle }, "Bug Still Present"), /* @__PURE__ */ import_react11.default.createElement(import_react_native10.Text, { style: styles8.retestSubtitle }, "The fix did not resolve this issue"))), /* @__PURE__ */ import_react11.default.createElement(import_react_native10.View, { style: styles8.section }, /* @__PURE__ */ import_react11.default.createElement(import_react_native10.Text, { style: shared.label }, "Severity"), /* @__PURE__ */ import_react11.default.createElement(import_react_native10.View, { style: styles8.severityRow }, [
14757
14983
  { sev: "critical", color: "#ef4444" },
14758
14984
  { sev: "high", color: "#f97316" },
14759
14985
  { sev: "medium", color: "#eab308" },
14760
14986
  { sev: "low", color: "#6b7280" }
14761
- ].map(({ sev, color }) => /* @__PURE__ */ import_react10.default.createElement(
14762
- import_react_native9.TouchableOpacity,
14987
+ ].map(({ sev, color }) => /* @__PURE__ */ import_react11.default.createElement(
14988
+ import_react_native10.TouchableOpacity,
14763
14989
  {
14764
14990
  key: sev,
14765
- style: [styles7.sevButton, severity === sev && { backgroundColor: `${color}30`, borderColor: color }],
14991
+ style: [styles8.sevButton, severity === sev && { backgroundColor: `${color}30`, borderColor: color }],
14766
14992
  onPress: () => setSeverity(sev)
14767
14993
  },
14768
- /* @__PURE__ */ import_react10.default.createElement(import_react_native9.Text, { style: [styles7.sevText, severity === sev && { color }] }, sev)
14769
- )))), /* @__PURE__ */ import_react10.default.createElement(import_react_native9.View, { style: styles7.section }, /* @__PURE__ */ import_react10.default.createElement(import_react_native9.Text, { style: shared.label }, "What went wrong?"), /* @__PURE__ */ import_react10.default.createElement(
14770
- import_react_native9.TextInput,
14994
+ /* @__PURE__ */ import_react11.default.createElement(import_react_native10.Text, { style: [styles8.sevText, severity === sev && { color }] }, sev)
14995
+ )))), /* @__PURE__ */ import_react11.default.createElement(import_react_native10.View, { style: styles8.section }, /* @__PURE__ */ import_react11.default.createElement(import_react_native10.Text, { style: shared.label }, "Category (optional)"), /* @__PURE__ */ import_react11.default.createElement(CategoryPicker, { value: category, onChange: setCategory, optional: true })), /* @__PURE__ */ import_react11.default.createElement(import_react_native10.View, { style: styles8.section }, /* @__PURE__ */ import_react11.default.createElement(import_react_native10.Text, { style: shared.label }, "What went wrong?"), /* @__PURE__ */ import_react11.default.createElement(
14996
+ import_react_native10.TextInput,
14771
14997
  {
14772
- style: styles7.descInput,
14998
+ style: styles8.descInput,
14773
14999
  value: description,
14774
15000
  onChangeText: setDescription,
14775
15001
  placeholder: "Describe what you observed. What still doesn't work?",
@@ -14778,7 +15004,7 @@ function ReportScreen({ nav, prefill }) {
14778
15004
  numberOfLines: 4,
14779
15005
  textAlignVertical: "top"
14780
15006
  }
14781
- )), /* @__PURE__ */ import_react10.default.createElement(
15007
+ )), /* @__PURE__ */ import_react11.default.createElement(
14782
15008
  ImagePickerButtons,
14783
15009
  {
14784
15010
  images: images.images,
@@ -14788,44 +15014,44 @@ function ReportScreen({ nav, prefill }) {
14788
15014
  onRemove: images.removeImage,
14789
15015
  label: "Attachments (optional)"
14790
15016
  }
14791
- ), error && /* @__PURE__ */ import_react10.default.createElement(import_react_native9.View, { style: styles7.errorBanner }, /* @__PURE__ */ import_react10.default.createElement(import_react_native9.Text, { style: styles7.errorText }, error)), /* @__PURE__ */ import_react10.default.createElement(
14792
- import_react_native9.TouchableOpacity,
15017
+ ), error && /* @__PURE__ */ import_react11.default.createElement(import_react_native10.View, { style: styles8.errorBanner }, /* @__PURE__ */ import_react11.default.createElement(import_react_native10.Text, { style: styles8.errorText }, error)), /* @__PURE__ */ import_react11.default.createElement(
15018
+ import_react_native10.TouchableOpacity,
14793
15019
  {
14794
- style: [shared.primaryButton, styles7.retestSubmitButton, (!description.trim() || submitting || images.isUploading) && shared.primaryButtonDisabled, { marginTop: 20 }],
15020
+ style: [shared.primaryButton, styles8.retestSubmitButton, (!description.trim() || submitting || images.isUploading) && shared.primaryButtonDisabled, { marginTop: 20 }],
14795
15021
  onPress: handleSubmit,
14796
15022
  disabled: !description.trim() || submitting || images.isUploading
14797
15023
  },
14798
- /* @__PURE__ */ import_react10.default.createElement(import_react_native9.Text, { style: shared.primaryButtonText }, images.isUploading ? "Uploading images..." : submitting ? "Submitting..." : error ? "Retry" : "Submit Failed Retest")
14799
- )) : /* @__PURE__ */ import_react10.default.createElement(import_react10.default.Fragment, null, /* @__PURE__ */ import_react10.default.createElement(import_react_native9.Text, { style: shared.label }, "What are you reporting?"), /* @__PURE__ */ import_react10.default.createElement(import_react_native9.View, { style: styles7.typeRow }, [
15024
+ /* @__PURE__ */ import_react11.default.createElement(import_react_native10.Text, { style: shared.primaryButtonText }, images.isUploading ? "Uploading images..." : submitting ? "Submitting..." : error ? "Retry" : "Submit Failed Retest")
15025
+ )) : /* @__PURE__ */ import_react11.default.createElement(import_react11.default.Fragment, null, /* @__PURE__ */ import_react11.default.createElement(import_react_native10.Text, { style: shared.label }, "What are you reporting?"), /* @__PURE__ */ import_react11.default.createElement(import_react_native10.View, { style: styles8.typeRow }, [
14800
15026
  { type: "bug", label: "Bug", icon: "\u{1F41B}" },
14801
15027
  { type: "feedback", label: "Feedback", icon: "\u{1F4A1}" },
14802
15028
  { type: "suggestion", label: "Idea", icon: "\u2728" }
14803
- ].map(({ type, label, icon }) => /* @__PURE__ */ import_react10.default.createElement(
14804
- import_react_native9.TouchableOpacity,
15029
+ ].map(({ type, label, icon }) => /* @__PURE__ */ import_react11.default.createElement(
15030
+ import_react_native10.TouchableOpacity,
14805
15031
  {
14806
15032
  key: type,
14807
- style: [styles7.typeCard, reportType === type && styles7.typeCardActive],
15033
+ style: [styles8.typeCard, reportType === type && styles8.typeCardActive],
14808
15034
  onPress: () => setReportType(type)
14809
15035
  },
14810
- /* @__PURE__ */ import_react10.default.createElement(import_react_native9.Text, { style: styles7.typeIcon }, icon),
14811
- /* @__PURE__ */ import_react10.default.createElement(import_react_native9.Text, { style: [styles7.typeLabel, reportType === type && styles7.typeLabelActive] }, label)
14812
- ))), isBugType && /* @__PURE__ */ import_react10.default.createElement(import_react_native9.View, { style: styles7.section }, /* @__PURE__ */ import_react10.default.createElement(import_react_native9.Text, { style: shared.label }, "Severity"), /* @__PURE__ */ import_react10.default.createElement(import_react_native9.View, { style: styles7.severityRow }, [
15036
+ /* @__PURE__ */ import_react11.default.createElement(import_react_native10.Text, { style: styles8.typeIcon }, icon),
15037
+ /* @__PURE__ */ import_react11.default.createElement(import_react_native10.Text, { style: [styles8.typeLabel, reportType === type && styles8.typeLabelActive] }, label)
15038
+ ))), isBugType && /* @__PURE__ */ import_react11.default.createElement(import_react_native10.View, { style: styles8.section }, /* @__PURE__ */ import_react11.default.createElement(import_react_native10.Text, { style: shared.label }, "Severity"), /* @__PURE__ */ import_react11.default.createElement(import_react_native10.View, { style: styles8.severityRow }, [
14813
15039
  { sev: "critical", color: "#ef4444" },
14814
15040
  { sev: "high", color: "#f97316" },
14815
15041
  { sev: "medium", color: "#eab308" },
14816
15042
  { sev: "low", color: "#6b7280" }
14817
- ].map(({ sev, color }) => /* @__PURE__ */ import_react10.default.createElement(
14818
- import_react_native9.TouchableOpacity,
15043
+ ].map(({ sev, color }) => /* @__PURE__ */ import_react11.default.createElement(
15044
+ import_react_native10.TouchableOpacity,
14819
15045
  {
14820
15046
  key: sev,
14821
- style: [styles7.sevButton, severity === sev && { backgroundColor: `${color}30`, borderColor: color }],
15047
+ style: [styles8.sevButton, severity === sev && { backgroundColor: `${color}30`, borderColor: color }],
14822
15048
  onPress: () => setSeverity(sev)
14823
15049
  },
14824
- /* @__PURE__ */ import_react10.default.createElement(import_react_native9.Text, { style: [styles7.sevText, severity === sev && { color }] }, sev)
14825
- )))), /* @__PURE__ */ import_react10.default.createElement(import_react_native9.View, { style: styles7.section }, /* @__PURE__ */ import_react10.default.createElement(import_react_native9.Text, { style: shared.label }, "What happened?"), /* @__PURE__ */ import_react10.default.createElement(
14826
- import_react_native9.TextInput,
15050
+ /* @__PURE__ */ import_react11.default.createElement(import_react_native10.Text, { style: [styles8.sevText, severity === sev && { color }] }, sev)
15051
+ )))), isBugType && /* @__PURE__ */ import_react11.default.createElement(import_react_native10.View, { style: styles8.section }, /* @__PURE__ */ import_react11.default.createElement(import_react_native10.Text, { style: shared.label }, "Category (optional)"), /* @__PURE__ */ import_react11.default.createElement(CategoryPicker, { value: category, onChange: setCategory, optional: true })), /* @__PURE__ */ import_react11.default.createElement(import_react_native10.View, { style: styles8.section }, /* @__PURE__ */ import_react11.default.createElement(import_react_native10.Text, { style: shared.label }, "What happened?"), /* @__PURE__ */ import_react11.default.createElement(
15052
+ import_react_native10.TextInput,
14827
15053
  {
14828
- style: styles7.descInput,
15054
+ style: styles8.descInput,
14829
15055
  value: description,
14830
15056
  onChangeText: setDescription,
14831
15057
  placeholder: "Describe the issue...",
@@ -14834,16 +15060,16 @@ function ReportScreen({ nav, prefill }) {
14834
15060
  numberOfLines: 4,
14835
15061
  textAlignVertical: "top"
14836
15062
  }
14837
- )), isBugType && /* @__PURE__ */ import_react10.default.createElement(import_react_native9.View, { style: styles7.section }, /* @__PURE__ */ import_react10.default.createElement(import_react_native9.Text, { style: shared.label }, "Which screen?"), /* @__PURE__ */ import_react10.default.createElement(
14838
- import_react_native9.TextInput,
15063
+ )), isBugType && /* @__PURE__ */ import_react11.default.createElement(import_react_native10.View, { style: styles8.section }, /* @__PURE__ */ import_react11.default.createElement(import_react_native10.Text, { style: shared.label }, "Which screen?"), /* @__PURE__ */ import_react11.default.createElement(
15064
+ import_react_native10.TextInput,
14839
15065
  {
14840
- style: styles7.screenInput,
15066
+ style: styles8.screenInput,
14841
15067
  value: affectedScreen,
14842
15068
  onChangeText: setAffectedScreen,
14843
15069
  placeholder: "e.g. Reservations, Settings...",
14844
15070
  placeholderTextColor: colors.textMuted
14845
15071
  }
14846
- ), /* @__PURE__ */ import_react10.default.createElement(import_react_native9.Text, { style: styles7.screenHint }, "Which screen or area was the bug on? (optional)")), /* @__PURE__ */ import_react10.default.createElement(
15072
+ ), /* @__PURE__ */ import_react11.default.createElement(import_react_native10.Text, { style: styles8.screenHint }, "Which screen or area was the bug on? (optional)")), /* @__PURE__ */ import_react11.default.createElement(
14847
15073
  ImagePickerButtons,
14848
15074
  {
14849
15075
  images: images.images,
@@ -14853,17 +15079,17 @@ function ReportScreen({ nav, prefill }) {
14853
15079
  onRemove: images.removeImage,
14854
15080
  label: "Screenshots (optional)"
14855
15081
  }
14856
- ), error && /* @__PURE__ */ import_react10.default.createElement(import_react_native9.View, { style: styles7.errorBanner }, /* @__PURE__ */ import_react10.default.createElement(import_react_native9.Text, { style: styles7.errorText }, error)), /* @__PURE__ */ import_react10.default.createElement(
14857
- import_react_native9.TouchableOpacity,
15082
+ ), error && /* @__PURE__ */ import_react11.default.createElement(import_react_native10.View, { style: styles8.errorBanner }, /* @__PURE__ */ import_react11.default.createElement(import_react_native10.Text, { style: styles8.errorText }, error)), /* @__PURE__ */ import_react11.default.createElement(
15083
+ import_react_native10.TouchableOpacity,
14858
15084
  {
14859
15085
  style: [shared.primaryButton, (!description.trim() || submitting || images.isUploading) && shared.primaryButtonDisabled, { marginTop: 20 }],
14860
15086
  onPress: handleSubmit,
14861
15087
  disabled: !description.trim() || submitting || images.isUploading
14862
15088
  },
14863
- /* @__PURE__ */ import_react10.default.createElement(import_react_native9.Text, { style: shared.primaryButtonText }, images.isUploading ? "Uploading images..." : submitting ? "Submitting..." : error ? "Retry" : "Submit Report")
15089
+ /* @__PURE__ */ import_react11.default.createElement(import_react_native10.Text, { style: shared.primaryButtonText }, images.isUploading ? "Uploading images..." : submitting ? "Submitting..." : error ? "Retry" : "Submit Report")
14864
15090
  )));
14865
15091
  }
14866
- var styles7 = import_react_native9.StyleSheet.create({
15092
+ var styles8 = import_react_native10.StyleSheet.create({
14867
15093
  typeRow: { flexDirection: "row", gap: 10, marginBottom: 20 },
14868
15094
  typeCard: { flex: 1, alignItems: "center", paddingVertical: 16, borderRadius: 12, backgroundColor: colors.card, borderWidth: 1, borderColor: colors.border },
14869
15095
  typeCardActive: { borderColor: colors.blue, backgroundColor: "#172554" },
@@ -14887,16 +15113,16 @@ var styles7 = import_react_native9.StyleSheet.create({
14887
15113
  });
14888
15114
 
14889
15115
  // src/widget/screens/ReportSuccessScreen.tsx
14890
- var import_react11 = __toESM(require("react"));
14891
- var import_react_native10 = require("react-native");
15116
+ var import_react12 = __toESM(require("react"));
15117
+ var import_react_native11 = require("react-native");
14892
15118
  function ReportSuccessScreen({ nav }) {
14893
- (0, import_react11.useEffect)(() => {
15119
+ (0, import_react12.useEffect)(() => {
14894
15120
  const timer = setTimeout(() => nav.reset(), 2e3);
14895
15121
  return () => clearTimeout(timer);
14896
15122
  }, [nav]);
14897
- return /* @__PURE__ */ import_react11.default.createElement(import_react_native10.View, { style: styles8.container }, /* @__PURE__ */ import_react11.default.createElement(import_react_native10.Text, { style: styles8.emoji }, "\u{1F389}"), /* @__PURE__ */ import_react11.default.createElement(import_react_native10.Text, { style: styles8.title }, "Report submitted!"), /* @__PURE__ */ import_react11.default.createElement(import_react_native10.Text, { style: styles8.subtitle }, "Thank you for your feedback"));
15123
+ return /* @__PURE__ */ import_react12.default.createElement(import_react_native11.View, { style: styles9.container }, /* @__PURE__ */ import_react12.default.createElement(import_react_native11.Text, { style: styles9.emoji }, "\u{1F389}"), /* @__PURE__ */ import_react12.default.createElement(import_react_native11.Text, { style: styles9.title }, "Report submitted!"), /* @__PURE__ */ import_react12.default.createElement(import_react_native11.Text, { style: styles9.subtitle }, "Thank you for your feedback"));
14898
15124
  }
14899
- var styles8 = import_react_native10.StyleSheet.create({
15125
+ var styles9 = import_react_native11.StyleSheet.create({
14900
15126
  container: { alignItems: "center", paddingVertical: 60 },
14901
15127
  emoji: { fontSize: 48, marginBottom: 16 },
14902
15128
  title: { fontSize: 22, fontWeight: "700", color: colors.textPrimary, marginBottom: 6 },
@@ -14904,29 +15130,29 @@ var styles8 = import_react_native10.StyleSheet.create({
14904
15130
  });
14905
15131
 
14906
15132
  // src/widget/screens/MessageListScreen.tsx
14907
- var import_react12 = __toESM(require("react"));
14908
- var import_react_native11 = require("react-native");
15133
+ var import_react13 = __toESM(require("react"));
15134
+ var import_react_native12 = require("react-native");
14909
15135
  function MessageListScreen({ nav }) {
14910
15136
  const { threads, unreadCount, refreshThreads } = useBugBear();
14911
- return /* @__PURE__ */ import_react12.default.createElement(import_react_native11.View, null, /* @__PURE__ */ import_react12.default.createElement(
14912
- import_react_native11.TouchableOpacity,
15137
+ return /* @__PURE__ */ import_react13.default.createElement(import_react_native12.View, null, /* @__PURE__ */ import_react13.default.createElement(
15138
+ import_react_native12.TouchableOpacity,
14913
15139
  {
14914
- style: styles9.newMsgButton,
15140
+ style: styles10.newMsgButton,
14915
15141
  onPress: () => nav.push({ name: "COMPOSE_MESSAGE" })
14916
15142
  },
14917
- /* @__PURE__ */ import_react12.default.createElement(import_react_native11.Text, { style: styles9.newMsgText }, "\u2709\uFE0F New Message")
14918
- ), threads.length === 0 ? /* @__PURE__ */ import_react12.default.createElement(import_react_native11.View, { style: shared.emptyState }, /* @__PURE__ */ import_react12.default.createElement(import_react_native11.Text, { style: shared.emptyEmoji }, "\u{1F4AC}"), /* @__PURE__ */ import_react12.default.createElement(import_react_native11.Text, { style: shared.emptyTitle }, "No messages yet"), /* @__PURE__ */ import_react12.default.createElement(import_react_native11.Text, { style: shared.emptySubtitle }, "Start a conversation or wait for messages from admins")) : /* @__PURE__ */ import_react12.default.createElement(import_react_native11.View, null, threads.map((thread) => /* @__PURE__ */ import_react12.default.createElement(
14919
- import_react_native11.TouchableOpacity,
15143
+ /* @__PURE__ */ import_react13.default.createElement(import_react_native12.Text, { style: styles10.newMsgText }, "\u2709\uFE0F New Message")
15144
+ ), threads.length === 0 ? /* @__PURE__ */ import_react13.default.createElement(import_react_native12.View, { style: shared.emptyState }, /* @__PURE__ */ import_react13.default.createElement(import_react_native12.Text, { style: shared.emptyEmoji }, "\u{1F4AC}"), /* @__PURE__ */ import_react13.default.createElement(import_react_native12.Text, { style: shared.emptyTitle }, "No messages yet"), /* @__PURE__ */ import_react13.default.createElement(import_react_native12.Text, { style: shared.emptySubtitle }, "Start a conversation or wait for messages from admins")) : /* @__PURE__ */ import_react13.default.createElement(import_react_native12.View, null, threads.map((thread) => /* @__PURE__ */ import_react13.default.createElement(
15145
+ import_react_native12.TouchableOpacity,
14920
15146
  {
14921
15147
  key: thread.id,
14922
- style: [styles9.threadItem, thread.unreadCount > 0 && styles9.threadItemUnread],
15148
+ style: [styles10.threadItem, thread.unreadCount > 0 && styles10.threadItemUnread],
14923
15149
  onPress: () => nav.push({ name: "THREAD_DETAIL", thread })
14924
15150
  },
14925
- /* @__PURE__ */ import_react12.default.createElement(import_react_native11.View, { style: styles9.threadLeft }, /* @__PURE__ */ import_react12.default.createElement(import_react_native11.Text, { style: styles9.threadIcon }, getThreadTypeIcon(thread.threadType)), /* @__PURE__ */ import_react12.default.createElement(import_react_native11.View, { style: styles9.threadInfo }, /* @__PURE__ */ import_react12.default.createElement(import_react_native11.View, { style: styles9.threadTitleRow }, thread.isPinned && /* @__PURE__ */ import_react12.default.createElement(import_react_native11.Text, { style: styles9.pinIcon }, "\u{1F4CC}"), /* @__PURE__ */ import_react12.default.createElement(import_react_native11.Text, { style: styles9.threadSubject, numberOfLines: 1 }, thread.subject || "No subject")), thread.lastMessage && /* @__PURE__ */ import_react12.default.createElement(import_react_native11.Text, { style: styles9.threadPreview, numberOfLines: 1 }, thread.lastMessage.senderName, ": ", thread.lastMessage.content))),
14926
- /* @__PURE__ */ import_react12.default.createElement(import_react_native11.View, { style: styles9.threadRight }, /* @__PURE__ */ import_react12.default.createElement(import_react_native11.Text, { style: styles9.threadTime }, formatRelativeTime(thread.lastMessageAt)), thread.unreadCount > 0 && /* @__PURE__ */ import_react12.default.createElement(import_react_native11.View, { style: styles9.unreadBadge }, /* @__PURE__ */ import_react12.default.createElement(import_react_native11.Text, { style: styles9.unreadText }, thread.unreadCount)), thread.priority !== "normal" && /* @__PURE__ */ import_react12.default.createElement(import_react_native11.View, { style: [styles9.priorityDot, { backgroundColor: getPriorityColor(thread.priority) }] }))
14927
- ))), /* @__PURE__ */ import_react12.default.createElement(import_react_native11.View, { style: styles9.footer }, /* @__PURE__ */ import_react12.default.createElement(import_react_native11.Text, { style: styles9.footerText }, threads.length, " thread", threads.length !== 1 ? "s" : "", " \xB7 ", unreadCount, " unread"), /* @__PURE__ */ import_react12.default.createElement(import_react_native11.TouchableOpacity, { onPress: refreshThreads }, /* @__PURE__ */ import_react12.default.createElement(import_react_native11.Text, { style: styles9.refreshText }, "\u21BB Refresh"))));
15151
+ /* @__PURE__ */ import_react13.default.createElement(import_react_native12.View, { style: styles10.threadLeft }, /* @__PURE__ */ import_react13.default.createElement(import_react_native12.Text, { style: styles10.threadIcon }, getThreadTypeIcon(thread.threadType)), /* @__PURE__ */ import_react13.default.createElement(import_react_native12.View, { style: styles10.threadInfo }, /* @__PURE__ */ import_react13.default.createElement(import_react_native12.View, { style: styles10.threadTitleRow }, thread.isPinned && /* @__PURE__ */ import_react13.default.createElement(import_react_native12.Text, { style: styles10.pinIcon }, "\u{1F4CC}"), /* @__PURE__ */ import_react13.default.createElement(import_react_native12.Text, { style: styles10.threadSubject, numberOfLines: 1 }, thread.subject || "No subject")), thread.lastMessage && /* @__PURE__ */ import_react13.default.createElement(import_react_native12.Text, { style: styles10.threadPreview, numberOfLines: 1 }, thread.lastMessage.senderName, ": ", thread.lastMessage.content))),
15152
+ /* @__PURE__ */ import_react13.default.createElement(import_react_native12.View, { style: styles10.threadRight }, /* @__PURE__ */ import_react13.default.createElement(import_react_native12.Text, { style: styles10.threadTime }, formatRelativeTime(thread.lastMessageAt)), thread.unreadCount > 0 && /* @__PURE__ */ import_react13.default.createElement(import_react_native12.View, { style: styles10.unreadBadge }, /* @__PURE__ */ import_react13.default.createElement(import_react_native12.Text, { style: styles10.unreadText }, thread.unreadCount)), thread.priority !== "normal" && /* @__PURE__ */ import_react13.default.createElement(import_react_native12.View, { style: [styles10.priorityDot, { backgroundColor: getPriorityColor(thread.priority) }] }))
15153
+ ))), /* @__PURE__ */ import_react13.default.createElement(import_react_native12.View, { style: styles10.footer }, /* @__PURE__ */ import_react13.default.createElement(import_react_native12.Text, { style: styles10.footerText }, threads.length, " thread", threads.length !== 1 ? "s" : "", " \xB7 ", unreadCount, " unread"), /* @__PURE__ */ import_react13.default.createElement(import_react_native12.TouchableOpacity, { onPress: refreshThreads }, /* @__PURE__ */ import_react13.default.createElement(import_react_native12.Text, { style: styles10.refreshText }, "\u21BB Refresh"))));
14928
15154
  }
14929
- var styles9 = import_react_native11.StyleSheet.create({
15155
+ var styles10 = import_react_native12.StyleSheet.create({
14930
15156
  newMsgButton: { backgroundColor: colors.blue, paddingVertical: 12, borderRadius: 12, alignItems: "center", marginBottom: 16 },
14931
15157
  newMsgText: { fontSize: 15, fontWeight: "600", color: "#fff" },
14932
15158
  threadItem: { flexDirection: "row", justifyContent: "space-between", paddingVertical: 12, paddingHorizontal: 12, borderRadius: 10, marginBottom: 4, backgroundColor: colors.card },
@@ -14949,17 +15175,17 @@ var styles9 = import_react_native11.StyleSheet.create({
14949
15175
  });
14950
15176
 
14951
15177
  // src/widget/screens/ThreadDetailScreen.tsx
14952
- var import_react13 = __toESM(require("react"));
14953
- var import_react_native12 = require("react-native");
15178
+ var import_react14 = __toESM(require("react"));
15179
+ var import_react_native13 = require("react-native");
14954
15180
  function ThreadDetailScreen({ thread, nav }) {
14955
15181
  const { getThreadMessages, sendMessage, markAsRead, uploadImage } = useBugBear();
14956
- const [messages, setMessages] = (0, import_react13.useState)([]);
14957
- const [loading, setLoading] = (0, import_react13.useState)(true);
14958
- const [replyText, setReplyText] = (0, import_react13.useState)("");
14959
- const [sending, setSending] = (0, import_react13.useState)(false);
14960
- const [sendError, setSendError] = (0, import_react13.useState)(false);
15182
+ const [messages, setMessages] = (0, import_react14.useState)([]);
15183
+ const [loading, setLoading] = (0, import_react14.useState)(true);
15184
+ const [replyText, setReplyText] = (0, import_react14.useState)("");
15185
+ const [sending, setSending] = (0, import_react14.useState)(false);
15186
+ const [sendError, setSendError] = (0, import_react14.useState)(false);
14961
15187
  const replyImages = useImageAttachments(uploadImage, 3, "discussion-attachments");
14962
- (0, import_react13.useEffect)(() => {
15188
+ (0, import_react14.useEffect)(() => {
14963
15189
  (async () => {
14964
15190
  setLoading(true);
14965
15191
  const msgs = await getThreadMessages(thread.id);
@@ -14971,7 +15197,7 @@ function ThreadDetailScreen({ thread, nav }) {
14971
15197
  })();
14972
15198
  }, [thread.id]);
14973
15199
  const handleSend = async () => {
14974
- if (!replyText.trim()) return;
15200
+ if (!replyText.trim() && replyImages.images.length === 0 || sending || replyImages.isUploading) return;
14975
15201
  setSending(true);
14976
15202
  setSendError(false);
14977
15203
  const attachments = replyImages.getAttachments();
@@ -14991,20 +15217,20 @@ function ThreadDetailScreen({ thread, nav }) {
14991
15217
  }
14992
15218
  setSending(false);
14993
15219
  };
14994
- return /* @__PURE__ */ import_react13.default.createElement(import_react_native12.View, { style: styles10.container }, /* @__PURE__ */ import_react13.default.createElement(import_react_native12.View, { style: styles10.header }, /* @__PURE__ */ import_react13.default.createElement(import_react_native12.Text, { style: styles10.headerIcon }, getThreadTypeIcon(thread.threadType)), /* @__PURE__ */ import_react13.default.createElement(import_react_native12.Text, { style: styles10.headerSubject, numberOfLines: 2 }, thread.subject || "No subject")), loading ? /* @__PURE__ */ import_react13.default.createElement(import_react_native12.View, { style: styles10.loadingContainer }, /* @__PURE__ */ import_react13.default.createElement(import_react_native12.Text, { style: styles10.loadingText }, "Loading messages...")) : /* @__PURE__ */ import_react13.default.createElement(import_react_native12.View, { style: styles10.messagesContainer }, messages.map((msg) => /* @__PURE__ */ import_react13.default.createElement(
14995
- import_react_native12.View,
15220
+ return /* @__PURE__ */ import_react14.default.createElement(import_react_native13.View, { style: styles11.container }, /* @__PURE__ */ import_react14.default.createElement(import_react_native13.View, { style: styles11.header }, /* @__PURE__ */ import_react14.default.createElement(import_react_native13.Text, { style: styles11.headerIcon }, getThreadTypeIcon(thread.threadType)), /* @__PURE__ */ import_react14.default.createElement(import_react_native13.Text, { style: styles11.headerSubject, numberOfLines: 2 }, thread.subject || "No subject")), loading ? /* @__PURE__ */ import_react14.default.createElement(import_react_native13.View, { style: styles11.loadingContainer }, /* @__PURE__ */ import_react14.default.createElement(import_react_native13.Text, { style: styles11.loadingText }, "Loading messages...")) : /* @__PURE__ */ import_react14.default.createElement(import_react_native13.View, { style: styles11.messagesContainer }, messages.map((msg) => /* @__PURE__ */ import_react14.default.createElement(
15221
+ import_react_native13.View,
14996
15222
  {
14997
15223
  key: msg.id,
14998
- style: [styles10.bubble, msg.senderType === "tester" ? styles10.bubbleTester : styles10.bubbleAdmin]
15224
+ style: [styles11.bubble, msg.senderType === "tester" ? styles11.bubbleTester : styles11.bubbleAdmin]
14999
15225
  },
15000
- /* @__PURE__ */ import_react13.default.createElement(import_react_native12.Text, { style: [styles10.sender, msg.senderType === "tester" && styles10.senderTester] }, msg.senderType === "tester" ? "You" : msg.senderName),
15001
- /* @__PURE__ */ import_react13.default.createElement(import_react_native12.Text, { style: [styles10.content, msg.senderType === "tester" && styles10.contentTester] }, msg.content),
15002
- msg.attachments && msg.attachments.length > 0 && /* @__PURE__ */ import_react13.default.createElement(import_react_native12.View, { style: styles10.attachments }, msg.attachments.filter((a) => a.type === "image").map((att, idx) => /* @__PURE__ */ import_react13.default.createElement(import_react_native12.Image, { key: idx, source: { uri: att.url }, style: styles10.attachmentImage, resizeMode: "cover" }))),
15003
- /* @__PURE__ */ import_react13.default.createElement(import_react_native12.Text, { style: [styles10.time, msg.senderType === "tester" && styles10.timeTester] }, formatMessageTime(msg.createdAt))
15004
- ))), sendError && /* @__PURE__ */ import_react13.default.createElement(import_react_native12.View, { style: styles10.errorBar }, /* @__PURE__ */ import_react13.default.createElement(import_react_native12.Text, { style: styles10.errorText }, "Failed to send. Tap Send to retry.")), replyImages.images.length > 0 && /* @__PURE__ */ import_react13.default.createElement(import_react_native12.View, { style: styles10.replyPreview }, /* @__PURE__ */ import_react13.default.createElement(ImagePreviewStrip, { images: replyImages.images, onRemove: replyImages.removeImage })), /* @__PURE__ */ import_react13.default.createElement(import_react_native12.View, { style: styles10.composer }, IMAGE_PICKER_AVAILABLE && /* @__PURE__ */ import_react13.default.createElement(import_react_native12.TouchableOpacity, { style: styles10.attachBtn, onPress: replyImages.pickFromGallery, disabled: replyImages.images.length >= 3 }, /* @__PURE__ */ import_react13.default.createElement(import_react_native12.Text, { style: styles10.attachBtnText }, "\u{1F4CE}")), /* @__PURE__ */ import_react13.default.createElement(
15005
- import_react_native12.TextInput,
15226
+ /* @__PURE__ */ import_react14.default.createElement(import_react_native13.Text, { style: [styles11.sender, msg.senderType === "tester" && styles11.senderTester] }, msg.senderType === "tester" ? "You" : msg.senderName),
15227
+ /* @__PURE__ */ import_react14.default.createElement(import_react_native13.Text, { style: [styles11.content, msg.senderType === "tester" && styles11.contentTester] }, msg.content),
15228
+ msg.attachments && msg.attachments.length > 0 && /* @__PURE__ */ import_react14.default.createElement(import_react_native13.View, { style: styles11.attachments }, msg.attachments.filter((a) => a.type === "image").map((att, idx) => /* @__PURE__ */ import_react14.default.createElement(import_react_native13.Image, { key: idx, source: { uri: att.url }, style: styles11.attachmentImage, resizeMode: "cover" }))),
15229
+ /* @__PURE__ */ import_react14.default.createElement(import_react_native13.Text, { style: [styles11.time, msg.senderType === "tester" && styles11.timeTester] }, formatMessageTime(msg.createdAt))
15230
+ ))), sendError && /* @__PURE__ */ import_react14.default.createElement(import_react_native13.View, { style: styles11.errorBar }, /* @__PURE__ */ import_react14.default.createElement(import_react_native13.Text, { style: styles11.errorText }, "Failed to send. Tap Send to retry.")), replyImages.images.length > 0 && /* @__PURE__ */ import_react14.default.createElement(import_react_native13.View, { style: styles11.replyPreview }, /* @__PURE__ */ import_react14.default.createElement(ImagePreviewStrip, { images: replyImages.images, onRemove: replyImages.removeImage })), /* @__PURE__ */ import_react14.default.createElement(import_react_native13.View, { style: styles11.composer }, IMAGE_PICKER_AVAILABLE && /* @__PURE__ */ import_react14.default.createElement(import_react_native13.TouchableOpacity, { style: styles11.attachBtn, onPress: replyImages.pickFromGallery, disabled: replyImages.images.length >= 3 }, /* @__PURE__ */ import_react14.default.createElement(import_react_native13.Text, { style: styles11.attachBtnText }, "\u{1F4CE}")), /* @__PURE__ */ import_react14.default.createElement(
15231
+ import_react_native13.TextInput,
15006
15232
  {
15007
- style: styles10.replyInput,
15233
+ style: styles11.replyInput,
15008
15234
  value: replyText,
15009
15235
  onChangeText: setReplyText,
15010
15236
  placeholder: "Type a reply...",
@@ -15012,17 +15238,17 @@ function ThreadDetailScreen({ thread, nav }) {
15012
15238
  multiline: true,
15013
15239
  maxLength: 1e3
15014
15240
  }
15015
- ), /* @__PURE__ */ import_react13.default.createElement(
15016
- import_react_native12.TouchableOpacity,
15241
+ ), /* @__PURE__ */ import_react14.default.createElement(
15242
+ import_react_native13.TouchableOpacity,
15017
15243
  {
15018
- style: [styles10.sendBtn, (!replyText.trim() || sending || replyImages.isUploading) && styles10.sendBtnDisabled],
15244
+ style: [styles11.sendBtn, (!replyText.trim() || sending || replyImages.isUploading) && styles11.sendBtnDisabled],
15019
15245
  onPress: handleSend,
15020
15246
  disabled: !replyText.trim() || sending || replyImages.isUploading
15021
15247
  },
15022
- /* @__PURE__ */ import_react13.default.createElement(import_react_native12.Text, { style: styles10.sendBtnText }, sending ? "..." : "Send")
15248
+ /* @__PURE__ */ import_react14.default.createElement(import_react_native13.Text, { style: styles11.sendBtnText }, sending ? "..." : "Send")
15023
15249
  )));
15024
15250
  }
15025
- var styles10 = import_react_native12.StyleSheet.create({
15251
+ var styles11 = import_react_native13.StyleSheet.create({
15026
15252
  container: { flex: 1 },
15027
15253
  header: { flexDirection: "row", alignItems: "center", gap: 8, marginBottom: 16, paddingBottom: 12, borderBottomWidth: 1, borderBottomColor: colors.border },
15028
15254
  headerIcon: { fontSize: 20 },
@@ -15054,13 +15280,13 @@ var styles10 = import_react_native12.StyleSheet.create({
15054
15280
  });
15055
15281
 
15056
15282
  // src/widget/screens/ComposeMessageScreen.tsx
15057
- var import_react14 = __toESM(require("react"));
15058
- var import_react_native13 = require("react-native");
15283
+ var import_react15 = __toESM(require("react"));
15284
+ var import_react_native14 = require("react-native");
15059
15285
  function ComposeMessageScreen({ nav }) {
15060
15286
  const { createThread, uploadImage } = useBugBear();
15061
- const [subject, setSubject] = (0, import_react14.useState)("");
15062
- const [message, setMessage] = (0, import_react14.useState)("");
15063
- const [sending, setSending] = (0, import_react14.useState)(false);
15287
+ const [subject, setSubject] = (0, import_react15.useState)("");
15288
+ const [message, setMessage] = (0, import_react15.useState)("");
15289
+ const [sending, setSending] = (0, import_react15.useState)(false);
15064
15290
  const images = useImageAttachments(uploadImage, 3, "discussion-attachments");
15065
15291
  const handleSend = async () => {
15066
15292
  if (!subject.trim() || !message.trim()) return;
@@ -15076,20 +15302,20 @@ function ComposeMessageScreen({ nav }) {
15076
15302
  nav.pop();
15077
15303
  }
15078
15304
  };
15079
- return /* @__PURE__ */ import_react14.default.createElement(import_react_native13.View, null, /* @__PURE__ */ import_react14.default.createElement(import_react_native13.View, { style: styles11.header }, /* @__PURE__ */ import_react14.default.createElement(import_react_native13.Text, { style: styles11.title }, "New Message"), /* @__PURE__ */ import_react14.default.createElement(import_react_native13.Text, { style: styles11.subtitle }, "Send a message to the QA team")), /* @__PURE__ */ import_react14.default.createElement(import_react_native13.View, { style: styles11.form }, /* @__PURE__ */ import_react14.default.createElement(import_react_native13.Text, { style: shared.label }, "Subject"), /* @__PURE__ */ import_react14.default.createElement(
15080
- import_react_native13.TextInput,
15305
+ return /* @__PURE__ */ import_react15.default.createElement(import_react_native14.View, null, /* @__PURE__ */ import_react15.default.createElement(import_react_native14.View, { style: styles12.header }, /* @__PURE__ */ import_react15.default.createElement(import_react_native14.Text, { style: styles12.title }, "New Message"), /* @__PURE__ */ import_react15.default.createElement(import_react_native14.Text, { style: styles12.subtitle }, "Send a message to the QA team")), /* @__PURE__ */ import_react15.default.createElement(import_react_native14.View, { style: styles12.form }, /* @__PURE__ */ import_react15.default.createElement(import_react_native14.Text, { style: shared.label }, "Subject"), /* @__PURE__ */ import_react15.default.createElement(
15306
+ import_react_native14.TextInput,
15081
15307
  {
15082
- style: styles11.subjectInput,
15308
+ style: styles12.subjectInput,
15083
15309
  value: subject,
15084
15310
  onChangeText: setSubject,
15085
15311
  placeholder: "What's this about?",
15086
15312
  placeholderTextColor: colors.textMuted,
15087
15313
  maxLength: 100
15088
15314
  }
15089
- ), /* @__PURE__ */ import_react14.default.createElement(import_react_native13.Text, { style: [shared.label, { marginTop: 16 }] }, "Message"), /* @__PURE__ */ import_react14.default.createElement(
15090
- import_react_native13.TextInput,
15315
+ ), /* @__PURE__ */ import_react15.default.createElement(import_react_native14.Text, { style: [shared.label, { marginTop: 16 }] }, "Message"), /* @__PURE__ */ import_react15.default.createElement(
15316
+ import_react_native14.TextInput,
15091
15317
  {
15092
- style: styles11.messageInput,
15318
+ style: styles12.messageInput,
15093
15319
  value: message,
15094
15320
  onChangeText: setMessage,
15095
15321
  placeholder: "Write your message...",
@@ -15099,7 +15325,7 @@ function ComposeMessageScreen({ nav }) {
15099
15325
  textAlignVertical: "top",
15100
15326
  maxLength: 2e3
15101
15327
  }
15102
- ), /* @__PURE__ */ import_react14.default.createElement(
15328
+ ), /* @__PURE__ */ import_react15.default.createElement(
15103
15329
  ImagePickerButtons,
15104
15330
  {
15105
15331
  images: images.images,
@@ -15108,17 +15334,17 @@ function ComposeMessageScreen({ nav }) {
15108
15334
  onPickCamera: images.pickFromCamera,
15109
15335
  onRemove: images.removeImage
15110
15336
  }
15111
- ), /* @__PURE__ */ import_react14.default.createElement(
15112
- import_react_native13.TouchableOpacity,
15337
+ ), /* @__PURE__ */ import_react15.default.createElement(
15338
+ import_react_native14.TouchableOpacity,
15113
15339
  {
15114
15340
  style: [shared.primaryButton, (!subject.trim() || !message.trim() || sending || images.isUploading) && shared.primaryButtonDisabled, { marginTop: 20 }],
15115
15341
  onPress: handleSend,
15116
15342
  disabled: !subject.trim() || !message.trim() || sending || images.isUploading
15117
15343
  },
15118
- /* @__PURE__ */ import_react14.default.createElement(import_react_native13.Text, { style: shared.primaryButtonText }, images.isUploading ? "Uploading..." : sending ? "Sending..." : "Send Message")
15344
+ /* @__PURE__ */ import_react15.default.createElement(import_react_native14.Text, { style: shared.primaryButtonText }, images.isUploading ? "Uploading..." : sending ? "Sending..." : "Send Message")
15119
15345
  )));
15120
15346
  }
15121
- var styles11 = import_react_native13.StyleSheet.create({
15347
+ var styles12 = import_react_native14.StyleSheet.create({
15122
15348
  header: { marginBottom: 20 },
15123
15349
  title: { fontSize: 20, fontWeight: "600", color: colors.textPrimary, marginBottom: 4 },
15124
15350
  subtitle: { fontSize: 14, color: colors.textMuted },
@@ -15128,20 +15354,20 @@ var styles11 = import_react_native13.StyleSheet.create({
15128
15354
  });
15129
15355
 
15130
15356
  // src/widget/screens/ProfileScreen.tsx
15131
- var import_react15 = __toESM(require("react"));
15132
- var import_react_native14 = require("react-native");
15357
+ var import_react16 = __toESM(require("react"));
15358
+ var import_react_native15 = require("react-native");
15133
15359
  function ProfileScreen({ nav }) {
15134
15360
  const { testerInfo, assignments, updateTesterProfile, refreshTesterInfo } = useBugBear();
15135
- const [editing, setEditing] = (0, import_react15.useState)(false);
15136
- const [name, setName] = (0, import_react15.useState)(testerInfo?.name || "");
15137
- const [additionalEmails, setAdditionalEmails] = (0, import_react15.useState)(testerInfo?.additionalEmails || []);
15138
- const [newEmailInput, setNewEmailInput] = (0, import_react15.useState)("");
15139
- const [platforms, setPlatforms] = (0, import_react15.useState)(testerInfo?.platforms || []);
15140
- const [saving, setSaving] = (0, import_react15.useState)(false);
15141
- const [saved, setSaved] = (0, import_react15.useState)(false);
15142
- const [showDetails, setShowDetails] = (0, import_react15.useState)(false);
15361
+ const [editing, setEditing] = (0, import_react16.useState)(false);
15362
+ const [name, setName] = (0, import_react16.useState)(testerInfo?.name || "");
15363
+ const [additionalEmails, setAdditionalEmails] = (0, import_react16.useState)(testerInfo?.additionalEmails || []);
15364
+ const [newEmailInput, setNewEmailInput] = (0, import_react16.useState)("");
15365
+ const [platforms, setPlatforms] = (0, import_react16.useState)(testerInfo?.platforms || []);
15366
+ const [saving, setSaving] = (0, import_react16.useState)(false);
15367
+ const [saved, setSaved] = (0, import_react16.useState)(false);
15368
+ const [showDetails, setShowDetails] = (0, import_react16.useState)(false);
15143
15369
  const completedCount = assignments.filter((a) => a.status === "passed" || a.status === "failed").length;
15144
- (0, import_react15.useEffect)(() => {
15370
+ (0, import_react16.useEffect)(() => {
15145
15371
  if (testerInfo) {
15146
15372
  setName(testerInfo.name);
15147
15373
  setAdditionalEmails(testerInfo.additionalEmails || []);
@@ -15175,19 +15401,19 @@ function ProfileScreen({ nav }) {
15175
15401
  }
15176
15402
  };
15177
15403
  if (saved) {
15178
- return /* @__PURE__ */ import_react15.default.createElement(import_react_native14.View, { style: shared.emptyState }, /* @__PURE__ */ import_react15.default.createElement(import_react_native14.Text, { style: shared.emptyEmoji }, "\u2705"), /* @__PURE__ */ import_react15.default.createElement(import_react_native14.Text, { style: shared.emptyTitle }, "Profile saved!"));
15404
+ return /* @__PURE__ */ import_react16.default.createElement(import_react_native15.View, { style: shared.emptyState }, /* @__PURE__ */ import_react16.default.createElement(import_react_native15.Text, { style: shared.emptyEmoji }, "\u2705"), /* @__PURE__ */ import_react16.default.createElement(import_react_native15.Text, { style: shared.emptyTitle }, "Profile saved!"));
15179
15405
  }
15180
15406
  if (!testerInfo) {
15181
- return /* @__PURE__ */ import_react15.default.createElement(import_react_native14.View, { style: shared.emptyState }, /* @__PURE__ */ import_react15.default.createElement(import_react_native14.Text, { style: shared.emptyEmoji }, "\u{1F464}"), /* @__PURE__ */ import_react15.default.createElement(import_react_native14.Text, { style: shared.emptyTitle }, "No profile found"));
15407
+ return /* @__PURE__ */ import_react16.default.createElement(import_react_native15.View, { style: shared.emptyState }, /* @__PURE__ */ import_react16.default.createElement(import_react_native15.Text, { style: shared.emptyEmoji }, "\u{1F464}"), /* @__PURE__ */ import_react16.default.createElement(import_react_native15.Text, { style: shared.emptyTitle }, "No profile found"));
15182
15408
  }
15183
15409
  if (editing) {
15184
- return /* @__PURE__ */ import_react15.default.createElement(import_react_native14.View, null, /* @__PURE__ */ import_react15.default.createElement(import_react_native14.View, { style: styles12.editHeader }, /* @__PURE__ */ import_react15.default.createElement(import_react_native14.Text, { style: styles12.editTitle }, "Edit Profile"), /* @__PURE__ */ import_react15.default.createElement(import_react_native14.TouchableOpacity, { onPress: () => {
15410
+ return /* @__PURE__ */ import_react16.default.createElement(import_react_native15.View, null, /* @__PURE__ */ import_react16.default.createElement(import_react_native15.View, { style: styles13.editHeader }, /* @__PURE__ */ import_react16.default.createElement(import_react_native15.Text, { style: styles13.editTitle }, "Edit Profile"), /* @__PURE__ */ import_react16.default.createElement(import_react_native15.TouchableOpacity, { onPress: () => {
15185
15411
  setEditing(false);
15186
15412
  setNewEmailInput("");
15187
- } }, /* @__PURE__ */ import_react15.default.createElement(import_react_native14.Text, { style: styles12.cancelText }, "Cancel"))), /* @__PURE__ */ import_react15.default.createElement(import_react_native14.View, { style: styles12.field }, /* @__PURE__ */ import_react15.default.createElement(import_react_native14.Text, { style: shared.label }, "Name"), /* @__PURE__ */ import_react15.default.createElement(import_react_native14.TextInput, { style: styles12.input, value: name, onChangeText: setName, placeholder: "Your name", placeholderTextColor: colors.textMuted })), /* @__PURE__ */ import_react15.default.createElement(import_react_native14.View, { style: styles12.field }, /* @__PURE__ */ import_react15.default.createElement(import_react_native14.Text, { style: shared.label }, "Primary Email"), /* @__PURE__ */ import_react15.default.createElement(import_react_native14.Text, { style: styles12.emailFixed }, testerInfo.email)), /* @__PURE__ */ import_react15.default.createElement(import_react_native14.View, { style: styles12.field }, /* @__PURE__ */ import_react15.default.createElement(import_react_native14.Text, { style: shared.label }, "Additional Emails"), additionalEmails.map((email) => /* @__PURE__ */ import_react15.default.createElement(import_react_native14.View, { key: email, style: styles12.emailRow }, /* @__PURE__ */ import_react15.default.createElement(import_react_native14.Text, { style: styles12.emailText }, email), /* @__PURE__ */ import_react15.default.createElement(import_react_native14.TouchableOpacity, { onPress: () => setAdditionalEmails(additionalEmails.filter((e) => e !== email)) }, /* @__PURE__ */ import_react15.default.createElement(import_react_native14.Text, { style: styles12.removeEmail }, "\u2715")))), /* @__PURE__ */ import_react15.default.createElement(import_react_native14.View, { style: styles12.addEmailRow }, /* @__PURE__ */ import_react15.default.createElement(
15188
- import_react_native14.TextInput,
15413
+ } }, /* @__PURE__ */ import_react16.default.createElement(import_react_native15.Text, { style: styles13.cancelText }, "Cancel"))), /* @__PURE__ */ import_react16.default.createElement(import_react_native15.View, { style: styles13.field }, /* @__PURE__ */ import_react16.default.createElement(import_react_native15.Text, { style: shared.label }, "Name"), /* @__PURE__ */ import_react16.default.createElement(import_react_native15.TextInput, { style: styles13.input, value: name, onChangeText: setName, placeholder: "Your name", placeholderTextColor: colors.textMuted })), /* @__PURE__ */ import_react16.default.createElement(import_react_native15.View, { style: styles13.field }, /* @__PURE__ */ import_react16.default.createElement(import_react_native15.Text, { style: shared.label }, "Primary Email"), /* @__PURE__ */ import_react16.default.createElement(import_react_native15.Text, { style: styles13.emailFixed }, testerInfo.email)), /* @__PURE__ */ import_react16.default.createElement(import_react_native15.View, { style: styles13.field }, /* @__PURE__ */ import_react16.default.createElement(import_react_native15.Text, { style: shared.label }, "Additional Emails"), additionalEmails.map((email) => /* @__PURE__ */ import_react16.default.createElement(import_react_native15.View, { key: email, style: styles13.emailRow }, /* @__PURE__ */ import_react16.default.createElement(import_react_native15.Text, { style: styles13.emailText }, email), /* @__PURE__ */ import_react16.default.createElement(import_react_native15.TouchableOpacity, { onPress: () => setAdditionalEmails(additionalEmails.filter((e) => e !== email)) }, /* @__PURE__ */ import_react16.default.createElement(import_react_native15.Text, { style: styles13.removeEmail }, "\u2715")))), /* @__PURE__ */ import_react16.default.createElement(import_react_native15.View, { style: styles13.addEmailRow }, /* @__PURE__ */ import_react16.default.createElement(
15414
+ import_react_native15.TextInput,
15189
15415
  {
15190
- style: [styles12.input, { flex: 1, marginRight: 8 }],
15416
+ style: [styles13.input, { flex: 1, marginRight: 8 }],
15191
15417
  value: newEmailInput,
15192
15418
  onChangeText: setNewEmailInput,
15193
15419
  placeholder: "Add email",
@@ -15195,26 +15421,26 @@ function ProfileScreen({ nav }) {
15195
15421
  keyboardType: "email-address",
15196
15422
  autoCapitalize: "none"
15197
15423
  }
15198
- ), /* @__PURE__ */ import_react15.default.createElement(import_react_native14.TouchableOpacity, { style: styles12.addButton, onPress: handleAddEmail }, /* @__PURE__ */ import_react15.default.createElement(import_react_native14.Text, { style: styles12.addButtonText }, "Add")))), /* @__PURE__ */ import_react15.default.createElement(import_react_native14.View, { style: styles12.field }, /* @__PURE__ */ import_react15.default.createElement(import_react_native14.Text, { style: shared.label }, "Testing Platforms"), /* @__PURE__ */ import_react15.default.createElement(import_react_native14.View, { style: styles12.platformRow }, [{ key: "ios", label: "\u{1F4F1} iOS" }, { key: "android", label: "\u{1F916} Android" }, { key: "web", label: "\u{1F310} Web" }].map(({ key, label }) => /* @__PURE__ */ import_react15.default.createElement(
15199
- import_react_native14.TouchableOpacity,
15424
+ ), /* @__PURE__ */ import_react16.default.createElement(import_react_native15.TouchableOpacity, { style: styles13.addButton, onPress: handleAddEmail }, /* @__PURE__ */ import_react16.default.createElement(import_react_native15.Text, { style: styles13.addButtonText }, "Add")))), /* @__PURE__ */ import_react16.default.createElement(import_react_native15.View, { style: styles13.field }, /* @__PURE__ */ import_react16.default.createElement(import_react_native15.Text, { style: shared.label }, "Testing Platforms"), /* @__PURE__ */ import_react16.default.createElement(import_react_native15.View, { style: styles13.platformRow }, [{ key: "ios", label: "\u{1F4F1} iOS" }, { key: "android", label: "\u{1F916} Android" }, { key: "web", label: "\u{1F310} Web" }].map(({ key, label }) => /* @__PURE__ */ import_react16.default.createElement(
15425
+ import_react_native15.TouchableOpacity,
15200
15426
  {
15201
15427
  key,
15202
- style: [styles12.platformBtn, platforms.includes(key) && styles12.platformBtnActive],
15428
+ style: [styles13.platformBtn, platforms.includes(key) && styles13.platformBtnActive],
15203
15429
  onPress: () => setPlatforms((prev) => prev.includes(key) ? prev.filter((p) => p !== key) : [...prev, key])
15204
15430
  },
15205
- /* @__PURE__ */ import_react15.default.createElement(import_react_native14.Text, { style: [styles12.platformText, platforms.includes(key) && styles12.platformTextActive] }, label)
15206
- )))), /* @__PURE__ */ import_react15.default.createElement(import_react_native14.TouchableOpacity, { style: [shared.primaryButton, { marginTop: 20 }], onPress: handleSave, disabled: saving }, /* @__PURE__ */ import_react15.default.createElement(import_react_native14.Text, { style: shared.primaryButtonText }, saving ? "Saving..." : "Save Profile")));
15431
+ /* @__PURE__ */ import_react16.default.createElement(import_react_native15.Text, { style: [styles13.platformText, platforms.includes(key) && styles13.platformTextActive] }, label)
15432
+ )))), /* @__PURE__ */ import_react16.default.createElement(import_react_native15.TouchableOpacity, { style: [shared.primaryButton, { marginTop: 20 }], onPress: handleSave, disabled: saving }, /* @__PURE__ */ import_react16.default.createElement(import_react_native15.Text, { style: shared.primaryButtonText }, saving ? "Saving..." : "Save Profile")));
15207
15433
  }
15208
- return /* @__PURE__ */ import_react15.default.createElement(import_react_native14.View, null, /* @__PURE__ */ import_react15.default.createElement(import_react_native14.View, { style: styles12.profileCard }, /* @__PURE__ */ import_react15.default.createElement(import_react_native14.View, { style: styles12.avatar }, /* @__PURE__ */ import_react15.default.createElement(import_react_native14.Text, { style: styles12.avatarText }, testerInfo.name.charAt(0).toUpperCase())), /* @__PURE__ */ import_react15.default.createElement(import_react_native14.Text, { style: styles12.profileName }, testerInfo.name), /* @__PURE__ */ import_react15.default.createElement(import_react_native14.Text, { style: styles12.profileEmail }, testerInfo.email)), /* @__PURE__ */ import_react15.default.createElement(import_react_native14.View, { style: styles12.statsRow }, /* @__PURE__ */ import_react15.default.createElement(import_react_native14.View, { style: styles12.statItem }, /* @__PURE__ */ import_react15.default.createElement(import_react_native14.Text, { style: styles12.statNumber }, completedCount), /* @__PURE__ */ import_react15.default.createElement(import_react_native14.Text, { style: styles12.statLabel }, "Completed")), /* @__PURE__ */ import_react15.default.createElement(import_react_native14.View, { style: styles12.statDivider }), /* @__PURE__ */ import_react15.default.createElement(import_react_native14.View, { style: styles12.statItem }, /* @__PURE__ */ import_react15.default.createElement(import_react_native14.Text, { style: styles12.statNumber }, assignments.length), /* @__PURE__ */ import_react15.default.createElement(import_react_native14.Text, { style: styles12.statLabel }, "Total Assigned"))), /* @__PURE__ */ import_react15.default.createElement(import_react_native14.TouchableOpacity, { onPress: () => setShowDetails(!showDetails), style: styles12.detailsToggle }, /* @__PURE__ */ import_react15.default.createElement(import_react_native14.Text, { style: styles12.detailsToggleText }, showDetails ? "\u25BC" : "\u25B6", " Details")), showDetails && /* @__PURE__ */ import_react15.default.createElement(import_react_native14.View, { style: styles12.detailsSection }, additionalEmails.length > 0 && /* @__PURE__ */ import_react15.default.createElement(import_react_native14.View, { style: styles12.detailBlock }, /* @__PURE__ */ import_react15.default.createElement(import_react_native14.Text, { style: styles12.detailLabel }, "Additional Emails"), additionalEmails.map((e) => /* @__PURE__ */ import_react15.default.createElement(import_react_native14.Text, { key: e, style: styles12.detailValue }, e))), platforms.length > 0 && /* @__PURE__ */ import_react15.default.createElement(import_react_native14.View, { style: styles12.detailBlock }, /* @__PURE__ */ import_react15.default.createElement(import_react_native14.Text, { style: styles12.detailLabel }, "Platforms"), /* @__PURE__ */ import_react15.default.createElement(import_react_native14.View, { style: styles12.platformTags }, platforms.map((p) => /* @__PURE__ */ import_react15.default.createElement(import_react_native14.View, { key: p, style: styles12.platformTag }, /* @__PURE__ */ import_react15.default.createElement(import_react_native14.Text, { style: styles12.platformTagText }, p === "ios" ? "\u{1F4F1} iOS" : p === "android" ? "\u{1F916} Android" : "\u{1F310} Web")))))), /* @__PURE__ */ import_react15.default.createElement(
15209
- import_react_native14.TouchableOpacity,
15434
+ return /* @__PURE__ */ import_react16.default.createElement(import_react_native15.View, null, /* @__PURE__ */ import_react16.default.createElement(import_react_native15.View, { style: styles13.profileCard }, /* @__PURE__ */ import_react16.default.createElement(import_react_native15.View, { style: styles13.avatar }, /* @__PURE__ */ import_react16.default.createElement(import_react_native15.Text, { style: styles13.avatarText }, testerInfo.name.charAt(0).toUpperCase())), /* @__PURE__ */ import_react16.default.createElement(import_react_native15.Text, { style: styles13.profileName }, testerInfo.name), /* @__PURE__ */ import_react16.default.createElement(import_react_native15.Text, { style: styles13.profileEmail }, testerInfo.email)), /* @__PURE__ */ import_react16.default.createElement(import_react_native15.View, { style: styles13.statsRow }, /* @__PURE__ */ import_react16.default.createElement(import_react_native15.View, { style: styles13.statItem }, /* @__PURE__ */ import_react16.default.createElement(import_react_native15.Text, { style: styles13.statNumber }, completedCount), /* @__PURE__ */ import_react16.default.createElement(import_react_native15.Text, { style: styles13.statLabel }, "Completed")), /* @__PURE__ */ import_react16.default.createElement(import_react_native15.View, { style: styles13.statDivider }), /* @__PURE__ */ import_react16.default.createElement(import_react_native15.View, { style: styles13.statItem }, /* @__PURE__ */ import_react16.default.createElement(import_react_native15.Text, { style: styles13.statNumber }, assignments.length), /* @__PURE__ */ import_react16.default.createElement(import_react_native15.Text, { style: styles13.statLabel }, "Total Assigned"))), /* @__PURE__ */ import_react16.default.createElement(import_react_native15.TouchableOpacity, { onPress: () => setShowDetails(!showDetails), style: styles13.detailsToggle }, /* @__PURE__ */ import_react16.default.createElement(import_react_native15.Text, { style: styles13.detailsToggleText }, showDetails ? "\u25BC" : "\u25B6", " Details")), showDetails && /* @__PURE__ */ import_react16.default.createElement(import_react_native15.View, { style: styles13.detailsSection }, additionalEmails.length > 0 && /* @__PURE__ */ import_react16.default.createElement(import_react_native15.View, { style: styles13.detailBlock }, /* @__PURE__ */ import_react16.default.createElement(import_react_native15.Text, { style: styles13.detailLabel }, "Additional Emails"), additionalEmails.map((e) => /* @__PURE__ */ import_react16.default.createElement(import_react_native15.Text, { key: e, style: styles13.detailValue }, e))), platforms.length > 0 && /* @__PURE__ */ import_react16.default.createElement(import_react_native15.View, { style: styles13.detailBlock }, /* @__PURE__ */ import_react16.default.createElement(import_react_native15.Text, { style: styles13.detailLabel }, "Platforms"), /* @__PURE__ */ import_react16.default.createElement(import_react_native15.View, { style: styles13.platformTags }, platforms.map((p) => /* @__PURE__ */ import_react16.default.createElement(import_react_native15.View, { key: p, style: styles13.platformTag }, /* @__PURE__ */ import_react16.default.createElement(import_react_native15.Text, { style: styles13.platformTagText }, p === "ios" ? "\u{1F4F1} iOS" : p === "android" ? "\u{1F916} Android" : "\u{1F310} Web")))))), /* @__PURE__ */ import_react16.default.createElement(
15435
+ import_react_native15.TouchableOpacity,
15210
15436
  {
15211
15437
  style: [shared.primaryButton, { marginTop: 20 }],
15212
15438
  onPress: () => setEditing(true)
15213
15439
  },
15214
- /* @__PURE__ */ import_react15.default.createElement(import_react_native14.Text, { style: shared.primaryButtonText }, "Edit Profile")
15440
+ /* @__PURE__ */ import_react16.default.createElement(import_react_native15.Text, { style: shared.primaryButtonText }, "Edit Profile")
15215
15441
  ));
15216
15442
  }
15217
- var styles12 = import_react_native14.StyleSheet.create({
15443
+ var styles13 = import_react_native15.StyleSheet.create({
15218
15444
  profileCard: { alignItems: "center", backgroundColor: colors.card, borderRadius: 16, padding: 24, marginBottom: 16 },
15219
15445
  avatar: { width: 64, height: 64, borderRadius: 32, backgroundColor: colors.blue, justifyContent: "center", alignItems: "center", marginBottom: 12 },
15220
15446
  avatarText: { fontSize: 28, fontWeight: "700", color: "#fff" },
@@ -15255,8 +15481,8 @@ var styles12 = import_react_native14.StyleSheet.create({
15255
15481
  });
15256
15482
 
15257
15483
  // src/widget/screens/IssueListScreen.tsx
15258
- var import_react16 = __toESM(require("react"));
15259
- var import_react_native15 = require("react-native");
15484
+ var import_react17 = __toESM(require("react"));
15485
+ var import_react_native16 = require("react-native");
15260
15486
  var CATEGORY_CONFIG = {
15261
15487
  open: { label: "Open Issues", accent: "#f97316", emptyIcon: "\u2705", emptyText: "No open issues" },
15262
15488
  done: { label: "Done", accent: "#22c55e", emptyIcon: "\u{1F389}", emptyText: "No completed issues yet" },
@@ -15270,10 +15496,10 @@ var SEVERITY_COLORS = {
15270
15496
  };
15271
15497
  function IssueListScreen({ nav, category }) {
15272
15498
  const { client } = useBugBear();
15273
- const [issues, setIssues] = (0, import_react16.useState)([]);
15274
- const [loading, setLoading] = (0, import_react16.useState)(true);
15499
+ const [issues, setIssues] = (0, import_react17.useState)([]);
15500
+ const [loading, setLoading] = (0, import_react17.useState)(true);
15275
15501
  const config = CATEGORY_CONFIG[category];
15276
- (0, import_react16.useEffect)(() => {
15502
+ (0, import_react17.useEffect)(() => {
15277
15503
  let cancelled = false;
15278
15504
  setLoading(true);
15279
15505
  (async () => {
@@ -15289,26 +15515,26 @@ function IssueListScreen({ nav, category }) {
15289
15515
  };
15290
15516
  }, [client, category]);
15291
15517
  if (loading) {
15292
- return /* @__PURE__ */ import_react16.default.createElement(import_react_native15.View, { style: styles13.emptyContainer }, /* @__PURE__ */ import_react16.default.createElement(import_react_native15.ActivityIndicator, { size: "small", color: colors.textMuted }), /* @__PURE__ */ import_react16.default.createElement(import_react_native15.Text, { style: styles13.emptyText }, "Loading..."));
15518
+ return /* @__PURE__ */ import_react17.default.createElement(import_react_native16.View, { style: styles14.emptyContainer }, /* @__PURE__ */ import_react17.default.createElement(import_react_native16.ActivityIndicator, { size: "small", color: colors.textMuted }), /* @__PURE__ */ import_react17.default.createElement(import_react_native16.Text, { style: styles14.emptyText }, "Loading..."));
15293
15519
  }
15294
15520
  if (issues.length === 0) {
15295
- return /* @__PURE__ */ import_react16.default.createElement(import_react_native15.View, { style: styles13.emptyContainer }, /* @__PURE__ */ import_react16.default.createElement(import_react_native15.Text, { style: styles13.emptyIcon }, config.emptyIcon), /* @__PURE__ */ import_react16.default.createElement(import_react_native15.Text, { style: styles13.emptyText }, config.emptyText));
15521
+ return /* @__PURE__ */ import_react17.default.createElement(import_react_native16.View, { style: styles14.emptyContainer }, /* @__PURE__ */ import_react17.default.createElement(import_react_native16.Text, { style: styles14.emptyIcon }, config.emptyIcon), /* @__PURE__ */ import_react17.default.createElement(import_react_native16.Text, { style: styles14.emptyText }, config.emptyText));
15296
15522
  }
15297
- return /* @__PURE__ */ import_react16.default.createElement(import_react_native15.View, null, issues.map((issue) => /* @__PURE__ */ import_react16.default.createElement(
15298
- import_react_native15.TouchableOpacity,
15523
+ return /* @__PURE__ */ import_react17.default.createElement(import_react_native16.View, null, issues.map((issue) => /* @__PURE__ */ import_react17.default.createElement(
15524
+ import_react_native16.TouchableOpacity,
15299
15525
  {
15300
15526
  key: issue.id,
15301
- style: styles13.issueCard,
15527
+ style: styles14.issueCard,
15302
15528
  onPress: () => nav.push({ name: "ISSUE_DETAIL", issue }),
15303
15529
  activeOpacity: 0.7
15304
15530
  },
15305
- /* @__PURE__ */ import_react16.default.createElement(import_react_native15.View, { style: styles13.topRow }, issue.severity && /* @__PURE__ */ import_react16.default.createElement(import_react_native15.View, { style: [styles13.severityDot, { backgroundColor: SEVERITY_COLORS[issue.severity] || colors.textDim }] }), /* @__PURE__ */ import_react16.default.createElement(import_react_native15.Text, { style: styles13.issueTitle, numberOfLines: 1 }, issue.title)),
15306
- /* @__PURE__ */ import_react16.default.createElement(import_react_native15.View, { style: styles13.bottomRow }, issue.route && /* @__PURE__ */ import_react16.default.createElement(import_react_native15.Text, { style: styles13.routeText, numberOfLines: 1 }, issue.route), /* @__PURE__ */ import_react16.default.createElement(import_react_native15.Text, { style: styles13.timeText }, formatRelativeTime(issue.updatedAt))),
15307
- category === "done" && issue.verifiedByName && /* @__PURE__ */ import_react16.default.createElement(import_react_native15.View, { style: styles13.verifiedBadge }, /* @__PURE__ */ import_react16.default.createElement(import_react_native15.Text, { style: styles13.verifiedBadgeText }, "\u2714", " Verified by ", issue.verifiedByName)),
15308
- category === "reopened" && issue.originalBugTitle && /* @__PURE__ */ import_react16.default.createElement(import_react_native15.View, { style: styles13.reopenedBadge }, /* @__PURE__ */ import_react16.default.createElement(import_react_native15.Text, { style: styles13.reopenedBadgeText, numberOfLines: 1 }, "\u{1F504}", " Retest of: ", issue.originalBugTitle))
15531
+ /* @__PURE__ */ import_react17.default.createElement(import_react_native16.View, { style: styles14.topRow }, issue.severity && /* @__PURE__ */ import_react17.default.createElement(import_react_native16.View, { style: [styles14.severityDot, { backgroundColor: SEVERITY_COLORS[issue.severity] || colors.textDim }] }), /* @__PURE__ */ import_react17.default.createElement(import_react_native16.Text, { style: styles14.issueTitle, numberOfLines: 1 }, issue.title)),
15532
+ /* @__PURE__ */ import_react17.default.createElement(import_react_native16.View, { style: styles14.bottomRow }, issue.route && /* @__PURE__ */ import_react17.default.createElement(import_react_native16.Text, { style: styles14.routeText, numberOfLines: 1 }, issue.route), /* @__PURE__ */ import_react17.default.createElement(import_react_native16.Text, { style: styles14.timeText }, formatRelativeTime(issue.updatedAt))),
15533
+ category === "done" && issue.verifiedByName && /* @__PURE__ */ import_react17.default.createElement(import_react_native16.View, { style: styles14.verifiedBadge }, /* @__PURE__ */ import_react17.default.createElement(import_react_native16.Text, { style: styles14.verifiedBadgeText }, "\u2714", " Verified by ", issue.verifiedByName)),
15534
+ category === "reopened" && issue.originalBugTitle && /* @__PURE__ */ import_react17.default.createElement(import_react_native16.View, { style: styles14.reopenedBadge }, /* @__PURE__ */ import_react17.default.createElement(import_react_native16.Text, { style: styles14.reopenedBadgeText, numberOfLines: 1 }, "\u{1F504}", " Retest of: ", issue.originalBugTitle))
15309
15535
  )));
15310
15536
  }
15311
- var styles13 = import_react_native15.StyleSheet.create({
15537
+ var styles14 = import_react_native16.StyleSheet.create({
15312
15538
  emptyContainer: {
15313
15539
  alignItems: "center",
15314
15540
  paddingVertical: 40
@@ -15399,8 +15625,8 @@ var styles13 = import_react_native15.StyleSheet.create({
15399
15625
  });
15400
15626
 
15401
15627
  // src/widget/screens/IssueDetailScreen.tsx
15402
- var import_react17 = __toESM(require("react"));
15403
- var import_react_native16 = require("react-native");
15628
+ var import_react18 = __toESM(require("react"));
15629
+ var import_react_native17 = require("react-native");
15404
15630
  var STATUS_LABELS = {
15405
15631
  new: { label: "New", bg: "#1e3a5f", color: "#60a5fa" },
15406
15632
  triaging: { label: "Triaging", bg: "#1e3a5f", color: "#60a5fa" },
@@ -15424,9 +15650,9 @@ var SEVERITY_CONFIG = {
15424
15650
  function IssueDetailScreen({ nav, issue }) {
15425
15651
  const statusConfig = STATUS_LABELS[issue.status] || { label: issue.status, bg: "#27272a", color: "#a1a1aa" };
15426
15652
  const severityConfig = issue.severity ? SEVERITY_CONFIG[issue.severity] : null;
15427
- return /* @__PURE__ */ import_react17.default.createElement(import_react_native16.View, null, /* @__PURE__ */ import_react17.default.createElement(import_react_native16.View, { style: styles14.badgeRow }, /* @__PURE__ */ import_react17.default.createElement(import_react_native16.View, { style: [styles14.badge, { backgroundColor: statusConfig.bg }] }, /* @__PURE__ */ import_react17.default.createElement(import_react_native16.Text, { style: [styles14.badgeText, { color: statusConfig.color }] }, statusConfig.label)), severityConfig && /* @__PURE__ */ import_react17.default.createElement(import_react_native16.View, { style: [styles14.badge, { backgroundColor: severityConfig.bg }] }, /* @__PURE__ */ import_react17.default.createElement(import_react_native16.Text, { style: [styles14.badgeText, { color: severityConfig.color }] }, severityConfig.label))), /* @__PURE__ */ import_react17.default.createElement(import_react_native16.Text, { style: styles14.title }, issue.title), issue.route && /* @__PURE__ */ import_react17.default.createElement(import_react_native16.Text, { style: styles14.route }, issue.route), issue.description && /* @__PURE__ */ import_react17.default.createElement(import_react_native16.View, { style: styles14.descriptionCard }, /* @__PURE__ */ import_react17.default.createElement(import_react_native16.Text, { style: styles14.descriptionText }, issue.description)), issue.verifiedByName && /* @__PURE__ */ import_react17.default.createElement(import_react_native16.View, { style: styles14.verifiedCard }, /* @__PURE__ */ import_react17.default.createElement(import_react_native16.View, { style: styles14.verifiedHeader }, /* @__PURE__ */ import_react17.default.createElement(import_react_native16.Text, { style: styles14.verifiedIcon }, "\u2705"), /* @__PURE__ */ import_react17.default.createElement(import_react_native16.Text, { style: styles14.verifiedTitle }, "Retesting Proof")), /* @__PURE__ */ import_react17.default.createElement(import_react_native16.Text, { style: styles14.verifiedBody }, "Verified by ", issue.verifiedByName, issue.verifiedAt && ` on ${new Date(issue.verifiedAt).toLocaleDateString(void 0, { month: "short", day: "numeric", year: "numeric" })}`)), issue.originalBugTitle && /* @__PURE__ */ import_react17.default.createElement(import_react_native16.View, { style: styles14.originalBugCard }, /* @__PURE__ */ import_react17.default.createElement(import_react_native16.View, { style: styles14.originalBugHeader }, /* @__PURE__ */ import_react17.default.createElement(import_react_native16.Text, { style: styles14.originalBugIcon }, "\u{1F504}"), /* @__PURE__ */ import_react17.default.createElement(import_react_native16.Text, { style: styles14.originalBugTitle }, "Original Bug")), /* @__PURE__ */ import_react17.default.createElement(import_react_native16.Text, { style: styles14.originalBugBody }, "Retest of: ", issue.originalBugTitle)), issue.screenshotUrls && issue.screenshotUrls.length > 0 && /* @__PURE__ */ import_react17.default.createElement(import_react_native16.View, { style: styles14.screenshotSection }, /* @__PURE__ */ import_react17.default.createElement(import_react_native16.Text, { style: styles14.screenshotLabel }, "Screenshots (", issue.screenshotUrls.length, ")"), /* @__PURE__ */ import_react17.default.createElement(import_react_native16.View, { style: styles14.screenshotRow }, issue.screenshotUrls.map((url, i) => /* @__PURE__ */ import_react17.default.createElement(import_react_native16.TouchableOpacity, { key: i, onPress: () => import_react_native16.Linking.openURL(url), activeOpacity: 0.7 }, /* @__PURE__ */ import_react17.default.createElement(import_react_native16.Image, { source: { uri: url }, style: styles14.screenshotThumb }))))), /* @__PURE__ */ import_react17.default.createElement(import_react_native16.View, { style: styles14.metaSection }, issue.reporterName && /* @__PURE__ */ import_react17.default.createElement(import_react_native16.Text, { style: styles14.metaText }, "Reported by ", issue.reporterName), /* @__PURE__ */ import_react17.default.createElement(import_react_native16.Text, { style: styles14.metaTextSmall }, "Created ", formatRelativeTime(issue.createdAt), " ", "\xB7", " Updated ", formatRelativeTime(issue.updatedAt))));
15653
+ return /* @__PURE__ */ import_react18.default.createElement(import_react_native17.View, null, /* @__PURE__ */ import_react18.default.createElement(import_react_native17.View, { style: styles15.badgeRow }, /* @__PURE__ */ import_react18.default.createElement(import_react_native17.View, { style: [styles15.badge, { backgroundColor: statusConfig.bg }] }, /* @__PURE__ */ import_react18.default.createElement(import_react_native17.Text, { style: [styles15.badgeText, { color: statusConfig.color }] }, statusConfig.label)), severityConfig && /* @__PURE__ */ import_react18.default.createElement(import_react_native17.View, { style: [styles15.badge, { backgroundColor: severityConfig.bg }] }, /* @__PURE__ */ import_react18.default.createElement(import_react_native17.Text, { style: [styles15.badgeText, { color: severityConfig.color }] }, severityConfig.label))), /* @__PURE__ */ import_react18.default.createElement(import_react_native17.Text, { style: styles15.title }, issue.title), issue.route && /* @__PURE__ */ import_react18.default.createElement(import_react_native17.Text, { style: styles15.route }, issue.route), issue.description && /* @__PURE__ */ import_react18.default.createElement(import_react_native17.View, { style: styles15.descriptionCard }, /* @__PURE__ */ import_react18.default.createElement(import_react_native17.Text, { style: styles15.descriptionText }, issue.description)), issue.verifiedByName && /* @__PURE__ */ import_react18.default.createElement(import_react_native17.View, { style: styles15.verifiedCard }, /* @__PURE__ */ import_react18.default.createElement(import_react_native17.View, { style: styles15.verifiedHeader }, /* @__PURE__ */ import_react18.default.createElement(import_react_native17.Text, { style: styles15.verifiedIcon }, "\u2705"), /* @__PURE__ */ import_react18.default.createElement(import_react_native17.Text, { style: styles15.verifiedTitle }, "Retesting Proof")), /* @__PURE__ */ import_react18.default.createElement(import_react_native17.Text, { style: styles15.verifiedBody }, "Verified by ", issue.verifiedByName, issue.verifiedAt && ` on ${new Date(issue.verifiedAt).toLocaleDateString(void 0, { month: "short", day: "numeric", year: "numeric" })}`)), issue.originalBugTitle && /* @__PURE__ */ import_react18.default.createElement(import_react_native17.View, { style: styles15.originalBugCard }, /* @__PURE__ */ import_react18.default.createElement(import_react_native17.View, { style: styles15.originalBugHeader }, /* @__PURE__ */ import_react18.default.createElement(import_react_native17.Text, { style: styles15.originalBugIcon }, "\u{1F504}"), /* @__PURE__ */ import_react18.default.createElement(import_react_native17.Text, { style: styles15.originalBugTitle }, "Original Bug")), /* @__PURE__ */ import_react18.default.createElement(import_react_native17.Text, { style: styles15.originalBugBody }, "Retest of: ", issue.originalBugTitle)), issue.screenshotUrls && issue.screenshotUrls.length > 0 && /* @__PURE__ */ import_react18.default.createElement(import_react_native17.View, { style: styles15.screenshotSection }, /* @__PURE__ */ import_react18.default.createElement(import_react_native17.Text, { style: styles15.screenshotLabel }, "Screenshots (", issue.screenshotUrls.length, ")"), /* @__PURE__ */ import_react18.default.createElement(import_react_native17.View, { style: styles15.screenshotRow }, issue.screenshotUrls.map((url, i) => /* @__PURE__ */ import_react18.default.createElement(import_react_native17.TouchableOpacity, { key: i, onPress: () => import_react_native17.Linking.openURL(url), activeOpacity: 0.7 }, /* @__PURE__ */ import_react18.default.createElement(import_react_native17.Image, { source: { uri: url }, style: styles15.screenshotThumb }))))), /* @__PURE__ */ import_react18.default.createElement(import_react_native17.View, { style: styles15.metaSection }, issue.reporterName && /* @__PURE__ */ import_react18.default.createElement(import_react_native17.Text, { style: styles15.metaText }, "Reported by ", issue.reporterName), /* @__PURE__ */ import_react18.default.createElement(import_react_native17.Text, { style: styles15.metaTextSmall }, "Created ", formatRelativeTime(issue.createdAt), " ", "\xB7", " Updated ", formatRelativeTime(issue.updatedAt))));
15428
15654
  }
15429
- var styles14 = import_react_native16.StyleSheet.create({
15655
+ var styles15 = import_react_native17.StyleSheet.create({
15430
15656
  badgeRow: {
15431
15657
  flexDirection: "row",
15432
15658
  gap: 8,
@@ -15557,8 +15783,8 @@ var styles14 = import_react_native16.StyleSheet.create({
15557
15783
  });
15558
15784
 
15559
15785
  // src/BugBearButton.tsx
15560
- var screenWidth = import_react_native17.Dimensions.get("window").width;
15561
- var screenHeight = import_react_native17.Dimensions.get("window").height;
15786
+ var screenWidth = import_react_native18.Dimensions.get("window").width;
15787
+ var screenHeight = import_react_native18.Dimensions.get("window").height;
15562
15788
  function BugBearButton({
15563
15789
  position = "bottom-right",
15564
15790
  buttonStyle,
@@ -15570,7 +15796,7 @@ function BugBearButton({
15570
15796
  }) {
15571
15797
  const { shouldShowWidget, testerInfo, isLoading, unreadCount, assignments } = useBugBear();
15572
15798
  const { currentScreen, canGoBack, push, pop, replace, reset } = useNavigation();
15573
- const [modalVisible, setModalVisible] = (0, import_react18.useState)(false);
15799
+ const [modalVisible, setModalVisible] = (0, import_react19.useState)(false);
15574
15800
  const getInitialPosition = () => {
15575
15801
  const buttonSize = 56;
15576
15802
  const margin = 16;
@@ -15582,10 +15808,10 @@ function BugBearButton({
15582
15808
  return { x, y };
15583
15809
  };
15584
15810
  const initialPos = getInitialPosition();
15585
- const pan = (0, import_react18.useRef)(new import_react_native17.Animated.ValueXY(initialPos)).current;
15586
- const isDragging = (0, import_react18.useRef)(false);
15587
- const panResponder = (0, import_react18.useRef)(
15588
- import_react_native17.PanResponder.create({
15811
+ const pan = (0, import_react19.useRef)(new import_react_native18.Animated.ValueXY(initialPos)).current;
15812
+ const isDragging = (0, import_react19.useRef)(false);
15813
+ const panResponder = (0, import_react19.useRef)(
15814
+ import_react_native18.PanResponder.create({
15589
15815
  onStartShouldSetPanResponder: () => draggable,
15590
15816
  onMoveShouldSetPanResponder: (_, gs) => draggable && (Math.abs(gs.dx) > 5 || Math.abs(gs.dy) > 5),
15591
15817
  onPanResponderGrant: () => {
@@ -15600,7 +15826,7 @@ function BugBearButton({
15600
15826
  if (Math.abs(gs.dx) > 5 || Math.abs(gs.dy) > 5) {
15601
15827
  isDragging.current = true;
15602
15828
  }
15603
- import_react_native17.Animated.event(
15829
+ import_react_native18.Animated.event(
15604
15830
  [null, { dx: pan.x, dy: pan.y }],
15605
15831
  { useNativeDriver: false }
15606
15832
  )(_, gs);
@@ -15613,7 +15839,7 @@ function BugBearButton({
15613
15839
  const margin = 16;
15614
15840
  const snapX = currentX < screenWidth / 2 ? margin : screenWidth - buttonSize - margin;
15615
15841
  const snapY = Math.max(minY, Math.min(currentY, screenHeight - maxYOffset));
15616
- import_react_native17.Animated.spring(pan, {
15842
+ import_react_native18.Animated.spring(pan, {
15617
15843
  toValue: { x: snapX, y: snapY },
15618
15844
  useNativeDriver: false,
15619
15845
  friction: 7,
@@ -15660,24 +15886,24 @@ function BugBearButton({
15660
15886
  }
15661
15887
  };
15662
15888
  const handleClose = () => {
15663
- import_react_native17.Keyboard.dismiss();
15889
+ import_react_native18.Keyboard.dismiss();
15664
15890
  setModalVisible(false);
15665
15891
  };
15666
15892
  const nav = {
15667
15893
  push: (screen) => {
15668
- import_react_native17.Keyboard.dismiss();
15894
+ import_react_native18.Keyboard.dismiss();
15669
15895
  push(screen);
15670
15896
  },
15671
15897
  pop: () => {
15672
- import_react_native17.Keyboard.dismiss();
15898
+ import_react_native18.Keyboard.dismiss();
15673
15899
  pop();
15674
15900
  },
15675
15901
  replace: (screen) => {
15676
- import_react_native17.Keyboard.dismiss();
15902
+ import_react_native18.Keyboard.dismiss();
15677
15903
  replace(screen);
15678
15904
  },
15679
15905
  reset: () => {
15680
- import_react_native17.Keyboard.dismiss();
15906
+ import_react_native18.Keyboard.dismiss();
15681
15907
  reset();
15682
15908
  },
15683
15909
  canGoBack,
@@ -15686,77 +15912,77 @@ function BugBearButton({
15686
15912
  const renderScreen = () => {
15687
15913
  switch (currentScreen.name) {
15688
15914
  case "HOME":
15689
- return /* @__PURE__ */ import_react18.default.createElement(HomeScreen, { nav });
15915
+ return /* @__PURE__ */ import_react19.default.createElement(HomeScreen, { nav });
15690
15916
  case "TEST_DETAIL":
15691
- return /* @__PURE__ */ import_react18.default.createElement(TestDetailScreen, { testId: currentScreen.testId, nav });
15917
+ return /* @__PURE__ */ import_react19.default.createElement(TestDetailScreen, { testId: currentScreen.testId, nav });
15692
15918
  case "TEST_LIST":
15693
- return /* @__PURE__ */ import_react18.default.createElement(TestListScreen, { nav });
15919
+ return /* @__PURE__ */ import_react19.default.createElement(TestListScreen, { nav });
15694
15920
  case "TEST_FEEDBACK":
15695
- return /* @__PURE__ */ import_react18.default.createElement(TestFeedbackScreen, { status: currentScreen.status, assignmentId: currentScreen.assignmentId, nav });
15921
+ return /* @__PURE__ */ import_react19.default.createElement(TestFeedbackScreen, { status: currentScreen.status, assignmentId: currentScreen.assignmentId, nav });
15696
15922
  case "REPORT":
15697
- return /* @__PURE__ */ import_react18.default.createElement(ReportScreen, { nav, prefill: currentScreen.prefill });
15923
+ return /* @__PURE__ */ import_react19.default.createElement(ReportScreen, { nav, prefill: currentScreen.prefill });
15698
15924
  case "REPORT_SUCCESS":
15699
- return /* @__PURE__ */ import_react18.default.createElement(ReportSuccessScreen, { nav });
15925
+ return /* @__PURE__ */ import_react19.default.createElement(ReportSuccessScreen, { nav });
15700
15926
  case "MESSAGE_LIST":
15701
- return /* @__PURE__ */ import_react18.default.createElement(MessageListScreen, { nav });
15927
+ return /* @__PURE__ */ import_react19.default.createElement(MessageListScreen, { nav });
15702
15928
  case "THREAD_DETAIL":
15703
- return /* @__PURE__ */ import_react18.default.createElement(ThreadDetailScreen, { thread: currentScreen.thread, nav });
15929
+ return /* @__PURE__ */ import_react19.default.createElement(ThreadDetailScreen, { thread: currentScreen.thread, nav });
15704
15930
  case "COMPOSE_MESSAGE":
15705
- return /* @__PURE__ */ import_react18.default.createElement(ComposeMessageScreen, { nav });
15931
+ return /* @__PURE__ */ import_react19.default.createElement(ComposeMessageScreen, { nav });
15706
15932
  case "ISSUE_LIST":
15707
- return /* @__PURE__ */ import_react18.default.createElement(IssueListScreen, { nav, category: currentScreen.category });
15933
+ return /* @__PURE__ */ import_react19.default.createElement(IssueListScreen, { nav, category: currentScreen.category });
15708
15934
  case "ISSUE_DETAIL":
15709
- return /* @__PURE__ */ import_react18.default.createElement(IssueDetailScreen, { nav, issue: currentScreen.issue });
15935
+ return /* @__PURE__ */ import_react19.default.createElement(IssueDetailScreen, { nav, issue: currentScreen.issue });
15710
15936
  case "PROFILE":
15711
- return /* @__PURE__ */ import_react18.default.createElement(ProfileScreen, { nav });
15937
+ return /* @__PURE__ */ import_react19.default.createElement(ProfileScreen, { nav });
15712
15938
  default:
15713
- return /* @__PURE__ */ import_react18.default.createElement(HomeScreen, { nav });
15939
+ return /* @__PURE__ */ import_react19.default.createElement(HomeScreen, { nav });
15714
15940
  }
15715
15941
  };
15716
- return /* @__PURE__ */ import_react18.default.createElement(import_react18.default.Fragment, null, /* @__PURE__ */ import_react18.default.createElement(
15717
- import_react_native17.Animated.View,
15942
+ return /* @__PURE__ */ import_react19.default.createElement(import_react19.default.Fragment, null, /* @__PURE__ */ import_react19.default.createElement(
15943
+ import_react_native18.Animated.View,
15718
15944
  {
15719
- style: [styles15.fabContainer, { transform: pan.getTranslateTransform() }, buttonStyle],
15945
+ style: [styles16.fabContainer, { transform: pan.getTranslateTransform() }, buttonStyle],
15720
15946
  ...panResponder.panHandlers
15721
15947
  },
15722
- /* @__PURE__ */ import_react18.default.createElement(
15723
- import_react_native17.TouchableOpacity,
15948
+ /* @__PURE__ */ import_react19.default.createElement(
15949
+ import_react_native18.TouchableOpacity,
15724
15950
  {
15725
- style: styles15.fab,
15951
+ style: styles16.fab,
15726
15952
  onPress: () => setModalVisible(true),
15727
15953
  activeOpacity: draggable ? 1 : 0.7
15728
15954
  },
15729
- /* @__PURE__ */ import_react18.default.createElement(import_react_native17.Image, { source: { uri: BUGBEAR_LOGO_BASE64 }, style: styles15.fabIcon }),
15730
- badgeCount > 0 && /* @__PURE__ */ import_react18.default.createElement(import_react_native17.View, { style: styles15.badge }, /* @__PURE__ */ import_react18.default.createElement(import_react_native17.Text, { style: styles15.badgeText }, badgeCount > 9 ? "9+" : badgeCount))
15955
+ /* @__PURE__ */ import_react19.default.createElement(import_react_native18.Image, { source: { uri: BUGBEAR_LOGO_BASE64 }, style: styles16.fabIcon }),
15956
+ badgeCount > 0 && /* @__PURE__ */ import_react19.default.createElement(import_react_native18.View, { style: styles16.badge }, /* @__PURE__ */ import_react19.default.createElement(import_react_native18.Text, { style: styles16.badgeText }, badgeCount > 9 ? "9+" : badgeCount))
15731
15957
  )
15732
- ), /* @__PURE__ */ import_react18.default.createElement(
15733
- import_react_native17.Modal,
15958
+ ), /* @__PURE__ */ import_react19.default.createElement(
15959
+ import_react_native18.Modal,
15734
15960
  {
15735
15961
  visible: modalVisible,
15736
15962
  animationType: "slide",
15737
15963
  transparent: true,
15738
15964
  onRequestClose: handleClose
15739
15965
  },
15740
- /* @__PURE__ */ import_react18.default.createElement(
15741
- import_react_native17.KeyboardAvoidingView,
15966
+ /* @__PURE__ */ import_react19.default.createElement(
15967
+ import_react_native18.KeyboardAvoidingView,
15742
15968
  {
15743
- behavior: import_react_native17.Platform.OS === "ios" ? "padding" : "height",
15744
- style: styles15.modalOverlay
15969
+ behavior: import_react_native18.Platform.OS === "ios" ? "padding" : "height",
15970
+ style: styles16.modalOverlay
15745
15971
  },
15746
- /* @__PURE__ */ import_react18.default.createElement(import_react_native17.View, { style: styles15.modalContainer }, /* @__PURE__ */ import_react18.default.createElement(import_react_native17.View, { style: styles15.header }, /* @__PURE__ */ import_react18.default.createElement(import_react_native17.View, { style: styles15.headerLeft }, canGoBack ? /* @__PURE__ */ import_react18.default.createElement(import_react_native17.View, { style: styles15.headerNavRow }, /* @__PURE__ */ import_react18.default.createElement(import_react_native17.TouchableOpacity, { onPress: () => nav.pop(), style: styles15.backButton }, /* @__PURE__ */ import_react18.default.createElement(import_react_native17.Text, { style: styles15.backText }, "\u2190 Back")), /* @__PURE__ */ import_react18.default.createElement(import_react_native17.TouchableOpacity, { onPress: () => nav.reset(), style: styles15.homeButton }, /* @__PURE__ */ import_react18.default.createElement(import_react_native17.Text, { style: styles15.homeText }, "\u{1F3E0}"))) : /* @__PURE__ */ import_react18.default.createElement(import_react_native17.View, { style: styles15.headerTitleRow }, /* @__PURE__ */ import_react18.default.createElement(import_react_native17.Text, { style: styles15.headerTitle }, "BugBear"), testerInfo && /* @__PURE__ */ import_react18.default.createElement(import_react_native17.TouchableOpacity, { onPress: () => push({ name: "PROFILE" }) }, /* @__PURE__ */ import_react18.default.createElement(import_react_native17.Text, { style: styles15.headerName }, testerInfo.name, " \u270E")))), getHeaderTitle() ? /* @__PURE__ */ import_react18.default.createElement(import_react_native17.Text, { style: styles15.headerScreenTitle, numberOfLines: 1 }, getHeaderTitle()) : null, /* @__PURE__ */ import_react18.default.createElement(import_react_native17.TouchableOpacity, { onPress: handleClose, style: styles15.closeButton }, /* @__PURE__ */ import_react18.default.createElement(import_react_native17.Text, { style: styles15.closeText }, "\u2715"))), /* @__PURE__ */ import_react18.default.createElement(
15747
- import_react_native17.ScrollView,
15972
+ /* @__PURE__ */ import_react19.default.createElement(import_react_native18.View, { style: styles16.modalContainer }, /* @__PURE__ */ import_react19.default.createElement(import_react_native18.View, { style: styles16.header }, /* @__PURE__ */ import_react19.default.createElement(import_react_native18.View, { style: styles16.headerLeft }, canGoBack ? /* @__PURE__ */ import_react19.default.createElement(import_react_native18.View, { style: styles16.headerNavRow }, /* @__PURE__ */ import_react19.default.createElement(import_react_native18.TouchableOpacity, { onPress: () => nav.pop(), style: styles16.backButton }, /* @__PURE__ */ import_react19.default.createElement(import_react_native18.Text, { style: styles16.backText }, "\u2190 Back")), /* @__PURE__ */ import_react19.default.createElement(import_react_native18.TouchableOpacity, { onPress: () => nav.reset(), style: styles16.homeButton }, /* @__PURE__ */ import_react19.default.createElement(import_react_native18.Text, { style: styles16.homeText }, "\u{1F3E0}"))) : /* @__PURE__ */ import_react19.default.createElement(import_react_native18.View, { style: styles16.headerTitleRow }, /* @__PURE__ */ import_react19.default.createElement(import_react_native18.Text, { style: styles16.headerTitle }, "BugBear"), testerInfo && /* @__PURE__ */ import_react19.default.createElement(import_react_native18.TouchableOpacity, { onPress: () => push({ name: "PROFILE" }) }, /* @__PURE__ */ import_react19.default.createElement(import_react_native18.Text, { style: styles16.headerName }, testerInfo.name, " \u270E")))), getHeaderTitle() ? /* @__PURE__ */ import_react19.default.createElement(import_react_native18.Text, { style: styles16.headerScreenTitle, numberOfLines: 1 }, getHeaderTitle()) : null, /* @__PURE__ */ import_react19.default.createElement(import_react_native18.TouchableOpacity, { onPress: handleClose, style: styles16.closeButton }, /* @__PURE__ */ import_react19.default.createElement(import_react_native18.Text, { style: styles16.closeText }, "\u2715"))), /* @__PURE__ */ import_react19.default.createElement(
15973
+ import_react_native18.ScrollView,
15748
15974
  {
15749
- style: styles15.content,
15750
- contentContainerStyle: styles15.contentContainer,
15975
+ style: styles16.content,
15976
+ contentContainerStyle: styles16.contentContainer,
15751
15977
  keyboardShouldPersistTaps: "handled",
15752
15978
  showsVerticalScrollIndicator: false
15753
15979
  },
15754
- isLoading ? /* @__PURE__ */ import_react18.default.createElement(import_react_native17.View, { style: styles15.loadingContainer }, /* @__PURE__ */ import_react18.default.createElement(import_react_native17.ActivityIndicator, { size: "large", color: colors.blue }), /* @__PURE__ */ import_react18.default.createElement(import_react_native17.Text, { style: styles15.loadingText }, "Loading...")) : renderScreen()
15980
+ isLoading ? /* @__PURE__ */ import_react19.default.createElement(import_react_native18.View, { style: styles16.loadingContainer }, /* @__PURE__ */ import_react19.default.createElement(import_react_native18.ActivityIndicator, { size: "large", color: colors.blue }), /* @__PURE__ */ import_react19.default.createElement(import_react_native18.Text, { style: styles16.loadingText }, "Loading...")) : renderScreen()
15755
15981
  ))
15756
15982
  )
15757
15983
  ));
15758
15984
  }
15759
- var styles15 = import_react_native17.StyleSheet.create({
15985
+ var styles16 = import_react_native18.StyleSheet.create({
15760
15986
  // FAB
15761
15987
  fabContainer: {
15762
15988
  position: "absolute",
@@ -15898,9 +16124,9 @@ var styles15 = import_react_native17.StyleSheet.create({
15898
16124
  });
15899
16125
 
15900
16126
  // src/BugBearErrorBoundary.tsx
15901
- var import_react19 = __toESM(require("react"));
15902
- var import_react_native18 = require("react-native");
15903
- var BugBearErrorBoundary = class extends import_react19.Component {
16127
+ var import_react20 = __toESM(require("react"));
16128
+ var import_react_native19 = require("react-native");
16129
+ var BugBearErrorBoundary = class extends import_react20.Component {
15904
16130
  constructor(props) {
15905
16131
  super(props);
15906
16132
  this.reset = () => {
@@ -15944,7 +16170,7 @@ var BugBearErrorBoundary = class extends import_react19.Component {
15944
16170
  if (fallback) {
15945
16171
  return fallback;
15946
16172
  }
15947
- return /* @__PURE__ */ import_react19.default.createElement(import_react_native18.View, { style: styles16.container }, /* @__PURE__ */ import_react19.default.createElement(import_react_native18.Text, { style: styles16.title }, "Something went wrong"), /* @__PURE__ */ import_react19.default.createElement(import_react_native18.Text, { style: styles16.message }, error.message), /* @__PURE__ */ import_react19.default.createElement(import_react_native18.TouchableOpacity, { style: styles16.button, onPress: this.reset }, /* @__PURE__ */ import_react19.default.createElement(import_react_native18.Text, { style: styles16.buttonText }, "Try Again")), /* @__PURE__ */ import_react19.default.createElement(import_react_native18.Text, { style: styles16.caption }, "The error has been captured by BugBear"));
16173
+ return /* @__PURE__ */ import_react20.default.createElement(import_react_native19.View, { style: styles17.container }, /* @__PURE__ */ import_react20.default.createElement(import_react_native19.Text, { style: styles17.title }, "Something went wrong"), /* @__PURE__ */ import_react20.default.createElement(import_react_native19.Text, { style: styles17.message }, error.message), /* @__PURE__ */ import_react20.default.createElement(import_react_native19.TouchableOpacity, { style: styles17.button, onPress: this.reset }, /* @__PURE__ */ import_react20.default.createElement(import_react_native19.Text, { style: styles17.buttonText }, "Try Again")), /* @__PURE__ */ import_react20.default.createElement(import_react_native19.Text, { style: styles17.caption }, "The error has been captured by BugBear"));
15948
16174
  }
15949
16175
  return children;
15950
16176
  }
@@ -15955,7 +16181,7 @@ function useErrorContext() {
15955
16181
  getEnhancedContext: () => contextCapture.getEnhancedContext()
15956
16182
  };
15957
16183
  }
15958
- var styles16 = import_react_native18.StyleSheet.create({
16184
+ var styles17 = import_react_native19.StyleSheet.create({
15959
16185
  container: {
15960
16186
  padding: 20,
15961
16187
  margin: 20,