From 30a5fa100c060928039839e37dd3f6d6f90ede2b Mon Sep 17 00:00:00 2001 From: Henry-Hiles Date: Mon, 12 Oct 2026 10:36:41 -0400 Subject: [PATCH] gracefully catch errors when parsing membership state --- lib/models/content/content.dart | 13 ++++--------- lib/models/event.dart | 6 +++--- lib/widgets/renderers/event.dart | 4 ++-- 3 files changed, 9 insertions(+), 14 deletions(-) diff --git a/lib/models/content/content.dart b/lib/models/content/content.dart index e28ccbf..37a87b7 100644 --- a/lib/models/content/content.dart +++ b/lib/models/content/content.dart @@ -17,11 +17,7 @@ import "package:nexus/models/content/topic.dart"; import "package:nexus/models/content/sticker.dart"; import "package:nexus/models/content/history_visibility.dart"; -class Content { - final Error? parseError; - - const Content({this.parseError}); - +class const Content({final String? parseError, final StackTrace? stackTrace}) { factory Content.fromJson(Map json) => const Content(); Map toJson() => {}; @@ -35,9 +31,8 @@ class Content { .firstWhereOrNull((eventType) => eventType.type == type) ?.contentFromJson ?? Content.fromJson)(json); - } catch (error) { - if (error is Error) return Content(parseError: error); - rethrow; + } catch (error, stackTrace) { + return Content(parseError: error.toString(), stackTrace: stackTrace); } } } @@ -65,5 +60,5 @@ enum EventType( name("m.room.name", NameContent.fromJson), reaction("m.reaction", ReactionContent.fromJson), pinnedEvents("m.room.pinned_events", PinnedEventsContent.fromJson), - message("m.room.message", MessageContent.fromJson); + message("m.room.message", MessageContent.fromJson), } diff --git a/lib/models/event.dart b/lib/models/event.dart index de065fe..18ad11b 100644 --- a/lib/models/event.dart +++ b/lib/models/event.dart @@ -58,16 +58,16 @@ class const Event({ replyTo: replyToFromJson(getContentFromJson(json)), pmp: json["content"]?["com.beeper.per_message_profile"] == null ? null - : Profile.fromJsonWithCatch( + : .fromJsonWithCatch( json["content"]?["com.beeper.per_message_profile"], ), - content: Content.fromEventJson( + content: .fromEventJson( getContentFromJson(json), json["decrypted_type"] ?? json["type"], ), previousContent: json["unsigned"]?["prev_content"] == null ? null - : Content.fromEventJson( + : .fromEventJson( json["unsigned"]?["prev_content"], json["decrypted_type"] ?? json["type"], ), diff --git a/lib/widgets/renderers/event.dart b/lib/widgets/renderers/event.dart index af4cef4..97c0265 100644 --- a/lib/widgets/renderers/event.dart +++ b/lib/widgets/renderers/event.dart @@ -84,11 +84,11 @@ class const EventRenderer( final child = event.redactedBy != null || event.relationType == "m.replace" ? null : switch (event.content) { - Content(:final parseError?) => Row( + Content(:final parseError?, :final stackTrace) => Row( children: [ ErrorDialog( "An error occurred while parsing event ${event.eventId}:\n$parseError", - parseError.stackTrace, + stackTrace, ), ], ),