@bbearai/react-native 0.3.9 → 0.3.11

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -11534,7 +11534,7 @@ var ContextCaptureManager = class {
11534
11534
  });
11535
11535
  }
11536
11536
  captureFetch() {
11537
- if (typeof window === "undefined" || typeof fetch === "undefined") return;
11537
+ if (typeof window === "undefined" || typeof fetch === "undefined" || typeof document === "undefined") return;
11538
11538
  this.originalFetch = window.fetch;
11539
11539
  const self2 = this;
11540
11540
  window.fetch = async function(input, init) {
@@ -12655,6 +12655,7 @@ var BugBearClient = class {
12655
12655
  return false;
12656
12656
  }
12657
12657
  await this.supabase.from("discussion_threads").update({ last_message_at: (/* @__PURE__ */ new Date()).toISOString() }).eq("id", threadId);
12658
+ await this.markThreadAsRead(threadId);
12658
12659
  return true;
12659
12660
  } catch (err) {
12660
12661
  console.error("BugBear: Error sending message", err);
@@ -13799,11 +13800,14 @@ function TestDetailScreen({ testId, nav }) {
13799
13800
  setSelectedSkipReason(null);
13800
13801
  setSkipNotes("");
13801
13802
  setSkipping(false);
13802
- const remaining = assignments.filter(
13803
+ const currentIdx = assignments.indexOf(displayedAssignment);
13804
+ const pending = assignments.filter(
13803
13805
  (a) => (a.status === "pending" || a.status === "in_progress") && a.id !== displayedAssignment.id
13804
13806
  );
13805
- if (remaining.length > 0) {
13806
- nav.replace({ name: "TEST_DETAIL", testId: remaining[0].id });
13807
+ if (pending.length > 0) {
13808
+ const nextAfterCurrent = pending.find((a) => assignments.indexOf(a) > currentIdx);
13809
+ const nextTest = nextAfterCurrent || pending[0];
13810
+ nav.replace({ name: "TEST_DETAIL", testId: nextTest.id });
13807
13811
  } else {
13808
13812
  nav.reset();
13809
13813
  }
@@ -14001,6 +14005,9 @@ function TestListScreen({ nav }) {
14001
14005
  const { assignments, currentAssignment, refreshAssignments } = useBugBear();
14002
14006
  const [filter, setFilter] = (0, import_react5.useState)("all");
14003
14007
  const [collapsedFolders, setCollapsedFolders] = (0, import_react5.useState)(/* @__PURE__ */ new Set());
14008
+ (0, import_react5.useEffect)(() => {
14009
+ refreshAssignments();
14010
+ }, []);
14004
14011
  const groupedAssignments = (0, import_react5.useMemo)(() => {
14005
14012
  const groups = /* @__PURE__ */ new Map();
14006
14013
  for (const assignment of assignments) {
@@ -14333,9 +14340,12 @@ function TestFeedbackScreen({ status, assignmentId, nav }) {
14333
14340
  if (status === "failed") {
14334
14341
  nav.replace({ name: "REPORT", prefill: { type: "test_fail", assignmentId, testCaseId: assignment?.testCase.id } });
14335
14342
  } else {
14336
- const remaining = assignments.filter((a) => (a.status === "pending" || a.status === "in_progress") && a.id !== assignmentId);
14337
- if (remaining.length > 0) {
14338
- nav.replace({ name: "TEST_DETAIL", testId: remaining[0].id });
14343
+ const currentIdx = assignments.findIndex((a) => a.id === assignmentId);
14344
+ const pending = assignments.filter((a) => (a.status === "pending" || a.status === "in_progress") && a.id !== assignmentId);
14345
+ if (pending.length > 0) {
14346
+ const nextAfterCurrent = pending.find((a) => assignments.indexOf(a) > currentIdx);
14347
+ const nextTest = nextAfterCurrent || pending[0];
14348
+ nav.replace({ name: "TEST_DETAIL", testId: nextTest.id });
14339
14349
  } else {
14340
14350
  nav.reset();
14341
14351
  }
@@ -14345,9 +14355,12 @@ function TestFeedbackScreen({ status, assignmentId, nav }) {
14345
14355
  if (status === "failed") {
14346
14356
  nav.replace({ name: "REPORT", prefill: { type: "test_fail", assignmentId, testCaseId: assignment?.testCase.id } });
14347
14357
  } else {
14348
- const remaining = assignments.filter((a) => (a.status === "pending" || a.status === "in_progress") && a.id !== assignmentId);
14349
- if (remaining.length > 0) {
14350
- nav.replace({ name: "TEST_DETAIL", testId: remaining[0].id });
14358
+ const currentIdx = assignments.findIndex((a) => a.id === assignmentId);
14359
+ const pending = assignments.filter((a) => (a.status === "pending" || a.status === "in_progress") && a.id !== assignmentId);
14360
+ if (pending.length > 0) {
14361
+ const nextAfterCurrent = pending.find((a) => assignments.indexOf(a) > currentIdx);
14362
+ const nextTest = nextAfterCurrent || pending[0];
14363
+ nav.replace({ name: "TEST_DETAIL", testId: nextTest.id });
14351
14364
  } else {
14352
14365
  nav.reset();
14353
14366
  }
@@ -14422,32 +14435,46 @@ function ReportScreen({ nav, prefill }) {
14422
14435
  const [description, setDescription] = (0, import_react10.useState)("");
14423
14436
  const [affectedScreen, setAffectedScreen] = (0, import_react10.useState)("");
14424
14437
  const [submitting, setSubmitting] = (0, import_react10.useState)(false);
14438
+ const [error, setError] = (0, import_react10.useState)(null);
14425
14439
  const images = useImageAttachments(uploadImage, 5, "screenshots");
14426
14440
  const isBugType = reportType === "bug" || reportType === "test_fail";
14427
14441
  const handleSubmit = async () => {
14428
14442
  if (!client || !description.trim()) return;
14429
14443
  setSubmitting(true);
14430
- const baseContext = client.getAppContext();
14431
- const appContext = {
14432
- ...baseContext,
14433
- currentRoute: affectedScreen.trim() || baseContext.currentRoute
14434
- };
14435
- const screenshotUrls = images.getScreenshotUrls();
14436
- await client.submitReport({
14437
- type: reportType,
14438
- description: description.trim(),
14439
- severity: isBugType ? severity : void 0,
14440
- assignmentId: prefill?.assignmentId,
14441
- testCaseId: prefill?.testCaseId,
14442
- appContext,
14443
- deviceInfo: getDeviceInfo(),
14444
- screenshots: screenshotUrls.length > 0 ? screenshotUrls : void 0
14445
- });
14446
- if (prefill?.assignmentId) {
14447
- await refreshAssignments();
14444
+ setError(null);
14445
+ try {
14446
+ const baseContext = client.getAppContext();
14447
+ const appContext = {
14448
+ ...baseContext,
14449
+ currentRoute: affectedScreen.trim() || baseContext.currentRoute
14450
+ };
14451
+ const screenshotUrls = images.getScreenshotUrls();
14452
+ const result = await client.submitReport({
14453
+ type: reportType,
14454
+ description: description.trim(),
14455
+ severity: isBugType ? severity : void 0,
14456
+ assignmentId: prefill?.assignmentId,
14457
+ testCaseId: prefill?.testCaseId,
14458
+ appContext,
14459
+ deviceInfo: getDeviceInfo(),
14460
+ screenshots: screenshotUrls.length > 0 ? screenshotUrls : void 0
14461
+ });
14462
+ if (!result.success) {
14463
+ console.error("BugBear: Report submission failed", result.error);
14464
+ setError(result.error || "Failed to submit report. Please try again.");
14465
+ setSubmitting(false);
14466
+ return;
14467
+ }
14468
+ if (prefill?.assignmentId) {
14469
+ await refreshAssignments();
14470
+ }
14471
+ setSubmitting(false);
14472
+ nav.replace({ name: "REPORT_SUCCESS" });
14473
+ } catch (err) {
14474
+ console.error("BugBear: Report submission error", err);
14475
+ setError(err instanceof Error ? err.message : "An unexpected error occurred. Please try again.");
14476
+ setSubmitting(false);
14448
14477
  }
14449
- setSubmitting(false);
14450
- nav.replace({ name: "REPORT_SUCCESS" });
14451
14478
  };
14452
14479
  return /* @__PURE__ */ import_react10.default.createElement(import_react_native9.View, 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 }, [
14453
14480
  { type: "bug", label: "Bug", icon: "\u{1F41B}" },
@@ -14506,14 +14533,14 @@ function ReportScreen({ nav, prefill }) {
14506
14533
  onRemove: images.removeImage,
14507
14534
  label: "Screenshots (optional)"
14508
14535
  }
14509
- ), /* @__PURE__ */ import_react10.default.createElement(
14536
+ ), 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(
14510
14537
  import_react_native9.TouchableOpacity,
14511
14538
  {
14512
14539
  style: [shared.primaryButton, (!description.trim() || submitting || images.isUploading) && shared.primaryButtonDisabled, { marginTop: 20 }],
14513
14540
  onPress: handleSubmit,
14514
14541
  disabled: !description.trim() || submitting || images.isUploading
14515
14542
  },
14516
- /* @__PURE__ */ import_react10.default.createElement(import_react_native9.Text, { style: shared.primaryButtonText }, images.isUploading ? "Uploading images..." : submitting ? "Submitting..." : "Submit Report")
14543
+ /* @__PURE__ */ import_react10.default.createElement(import_react_native9.Text, { style: shared.primaryButtonText }, images.isUploading ? "Uploading images..." : submitting ? "Submitting..." : error ? "Retry" : "Submit Report")
14517
14544
  ));
14518
14545
  }
14519
14546
  var styles7 = import_react_native9.StyleSheet.create({
@@ -14529,7 +14556,9 @@ var styles7 = import_react_native9.StyleSheet.create({
14529
14556
  sevText: { fontSize: 12, fontWeight: "500", color: colors.textSecondary, textTransform: "capitalize" },
14530
14557
  descInput: { backgroundColor: colors.card, borderWidth: 1, borderColor: colors.border, borderRadius: 12, paddingHorizontal: 14, paddingVertical: 12, fontSize: 14, color: colors.textPrimary, minHeight: 100 },
14531
14558
  screenInput: { backgroundColor: colors.card, borderWidth: 1, borderColor: colors.border, borderRadius: 8, paddingHorizontal: 12, paddingVertical: 8, fontSize: 13, color: colors.textPrimary },
14532
- screenHint: { fontSize: 11, color: colors.textMuted, marginTop: 4 }
14559
+ screenHint: { fontSize: 11, color: colors.textMuted, marginTop: 4 },
14560
+ errorBanner: { backgroundColor: "#7f1d1d", borderWidth: 1, borderColor: "#991b1b", borderRadius: 8, padding: 12, marginTop: 16 },
14561
+ errorText: { fontSize: 13, color: "#fca5a5", lineHeight: 18 }
14533
14562
  });
14534
14563
 
14535
14564
  // src/widget/screens/ReportSuccessScreen.tsx
package/dist/index.mjs CHANGED
@@ -11503,7 +11503,7 @@ var ContextCaptureManager = class {
11503
11503
  });
11504
11504
  }
11505
11505
  captureFetch() {
11506
- if (typeof window === "undefined" || typeof fetch === "undefined") return;
11506
+ if (typeof window === "undefined" || typeof fetch === "undefined" || typeof document === "undefined") return;
11507
11507
  this.originalFetch = window.fetch;
11508
11508
  const self2 = this;
11509
11509
  window.fetch = async function(input, init) {
@@ -12624,6 +12624,7 @@ var BugBearClient = class {
12624
12624
  return false;
12625
12625
  }
12626
12626
  await this.supabase.from("discussion_threads").update({ last_message_at: (/* @__PURE__ */ new Date()).toISOString() }).eq("id", threadId);
12627
+ await this.markThreadAsRead(threadId);
12627
12628
  return true;
12628
12629
  } catch (err) {
12629
12630
  console.error("BugBear: Error sending message", err);
@@ -13783,11 +13784,14 @@ function TestDetailScreen({ testId, nav }) {
13783
13784
  setSelectedSkipReason(null);
13784
13785
  setSkipNotes("");
13785
13786
  setSkipping(false);
13786
- const remaining = assignments.filter(
13787
+ const currentIdx = assignments.indexOf(displayedAssignment);
13788
+ const pending = assignments.filter(
13787
13789
  (a) => (a.status === "pending" || a.status === "in_progress") && a.id !== displayedAssignment.id
13788
13790
  );
13789
- if (remaining.length > 0) {
13790
- nav.replace({ name: "TEST_DETAIL", testId: remaining[0].id });
13791
+ if (pending.length > 0) {
13792
+ const nextAfterCurrent = pending.find((a) => assignments.indexOf(a) > currentIdx);
13793
+ const nextTest = nextAfterCurrent || pending[0];
13794
+ nav.replace({ name: "TEST_DETAIL", testId: nextTest.id });
13791
13795
  } else {
13792
13796
  nav.reset();
13793
13797
  }
@@ -13979,12 +13983,15 @@ var styles2 = StyleSheet3.create({
13979
13983
  });
13980
13984
 
13981
13985
  // src/widget/screens/TestListScreen.tsx
13982
- import React4, { useState as useState3, useMemo as useMemo2, useCallback as useCallback3 } from "react";
13986
+ import React4, { useState as useState3, useMemo as useMemo2, useCallback as useCallback3, useEffect as useEffect4 } from "react";
13983
13987
  import { View as View3, Text as Text3, TouchableOpacity as TouchableOpacity3, StyleSheet as StyleSheet4 } from "react-native";
13984
13988
  function TestListScreen({ nav }) {
13985
13989
  const { assignments, currentAssignment, refreshAssignments } = useBugBear();
13986
13990
  const [filter, setFilter] = useState3("all");
13987
13991
  const [collapsedFolders, setCollapsedFolders] = useState3(/* @__PURE__ */ new Set());
13992
+ useEffect4(() => {
13993
+ refreshAssignments();
13994
+ }, []);
13988
13995
  const groupedAssignments = useMemo2(() => {
13989
13996
  const groups = /* @__PURE__ */ new Map();
13990
13997
  for (const assignment of assignments) {
@@ -14317,9 +14324,12 @@ function TestFeedbackScreen({ status, assignmentId, nav }) {
14317
14324
  if (status === "failed") {
14318
14325
  nav.replace({ name: "REPORT", prefill: { type: "test_fail", assignmentId, testCaseId: assignment?.testCase.id } });
14319
14326
  } else {
14320
- const remaining = assignments.filter((a) => (a.status === "pending" || a.status === "in_progress") && a.id !== assignmentId);
14321
- if (remaining.length > 0) {
14322
- nav.replace({ name: "TEST_DETAIL", testId: remaining[0].id });
14327
+ const currentIdx = assignments.findIndex((a) => a.id === assignmentId);
14328
+ const pending = assignments.filter((a) => (a.status === "pending" || a.status === "in_progress") && a.id !== assignmentId);
14329
+ if (pending.length > 0) {
14330
+ const nextAfterCurrent = pending.find((a) => assignments.indexOf(a) > currentIdx);
14331
+ const nextTest = nextAfterCurrent || pending[0];
14332
+ nav.replace({ name: "TEST_DETAIL", testId: nextTest.id });
14323
14333
  } else {
14324
14334
  nav.reset();
14325
14335
  }
@@ -14329,9 +14339,12 @@ function TestFeedbackScreen({ status, assignmentId, nav }) {
14329
14339
  if (status === "failed") {
14330
14340
  nav.replace({ name: "REPORT", prefill: { type: "test_fail", assignmentId, testCaseId: assignment?.testCase.id } });
14331
14341
  } else {
14332
- const remaining = assignments.filter((a) => (a.status === "pending" || a.status === "in_progress") && a.id !== assignmentId);
14333
- if (remaining.length > 0) {
14334
- nav.replace({ name: "TEST_DETAIL", testId: remaining[0].id });
14342
+ const currentIdx = assignments.findIndex((a) => a.id === assignmentId);
14343
+ const pending = assignments.filter((a) => (a.status === "pending" || a.status === "in_progress") && a.id !== assignmentId);
14344
+ if (pending.length > 0) {
14345
+ const nextAfterCurrent = pending.find((a) => assignments.indexOf(a) > currentIdx);
14346
+ const nextTest = nextAfterCurrent || pending[0];
14347
+ nav.replace({ name: "TEST_DETAIL", testId: nextTest.id });
14335
14348
  } else {
14336
14349
  nav.reset();
14337
14350
  }
@@ -14406,32 +14419,46 @@ function ReportScreen({ nav, prefill }) {
14406
14419
  const [description, setDescription] = useState6("");
14407
14420
  const [affectedScreen, setAffectedScreen] = useState6("");
14408
14421
  const [submitting, setSubmitting] = useState6(false);
14422
+ const [error, setError] = useState6(null);
14409
14423
  const images = useImageAttachments(uploadImage, 5, "screenshots");
14410
14424
  const isBugType = reportType === "bug" || reportType === "test_fail";
14411
14425
  const handleSubmit = async () => {
14412
14426
  if (!client || !description.trim()) return;
14413
14427
  setSubmitting(true);
14414
- const baseContext = client.getAppContext();
14415
- const appContext = {
14416
- ...baseContext,
14417
- currentRoute: affectedScreen.trim() || baseContext.currentRoute
14418
- };
14419
- const screenshotUrls = images.getScreenshotUrls();
14420
- await client.submitReport({
14421
- type: reportType,
14422
- description: description.trim(),
14423
- severity: isBugType ? severity : void 0,
14424
- assignmentId: prefill?.assignmentId,
14425
- testCaseId: prefill?.testCaseId,
14426
- appContext,
14427
- deviceInfo: getDeviceInfo(),
14428
- screenshots: screenshotUrls.length > 0 ? screenshotUrls : void 0
14429
- });
14430
- if (prefill?.assignmentId) {
14431
- await refreshAssignments();
14428
+ setError(null);
14429
+ try {
14430
+ const baseContext = client.getAppContext();
14431
+ const appContext = {
14432
+ ...baseContext,
14433
+ currentRoute: affectedScreen.trim() || baseContext.currentRoute
14434
+ };
14435
+ const screenshotUrls = images.getScreenshotUrls();
14436
+ const result = await client.submitReport({
14437
+ type: reportType,
14438
+ description: description.trim(),
14439
+ severity: isBugType ? severity : void 0,
14440
+ assignmentId: prefill?.assignmentId,
14441
+ testCaseId: prefill?.testCaseId,
14442
+ appContext,
14443
+ deviceInfo: getDeviceInfo(),
14444
+ screenshots: screenshotUrls.length > 0 ? screenshotUrls : void 0
14445
+ });
14446
+ if (!result.success) {
14447
+ console.error("BugBear: Report submission failed", result.error);
14448
+ setError(result.error || "Failed to submit report. Please try again.");
14449
+ setSubmitting(false);
14450
+ return;
14451
+ }
14452
+ if (prefill?.assignmentId) {
14453
+ await refreshAssignments();
14454
+ }
14455
+ setSubmitting(false);
14456
+ nav.replace({ name: "REPORT_SUCCESS" });
14457
+ } catch (err) {
14458
+ console.error("BugBear: Report submission error", err);
14459
+ setError(err instanceof Error ? err.message : "An unexpected error occurred. Please try again.");
14460
+ setSubmitting(false);
14432
14461
  }
14433
- setSubmitting(false);
14434
- nav.replace({ name: "REPORT_SUCCESS" });
14435
14462
  };
14436
14463
  return /* @__PURE__ */ React8.createElement(View7, null, /* @__PURE__ */ React8.createElement(Text7, { style: shared.label }, "What are you reporting?"), /* @__PURE__ */ React8.createElement(View7, { style: styles7.typeRow }, [
14437
14464
  { type: "bug", label: "Bug", icon: "\u{1F41B}" },
@@ -14490,14 +14517,14 @@ function ReportScreen({ nav, prefill }) {
14490
14517
  onRemove: images.removeImage,
14491
14518
  label: "Screenshots (optional)"
14492
14519
  }
14493
- ), /* @__PURE__ */ React8.createElement(
14520
+ ), error && /* @__PURE__ */ React8.createElement(View7, { style: styles7.errorBanner }, /* @__PURE__ */ React8.createElement(Text7, { style: styles7.errorText }, error)), /* @__PURE__ */ React8.createElement(
14494
14521
  TouchableOpacity7,
14495
14522
  {
14496
14523
  style: [shared.primaryButton, (!description.trim() || submitting || images.isUploading) && shared.primaryButtonDisabled, { marginTop: 20 }],
14497
14524
  onPress: handleSubmit,
14498
14525
  disabled: !description.trim() || submitting || images.isUploading
14499
14526
  },
14500
- /* @__PURE__ */ React8.createElement(Text7, { style: shared.primaryButtonText }, images.isUploading ? "Uploading images..." : submitting ? "Submitting..." : "Submit Report")
14527
+ /* @__PURE__ */ React8.createElement(Text7, { style: shared.primaryButtonText }, images.isUploading ? "Uploading images..." : submitting ? "Submitting..." : error ? "Retry" : "Submit Report")
14501
14528
  ));
14502
14529
  }
14503
14530
  var styles7 = StyleSheet8.create({
@@ -14513,14 +14540,16 @@ var styles7 = StyleSheet8.create({
14513
14540
  sevText: { fontSize: 12, fontWeight: "500", color: colors.textSecondary, textTransform: "capitalize" },
14514
14541
  descInput: { backgroundColor: colors.card, borderWidth: 1, borderColor: colors.border, borderRadius: 12, paddingHorizontal: 14, paddingVertical: 12, fontSize: 14, color: colors.textPrimary, minHeight: 100 },
14515
14542
  screenInput: { backgroundColor: colors.card, borderWidth: 1, borderColor: colors.border, borderRadius: 8, paddingHorizontal: 12, paddingVertical: 8, fontSize: 13, color: colors.textPrimary },
14516
- screenHint: { fontSize: 11, color: colors.textMuted, marginTop: 4 }
14543
+ screenHint: { fontSize: 11, color: colors.textMuted, marginTop: 4 },
14544
+ errorBanner: { backgroundColor: "#7f1d1d", borderWidth: 1, borderColor: "#991b1b", borderRadius: 8, padding: 12, marginTop: 16 },
14545
+ errorText: { fontSize: 13, color: "#fca5a5", lineHeight: 18 }
14517
14546
  });
14518
14547
 
14519
14548
  // src/widget/screens/ReportSuccessScreen.tsx
14520
- import React9, { useEffect as useEffect4 } from "react";
14549
+ import React9, { useEffect as useEffect5 } from "react";
14521
14550
  import { View as View8, Text as Text8, StyleSheet as StyleSheet9 } from "react-native";
14522
14551
  function ReportSuccessScreen({ nav }) {
14523
- useEffect4(() => {
14552
+ useEffect5(() => {
14524
14553
  const timer = setTimeout(() => nav.reset(), 2e3);
14525
14554
  return () => clearTimeout(timer);
14526
14555
  }, [nav]);
@@ -14579,7 +14608,7 @@ var styles9 = StyleSheet10.create({
14579
14608
  });
14580
14609
 
14581
14610
  // src/widget/screens/ThreadDetailScreen.tsx
14582
- import React11, { useState as useState7, useEffect as useEffect5 } from "react";
14611
+ import React11, { useState as useState7, useEffect as useEffect6 } from "react";
14583
14612
  import { View as View10, Text as Text10, TouchableOpacity as TouchableOpacity9, TextInput as TextInput4, StyleSheet as StyleSheet11, Image as Image2 } from "react-native";
14584
14613
  function ThreadDetailScreen({ thread, nav }) {
14585
14614
  const { getThreadMessages, sendMessage, markAsRead, uploadImage } = useBugBear();
@@ -14589,7 +14618,7 @@ function ThreadDetailScreen({ thread, nav }) {
14589
14618
  const [sending, setSending] = useState7(false);
14590
14619
  const [sendError, setSendError] = useState7(false);
14591
14620
  const replyImages = useImageAttachments(uploadImage, 3, "discussion-attachments");
14592
- useEffect5(() => {
14621
+ useEffect6(() => {
14593
14622
  (async () => {
14594
14623
  setLoading(true);
14595
14624
  const msgs = await getThreadMessages(thread.id);
@@ -14758,7 +14787,7 @@ var styles11 = StyleSheet12.create({
14758
14787
  });
14759
14788
 
14760
14789
  // src/widget/screens/ProfileScreen.tsx
14761
- import React13, { useState as useState9, useEffect as useEffect6 } from "react";
14790
+ import React13, { useState as useState9, useEffect as useEffect7 } from "react";
14762
14791
  import { View as View12, Text as Text12, TouchableOpacity as TouchableOpacity11, TextInput as TextInput6, StyleSheet as StyleSheet13 } from "react-native";
14763
14792
  function ProfileScreen({ nav }) {
14764
14793
  const { testerInfo, assignments, updateTesterProfile, refreshTesterInfo } = useBugBear();
@@ -14771,7 +14800,7 @@ function ProfileScreen({ nav }) {
14771
14800
  const [saved, setSaved] = useState9(false);
14772
14801
  const [showDetails, setShowDetails] = useState9(false);
14773
14802
  const completedCount = assignments.filter((a) => a.status === "passed" || a.status === "failed").length;
14774
- useEffect6(() => {
14803
+ useEffect7(() => {
14775
14804
  if (testerInfo) {
14776
14805
  setName(testerInfo.name);
14777
14806
  setAdditionalEmails(testerInfo.additionalEmails || []);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@bbearai/react-native",
3
- "version": "0.3.9",
3
+ "version": "0.3.11",
4
4
  "description": "BugBear React Native components for mobile apps",
5
5
  "main": "./dist/index.js",
6
6
  "module": "./dist/index.mjs",