From 5e0e049f81bfdd5cf6761288b649277bf43d16f5 Mon Sep 17 00:00:00 2001 From: ggurdin Date: Mon, 3 Nov 2025 11:10:59 -0500 Subject: [PATCH] fix: throw more specific errors, always send stack trace to sentry, don't try to access client directly after logout --- .../activity_roles_model.dart | 6 +-- .../event_wrappers/pangea_message_event.dart | 37 ++++++++++++++++--- lib/pangea/lemmas/lemma_reaction_picker.dart | 4 +- .../toolbar/models/speech_to_text_models.dart | 17 ++++++--- .../toolbar/widgets/select_mode_buttons.dart | 3 +- lib/widgets/matrix.dart | 16 ++++---- 6 files changed, 58 insertions(+), 25 deletions(-) diff --git a/lib/pangea/activity_sessions/activity_roles_model.dart b/lib/pangea/activity_sessions/activity_roles_model.dart index a2942e751..ff8b392ae 100644 --- a/lib/pangea/activity_sessions/activity_roles_model.dart +++ b/lib/pangea/activity_sessions/activity_roles_model.dart @@ -38,11 +38,11 @@ class ActivityRolesModel { } static ActivityRolesModel fromJson(Map json) { - final roles = (json['roles'] as Map) - .map((id, value) => MapEntry(id, ActivityRoleModel.fromJson(value))); + final roles = (json['roles'] as Map?) + ?.map((id, value) => MapEntry(id, ActivityRoleModel.fromJson(value))); return ActivityRolesModel( - roles, + roles ?? {}, ); } } diff --git a/lib/pangea/events/event_wrappers/pangea_message_event.dart b/lib/pangea/events/event_wrappers/pangea_message_event.dart index fd410a3ba..651b4239f 100644 --- a/lib/pangea/events/event_wrappers/pangea_message_event.dart +++ b/lib/pangea/events/event_wrappers/pangea_message_event.dart @@ -235,9 +235,21 @@ class PangeaMessageEvent { event.content.tryGetMap(ModelKey.botTranscription); if (rawBotTranscription != null) { - return SpeechToTextModel.fromJson( - Map.from(rawBotTranscription), - ); + try { + return SpeechToTextModel.fromJson( + Map.from(rawBotTranscription), + ); + } catch (err, s) { + ErrorHandler.logError( + e: err, + s: s, + data: { + "event": _event.toJson(), + }, + m: "error parsing botTranscription", + ); + return null; + } } return representations @@ -270,9 +282,22 @@ class PangeaMessageEvent { final rawBotTranscription = event.content.tryGetMap(ModelKey.botTranscription); if (rawBotTranscription != null) { - final botTranscription = SpeechToTextModel.fromJson( - Map.from(rawBotTranscription), - ); + SpeechToTextModel botTranscription; + try { + botTranscription = SpeechToTextModel.fromJson( + Map.from(rawBotTranscription), + ); + } catch (err, s) { + ErrorHandler.logError( + e: err, + s: s, + data: { + "event": _event.toJson(), + }, + m: "error parsing botTranscription", + ); + return null; + } _representations ??= []; _representations!.add( diff --git a/lib/pangea/lemmas/lemma_reaction_picker.dart b/lib/pangea/lemmas/lemma_reaction_picker.dart index cf72c433f..1d70bc72c 100644 --- a/lib/pangea/lemmas/lemma_reaction_picker.dart +++ b/lib/pangea/lemmas/lemma_reaction_picker.dart @@ -75,7 +75,9 @@ class LemmaReactionPicker extends StatelessWidget { return LemmaEmojiPicker( emojis: emojis, - onSelect: event != null ? (emoji) => setEmoji(emoji, context) : null, + onSelect: event?.room.timeline != null + ? (emoji) => setEmoji(emoji, context) + : null, disabled: (emoji) => sentReactions.contains(emoji), loading: loading, ); diff --git a/lib/pangea/toolbar/models/speech_to_text_models.dart b/lib/pangea/toolbar/models/speech_to_text_models.dart index 4b00929a0..ffb2a7088 100644 --- a/lib/pangea/toolbar/models/speech_to_text_models.dart +++ b/lib/pangea/toolbar/models/speech_to_text_models.dart @@ -222,12 +222,17 @@ class SpeechToTextModel { String get langCode => results.first.transcripts.first.langCode; - factory SpeechToTextModel.fromJson(Map json) => - SpeechToTextModel( - results: (json['results'] as List) - .map((e) => SpeechToTextResult.fromJson(e)) - .toList(), - ); + factory SpeechToTextModel.fromJson(Map json) { + final results = json['results'] as List; + if (results.isEmpty) { + throw Exception('SpeechToTextModel.fromJson: results is empty'); + } + return SpeechToTextModel( + results: (json['results'] as List) + .map((e) => SpeechToTextResult.fromJson(e)) + .toList(), + ); + } Map toJson() => { "results": results.map((e) => e.toJson()).toList(), diff --git a/lib/pangea/toolbar/widgets/select_mode_buttons.dart b/lib/pangea/toolbar/widgets/select_mode_buttons.dart index ac235bd9d..85cdba00c 100644 --- a/lib/pangea/toolbar/widgets/select_mode_buttons.dart +++ b/lib/pangea/toolbar/widgets/select_mode_buttons.dart @@ -432,13 +432,14 @@ class SelectModeButtonsState extends State { widget.overlayController.setTranscription(resp!); _transcriptionCompleter?.complete(resp.transcript.text); - } catch (err) { + } catch (err, s) { widget.overlayController.setTranscriptionError( err.toString(), ); _transcriptionCompleter?.completeError(err); ErrorHandler.logError( e: err, + s: s, data: {}, ); } diff --git a/lib/widgets/matrix.dart b/lib/widgets/matrix.dart index 4a1512833..678ee8991 100644 --- a/lib/widgets/matrix.dart +++ b/lib/widgets/matrix.dart @@ -385,14 +385,14 @@ class MatrixState extends State with WidgetsBindingObserver { } } else { // #Pangea - final isL2Set = await pangeaController.userController.isUserL2Set; - FluffyChatApp.router.go( - state == LoginState.loggedIn - ? isL2Set - ? '/rooms' - : '/registration/create' - : '/home', - ); + if (state == LoginState.loggedIn) { + final isL2Set = await pangeaController.userController.isUserL2Set; + FluffyChatApp.router.go( + isL2Set ? '/rooms' : '/registration/create', + ); + } else { + FluffyChatApp.router.go('/home'); + } // FluffyChatApp.router // .go(state == LoginState.loggedIn ? '/rooms' : '/home'); // Pangea#