Address code review feedback

- Remove unused originalMessage parameter from _getUserFriendlyMessage
- Add rate limiting to user-initiated error reports
- Fix empty description showing "Technical details" toggle

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
alltheseas
2026-02-05 14:46:28 -06:00
co-authored by Claude Opus 4.5
parent e405caeacb
commit ca965581e2
3 changed files with 22 additions and 3 deletions
+18
View File
@@ -78,10 +78,24 @@ class ErrorReportingService {
/// User-initiated error report (e.g., from "Report issue" button). /// User-initiated error report (e.g., from "Report issue" button).
/// ///
/// Returns true if the report was sent successfully. /// Returns true if the report was sent successfully.
/// Rate-limited to prevent accidental spam from repeated taps.
Future<bool> reportUserError({ Future<bool> reportUserError({
required String title, required String title,
String? technicalDetails, String? technicalDetails,
}) async { }) async {
// Check session limit
if (_sessionReportCount >= _maxReportsPerSession) {
return false;
}
// Rate limit by error content
final errorHash = '$title\n${technicalDetails ?? ''}'.hashCode;
final lastReport = _reportedErrors[errorHash];
if (lastReport != null &&
DateTime.now().difference(lastReport) < _rateLimitDuration) {
return false;
}
try { try {
// Create ephemeral signer for error reporting // Create ephemeral signer for error reporting
final signer = Bip340PrivateKeySigner(Utils.generateRandomHex64(), ref); final signer = Bip340PrivateKeySigner(Utils.generateRandomHex64(), ref);
@@ -102,6 +116,10 @@ class ErrorReportingService {
signedDm, signedDm,
}, source: const RemoteSource(relays: 'social')); }, source: const RemoteSource(relays: 'social'));
// Update rate limiting
_reportedErrors[errorHash] = DateTime.now();
_sessionReportCount++;
return true; return true;
} catch (e) { } catch (e) {
debugPrint('[ErrorReporting] Failed to send user report: $e'); debugPrint('[ErrorReporting] Failed to send user report: $e');
+2 -1
View File
@@ -298,7 +298,8 @@ class _ToastContentState extends State<_ToastContent> {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
final hasDescription = widget.description != null; final hasDescription =
widget.description != null && widget.description!.isNotEmpty;
final hasActions = widget.actions.isNotEmpty; final hasActions = widget.actions.isNotEmpty;
final hasExtraContent = hasDescription || hasActions; final hasExtraContent = hasDescription || hasActions;
@@ -272,7 +272,7 @@ final class AndroidPackageManager extends PackageManager {
case InstallStatus.failed: case InstallStatus.failed:
final failureType = _errorCodeToFailureType(errorCode, message); final failureType = _errorCodeToFailureType(errorCode, message);
final userMessage = _getUserFriendlyMessage(failureType, message); final userMessage = _getUserFriendlyMessage(failureType);
// Preserve technical details: combine original message and description // Preserve technical details: combine original message and description
final technicalDetails = [ final technicalDetails = [
if (message != null) message, if (message != null) message,
@@ -373,7 +373,7 @@ final class AndroidPackageManager extends PackageManager {
/// Convert failure type to user-friendly message. /// Convert failure type to user-friendly message.
/// Technical details are preserved in the description field. /// Technical details are preserved in the description field.
String _getUserFriendlyMessage(FailureType type, String? originalMessage) { String _getUserFriendlyMessage(FailureType type) {
return switch (type) { return switch (type) {
FailureType.downloadFailed => 'Download failed. Please try again.', FailureType.downloadFailed => 'Download failed. Please try again.',
FailureType.hashMismatch => FailureType.hashMismatch =>