@bbearai/react-native 0.10.0 → 0.10.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -12838,7 +12838,7 @@ var BugBearClient = class {
12838
12838
  } : {
12839
12839
  // Standalone verification assignment (bug reported without a test case)
12840
12840
  id: item.original_report_id || item.id,
12841
- title: item.notes || "Bug Verification",
12841
+ title: item.notes?.replace(/^Verification:\s*/i, "") || "Bug Verification",
12842
12842
  testKey: "VERIFY",
12843
12843
  description: "Verify that the reported bug has been fixed",
12844
12844
  steps: [],
@@ -15388,7 +15388,8 @@ var s = import_react_native3.StyleSheet.create({
15388
15388
 
15389
15389
  // src/widget/screens/HomeScreen.tsx
15390
15390
  function HomeScreen({ nav }) {
15391
- const { assignments, unreadCount, threads, refreshAssignments, refreshThreads, issueCounts, refreshIssueCounts, dashboardUrl, isLoading, activeSession, sessionFindings, refreshSession, widgetMode, widgetColorScheme } = useBugBear();
15391
+ const { client, assignments, unreadCount, threads, refreshAssignments, refreshThreads, issueCounts, refreshIssueCounts, dashboardUrl, isLoading, activeSession, sessionFindings, refreshSession, widgetMode, widgetColorScheme } = useBugBear();
15392
+ const [tasks, setTasks] = (0, import_react4.useState)([]);
15392
15393
  const styles7 = (0, import_react4.useMemo)(() => createStyles(), [widgetColorScheme]);
15393
15394
  const [sessionElapsed, setSessionElapsed] = (0, import_react4.useState)(0);
15394
15395
  const timerRef = (0, import_react4.useRef)(null);
@@ -15409,6 +15410,10 @@ function HomeScreen({ nav }) {
15409
15410
  if (widgetMode === "qa") {
15410
15411
  refreshAssignments();
15411
15412
  refreshSession();
15413
+ if (client?.getTasks) {
15414
+ client.getTasks().then(setTasks).catch(() => {
15415
+ });
15416
+ }
15412
15417
  }
15413
15418
  refreshThreads();
15414
15419
  refreshIssueCounts();
@@ -15554,27 +15559,38 @@ function HomeScreen({ nav }) {
15554
15559
  /* @__PURE__ */ import_react4.default.createElement(import_react_native4.View, { style: styles7.sessionDot }),
15555
15560
  /* @__PURE__ */ import_react4.default.createElement(import_react_native4.View, { style: styles7.sessionCardContent }, /* @__PURE__ */ import_react4.default.createElement(import_react_native4.Text, { style: styles7.sessionCardTitle, numberOfLines: 1 }, activeSession.focusArea || "QA Session"), /* @__PURE__ */ import_react4.default.createElement(import_react_native4.Text, { style: styles7.sessionCardMeta }, formatTimer(sessionElapsed), " \xB7 ", sessionFindings.length, " finding", sessionFindings.length !== 1 ? "s" : "")),
15556
15561
  /* @__PURE__ */ import_react4.default.createElement(import_react_native4.Text, { style: styles7.sessionCardAction }, "Resume \u2192")
15557
- ) : /* @__PURE__ */ import_react4.default.createElement(
15562
+ ) : /* @__PURE__ */ import_react4.default.createElement(import_react_native4.View, { style: styles7.sessionRow }, /* @__PURE__ */ import_react4.default.createElement(
15558
15563
  import_react_native4.TouchableOpacity,
15559
15564
  {
15560
- style: styles7.sessionCardInactive,
15565
+ style: styles7.sessionTileBlue,
15561
15566
  onPress: () => nav.push({ name: "SESSION_START" }),
15562
15567
  activeOpacity: 0.7
15563
15568
  },
15564
- /* @__PURE__ */ import_react4.default.createElement(import_react_native4.Text, { style: styles7.sessionCardIcon }, "\u{1F50D}"),
15565
- /* @__PURE__ */ import_react4.default.createElement(import_react_native4.Text, { style: styles7.sessionCardLabel }, "Start QA Session"),
15566
- /* @__PURE__ */ import_react4.default.createElement(import_react_native4.Text, { style: styles7.sessionCardArrow }, "\u2192")
15567
- ), !activeSession && nav.startAdHoc && /* @__PURE__ */ import_react4.default.createElement(
15569
+ /* @__PURE__ */ import_react4.default.createElement(import_react_native4.Text, { style: styles7.tileIcon }, "\u{1F50D}"),
15570
+ /* @__PURE__ */ import_react4.default.createElement(import_react_native4.Text, { style: styles7.tileTitle }, "Focused Session"),
15571
+ /* @__PURE__ */ import_react4.default.createElement(import_react_native4.Text, { style: styles7.tileSub }, "Set focus area & track before starting")
15572
+ ), nav.startAdHoc && /* @__PURE__ */ import_react4.default.createElement(
15568
15573
  import_react_native4.TouchableOpacity,
15569
15574
  {
15570
- style: styles7.quickTestCard,
15575
+ style: styles7.sessionTileGreen,
15571
15576
  onPress: () => nav.startAdHoc?.(),
15572
15577
  activeOpacity: 0.7
15573
15578
  },
15574
- /* @__PURE__ */ import_react4.default.createElement(import_react_native4.Text, { style: styles7.quickTestIcon }, "\u26A1"),
15575
- /* @__PURE__ */ import_react4.default.createElement(import_react_native4.View, { style: styles7.quickTestContent }, /* @__PURE__ */ import_react4.default.createElement(import_react_native4.Text, { style: styles7.quickTestTitle }, "Quick Test"), /* @__PURE__ */ import_react4.default.createElement(import_react_native4.Text, { style: styles7.quickTestSub }, "Ad hoc explore & report")),
15576
- /* @__PURE__ */ import_react4.default.createElement(import_react_native4.Text, { style: styles7.sessionCardArrow }, "\u2192")
15577
- ), /* @__PURE__ */ import_react4.default.createElement(import_react_native4.View, { style: styles7.actionGrid }, /* @__PURE__ */ import_react4.default.createElement(
15579
+ /* @__PURE__ */ import_react4.default.createElement(import_react_native4.Text, { style: styles7.tileIcon }, "\u26A1"),
15580
+ /* @__PURE__ */ import_react4.default.createElement(import_react_native4.Text, { style: styles7.tileTitle }, "Quick Test"),
15581
+ /* @__PURE__ */ import_react4.default.createElement(import_react_native4.Text, { style: styles7.tileSub }, "Jump straight in \u2014 no setup needed")
15582
+ )), !activeSession && tasks.length > 0 && /* @__PURE__ */ import_react4.default.createElement(import_react_native4.View, { style: { marginBottom: 20 } }, /* @__PURE__ */ import_react4.default.createElement(import_react_native4.Text, { style: { fontSize: 12, fontWeight: "600", color: colors.textSecondary, textTransform: "uppercase", letterSpacing: 0.5, marginBottom: 8 } }, "Task Checklist"), tasks.map((task) => /* @__PURE__ */ import_react4.default.createElement(
15583
+ import_react_native4.TouchableOpacity,
15584
+ {
15585
+ key: task.id,
15586
+ style: { backgroundColor: colors.card, borderWidth: 1, borderColor: colors.border, borderRadius: 10, padding: 12, paddingHorizontal: 14, flexDirection: "row", alignItems: "center", gap: 10, marginBottom: 4 },
15587
+ onPress: () => nav.startAdHoc?.(task.id, task.title),
15588
+ activeOpacity: 0.7
15589
+ },
15590
+ task.priority === "high" && /* @__PURE__ */ import_react4.default.createElement(import_react_native4.View, { style: { width: 6, height: 6, borderRadius: 3, backgroundColor: colors.red } }),
15591
+ /* @__PURE__ */ import_react4.default.createElement(import_react_native4.View, { style: { flex: 1 } }, /* @__PURE__ */ import_react4.default.createElement(import_react_native4.Text, { style: { fontSize: 13, fontWeight: "500", color: colors.textPrimary }, numberOfLines: 1 }, task.title), task.description ? /* @__PURE__ */ import_react4.default.createElement(import_react_native4.Text, { style: { fontSize: 11, color: colors.textMuted, marginTop: 2 }, numberOfLines: 1 }, task.description) : null),
15592
+ /* @__PURE__ */ import_react4.default.createElement(import_react_native4.Text, { style: { fontSize: 11, fontWeight: "600", color: colors.blue } }, "Go")
15593
+ ))), /* @__PURE__ */ import_react4.default.createElement(import_react_native4.View, { style: styles7.actionGrid }, /* @__PURE__ */ import_react4.default.createElement(
15578
15594
  import_react_native4.TouchableOpacity,
15579
15595
  {
15580
15596
  style: styles7.actionCard,
@@ -15887,7 +15903,7 @@ function createStyles() {
15887
15903
  fontSize: 13,
15888
15904
  color: colors.blue
15889
15905
  },
15890
- // Session card
15906
+ // Session card (active — running session)
15891
15907
  sessionCardActive: {
15892
15908
  flexDirection: "row",
15893
15909
  alignItems: "center",
@@ -15924,59 +15940,50 @@ function createStyles() {
15924
15940
  fontWeight: "600",
15925
15941
  color: colors.blue
15926
15942
  },
15927
- sessionCardInactive: {
15943
+ sessionCardArrow: {
15944
+ fontSize: 13,
15945
+ color: colors.textMuted
15946
+ },
15947
+ // Session start row — two side-by-side tiles
15948
+ sessionRow: {
15928
15949
  flexDirection: "row",
15929
- alignItems: "center",
15950
+ gap: 10,
15951
+ marginBottom: 16
15952
+ },
15953
+ sessionTileBlue: {
15954
+ flex: 1,
15930
15955
  backgroundColor: colors.card,
15931
15956
  borderWidth: 1,
15932
15957
  borderColor: colors.border,
15958
+ borderTopWidth: 3,
15959
+ borderTopColor: colors.blue,
15933
15960
  borderRadius: 12,
15934
15961
  padding: 12,
15935
- paddingHorizontal: 16,
15936
- gap: 12,
15937
- marginBottom: 16
15938
- },
15939
- sessionCardIcon: {
15940
- fontSize: 22
15962
+ gap: 4
15941
15963
  },
15942
- sessionCardLabel: {
15964
+ sessionTileGreen: {
15943
15965
  flex: 1,
15944
- fontSize: 14,
15945
- fontWeight: "500",
15946
- color: colors.textPrimary
15947
- },
15948
- sessionCardArrow: {
15949
- fontSize: 13,
15950
- color: colors.textMuted
15951
- },
15952
- // Quick Test card
15953
- quickTestCard: {
15954
- flexDirection: "row",
15955
- alignItems: "center",
15956
15966
  backgroundColor: colors.card,
15957
15967
  borderWidth: 1,
15958
15968
  borderColor: colors.border,
15969
+ borderTopWidth: 3,
15970
+ borderTopColor: colors.green,
15959
15971
  borderRadius: 12,
15960
15972
  padding: 12,
15961
- paddingHorizontal: 16,
15962
- gap: 12,
15963
- marginBottom: 16
15964
- },
15965
- quickTestIcon: {
15966
- fontSize: 22
15973
+ gap: 4
15967
15974
  },
15968
- quickTestContent: {
15969
- flex: 1
15975
+ tileIcon: {
15976
+ fontSize: 20
15970
15977
  },
15971
- quickTestTitle: {
15972
- fontSize: 14,
15978
+ tileTitle: {
15979
+ fontSize: 13,
15973
15980
  fontWeight: "600",
15974
15981
  color: colors.textPrimary
15975
15982
  },
15976
- quickTestSub: {
15977
- fontSize: 12,
15983
+ tileSub: {
15984
+ fontSize: 11,
15978
15985
  color: colors.textMuted,
15979
- marginTop: 2
15986
+ lineHeight: 16
15980
15987
  }
15981
15988
  });
15982
15989
  }
@@ -18869,7 +18876,9 @@ function SessionActiveScreen({ nav }) {
18869
18876
  const [elapsed, setElapsed] = (0, import_react21.useState)(0);
18870
18877
  const timerRef = (0, import_react21.useRef)(null);
18871
18878
  (0, import_react21.useEffect)(() => {
18872
- refreshSession();
18879
+ if (!activeSession) {
18880
+ refreshSession();
18881
+ }
18873
18882
  }, []);
18874
18883
  (0, import_react21.useEffect)(() => {
18875
18884
  if (timerRef.current) clearInterval(timerRef.current);
package/dist/index.mjs CHANGED
@@ -12805,7 +12805,7 @@ var BugBearClient = class {
12805
12805
  } : {
12806
12806
  // Standalone verification assignment (bug reported without a test case)
12807
12807
  id: item.original_report_id || item.id,
12808
- title: item.notes || "Bug Verification",
12808
+ title: item.notes?.replace(/^Verification:\s*/i, "") || "Bug Verification",
12809
12809
  testKey: "VERIFY",
12810
12810
  description: "Verify that the reported bug has been fixed",
12811
12811
  steps: [],
@@ -15370,7 +15370,8 @@ var s = StyleSheet2.create({
15370
15370
 
15371
15371
  // src/widget/screens/HomeScreen.tsx
15372
15372
  function HomeScreen({ nav }) {
15373
- const { assignments, unreadCount, threads, refreshAssignments, refreshThreads, issueCounts, refreshIssueCounts, dashboardUrl, isLoading, activeSession, sessionFindings, refreshSession, widgetMode, widgetColorScheme } = useBugBear();
15373
+ const { client, assignments, unreadCount, threads, refreshAssignments, refreshThreads, issueCounts, refreshIssueCounts, dashboardUrl, isLoading, activeSession, sessionFindings, refreshSession, widgetMode, widgetColorScheme } = useBugBear();
15374
+ const [tasks, setTasks] = useState2([]);
15374
15375
  const styles7 = useMemo(() => createStyles(), [widgetColorScheme]);
15375
15376
  const [sessionElapsed, setSessionElapsed] = useState2(0);
15376
15377
  const timerRef = useRef3(null);
@@ -15391,6 +15392,10 @@ function HomeScreen({ nav }) {
15391
15392
  if (widgetMode === "qa") {
15392
15393
  refreshAssignments();
15393
15394
  refreshSession();
15395
+ if (client?.getTasks) {
15396
+ client.getTasks().then(setTasks).catch(() => {
15397
+ });
15398
+ }
15394
15399
  }
15395
15400
  refreshThreads();
15396
15401
  refreshIssueCounts();
@@ -15536,27 +15541,38 @@ function HomeScreen({ nav }) {
15536
15541
  /* @__PURE__ */ React3.createElement(View3, { style: styles7.sessionDot }),
15537
15542
  /* @__PURE__ */ React3.createElement(View3, { style: styles7.sessionCardContent }, /* @__PURE__ */ React3.createElement(Text, { style: styles7.sessionCardTitle, numberOfLines: 1 }, activeSession.focusArea || "QA Session"), /* @__PURE__ */ React3.createElement(Text, { style: styles7.sessionCardMeta }, formatTimer(sessionElapsed), " \xB7 ", sessionFindings.length, " finding", sessionFindings.length !== 1 ? "s" : "")),
15538
15543
  /* @__PURE__ */ React3.createElement(Text, { style: styles7.sessionCardAction }, "Resume \u2192")
15539
- ) : /* @__PURE__ */ React3.createElement(
15544
+ ) : /* @__PURE__ */ React3.createElement(View3, { style: styles7.sessionRow }, /* @__PURE__ */ React3.createElement(
15540
15545
  TouchableOpacity,
15541
15546
  {
15542
- style: styles7.sessionCardInactive,
15547
+ style: styles7.sessionTileBlue,
15543
15548
  onPress: () => nav.push({ name: "SESSION_START" }),
15544
15549
  activeOpacity: 0.7
15545
15550
  },
15546
- /* @__PURE__ */ React3.createElement(Text, { style: styles7.sessionCardIcon }, "\u{1F50D}"),
15547
- /* @__PURE__ */ React3.createElement(Text, { style: styles7.sessionCardLabel }, "Start QA Session"),
15548
- /* @__PURE__ */ React3.createElement(Text, { style: styles7.sessionCardArrow }, "\u2192")
15549
- ), !activeSession && nav.startAdHoc && /* @__PURE__ */ React3.createElement(
15551
+ /* @__PURE__ */ React3.createElement(Text, { style: styles7.tileIcon }, "\u{1F50D}"),
15552
+ /* @__PURE__ */ React3.createElement(Text, { style: styles7.tileTitle }, "Focused Session"),
15553
+ /* @__PURE__ */ React3.createElement(Text, { style: styles7.tileSub }, "Set focus area & track before starting")
15554
+ ), nav.startAdHoc && /* @__PURE__ */ React3.createElement(
15550
15555
  TouchableOpacity,
15551
15556
  {
15552
- style: styles7.quickTestCard,
15557
+ style: styles7.sessionTileGreen,
15553
15558
  onPress: () => nav.startAdHoc?.(),
15554
15559
  activeOpacity: 0.7
15555
15560
  },
15556
- /* @__PURE__ */ React3.createElement(Text, { style: styles7.quickTestIcon }, "\u26A1"),
15557
- /* @__PURE__ */ React3.createElement(View3, { style: styles7.quickTestContent }, /* @__PURE__ */ React3.createElement(Text, { style: styles7.quickTestTitle }, "Quick Test"), /* @__PURE__ */ React3.createElement(Text, { style: styles7.quickTestSub }, "Ad hoc explore & report")),
15558
- /* @__PURE__ */ React3.createElement(Text, { style: styles7.sessionCardArrow }, "\u2192")
15559
- ), /* @__PURE__ */ React3.createElement(View3, { style: styles7.actionGrid }, /* @__PURE__ */ React3.createElement(
15561
+ /* @__PURE__ */ React3.createElement(Text, { style: styles7.tileIcon }, "\u26A1"),
15562
+ /* @__PURE__ */ React3.createElement(Text, { style: styles7.tileTitle }, "Quick Test"),
15563
+ /* @__PURE__ */ React3.createElement(Text, { style: styles7.tileSub }, "Jump straight in \u2014 no setup needed")
15564
+ )), !activeSession && tasks.length > 0 && /* @__PURE__ */ React3.createElement(View3, { style: { marginBottom: 20 } }, /* @__PURE__ */ React3.createElement(Text, { style: { fontSize: 12, fontWeight: "600", color: colors.textSecondary, textTransform: "uppercase", letterSpacing: 0.5, marginBottom: 8 } }, "Task Checklist"), tasks.map((task) => /* @__PURE__ */ React3.createElement(
15565
+ TouchableOpacity,
15566
+ {
15567
+ key: task.id,
15568
+ style: { backgroundColor: colors.card, borderWidth: 1, borderColor: colors.border, borderRadius: 10, padding: 12, paddingHorizontal: 14, flexDirection: "row", alignItems: "center", gap: 10, marginBottom: 4 },
15569
+ onPress: () => nav.startAdHoc?.(task.id, task.title),
15570
+ activeOpacity: 0.7
15571
+ },
15572
+ task.priority === "high" && /* @__PURE__ */ React3.createElement(View3, { style: { width: 6, height: 6, borderRadius: 3, backgroundColor: colors.red } }),
15573
+ /* @__PURE__ */ React3.createElement(View3, { style: { flex: 1 } }, /* @__PURE__ */ React3.createElement(Text, { style: { fontSize: 13, fontWeight: "500", color: colors.textPrimary }, numberOfLines: 1 }, task.title), task.description ? /* @__PURE__ */ React3.createElement(Text, { style: { fontSize: 11, color: colors.textMuted, marginTop: 2 }, numberOfLines: 1 }, task.description) : null),
15574
+ /* @__PURE__ */ React3.createElement(Text, { style: { fontSize: 11, fontWeight: "600", color: colors.blue } }, "Go")
15575
+ ))), /* @__PURE__ */ React3.createElement(View3, { style: styles7.actionGrid }, /* @__PURE__ */ React3.createElement(
15560
15576
  TouchableOpacity,
15561
15577
  {
15562
15578
  style: styles7.actionCard,
@@ -15869,7 +15885,7 @@ function createStyles() {
15869
15885
  fontSize: 13,
15870
15886
  color: colors.blue
15871
15887
  },
15872
- // Session card
15888
+ // Session card (active — running session)
15873
15889
  sessionCardActive: {
15874
15890
  flexDirection: "row",
15875
15891
  alignItems: "center",
@@ -15906,59 +15922,50 @@ function createStyles() {
15906
15922
  fontWeight: "600",
15907
15923
  color: colors.blue
15908
15924
  },
15909
- sessionCardInactive: {
15925
+ sessionCardArrow: {
15926
+ fontSize: 13,
15927
+ color: colors.textMuted
15928
+ },
15929
+ // Session start row — two side-by-side tiles
15930
+ sessionRow: {
15910
15931
  flexDirection: "row",
15911
- alignItems: "center",
15932
+ gap: 10,
15933
+ marginBottom: 16
15934
+ },
15935
+ sessionTileBlue: {
15936
+ flex: 1,
15912
15937
  backgroundColor: colors.card,
15913
15938
  borderWidth: 1,
15914
15939
  borderColor: colors.border,
15940
+ borderTopWidth: 3,
15941
+ borderTopColor: colors.blue,
15915
15942
  borderRadius: 12,
15916
15943
  padding: 12,
15917
- paddingHorizontal: 16,
15918
- gap: 12,
15919
- marginBottom: 16
15920
- },
15921
- sessionCardIcon: {
15922
- fontSize: 22
15944
+ gap: 4
15923
15945
  },
15924
- sessionCardLabel: {
15946
+ sessionTileGreen: {
15925
15947
  flex: 1,
15926
- fontSize: 14,
15927
- fontWeight: "500",
15928
- color: colors.textPrimary
15929
- },
15930
- sessionCardArrow: {
15931
- fontSize: 13,
15932
- color: colors.textMuted
15933
- },
15934
- // Quick Test card
15935
- quickTestCard: {
15936
- flexDirection: "row",
15937
- alignItems: "center",
15938
15948
  backgroundColor: colors.card,
15939
15949
  borderWidth: 1,
15940
15950
  borderColor: colors.border,
15951
+ borderTopWidth: 3,
15952
+ borderTopColor: colors.green,
15941
15953
  borderRadius: 12,
15942
15954
  padding: 12,
15943
- paddingHorizontal: 16,
15944
- gap: 12,
15945
- marginBottom: 16
15946
- },
15947
- quickTestIcon: {
15948
- fontSize: 22
15955
+ gap: 4
15949
15956
  },
15950
- quickTestContent: {
15951
- flex: 1
15957
+ tileIcon: {
15958
+ fontSize: 20
15952
15959
  },
15953
- quickTestTitle: {
15954
- fontSize: 14,
15960
+ tileTitle: {
15961
+ fontSize: 13,
15955
15962
  fontWeight: "600",
15956
15963
  color: colors.textPrimary
15957
15964
  },
15958
- quickTestSub: {
15959
- fontSize: 12,
15965
+ tileSub: {
15966
+ fontSize: 11,
15960
15967
  color: colors.textMuted,
15961
- marginTop: 2
15968
+ lineHeight: 16
15962
15969
  }
15963
15970
  });
15964
15971
  }
@@ -18851,7 +18858,9 @@ function SessionActiveScreen({ nav }) {
18851
18858
  const [elapsed, setElapsed] = useState16(0);
18852
18859
  const timerRef = useRef6(null);
18853
18860
  useEffect11(() => {
18854
- refreshSession();
18861
+ if (!activeSession) {
18862
+ refreshSession();
18863
+ }
18855
18864
  }, []);
18856
18865
  useEffect11(() => {
18857
18866
  if (timerRef.current) clearInterval(timerRef.current);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@bbearai/react-native",
3
- "version": "0.10.0",
3
+ "version": "0.10.2",
4
4
  "description": "BugBear React Native components for mobile apps",
5
5
  "main": "./dist/index.js",
6
6
  "module": "./dist/index.mjs",