@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 +62 -33
- package/dist/index.mjs +69 -40
- package/package.json +1 -1
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
|
|
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 (
|
|
13806
|
-
|
|
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
|
|
14337
|
-
|
|
14338
|
-
|
|
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
|
|
14349
|
-
|
|
14350
|
-
|
|
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
|
-
|
|
14431
|
-
|
|
14432
|
-
|
|
14433
|
-
|
|
14434
|
-
|
|
14435
|
-
|
|
14436
|
-
|
|
14437
|
-
|
|
14438
|
-
|
|
14439
|
-
|
|
14440
|
-
|
|
14441
|
-
|
|
14442
|
-
|
|
14443
|
-
|
|
14444
|
-
|
|
14445
|
-
|
|
14446
|
-
|
|
14447
|
-
|
|
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
|
|
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 (
|
|
13790
|
-
|
|
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
|
|
14321
|
-
|
|
14322
|
-
|
|
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
|
|
14333
|
-
|
|
14334
|
-
|
|
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
|
-
|
|
14415
|
-
|
|
14416
|
-
|
|
14417
|
-
|
|
14418
|
-
|
|
14419
|
-
|
|
14420
|
-
|
|
14421
|
-
|
|
14422
|
-
|
|
14423
|
-
|
|
14424
|
-
|
|
14425
|
-
|
|
14426
|
-
|
|
14427
|
-
|
|
14428
|
-
|
|
14429
|
-
|
|
14430
|
-
|
|
14431
|
-
|
|
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
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
14803
|
+
useEffect7(() => {
|
|
14775
14804
|
if (testerInfo) {
|
|
14776
14805
|
setName(testerInfo.name);
|
|
14777
14806
|
setAdditionalEmails(testerInfo.additionalEmails || []);
|