@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.
- package/dist/index.js +429 -203
- package/dist/index.mjs +409 -183
- 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
|
-
|
|
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
|
-
|
|
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
|
|
13365
|
-
var
|
|
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+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";
|
|
@@ -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
|
|
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
|
|
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,
|
|
14706
|
-
const [severity, setSeverity] = (0,
|
|
14707
|
-
const [
|
|
14708
|
-
const [
|
|
14709
|
-
const [
|
|
14710
|
-
const [
|
|
14711
|
-
const
|
|
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__ */
|
|
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__ */
|
|
14762
|
-
|
|
14987
|
+
].map(({ sev, color }) => /* @__PURE__ */ import_react11.default.createElement(
|
|
14988
|
+
import_react_native10.TouchableOpacity,
|
|
14763
14989
|
{
|
|
14764
14990
|
key: sev,
|
|
14765
|
-
style: [
|
|
14991
|
+
style: [styles8.sevButton, severity === sev && { backgroundColor: `${color}30`, borderColor: color }],
|
|
14766
14992
|
onPress: () => setSeverity(sev)
|
|
14767
14993
|
},
|
|
14768
|
-
/* @__PURE__ */
|
|
14769
|
-
)))), /* @__PURE__ */
|
|
14770
|
-
|
|
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:
|
|
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__ */
|
|
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__ */
|
|
14792
|
-
|
|
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,
|
|
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__ */
|
|
14799
|
-
)) : /* @__PURE__ */
|
|
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__ */
|
|
14804
|
-
|
|
15029
|
+
].map(({ type, label, icon }) => /* @__PURE__ */ import_react11.default.createElement(
|
|
15030
|
+
import_react_native10.TouchableOpacity,
|
|
14805
15031
|
{
|
|
14806
15032
|
key: type,
|
|
14807
|
-
style: [
|
|
15033
|
+
style: [styles8.typeCard, reportType === type && styles8.typeCardActive],
|
|
14808
15034
|
onPress: () => setReportType(type)
|
|
14809
15035
|
},
|
|
14810
|
-
/* @__PURE__ */
|
|
14811
|
-
/* @__PURE__ */
|
|
14812
|
-
))), isBugType && /* @__PURE__ */
|
|
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__ */
|
|
14818
|
-
|
|
15043
|
+
].map(({ sev, color }) => /* @__PURE__ */ import_react11.default.createElement(
|
|
15044
|
+
import_react_native10.TouchableOpacity,
|
|
14819
15045
|
{
|
|
14820
15046
|
key: sev,
|
|
14821
|
-
style: [
|
|
15047
|
+
style: [styles8.sevButton, severity === sev && { backgroundColor: `${color}30`, borderColor: color }],
|
|
14822
15048
|
onPress: () => setSeverity(sev)
|
|
14823
15049
|
},
|
|
14824
|
-
/* @__PURE__ */
|
|
14825
|
-
)))), /* @__PURE__ */
|
|
14826
|
-
|
|
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:
|
|
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__ */
|
|
14838
|
-
|
|
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:
|
|
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__ */
|
|
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__ */
|
|
14857
|
-
|
|
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__ */
|
|
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
|
|
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
|
|
14891
|
-
var
|
|
15116
|
+
var import_react12 = __toESM(require("react"));
|
|
15117
|
+
var import_react_native11 = require("react-native");
|
|
14892
15118
|
function ReportSuccessScreen({ nav }) {
|
|
14893
|
-
(0,
|
|
15119
|
+
(0, import_react12.useEffect)(() => {
|
|
14894
15120
|
const timer = setTimeout(() => nav.reset(), 2e3);
|
|
14895
15121
|
return () => clearTimeout(timer);
|
|
14896
15122
|
}, [nav]);
|
|
14897
|
-
return /* @__PURE__ */
|
|
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
|
|
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
|
|
14908
|
-
var
|
|
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__ */
|
|
14912
|
-
|
|
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:
|
|
15140
|
+
style: styles10.newMsgButton,
|
|
14915
15141
|
onPress: () => nav.push({ name: "COMPOSE_MESSAGE" })
|
|
14916
15142
|
},
|
|
14917
|
-
/* @__PURE__ */
|
|
14918
|
-
), threads.length === 0 ? /* @__PURE__ */
|
|
14919
|
-
|
|
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: [
|
|
15148
|
+
style: [styles10.threadItem, thread.unreadCount > 0 && styles10.threadItemUnread],
|
|
14923
15149
|
onPress: () => nav.push({ name: "THREAD_DETAIL", thread })
|
|
14924
15150
|
},
|
|
14925
|
-
/* @__PURE__ */
|
|
14926
|
-
/* @__PURE__ */
|
|
14927
|
-
))), /* @__PURE__ */
|
|
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
|
|
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
|
|
14953
|
-
var
|
|
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,
|
|
14957
|
-
const [loading, setLoading] = (0,
|
|
14958
|
-
const [replyText, setReplyText] = (0,
|
|
14959
|
-
const [sending, setSending] = (0,
|
|
14960
|
-
const [sendError, setSendError] = (0,
|
|
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,
|
|
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__ */
|
|
14995
|
-
|
|
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: [
|
|
15224
|
+
style: [styles11.bubble, msg.senderType === "tester" ? styles11.bubbleTester : styles11.bubbleAdmin]
|
|
14999
15225
|
},
|
|
15000
|
-
/* @__PURE__ */
|
|
15001
|
-
/* @__PURE__ */
|
|
15002
|
-
msg.attachments && msg.attachments.length > 0 && /* @__PURE__ */
|
|
15003
|
-
/* @__PURE__ */
|
|
15004
|
-
))), sendError && /* @__PURE__ */
|
|
15005
|
-
|
|
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:
|
|
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__ */
|
|
15016
|
-
|
|
15241
|
+
), /* @__PURE__ */ import_react14.default.createElement(
|
|
15242
|
+
import_react_native13.TouchableOpacity,
|
|
15017
15243
|
{
|
|
15018
|
-
style: [
|
|
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__ */
|
|
15248
|
+
/* @__PURE__ */ import_react14.default.createElement(import_react_native13.Text, { style: styles11.sendBtnText }, sending ? "..." : "Send")
|
|
15023
15249
|
)));
|
|
15024
15250
|
}
|
|
15025
|
-
var
|
|
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
|
|
15058
|
-
var
|
|
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,
|
|
15062
|
-
const [message, setMessage] = (0,
|
|
15063
|
-
const [sending, setSending] = (0,
|
|
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__ */
|
|
15080
|
-
|
|
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:
|
|
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__ */
|
|
15090
|
-
|
|
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:
|
|
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__ */
|
|
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__ */
|
|
15112
|
-
|
|
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__ */
|
|
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
|
|
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
|
|
15132
|
-
var
|
|
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,
|
|
15136
|
-
const [name, setName] = (0,
|
|
15137
|
-
const [additionalEmails, setAdditionalEmails] = (0,
|
|
15138
|
-
const [newEmailInput, setNewEmailInput] = (0,
|
|
15139
|
-
const [platforms, setPlatforms] = (0,
|
|
15140
|
-
const [saving, setSaving] = (0,
|
|
15141
|
-
const [saved, setSaved] = (0,
|
|
15142
|
-
const [showDetails, setShowDetails] = (0,
|
|
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,
|
|
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__ */
|
|
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__ */
|
|
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__ */
|
|
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__ */
|
|
15188
|
-
|
|
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: [
|
|
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__ */
|
|
15199
|
-
|
|
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: [
|
|
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__ */
|
|
15206
|
-
)))), /* @__PURE__ */
|
|
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__ */
|
|
15209
|
-
|
|
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__ */
|
|
15440
|
+
/* @__PURE__ */ import_react16.default.createElement(import_react_native15.Text, { style: shared.primaryButtonText }, "Edit Profile")
|
|
15215
15441
|
));
|
|
15216
15442
|
}
|
|
15217
|
-
var
|
|
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
|
|
15259
|
-
var
|
|
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,
|
|
15274
|
-
const [loading, setLoading] = (0,
|
|
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,
|
|
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__ */
|
|
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__ */
|
|
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__ */
|
|
15298
|
-
|
|
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:
|
|
15527
|
+
style: styles14.issueCard,
|
|
15302
15528
|
onPress: () => nav.push({ name: "ISSUE_DETAIL", issue }),
|
|
15303
15529
|
activeOpacity: 0.7
|
|
15304
15530
|
},
|
|
15305
|
-
/* @__PURE__ */
|
|
15306
|
-
/* @__PURE__ */
|
|
15307
|
-
category === "done" && issue.verifiedByName && /* @__PURE__ */
|
|
15308
|
-
category === "reopened" && issue.originalBugTitle && /* @__PURE__ */
|
|
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
|
|
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
|
|
15403
|
-
var
|
|
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__ */
|
|
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
|
|
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 =
|
|
15561
|
-
var screenHeight =
|
|
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,
|
|
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,
|
|
15586
|
-
const isDragging = (0,
|
|
15587
|
-
const panResponder = (0,
|
|
15588
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
15889
|
+
import_react_native18.Keyboard.dismiss();
|
|
15664
15890
|
setModalVisible(false);
|
|
15665
15891
|
};
|
|
15666
15892
|
const nav = {
|
|
15667
15893
|
push: (screen) => {
|
|
15668
|
-
|
|
15894
|
+
import_react_native18.Keyboard.dismiss();
|
|
15669
15895
|
push(screen);
|
|
15670
15896
|
},
|
|
15671
15897
|
pop: () => {
|
|
15672
|
-
|
|
15898
|
+
import_react_native18.Keyboard.dismiss();
|
|
15673
15899
|
pop();
|
|
15674
15900
|
},
|
|
15675
15901
|
replace: (screen) => {
|
|
15676
|
-
|
|
15902
|
+
import_react_native18.Keyboard.dismiss();
|
|
15677
15903
|
replace(screen);
|
|
15678
15904
|
},
|
|
15679
15905
|
reset: () => {
|
|
15680
|
-
|
|
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__ */
|
|
15915
|
+
return /* @__PURE__ */ import_react19.default.createElement(HomeScreen, { nav });
|
|
15690
15916
|
case "TEST_DETAIL":
|
|
15691
|
-
return /* @__PURE__ */
|
|
15917
|
+
return /* @__PURE__ */ import_react19.default.createElement(TestDetailScreen, { testId: currentScreen.testId, nav });
|
|
15692
15918
|
case "TEST_LIST":
|
|
15693
|
-
return /* @__PURE__ */
|
|
15919
|
+
return /* @__PURE__ */ import_react19.default.createElement(TestListScreen, { nav });
|
|
15694
15920
|
case "TEST_FEEDBACK":
|
|
15695
|
-
return /* @__PURE__ */
|
|
15921
|
+
return /* @__PURE__ */ import_react19.default.createElement(TestFeedbackScreen, { status: currentScreen.status, assignmentId: currentScreen.assignmentId, nav });
|
|
15696
15922
|
case "REPORT":
|
|
15697
|
-
return /* @__PURE__ */
|
|
15923
|
+
return /* @__PURE__ */ import_react19.default.createElement(ReportScreen, { nav, prefill: currentScreen.prefill });
|
|
15698
15924
|
case "REPORT_SUCCESS":
|
|
15699
|
-
return /* @__PURE__ */
|
|
15925
|
+
return /* @__PURE__ */ import_react19.default.createElement(ReportSuccessScreen, { nav });
|
|
15700
15926
|
case "MESSAGE_LIST":
|
|
15701
|
-
return /* @__PURE__ */
|
|
15927
|
+
return /* @__PURE__ */ import_react19.default.createElement(MessageListScreen, { nav });
|
|
15702
15928
|
case "THREAD_DETAIL":
|
|
15703
|
-
return /* @__PURE__ */
|
|
15929
|
+
return /* @__PURE__ */ import_react19.default.createElement(ThreadDetailScreen, { thread: currentScreen.thread, nav });
|
|
15704
15930
|
case "COMPOSE_MESSAGE":
|
|
15705
|
-
return /* @__PURE__ */
|
|
15931
|
+
return /* @__PURE__ */ import_react19.default.createElement(ComposeMessageScreen, { nav });
|
|
15706
15932
|
case "ISSUE_LIST":
|
|
15707
|
-
return /* @__PURE__ */
|
|
15933
|
+
return /* @__PURE__ */ import_react19.default.createElement(IssueListScreen, { nav, category: currentScreen.category });
|
|
15708
15934
|
case "ISSUE_DETAIL":
|
|
15709
|
-
return /* @__PURE__ */
|
|
15935
|
+
return /* @__PURE__ */ import_react19.default.createElement(IssueDetailScreen, { nav, issue: currentScreen.issue });
|
|
15710
15936
|
case "PROFILE":
|
|
15711
|
-
return /* @__PURE__ */
|
|
15937
|
+
return /* @__PURE__ */ import_react19.default.createElement(ProfileScreen, { nav });
|
|
15712
15938
|
default:
|
|
15713
|
-
return /* @__PURE__ */
|
|
15939
|
+
return /* @__PURE__ */ import_react19.default.createElement(HomeScreen, { nav });
|
|
15714
15940
|
}
|
|
15715
15941
|
};
|
|
15716
|
-
return /* @__PURE__ */
|
|
15717
|
-
|
|
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: [
|
|
15945
|
+
style: [styles16.fabContainer, { transform: pan.getTranslateTransform() }, buttonStyle],
|
|
15720
15946
|
...panResponder.panHandlers
|
|
15721
15947
|
},
|
|
15722
|
-
/* @__PURE__ */
|
|
15723
|
-
|
|
15948
|
+
/* @__PURE__ */ import_react19.default.createElement(
|
|
15949
|
+
import_react_native18.TouchableOpacity,
|
|
15724
15950
|
{
|
|
15725
|
-
style:
|
|
15951
|
+
style: styles16.fab,
|
|
15726
15952
|
onPress: () => setModalVisible(true),
|
|
15727
15953
|
activeOpacity: draggable ? 1 : 0.7
|
|
15728
15954
|
},
|
|
15729
|
-
/* @__PURE__ */
|
|
15730
|
-
badgeCount > 0 && /* @__PURE__ */
|
|
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__ */
|
|
15733
|
-
|
|
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__ */
|
|
15741
|
-
|
|
15966
|
+
/* @__PURE__ */ import_react19.default.createElement(
|
|
15967
|
+
import_react_native18.KeyboardAvoidingView,
|
|
15742
15968
|
{
|
|
15743
|
-
behavior:
|
|
15744
|
-
style:
|
|
15969
|
+
behavior: import_react_native18.Platform.OS === "ios" ? "padding" : "height",
|
|
15970
|
+
style: styles16.modalOverlay
|
|
15745
15971
|
},
|
|
15746
|
-
/* @__PURE__ */
|
|
15747
|
-
|
|
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:
|
|
15750
|
-
contentContainerStyle:
|
|
15975
|
+
style: styles16.content,
|
|
15976
|
+
contentContainerStyle: styles16.contentContainer,
|
|
15751
15977
|
keyboardShouldPersistTaps: "handled",
|
|
15752
15978
|
showsVerticalScrollIndicator: false
|
|
15753
15979
|
},
|
|
15754
|
-
isLoading ? /* @__PURE__ */
|
|
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
|
|
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
|
|
15902
|
-
var
|
|
15903
|
-
var BugBearErrorBoundary = class extends
|
|
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__ */
|
|
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
|
|
16184
|
+
var styles17 = import_react_native19.StyleSheet.create({
|
|
15959
16185
|
container: {
|
|
15960
16186
|
padding: 20,
|
|
15961
16187
|
margin: 20,
|