diff --git a/lib/pages/chat_list/chat_list.dart b/lib/pages/chat_list/chat_list.dart index 0b42d9785..c846e8aee 100644 --- a/lib/pages/chat_list/chat_list.dart +++ b/lib/pages/chat_list/chat_list.dart @@ -638,6 +638,7 @@ class ChatListController extends State m: "Failed to join analytics room", e: err, s: s, + data: {"analyticsRoom": analyticsRoom?.id}, ); } return; diff --git a/lib/pangea/choreographer/controllers/alternative_translator.dart b/lib/pangea/choreographer/controllers/alternative_translator.dart index 025fd2510..d6193ff40 100644 --- a/lib/pangea/choreographer/controllers/alternative_translator.dart +++ b/lib/pangea/choreographer/controllers/alternative_translator.dart @@ -97,7 +97,18 @@ class AlternativeTranslator { translationFeedbackKey = FeedbackKey.othersAreBetter; } catch (err, stack) { if (err is! http.Response) { - ErrorHandler.logError(e: err, s: stack); + ErrorHandler.logError( + e: err, + s: stack, + data: { + "sourceText": choreographer.itController.sourceText, + "currentText": choreographer.currentText, + "userL1": choreographer.l1LangCode, + "userL2": choreographer.l2LangCode, + "goldRouteTranslation": + choreographer.itController.goldRouteTracker.fullTranslation, + }, + ); } choreographer.errorService.setError( ChoreoError(type: ChoreoErrorType.unknown, raw: err), diff --git a/lib/pangea/choreographer/controllers/choreographer.dart b/lib/pangea/choreographer/controllers/choreographer.dart index f9eb72f5e..9ec7d8395 100644 --- a/lib/pangea/choreographer/controllers/choreographer.dart +++ b/lib/pangea/choreographer/controllers/choreographer.dart @@ -289,7 +289,21 @@ class Choreographer { onlyTokensAndLanguageDetection: onlyTokensAndLanguageDetection, )); } catch (err, stack) { - ErrorHandler.logError(e: err, s: stack); + ErrorHandler.logError( + e: err, + s: stack, + data: { + "l2Lang": l2Lang?.toJson(), + "l1Lang": l1Lang?.toJson(), + "choreoMode": choreoMode, + "igcEnabled": igcEnabled, + "itEnabled": itEnabled, + "isAutoIGCEnabled": isAutoIGCEnabled, + "isTranslationDone": itController.isTranslationDone, + "onlyTokensAndLanguageDetection": onlyTokensAndLanguageDetection, + "useCustomInput": _useCustomInput, + }, + ); } finally { stopLoading(); } @@ -317,6 +331,10 @@ class Choreographer { ErrorHandler.logError( e: "onReplacementSelect with null igcTextData", s: StackTrace.current, + data: { + "matchIndex": matchIndex, + "choiceIndex": choiceIndex, + }, ); MatrixState.pAnyState.closeOverlay(); return; @@ -325,6 +343,11 @@ class Choreographer { ErrorHandler.logError( e: "onReplacementSelect with null choices", s: StackTrace.current, + data: { + "igctextData": igc.igcTextData?.toJson(), + "matchIndex": matchIndex, + "choiceIndex": choiceIndex, + }, ); MatrixState.pAnyState.closeOverlay(); return; @@ -363,16 +386,15 @@ class Choreographer { setState(); } catch (err, stack) { debugger(when: kDebugMode); - Sentry.addBreadcrumb( - Breadcrumb.fromJson( - { - "igctextDdata": igc.igcTextData?.toJson(), - "matchIndex": matchIndex, - "choiceIndex": choiceIndex, - }, - ), + ErrorHandler.logError( + e: err, + s: stack, + data: { + "igctextData": igc.igcTextData?.toJson(), + "matchIndex": matchIndex, + "choiceIndex": choiceIndex, + }, ); - ErrorHandler.logError(e: err, s: stack); igc.igcTextData?.matches.clear(); } finally { giveInputFocus(); @@ -387,6 +409,7 @@ class Choreographer { ErrorHandler.logError( m: "should not be in onIgnoreMatch with null igcTextData", s: StackTrace.current, + data: {}, ); return; } @@ -397,7 +420,7 @@ class Choreographer { if (matchIndex == -1) { debugger(when: kDebugMode); - throw Exception("Cannnot find the ignored match in igcTextData"); + throw Exception("Cannot find the ignored match in igcTextData"); } igc.igcTextData!.matches[matchIndex].status = PangeaMatchStatus.ignored; @@ -417,6 +440,9 @@ class Choreographer { ErrorHandler.logError( e: err, s: stack, + data: { + "igctextData": igc.igcTextData?.toJson(), + }, ); igc.igcTextData?.matches.clear(); } finally { diff --git a/lib/pangea/choreographer/controllers/igc_controller.dart b/lib/pangea/choreographer/controllers/igc_controller.dart index a539be048..bebfaa4bc 100644 --- a/lib/pangea/choreographer/controllers/igc_controller.dart +++ b/lib/pangea/choreographer/controllers/igc_controller.dart @@ -120,7 +120,19 @@ class IgcController { choreographer.errorService.setError( ChoreoError(type: ChoreoErrorType.unknown, raw: err), ); - ErrorHandler.logError(e: err, s: stack); + ErrorHandler.logError( + e: err, + s: stack, + data: { + "onlyTokensAndLanguageDetection": onlyTokensAndLanguageDetection, + "currentText": choreographer.currentText, + "userL1": choreographer.l1LangCode, + "userL2": choreographer.l2LangCode, + "igcEnabled": choreographer.igcEnabled, + "itEnabled": choreographer.itEnabled, + "matches": igcTextData?.matches.map((e) => e.toJson()), + }, + ); clear(); } } @@ -129,8 +141,11 @@ class IgcController { if (igcTextData == null || igcTextData!.matches.isEmpty) { debugger(when: kDebugMode); ErrorHandler.logError( - m: "should not be calling showFirstMatch with this igcTextData ${igcTextData?.toJson().toString()}", + m: "should not be calling showFirstMatch with this igcTextData.", s: StackTrace.current, + data: { + "igcTextData": igcTextData?.toJson(), + }, ); return; } diff --git a/lib/pangea/choreographer/controllers/it_controller.dart b/lib/pangea/choreographer/controllers/it_controller.dart index fca357988..b469f6843 100644 --- a/lib/pangea/choreographer/controllers/it_controller.dart +++ b/lib/pangea/choreographer/controllers/it_controller.dart @@ -175,7 +175,15 @@ class ITController { } catch (e, s) { debugger(when: kDebugMode); if (e is! http.Response) { - ErrorHandler.logError(e: e, s: s); + ErrorHandler.logError( + e: e, + s: s, + data: { + "currentText": choreographer.currentText, + "sourceText": sourceText, + "currentITStepPayloadID": currentITStep?.payloadId, + }, + ); } choreographer.errorService.setErrorAndLock( ChoreoError(type: ChoreoErrorType.unknown, raw: e), @@ -191,8 +199,8 @@ class ITController { e: Exception("sourceText is null in getNextTranslationData"), data: { "sourceText": sourceText, - "currentITStep": currentITStep, - "nextITStep": nextITStep, + "currentITStepPayloadID": currentITStep?.payloadId, + "continuances": goldRouteTracker.continuances.map((e) => e.toJson()), }, ); return; @@ -220,7 +228,16 @@ class ITController { } catch (e, s) { debugger(when: kDebugMode); if (e is! http.Response) { - ErrorHandler.logError(e: e, s: s); + ErrorHandler.logError( + e: e, + s: s, + data: { + "sourceText": sourceText, + "currentITStepPayloadID": currentITStep?.payloadId, + "continuances": + goldRouteTracker.continuances.map((e) => e.toJson()), + }, + ); } choreographer.errorService.setErrorAndLock( ChoreoError(type: ChoreoErrorType.unknown, raw: e), @@ -246,7 +263,14 @@ class ITController { } catch (err, stack) { debugger(when: kDebugMode); if (err is! http.Response) { - ErrorHandler.logError(e: err, s: stack); + ErrorHandler.logError( + e: err, + s: stack, + data: { + "newSourceText": newSourceText, + "l1Lang": choreographer.l1LangCode, + }, + ); } choreographer.errorService.setErrorAndLock( ChoreoError(type: ChoreoErrorType.unknown, raw: err), diff --git a/lib/pangea/choreographer/widgets/it_bar.dart b/lib/pangea/choreographer/widgets/it_bar.dart index 0092cbc73..b0214734a 100644 --- a/lib/pangea/choreographer/widgets/it_bar.dart +++ b/lib/pangea/choreographer/widgets/it_bar.dart @@ -301,7 +301,10 @@ class ITChoices extends StatelessWidget { String? get sourceText { if ((controller.sourceText == null || controller.sourceText!.isEmpty)) { - ErrorHandler.logError(m: "null source text in ItChoices"); + ErrorHandler.logError( + m: "null source text in ItChoices", + data: {}, + ); } return controller.sourceText; } @@ -316,6 +319,9 @@ class ITChoices extends StatelessWidget { ErrorHandler.logError( m: "currentITStep is null in showCard", s: StackTrace.current, + data: { + "index": index, + }, ); return; } diff --git a/lib/pangea/choreographer/widgets/it_feedback_card.dart b/lib/pangea/choreographer/widgets/it_feedback_card.dart index 4bc81aad5..db19f303a 100644 --- a/lib/pangea/choreographer/widgets/it_feedback_card.dart +++ b/lib/pangea/choreographer/widgets/it_feedback_card.dart @@ -66,6 +66,7 @@ class ITFeedbackCardController extends State { if (res == null) { ErrorHandler.logError( m: "Cannot translate feedback because res is null", + data: {}, ); return; } diff --git a/lib/pangea/choreographer/widgets/language_permissions_warning_buttons.dart b/lib/pangea/choreographer/widgets/language_permissions_warning_buttons.dart index 061c81699..8524bef43 100644 --- a/lib/pangea/choreographer/widgets/language_permissions_warning_buttons.dart +++ b/lib/pangea/choreographer/widgets/language_permissions_warning_buttons.dart @@ -76,6 +76,7 @@ class LanguagePermissionsButtons extends StatelessWidget { if (roomID == null) { ErrorHandler.logError( e: Exception("Room ID is null in language permissions"), + data: {}, ); return null; } @@ -140,6 +141,9 @@ class LanguagePermissionsButtons extends StatelessWidget { debugger(when: kDebugMode); ErrorHandler.logError( e: Exception("Unhandled case in language permissions"), + data: { + "roomID": roomID, + }, ); return null; } diff --git a/lib/pangea/choreographer/widgets/translation_finished_flow.dart b/lib/pangea/choreographer/widgets/translation_finished_flow.dart index f3a26b0c7..0c4c256be 100644 --- a/lib/pangea/choreographer/widgets/translation_finished_flow.dart +++ b/lib/pangea/choreographer/widgets/translation_finished_flow.dart @@ -21,7 +21,14 @@ class TranslationFeedback extends StatelessWidget { feedbackText = "Nice job!"; style = null; debugPrint("error getting copy and styles"); - ErrorHandler.logError(e: err, s: stack); + ErrorHandler.logError( + e: err, + s: stack, + data: { + "feedbackText": controller.choreographer.altTranslator + .translationFeedback(context), + }, + ); } return Padding( padding: const EdgeInsets.symmetric(horizontal: 20), diff --git a/lib/pangea/controllers/class_controller.dart b/lib/pangea/controllers/class_controller.dart index 67a7a4ef9..3ba4c112d 100644 --- a/lib/pangea/controllers/class_controller.dart +++ b/lib/pangea/controllers/class_controller.dart @@ -37,7 +37,13 @@ class ClassController extends BaseController { Future.wait( _pangeaController.matrixState.client.spacesImTeaching.map( (space) => space.setClassPowerLevels().catchError((err, s) { - ErrorHandler.logError(e: err, s: s); + ErrorHandler.logError( + e: err, + s: s, + data: { + "spaceID": space.id, + }, + ); }), ), ); @@ -173,7 +179,13 @@ class ClassController extends BaseController { ); } catch (err, stack) { debugger(when: kDebugMode); - ErrorHandler.logError(e: err, s: stack); + ErrorHandler.logError( + e: err, + s: stack, + data: { + "roomID": roomId, + }, + ); } } } diff --git a/lib/pangea/controllers/contextual_definition_controller.dart b/lib/pangea/controllers/contextual_definition_controller.dart index cfe13ebf0..78d77946a 100644 --- a/lib/pangea/controllers/contextual_definition_controller.dart +++ b/lib/pangea/controllers/contextual_definition_controller.dart @@ -104,6 +104,10 @@ class _ContextualDefinitionRepo { e: Exception( "empty text in contextual definition response", ), + data: { + "request": request.toJson(), + "accessToken": accessToken, + }, ); } diff --git a/lib/pangea/controllers/get_analytics_controller.dart b/lib/pangea/controllers/get_analytics_controller.dart index 2372f96bf..7783ebd95 100644 --- a/lib/pangea/controllers/get_analytics_controller.dart +++ b/lib/pangea/controllers/get_analytics_controller.dart @@ -80,7 +80,11 @@ class GetAnalyticsController { ..._locallyCachedConstructs, ]); } catch (err, s) { - ErrorHandler.logError(e: err, s: s); + ErrorHandler.logError( + e: err, + s: s, + data: {}, + ); } finally { _updateAnalyticsStream(); if (!initCompleter.isCompleted) initCompleter.complete(); @@ -130,7 +134,13 @@ class GetAnalyticsController { formattedCache[entry.key] = entry.value.map((e) => OneConstructUse.fromJson(e)).toList(); } catch (err, s) { - ErrorHandler.logError(e: err, s: s); + ErrorHandler.logError( + e: err, + s: s, + data: { + "key": entry.key, + }, + ); continue; } } @@ -148,6 +158,9 @@ class GetAnalyticsController { ), s: stackTrace, m: 'Failed to retrieve messages since update', + data: { + "messagesSinceUpdate": PLocalKey.messagesSinceUpdate, + }, ); return {}; } diff --git a/lib/pangea/controllers/it_feedback_controller.dart b/lib/pangea/controllers/it_feedback_controller.dart index 7a989bda6..c953bad43 100644 --- a/lib/pangea/controllers/it_feedback_controller.dart +++ b/lib/pangea/controllers/it_feedback_controller.dart @@ -104,6 +104,10 @@ class _ITFeedbackRepo { e: Exception( "empty text in contextual definition response", ), + data: { + "request": request.toJson(), + "accessToken": accessToken, + }, ); } diff --git a/lib/pangea/controllers/language_list_controller.dart b/lib/pangea/controllers/language_list_controller.dart index a4bb3658c..fecdfe4cd 100644 --- a/lib/pangea/controllers/language_list_controller.dart +++ b/lib/pangea/controllers/language_list_controller.dart @@ -44,7 +44,13 @@ class PangeaLanguage { _langList.insert(0, LanguageModel.multiLingual()); } catch (err, stack) { debugger(when: kDebugMode); - ErrorHandler.logError(e: err, s: stack); + ErrorHandler.logError( + e: err, + s: stack, + data: { + "langList": _langList.map((e) => e.toJson()), + }, + ); } } diff --git a/lib/pangea/controllers/message_data_controller.dart b/lib/pangea/controllers/message_data_controller.dart index d11c1ea52..20cb302a6 100644 --- a/lib/pangea/controllers/message_data_controller.dart +++ b/lib/pangea/controllers/message_data_controller.dart @@ -80,6 +80,10 @@ class MessageDataController extends BaseController { e: Exception( "empty tokens in tokenize response return", ), + data: { + "accessToken": accessToken, + "request": request.toJson(), + }, ); } diff --git a/lib/pangea/controllers/pangea_controller.dart b/lib/pangea/controllers/pangea_controller.dart index 3bfc5fd56..ffddb2265 100644 --- a/lib/pangea/controllers/pangea_controller.dart +++ b/lib/pangea/controllers/pangea_controller.dart @@ -290,7 +290,14 @@ class PangeaController { return null; } catch (err, stack) { debugger(when: kDebugMode); - ErrorHandler.logError(e: err, s: stack); + ErrorHandler.logError( + e: err, + s: stack, + data: { + "directChatRoomId": matrixState.client + .getDirectChatFromUserId(BotName.byEnvironment), + }, + ); } } @@ -370,6 +377,9 @@ class PangeaController { } catch (err) { ErrorHandler.logError( e: "Failed to fetch participants for space ${space.id}", + data: { + "spaceID": space.id, + }, ); continue; } diff --git a/lib/pangea/controllers/put_analytics_controller.dart b/lib/pangea/controllers/put_analytics_controller.dart index 6e90b4a86..fbc689299 100644 --- a/lib/pangea/controllers/put_analytics_controller.dart +++ b/lib/pangea/controllers/put_analytics_controller.dart @@ -96,6 +96,7 @@ class PutAnalyticsController extends BaseController { s: s, e: err, m: "Failed to get last updated time for analytics", + data: {}, ); } finally { // if this is the initial load, complete the lastUpdatedCompleter @@ -254,6 +255,9 @@ class PutAnalyticsController extends BaseController { e: PangeaWarningError("Failed to add message since update: $e"), s: s, m: 'Failed to add message since update for eventId: $cacheKey', + data: { + "cacheKey": cacheKey, + }, ); } } @@ -368,6 +372,9 @@ class PutAnalyticsController extends BaseController { e: err, m: "Failed to update analytics", s: s, + data: { + "l2Override": l2Override, + }, ); } finally { _updateCompleter?.complete(); diff --git a/lib/pangea/controllers/speech_to_text_controller.dart b/lib/pangea/controllers/speech_to_text_controller.dart index 4e32d6f9e..e1008c520 100644 --- a/lib/pangea/controllers/speech_to_text_controller.dart +++ b/lib/pangea/controllers/speech_to_text_controller.dart @@ -113,7 +113,14 @@ class SpeechToTextController { final response = SpeechToTextModel.fromJson(json); saveSpeechToTextAsRepresentationEvent(response, requestModel).onError( - (error, stackTrace) => ErrorHandler.logError(e: error, s: stackTrace), + (error, stackTrace) => ErrorHandler.logError( + e: error, + s: stackTrace, + data: { + "response": response.toJson(), + "requestModel": requestModel.toJson(), + }, + ), ); return response; diff --git a/lib/pangea/controllers/subscription_controller.dart b/lib/pangea/controllers/subscription_controller.dart index 54be38b12..5b79b4610 100644 --- a/lib/pangea/controllers/subscription_controller.dart +++ b/lib/pangea/controllers/subscription_controller.dart @@ -135,7 +135,13 @@ class SubscriptionController extends BaseController { setState(null); } catch (e, s) { debugPrint("Failed to initialize subscription controller"); - ErrorHandler.logError(e: e, s: s); + ErrorHandler.logError( + e: e, + s: s, + data: { + "availableSubscriptionInfo": availableSubscriptionInfo?.toJson(), + }, + ); } } @@ -155,6 +161,9 @@ class SubscriptionController extends BaseController { ErrorHandler.logError( m: "Tried to subscribe to web SubscriptionDetails with Null duration", s: StackTrace.current, + data: { + "selectedSubscription": selectedSubscription.toJson(), + }, ); return; } @@ -177,6 +186,9 @@ class SubscriptionController extends BaseController { ErrorHandler.logError( m: "Tried to subscribe to SubscriptionDetails with Null revenuecat Package", s: StackTrace.current, + data: { + "selectedSubscription": selectedSubscription.toJson(), + }, ); return; } @@ -198,6 +210,9 @@ class SubscriptionController extends BaseController { ErrorHandler.logError( m: "Failed to purchase revenuecat package for user $_userID with error code $errCode", s: StackTrace.current, + data: { + "selectedSubscription": selectedSubscription.toJson(), + }, ); return; } @@ -230,8 +245,9 @@ class SubscriptionController extends BaseController { final DateTime? createdAt = _userController.profile.userSettings.createdAt; if (createdAt == null) { ErrorHandler.logError( - m: "Null user profile createAt in subscription settings", + m: "Null user profile createdAt in subscription settings", s: StackTrace.current, + data: {}, ); return; } @@ -329,7 +345,13 @@ class SubscriptionController extends BaseController { ); dismissPaywall(); } catch (e, s) { - ErrorHandler.logError(e: e, s: s); + ErrorHandler.logError( + e: e, + s: s, + data: { + "availableSubscriptionInfo": availableSubscriptionInfo?.toJson(), + }, + ); } } diff --git a/lib/pangea/controllers/user_controller.dart b/lib/pangea/controllers/user_controller.dart index 4251bc558..f6ed36e37 100644 --- a/lib/pangea/controllers/user_controller.dart +++ b/lib/pangea/controllers/user_controller.dart @@ -115,7 +115,11 @@ class UserController extends BaseController { await _initialize(); addProfileListener(); } catch (err, s) { - ErrorHandler.logError(e: err, s: s); + ErrorHandler.logError( + e: err, + s: s, + data: {}, + ); } finally { _profileCompleter!.complete(); } @@ -159,6 +163,7 @@ class UserController extends BaseController { if (userId == null) { ErrorHandler.logError( e: "calling fullname with userId == null", + data: {}, ); return null; } @@ -173,7 +178,11 @@ class UserController extends BaseController { await initialize(); return profile.userSettings.targetLanguage != null; } catch (err, s) { - ErrorHandler.logError(e: err, s: s); + ErrorHandler.logError( + e: err, + s: s, + data: {}, + ); return false; } } @@ -208,7 +217,11 @@ class UserController extends BaseController { srcLang != LanguageKeys.unknownLanguage && tgtLang != LanguageKeys.unknownLanguage; } catch (err, s) { - ErrorHandler.logError(e: err, s: s); + ErrorHandler.logError( + e: err, + s: s, + data: {}, + ); return false; } } diff --git a/lib/pangea/extensions/client_extension/client_analytics_extension.dart b/lib/pangea/extensions/client_extension/client_analytics_extension.dart index 64691f98b..34e86bbd7 100644 --- a/lib/pangea/extensions/client_extension/client_analytics_extension.dart +++ b/lib/pangea/extensions/client_extension/client_analytics_extension.dart @@ -22,8 +22,14 @@ extension AnalyticsClientExtension on Client { analyticsRoom.membership == Membership.invite) { debugger(when: kDebugMode); analyticsRoom.join().onError( - (error, stackTrace) => - ErrorHandler.logError(e: error, s: stackTrace), + (error, stackTrace) => ErrorHandler.logError( + e: error, + s: stackTrace, + data: { + "langCode": langCode, + "userIdParam": userIdParam, + }, + ), ); return analyticsRoom; } @@ -137,7 +143,13 @@ extension AnalyticsClientExtension on Client { ) .map( (room) => room.join().catchError((err, s) { - ErrorHandler.logError(e: err, s: s); + ErrorHandler.logError( + e: err, + s: s, + data: { + "roomID": room.id, + }, + ); }), ), ); diff --git a/lib/pangea/extensions/pangea_event_extension.dart b/lib/pangea/extensions/pangea_event_extension.dart index 1ca280a98..01b75ce4d 100644 --- a/lib/pangea/extensions/pangea_event_extension.dart +++ b/lib/pangea/extensions/pangea_event_extension.dart @@ -60,6 +60,7 @@ extension PangeaEvent on Event { if (transcription == null || audioContent == null) { ErrorHandler.logError( e: "Called getPangeaAudioFile on an audio message without transcription or audio content", + data: {}, ); return null; } diff --git a/lib/pangea/extensions/pangea_room_extension/room_analytics_extension.dart b/lib/pangea/extensions/pangea_room_extension/room_analytics_extension.dart index a9a258903..b43afda74 100644 --- a/lib/pangea/extensions/pangea_room_extension/room_analytics_extension.dart +++ b/lib/pangea/extensions/pangea_room_extension/room_analytics_extension.dart @@ -29,6 +29,10 @@ extension AnalyticsRoomExtension on Room { e: err, m: "Failed to join analytics room $roomID in space $id", s: s, + data: { + "roomID": roomID, + "spaceID": id, + }, ); }), ), @@ -37,6 +41,9 @@ extension AnalyticsRoomExtension on Room { ErrorHandler.logError( e: err, s: s, + data: { + "spaceID": id, + }, ); return; } @@ -112,6 +119,10 @@ extension AnalyticsRoomExtension on Room { e: err, m: "Failed to invite teacher ${teacher.id} to analytics room ${analyticsRoom.id}", s: s, + data: { + "teacherID": teacher.id, + "analyticsRoomID": analyticsRoom.id, + }, ); }), ), diff --git a/lib/pangea/extensions/pangea_room_extension/room_children_and_parents_extension.dart b/lib/pangea/extensions/pangea_room_extension/room_children_and_parents_extension.dart index 5a73feb93..277de4043 100644 --- a/lib/pangea/extensions/pangea_room_extension/room_children_and_parents_extension.dart +++ b/lib/pangea/extensions/pangea_room_extension/room_children_and_parents_extension.dart @@ -129,6 +129,10 @@ extension ChildrenAndParentsRoomExtension on Room { ErrorHandler.logError( e: e, m: 'Failed to remove child from parent', + data: { + "roomID": roomId, + "parentID": parent.id, + }, ); } } @@ -141,7 +145,15 @@ extension ChildrenAndParentsRoomExtension on Room { visibility: matrix.Visibility.private, ); } catch (err, stack) { - ErrorHandler.logError(e: err, s: stack); + ErrorHandler.logError( + e: err, + s: stack, + data: { + "roomID": roomId, + "childID": child.id, + "suggested": suggested, + }, + ); } } diff --git a/lib/pangea/extensions/pangea_room_extension/room_events_extension.dart b/lib/pangea/extensions/pangea_room_extension/room_events_extension.dart index ad264f3dc..65246bbbe 100644 --- a/lib/pangea/extensions/pangea_room_extension/room_events_extension.dart +++ b/lib/pangea/extensions/pangea_room_extension/room_events_extension.dart @@ -130,7 +130,15 @@ extension EventsRoomExtension on Room { await leave(); } catch (err, stack) { debugger(when: kDebugMode); - ErrorHandler.logError(e: err, s: stack, data: powerLevels); + ErrorHandler.logError( + e: err, + s: stack, + data: { + "powerLevel": client.userID != null + ? getPowerLevelByUserId(client.userID!) + : null, + }, + ); rethrow; } }, diff --git a/lib/pangea/extensions/pangea_room_extension/room_settings_extension.dart b/lib/pangea/extensions/pangea_room_extension/room_settings_extension.dart index c9baaacaa..3c95ab122 100644 --- a/lib/pangea/extensions/pangea_room_extension/room_settings_extension.dart +++ b/lib/pangea/extensions/pangea_room_extension/room_settings_extension.dart @@ -29,7 +29,13 @@ extension RoomSettingsRoomExtension on Room { data: {"room": toJson()}, ), ); - ErrorHandler.logError(e: err, s: s); + ErrorHandler.logError( + e: err, + s: s, + data: { + "roomID": id, + }, + ); return null; } } @@ -109,6 +115,10 @@ extension RoomSettingsRoomExtension on Room { ErrorHandler.logError( e: "Failed to fetch suggestion status of room $id in space ${space.id}", s: StackTrace.current, + data: { + "spaceID": space.id, + "roomID": id, + }, ); return true; } @@ -121,6 +131,11 @@ extension RoomSettingsRoomExtension on Room { ErrorHandler.logError( e: "Failed to set suggestion status of room $id in space ${space.id}", s: StackTrace.current, + data: { + "spaceID": space.id, + "roomID": id, + "suggest": suggest, + }, ); return; } diff --git a/lib/pangea/matrix_event_wrappers/pangea_choreo_event.dart b/lib/pangea/matrix_event_wrappers/pangea_choreo_event.dart index a6a79fd4f..83444b482 100644 --- a/lib/pangea/matrix_event_wrappers/pangea_choreo_event.dart +++ b/lib/pangea/matrix_event_wrappers/pangea_choreo_event.dart @@ -26,7 +26,13 @@ class ChoreoEvent { return _content; } catch (err, s) { debugger(when: kDebugMode); - ErrorHandler.logError(e: err, s: s); + ErrorHandler.logError( + e: err, + s: s, + data: { + "event": event.toJson(), + }, + ); return null; } } diff --git a/lib/pangea/matrix_event_wrappers/pangea_message_event.dart b/lib/pangea/matrix_event_wrappers/pangea_message_event.dart index 5925af571..a1c92e12b 100644 --- a/lib/pangea/matrix_event_wrappers/pangea_message_event.dart +++ b/lib/pangea/matrix_event_wrappers/pangea_message_event.dart @@ -39,6 +39,9 @@ class PangeaMessageEvent { debugger(when: kDebugMode); ErrorHandler.logError( m: "${event.type} should not be used to make a PangeaMessageEvent", + data: { + "event": event.toJson(), + }, ); } _event = event; @@ -192,7 +195,7 @@ class PangeaMessageEvent { ErrorHandler.logError( e: e, s: s, - data: event.content.tryGetMap(ModelKey.transcription), + data: {}, m: "error parsing data in getTextToSpeechLocal", ); return false; @@ -333,7 +336,7 @@ class PangeaMessageEvent { ErrorHandler.logError( e: e, s: s, - data: content, + data: content ?? {}, m: "error parsing tokensSent", ); return null; @@ -392,6 +395,9 @@ class PangeaMessageEvent { m: "error parsing originalSent", e: err, s: s, + data: { + "event": _event.toJson(), + }, ); } } @@ -417,6 +423,9 @@ class PangeaMessageEvent { m: "error parsing originalWritten", e: err, s: s, + data: { + "event": _event.toJson(), + }, ); } } @@ -633,7 +642,13 @@ class PangeaMessageEvent { try { return practiceActivities.isNotEmpty; } catch (e, s) { - ErrorHandler.logError(e: e, s: s); + ErrorHandler.logError( + e: e, + s: s, + data: { + "event": _event.toJson(), + }, + ); return false; } } diff --git a/lib/pangea/matrix_event_wrappers/pangea_representation_event.dart b/lib/pangea/matrix_event_wrappers/pangea_representation_event.dart index b0f52b5ce..d9e8c34b0 100644 --- a/lib/pangea/matrix_event_wrappers/pangea_representation_event.dart +++ b/lib/pangea/matrix_event_wrappers/pangea_representation_event.dart @@ -85,16 +85,14 @@ class RepresentationEvent { if (tokenEvents.length > 1) { debugger(when: kDebugMode); - Sentry.addBreadcrumb( - Breadcrumb( - message: "Token events for representation ${_event?.eventId}: " - "Content: ${tokenEvents.map((e) => e.content).toString()}" - "Type: ${tokenEvents.map((e) => e.type).toString()}", - ), - ); ErrorHandler.logError( m: 'should not have more than one tokenEvent per representation ${_event?.eventId}', s: StackTrace.current, + data: { + "eventID": _event?.eventId, + "content": tokenEvents.map((e) => e.content).toString(), + "type": tokenEvents.map((e) => e.type).toString(), + }, ); } @@ -180,7 +178,7 @@ class RepresentationEvent { ErrorHandler.logError( m: 'should not have more than one choreoEvent per representation ${_event?.eventId}', s: StackTrace.current, - data: _event?.toJson(), + data: {"event": _event?.toJson()}, ); } diff --git a/lib/pangea/matrix_event_wrappers/pangea_tokens_event.dart b/lib/pangea/matrix_event_wrappers/pangea_tokens_event.dart index f617b8dae..842489bd3 100644 --- a/lib/pangea/matrix_event_wrappers/pangea_tokens_event.dart +++ b/lib/pangea/matrix_event_wrappers/pangea_tokens_event.dart @@ -26,7 +26,13 @@ class TokensEvent { return _content!; } catch (err, s) { debugger(when: kDebugMode); - ErrorHandler.logError(e: err, s: s); + ErrorHandler.logError( + e: err, + s: s, + data: { + "event": event.toJson(), + }, + ); return null; } } diff --git a/lib/pangea/models/analytics/construct_list_model.dart b/lib/pangea/models/analytics/construct_list_model.dart index 619a33a81..939b38958 100644 --- a/lib/pangea/models/analytics/construct_list_model.dart +++ b/lib/pangea/models/analytics/construct_list_model.dart @@ -6,7 +6,6 @@ import 'package:fluffychat/pangea/models/analytics/construct_use_model.dart'; import 'package:fluffychat/pangea/models/analytics/constructs_model.dart'; import 'package:fluffychat/pangea/models/practice_activities.dart/practice_activity_model.dart'; import 'package:fluffychat/pangea/utils/error_handler.dart'; -import 'package:sentry_flutter/sentry_flutter.dart'; /// A wrapper around a list of [OneConstructUse]s, used to simplify /// the process of filtering / sorting / displaying the events. @@ -59,7 +58,13 @@ class ConstructListModel { _updateCategoriesToUses(); _updateMetrics(); } catch (err, s) { - ErrorHandler.logError(e: "Failed to update analytics: $err", s: s); + ErrorHandler.logError( + e: "Failed to update analytics: $err", + s: s, + data: { + "newUses": newUses.map((e) => e.toJson()), + }, + ); } } @@ -159,16 +164,14 @@ class ConstructListModel { level = levelCalculation.floor(); } else { level = 1; - Sentry.addBreadcrumb( - Breadcrumb( - data: { - "totalXP": totalXP, - "prevXP": prevXP, - "level": levelCalculation, - }, - ), + ErrorHandler.logError( + e: "Calculated level in Nan or Infinity", + data: { + "totalXP": totalXP, + "prevXP": prevXP, + "level": levelCalculation, + }, ); - ErrorHandler.logError(e: "Calculated level in Nan or Infinity"); } } diff --git a/lib/pangea/models/analytics/constructs_model.dart b/lib/pangea/models/analytics/constructs_model.dart index 914fa3c0c..93445fb69 100644 --- a/lib/pangea/models/analytics/constructs_model.dart +++ b/lib/pangea/models/analytics/constructs_model.dart @@ -32,14 +32,25 @@ class ConstructAnalyticsModel { try { uses.add(OneConstructUse.fromJson(useJson)); } catch (err, s) { - ErrorHandler.logError(e: err, s: s); + ErrorHandler.logError( + e: err, + s: s, + data: { + "useJson": useJson, + }, + ); continue; } } } } else { debugger(when: kDebugMode); - ErrorHandler.logError(m: "Analytics room with non-list uses"); + ErrorHandler.logError( + m: "Analytics room with non-list uses", + data: { + "usesKey": _usesKey, + }, + ); } return ConstructAnalyticsModel( @@ -172,6 +183,9 @@ class OneConstructUse { } ErrorHandler.logError( m: "Morph construct lemma $morphLemma not found in morph categories and labels", + data: { + "morphLemma": morphLemma, + }, ); return "Other"; } diff --git a/lib/pangea/models/base_subscription_info.dart b/lib/pangea/models/base_subscription_info.dart index ade40543d..95fe0d9c3 100644 --- a/lib/pangea/models/base_subscription_info.dart +++ b/lib/pangea/models/base_subscription_info.dart @@ -127,7 +127,13 @@ class AvailableSubscriptionsInfo { try { return AvailableSubscriptionsInfo.fromJson(json); } catch (e, s) { - ErrorHandler.logError(e: e, s: s); + ErrorHandler.logError( + e: e, + s: s, + data: { + "json": json, + }, + ); return null; } } diff --git a/lib/pangea/models/bot_options_model.dart b/lib/pangea/models/bot_options_model.dart index 5e57ba1f9..89f59927e 100644 --- a/lib/pangea/models/bot_options_model.dart +++ b/lib/pangea/models/bot_options_model.dart @@ -122,7 +122,11 @@ class BotOptionsModel { return data; } catch (e, s) { debugger(when: kDebugMode); - ErrorHandler.logError(e: e, s: s); + ErrorHandler.logError( + e: e, + s: s, + data: data, + ); return data; } } diff --git a/lib/pangea/models/igc_text_data_model.dart b/lib/pangea/models/igc_text_data_model.dart index d6a8ac999..685acfcbc 100644 --- a/lib/pangea/models/igc_text_data_model.dart +++ b/lib/pangea/models/igc_text_data_model.dart @@ -11,7 +11,6 @@ import 'package:fluffychat/pangea/utils/error_handler.dart'; import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:matrix/matrix.dart'; -import 'package:sentry_flutter/sentry_flutter.dart'; import '../constants/model_keys.dart'; @@ -127,6 +126,9 @@ class IGCTextData { debugger(when: kDebugMode); ErrorHandler.logError( m: "pangeaMatch.match.choices is null in acceptReplacement", + data: { + "match": pangeaMatch.match.toJson(), + }, ); return; } @@ -268,16 +270,12 @@ class IGCTextData { final spaceBetween = tokens[tokenIndex + 1].text.offset - endOfToken; if (spaceBetween < 0) { - Sentry.addBreadcrumb( - Breadcrumb.fromJson( - { - "fullText": originalInput, - "tokens": tokens.map((e) => e.toJson()).toString(), - }, - ), - ); ErrorHandler.logError( m: "weird token lengths for ${tokens[tokenIndex].text.content} and ${tokens[tokenIndex + 1].text.content}", + data: { + "fullText": originalInput, + "tokens": tokens.map((e) => e.toJson()).toString(), + }, ); return 0; } diff --git a/lib/pangea/models/language_model.dart b/lib/pangea/models/language_model.dart index db8a44d33..096bfb424 100644 --- a/lib/pangea/models/language_model.dart +++ b/lib/pangea/models/language_model.dart @@ -481,7 +481,13 @@ class LanguageModel { return L10n.of(context).shDisplayName; } debugger(when: kDebugMode); - ErrorHandler.logError(m: "No Display name found", s: StackTrace.current); + ErrorHandler.logError( + m: "No Display name found", + s: StackTrace.current, + data: { + "langCode": langCode, + }, + ); return null; } } diff --git a/lib/pangea/models/mobile_subscriptions.dart b/lib/pangea/models/mobile_subscriptions.dart index cf5685118..17d2f4228 100644 --- a/lib/pangea/models/mobile_subscriptions.dart +++ b/lib/pangea/models/mobile_subscriptions.dart @@ -29,6 +29,7 @@ class MobileSubscriptionInfo extends CurrentSubscriptionInfo { ErrorHandler.logError( m: "Failed to configure revenuecat SDK", s: StackTrace.current, + data: {}, ); } } @@ -66,6 +67,7 @@ class MobileSubscriptionInfo extends CurrentSubscriptionInfo { ErrorHandler.logError( m: "Failed to fetch revenuecat customer info", s: StackTrace.current, + data: {}, ); return; } diff --git a/lib/pangea/models/space_model.dart b/lib/pangea/models/space_model.dart index 78abb7f6f..e27abb50a 100644 --- a/lib/pangea/models/space_model.dart +++ b/lib/pangea/models/space_model.dart @@ -57,7 +57,11 @@ class LanguageSettingsModel { return data; } catch (e, s) { debugger(when: kDebugMode); - ErrorHandler.logError(e: e, s: s); + ErrorHandler.logError( + e: e, + s: s, + data: data, + ); return data; } } diff --git a/lib/pangea/pages/connect/p_sso_button.dart b/lib/pangea/pages/connect/p_sso_button.dart index 072e697f1..148b78301 100644 --- a/lib/pangea/pages/connect/p_sso_button.dart +++ b/lib/pangea/pages/connect/p_sso_button.dart @@ -71,7 +71,11 @@ class PangeaSsoButtonState extends State { context, ); } catch (err, s) { - ErrorHandler.logError(e: err, s: s); + ErrorHandler.logError( + e: err, + s: s, + data: {}, + ); if (err is MatrixException) { _error = err.errorMessage; } else { diff --git a/lib/pangea/pages/find_partner/find_partner.dart b/lib/pangea/pages/find_partner/find_partner.dart index ab4da472a..f5af483ed 100644 --- a/lib/pangea/pages/find_partner/find_partner.dart +++ b/lib/pangea/pages/find_partner/find_partner.dart @@ -119,7 +119,17 @@ class FindPartnerController extends State { } catch (err, s) { error = err.toString(); setState(() => loading = false); - ErrorHandler.logError(e: err, s: s); + ErrorHandler.logError( + e: err, + s: s, + data: { + "accessToken": pangeaController.userController.accessToken, + "targetLanguage": targetLanguageSearch.langCode, + "sourceLanguage": sourceLanguageSearch.langCode, + "country": countrySearch, + "pageNumber": nextPage.toString(), + }, + ); return; } diff --git a/lib/pangea/pages/sign_up/signup.dart b/lib/pangea/pages/sign_up/signup.dart index d65ecd8af..e9d09f160 100644 --- a/lib/pangea/pages/sign_up/signup.dart +++ b/lib/pangea/pages/sign_up/signup.dart @@ -185,13 +185,21 @@ class SignupPageController extends State { } } on MatrixException catch (e, s) { if (e.error != MatrixError.M_THREEPID_IN_USE) { - ErrorHandler.logError(e: e, s: s); + ErrorHandler.logError( + e: e, + s: s, + data: {}, + ); } error = e.errorMessage; } catch (e, s) { const cancelledString = "Exception: Request has been canceled"; if (e.toString() != cancelledString) { - ErrorHandler.logError(e: e, s: s); + ErrorHandler.logError( + e: e, + s: s, + data: {}, + ); } error = (e).toLocalizedString(context); } finally { diff --git a/lib/pangea/pages/sign_up/user_settings.dart b/lib/pangea/pages/sign_up/user_settings.dart index 3635f010a..e8d0ca48c 100644 --- a/lib/pangea/pages/sign_up/user_settings.dart +++ b/lib/pangea/pages/sign_up/user_settings.dart @@ -130,7 +130,13 @@ class UserSettingsState extends State { } if (file != null) await client.setAvatar(file); } catch (err, s) { - ErrorHandler.logError(e: err, s: s); + ErrorHandler.logError( + e: err, + s: s, + data: { + "avatar": avatar.toString(), + }, + ); } } diff --git a/lib/pangea/repo/contextualized_translation_repo.dart b/lib/pangea/repo/contextualized_translation_repo.dart index d5cd8f9e0..19b18f876 100644 --- a/lib/pangea/repo/contextualized_translation_repo.dart +++ b/lib/pangea/repo/contextualized_translation_repo.dart @@ -37,6 +37,10 @@ class ContextualizationTranslationRepo { e: Exception( "empty translations in contextual translation response return", ), + data: { + "accessToken": accessToken, + "request": request.toJson(), + }, ); } diff --git a/lib/pangea/repo/subscription_repo.dart b/lib/pangea/repo/subscription_repo.dart index 9dd0a4e48..4ca735123 100644 --- a/lib/pangea/repo/subscription_repo.dart +++ b/lib/pangea/repo/subscription_repo.dart @@ -31,6 +31,7 @@ class SubscriptionRepo { ErrorHandler.logError( m: "Failed to fetch app information for revenuecat API", s: StackTrace.current, + data: {}, ); return null; } @@ -50,7 +51,11 @@ class SubscriptionRepo { RCProductsResponseModel.fromJson(json); return resp.allProducts; } catch (err, s) { - ErrorHandler.logError(e: err, s: s); + ErrorHandler.logError( + e: err, + s: s, + data: {}, + ); return null; } } diff --git a/lib/pangea/utils/bot_style.dart b/lib/pangea/utils/bot_style.dart index 1a74708e8..bcb5c2c4c 100644 --- a/lib/pangea/utils/bot_style.dart +++ b/lib/pangea/utils/bot_style.dart @@ -25,7 +25,11 @@ class BotStyle { return existingStyle?.merge(botStyle) ?? botStyle; } catch (err, stack) { - ErrorHandler.logError(m: "error getting styles", s: stack); + ErrorHandler.logError( + m: "error getting styles", + s: stack, + data: {}, + ); return existingStyle ?? const TextStyle(); } } diff --git a/lib/pangea/utils/download_chat.dart b/lib/pangea/utils/download_chat.dart index 7ba0e0d84..6b39e426c 100644 --- a/lib/pangea/utils/download_chat.dart +++ b/lib/pangea/utils/download_chat.dart @@ -41,7 +41,13 @@ Future downloadChat( room, ); } catch (err, s) { - ErrorHandler.logError(e: err, s: s); + ErrorHandler.logError( + e: err, + s: s, + data: { + "roomID": room.id, + }, + ); ScaffoldMessenger.of(context).showSnackBar( SnackBar( content: Text( @@ -210,7 +216,11 @@ Future downloadFile( } } catch (err, s) { debugPrint("Failed to get download folder path"); - ErrorHandler.logError(e: err, s: s); + ErrorHandler.logError( + e: err, + s: s, + data: {}, + ); } if (directory != null) { final File f = File("${directory.path}/$filename"); diff --git a/lib/pangea/utils/error_handler.dart b/lib/pangea/utils/error_handler.dart index a87553e61..532e6a74e 100644 --- a/lib/pangea/utils/error_handler.dart +++ b/lib/pangea/utils/error_handler.dart @@ -44,7 +44,11 @@ class ErrorHandler { }; PlatformDispatcher.instance.onError = (exception, stack) { - logError(e: exception, s: stack); + logError( + e: exception, + s: stack, + data: {}, + ); return true; }; } @@ -53,7 +57,7 @@ class ErrorHandler { Object? e, StackTrace? s, String? m, - Map? data, + required Map data, SentryLevel level = SentryLevel.error, }) async { if (e is PangeaWarningError) { @@ -63,10 +67,8 @@ class ErrorHandler { if (m != null) debugPrint("error message: $m"); } - if (data != null) { - Sentry.addBreadcrumb(Breadcrumb.fromJson(data)); - debugPrint(data.toString()); - } + Sentry.addBreadcrumb(Breadcrumb.fromJson(data)); + debugPrint(data.toString()); Sentry.captureException( e ?? Exception(m ?? "no message supplied"), @@ -101,17 +103,12 @@ class ErrorCopy { if (error is http.Response) { errorCode = (error as http.Response).statusCode; } else { - ErrorHandler.logError(e: error, s: StackTrace.current); - errorCode = null; - } - if (L10n.of(context) == null) { - _setDefaults(); - Sentry.addBreadcrumb(Breadcrumb.fromJson({"error": error?.toString()})); ErrorHandler.logError( - m: "null L10n in ErrorCopy.setCopy", + e: error, s: StackTrace.current, + data: {}, ); - return; + errorCode = null; } final L10n l10n = L10n.of(context); @@ -155,7 +152,11 @@ class ErrorCopy { body = l10n.errorPleaseRefresh; } } catch (e, s) { - ErrorHandler.logError(e: s, s: s); + ErrorHandler.logError( + e: s, + s: s, + data: {}, + ); _setDefaults(); } } diff --git a/lib/pangea/utils/get_chat_list_item_subtitle.dart b/lib/pangea/utils/get_chat_list_item_subtitle.dart index d02ac7088..3459a0d18 100644 --- a/lib/pangea/utils/get_chat_list_item_subtitle.dart +++ b/lib/pangea/utils/get_chat_list_item_subtitle.dart @@ -103,7 +103,13 @@ class GetChatListItemSubtitle { return text; } catch (e, s) { // debugger(when: kDebugMode); - ErrorHandler.logError(e: e, s: s); + ErrorHandler.logError( + e: e, + s: s, + data: { + "event": event?.toJson(), + }, + ); return event?.body ?? l10n.emptyChat; } } diff --git a/lib/pangea/utils/instructions.dart b/lib/pangea/utils/instructions.dart index 1b308ded5..cda4a6c1e 100644 --- a/lib/pangea/utils/instructions.dart +++ b/lib/pangea/utils/instructions.dart @@ -8,7 +8,6 @@ import '../controllers/pangea_controller.dart'; import '../widgets/common/bot_face_svg.dart'; import '../widgets/igc/card_header.dart'; import 'bot_style.dart'; -import 'error_handler.dart'; import 'overlay.dart'; class InstructionsController { @@ -94,13 +93,6 @@ class InstructionsController { if (key.toggledOff() && !forceShow) { return; } - if (L10n.of(context) == null) { - ErrorHandler.logError( - m: "null context in ITBotButton.showCard", - s: StackTrace.current, - ); - return; - } final botStyle = BotStyle.text(context); Future.delayed( diff --git a/lib/pangea/utils/match_copy.dart b/lib/pangea/utils/match_copy.dart index 3989e0658..1c4e77d0d 100644 --- a/lib/pangea/utils/match_copy.dart +++ b/lib/pangea/utils/match_copy.dart @@ -6,7 +6,6 @@ import 'package:fluffychat/widgets/matrix.dart'; import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:flutter_gen/gen_l10n/l10n.dart'; -import 'package:sentry_flutter/sentry_flutter.dart'; import '../constants/match_rule_ids.dart'; import '../models/pangea_match_model.dart'; @@ -65,15 +64,13 @@ class MatchCopy { } } catch (err, stack) { debugger(when: kDebugMode); - Sentry.addBreadcrumb( - Breadcrumb( - message: "match", - data: { - "match": match.toJson(), - }, - ), + ErrorHandler.logError( + e: err, + s: stack, + data: { + "match": match.toJson(), + }, ); - ErrorHandler.logError(e: err, s: stack); _setDefaults(); } } @@ -217,15 +214,13 @@ class MatchCopy { } } catch (err, stack) { debugger(when: kDebugMode); - Sentry.addBreadcrumb( - Breadcrumb( - message: "match", - data: { - "match": match.toJson(), - }, - ), + ErrorHandler.logError( + e: err, + s: stack, + data: { + "match": match.toJson(), + }, ); - ErrorHandler.logError(e: err, s: stack); _setDefaults(); } } diff --git a/lib/pangea/utils/overlay.dart b/lib/pangea/utils/overlay.dart index 63ceed926..745e97f64 100644 --- a/lib/pangea/utils/overlay.dart +++ b/lib/pangea/utils/overlay.dart @@ -74,7 +74,11 @@ class OverlayUtil { .openOverlay(entry, context, closePrevOverlay: closePrevOverlay); } catch (err, stack) { debugger(when: kDebugMode); - ErrorHandler.logError(e: err, s: stack); + ErrorHandler.logError( + e: err, + s: stack, + data: {}, + ); } } @@ -145,7 +149,11 @@ class OverlayUtil { ); } catch (err, stack) { debugger(when: kDebugMode); - ErrorHandler.logError(e: err, s: stack); + ErrorHandler.logError( + e: err, + s: stack, + data: {}, + ); } } diff --git a/lib/pangea/utils/sync_status_util_v2.dart b/lib/pangea/utils/sync_status_util_v2.dart index cf56be94d..478133ae6 100644 --- a/lib/pangea/utils/sync_status_util_v2.dart +++ b/lib/pangea/utils/sync_status_util_v2.dart @@ -43,7 +43,11 @@ class PLoadingStatusStateV2 extends State { widget.onFinish?.call(); } } catch (err, s) { - ErrorHandler.logError(e: err, s: s); + ErrorHandler.logError( + e: err, + s: s, + data: {}, + ); isFinished = true; } } diff --git a/lib/pangea/utils/update_version_dialog.dart b/lib/pangea/utils/update_version_dialog.dart index 7c27a9cca..5d8faf0fe 100644 --- a/lib/pangea/utils/update_version_dialog.dart +++ b/lib/pangea/utils/update_version_dialog.dart @@ -14,6 +14,7 @@ Future showUpdateVersionDialog({ ErrorHandler.logError( e: err, s: s, + data: {}, ); await showOkAlertDialog( context: context, diff --git a/lib/pangea/widgets/chat/message_selection_overlay.dart b/lib/pangea/widgets/chat/message_selection_overlay.dart index d939d31da..aab0e298c 100644 --- a/lib/pangea/widgets/chat/message_selection_overlay.dart +++ b/lib/pangea/widgets/chat/message_selection_overlay.dart @@ -157,7 +157,13 @@ class MessageOverlayController extends State ); } } catch (e, s) { - ErrorHandler.logError(e: e, s: s); + ErrorHandler.logError( + e: e, + s: s, + data: { + "eventID": pangeaMessageEvent?.eventId, + }, + ); } finally { if (_selectedTargetTokenForWordMeaning != null) { messageAnalyticsEntry?.addForWordMeaning( @@ -214,6 +220,7 @@ class MessageOverlayController extends State ErrorHandler.logError( e: "Error calling setState in MessageSelectionOverlay: $e", s: s, + data: {}, ); } } else { @@ -225,6 +232,7 @@ class MessageOverlayController extends State ErrorHandler.logError( e: "Error calling setState in MessageSelectionOverlay after postframeCallback: $e", s: s, + data: {}, ); } }); @@ -468,7 +476,13 @@ class MessageOverlayController extends State widget._event.eventId, ); } catch (e, s) { - ErrorHandler.logError(e: "Error getting message render box: $e", s: s); + ErrorHandler.logError( + e: "Error getting message render box: $e", + s: s, + data: { + "eventID": widget._event.eventId, + }, + ); return null; } } @@ -481,7 +495,11 @@ class MessageOverlayController extends State try { return _messageRenderBox?.size; } catch (e, s) { - ErrorHandler.logError(e: "Error getting message size: $e", s: s); + ErrorHandler.logError( + e: "Error getting message size: $e", + s: s, + data: {}, + ); return null; } } @@ -513,7 +531,11 @@ class MessageOverlayController extends State try { return MediaQuery.of(context); } catch (e, s) { - ErrorHandler.logError(e: "Error getting media query: $e", s: s); + ErrorHandler.logError( + e: "Error getting media query: $e", + s: s, + data: {}, + ); return null; } } diff --git a/lib/pangea/widgets/chat/message_speech_to_text_card.dart b/lib/pangea/widgets/chat/message_speech_to_text_card.dart index 1e6b9cc4d..f74eb5974 100644 --- a/lib/pangea/widgets/chat/message_speech_to_text_card.dart +++ b/lib/pangea/widgets/chat/message_speech_to_text_card.dart @@ -142,7 +142,11 @@ class MessageSpeechToTextCardState extends State { return TextSpan(children: spans); } catch (err, s) { - ErrorHandler.logError(e: err, s: s); + ErrorHandler.logError( + e: err, + s: s, + data: {}, + ); setState(() => error = err); return const TextSpan(text: ''); } diff --git a/lib/pangea/widgets/chat/message_translation_card.dart b/lib/pangea/widgets/chat/message_translation_card.dart index 31b2d6905..8c575aa2b 100644 --- a/lib/pangea/widgets/chat/message_translation_card.dart +++ b/lib/pangea/widgets/chat/message_translation_card.dart @@ -99,7 +99,10 @@ class MessageTranslationCardState extends State { ? fetchSelectedTextTranslation() : fetchRepresentationText()); } catch (err) { - ErrorHandler.logError(e: err); + ErrorHandler.logError( + e: err, + data: {}, + ); } if (mounted) { diff --git a/lib/pangea/widgets/chat/tts_controller.dart b/lib/pangea/widgets/chat/tts_controller.dart index f4b5dffa3..53bcb8d1a 100644 --- a/lib/pangea/widgets/chat/tts_controller.dart +++ b/lib/pangea/widgets/chat/tts_controller.dart @@ -77,7 +77,11 @@ class TtsController { } } catch (e, s) { debugger(when: kDebugMode); - ErrorHandler.logError(e: e, s: s); + ErrorHandler.logError( + e: e, + s: s, + data: {}, + ); } finally { debugPrint("availableLangCodes: $_availableLangCodes"); final enableTTSSetting = userController.profile.toolSettings.enableTTS; @@ -114,7 +118,11 @@ class TtsController { } } catch (e, s) { debugger(when: kDebugMode); - ErrorHandler.logError(e: e, s: s); + ErrorHandler.logError( + e: e, + s: s, + data: {}, + ); } } @@ -135,7 +143,11 @@ class TtsController { } } catch (e, s) { debugger(when: kDebugMode); - ErrorHandler.logError(e: e, s: s); + ErrorHandler.logError( + e: e, + s: s, + data: {}, + ); } } @@ -177,7 +189,6 @@ class TtsController { e: 'Language not supported by TTS engine', data: { 'targetLanguage': targetLanguage, - 'availableLangCodes': _availableLangCodes, }, ); if (eventID != null) { @@ -219,7 +230,13 @@ class TtsController { } } catch (e, s) { debugger(when: kDebugMode); - ErrorHandler.logError(e: e, s: s); + ErrorHandler.logError( + e: e, + s: s, + data: { + 'text': text, + }, + ); } } diff --git a/lib/pangea/widgets/conversation_bot/conversation_bot_settings.dart b/lib/pangea/widgets/conversation_bot/conversation_bot_settings.dart index e9088c100..6775bb24d 100644 --- a/lib/pangea/widgets/conversation_bot/conversation_bot_settings.dart +++ b/lib/pangea/widgets/conversation_bot/conversation_bot_settings.dart @@ -39,7 +39,14 @@ class ConversationBotSettingsState extends State { ); } catch (err, stack) { debugger(when: kDebugMode); - ErrorHandler.logError(e: err, s: stack); + ErrorHandler.logError( + e: err, + s: stack, + data: { + "botOptions": botOptions.toJson(), + "roomID": widget.room.id, + }, + ); } } diff --git a/lib/pangea/widgets/igc/pangea_rich_text.dart b/lib/pangea/widgets/igc/pangea_rich_text.dart index 278d1ebbb..f8ccc6001 100644 --- a/lib/pangea/widgets/igc/pangea_rich_text.dart +++ b/lib/pangea/widgets/igc/pangea_rich_text.dart @@ -73,6 +73,9 @@ class PangeaRichTextState extends State { e: PangeaWarningError(error), s: stackTrace, m: "Error setting text span in PangeaRichText", + data: { + "newTextSpan": newTextSpan, + }, ); } } @@ -103,6 +106,9 @@ class PangeaRichTextState extends State { e: PangeaWarningError(error), s: stackTrace, m: "Error fetching representation", + data: { + "langCode": widget.pangeaMessageEvent.messageDisplayLangCode, + }, ); return null; }).then((event) { diff --git a/lib/pangea/widgets/igc/span_card.dart b/lib/pangea/widgets/igc/span_card.dart index 6707a62e3..c0308b8be 100644 --- a/lib/pangea/widgets/igc/span_card.dart +++ b/lib/pangea/widgets/igc/span_card.dart @@ -111,7 +111,13 @@ class SpanCardState extends State { } } catch (e, s) { // debugger(when: kDebugMode); - ErrorHandler.logError(e: e, s: s); + ErrorHandler.logError( + e: e, + s: s, + data: { + "matchIndex": widget.scm.matchIndex, + }, + ); if (mounted) { setState(() { error = e; @@ -377,7 +383,11 @@ class WordMatchContent extends StatelessWidget { ); } on Exception catch (e) { debugger(when: kDebugMode); - ErrorHandler.logError(e: e, s: StackTrace.current); + ErrorHandler.logError( + e: e, + s: StackTrace.current, + data: {}, + ); rethrow; } } diff --git a/lib/pangea/widgets/igc/word_data_card.dart b/lib/pangea/widgets/igc/word_data_card.dart index 9a1342e01..4137381c8 100644 --- a/lib/pangea/widgets/igc/word_data_card.dart +++ b/lib/pangea/widgets/igc/word_data_card.dart @@ -113,7 +113,13 @@ class WordDataCardController extends State { GoogleAnalytics.contextualRequest(); } catch (err, stack) { debugger(when: kDebugMode); - ErrorHandler.logError(e: err, s: stack, data: req?.toJson()); + ErrorHandler.logError( + e: err, + s: stack, + data: { + "request": req?.toJson(), + }, + ); definitionError = Exception("Error getting definition"); } finally { if (mounted) setState(() => isLoadingContextualDefinition = false); @@ -172,7 +178,13 @@ class WordDataCardView extends StatelessWidget { ); } if (controller.activeL1 == null || controller.activeL2 == null) { - ErrorHandler.logError(m: "should not be here"); + ErrorHandler.logError( + m: "should not be here", + data: { + "activeL1": controller.activeL1?.toJson(), + "activeL2": controller.activeL2?.toJson(), + }, + ); return CardErrorWidget( error: controller.noLanguages, maxWidth: AppConfig.toolbarMinWidth, diff --git a/lib/pangea/widgets/practice_activity/word_audio_button.dart b/lib/pangea/widgets/practice_activity/word_audio_button.dart index 1904307a5..3ee582bd0 100644 --- a/lib/pangea/widgets/practice_activity/word_audio_button.dart +++ b/lib/pangea/widgets/practice_activity/word_audio_button.dart @@ -54,7 +54,14 @@ class WordAudioButtonState extends State { widget.eventID, ); } catch (e, s) { - ErrorHandler.logError(e: e, s: s); + ErrorHandler.logError( + e: e, + s: s, + data: { + "text": widget.text, + "eventID": widget.eventID, + }, + ); } finally { if (mounted) { setState(() => _isPlaying = false); diff --git a/lib/pangea/widgets/user_settings/p_language_dialog.dart b/lib/pangea/widgets/user_settings/p_language_dialog.dart index b9e1fb4b5..bac52d6bf 100644 --- a/lib/pangea/widgets/user_settings/p_language_dialog.dart +++ b/lib/pangea/widgets/user_settings/p_language_dialog.dart @@ -108,7 +108,11 @@ Future pLanguageDialog( Navigator.pop(context); } catch (err, s) { debugger(when: kDebugMode); - ErrorHandler.logError(e: err, s: s); + ErrorHandler.logError( + e: err, + s: s, + data: {}, + ); rethrow; } finally { callback(); diff --git a/lib/pangea/widgets/user_settings/p_settings_switch_list_tile.dart b/lib/pangea/widgets/user_settings/p_settings_switch_list_tile.dart index e6473a425..5e6a45a7c 100644 --- a/lib/pangea/widgets/user_settings/p_settings_switch_list_tile.dart +++ b/lib/pangea/widgets/user_settings/p_settings_switch_list_tile.dart @@ -57,6 +57,10 @@ class PSettingsSwitchListTileState e: err, m: "Failed to updates user setting", s: s, + data: { + "newValue": newValue, + "currentValue": currentValue, + }, ); } } diff --git a/lib/utils/background_push.dart b/lib/utils/background_push.dart index e836d0b16..86edc409d 100644 --- a/lib/utils/background_push.dart +++ b/lib/utils/background_push.dart @@ -149,7 +149,13 @@ class BackgroundPush { : '/rooms/$roomId', ); } catch (err, s) { - ErrorHandler.logError(e: err, s: s); + ErrorHandler.logError( + e: err, + s: s, + data: { + "roomId": message.data['room_id'], + }, + ); } } // Pangea# @@ -226,6 +232,7 @@ class BackgroundPush { ErrorHandler.logError( e: "Error requesting notifications permission: $err", s: s, + data: {}, ); } // Pangea# @@ -316,7 +323,11 @@ class BackgroundPush { } catch (e, s) { Logs().e('[Push] Unable to set pushers', e, s); // #Pangea - ErrorHandler.logError(e: e, s: s); + ErrorHandler.logError( + e: e, + s: s, + data: {}, + ); // Pangea# } } @@ -428,7 +439,13 @@ class BackgroundPush { } catch (e, s) { Logs().e('[Push] Failed to open room', e, s); // #Pangea - ErrorHandler.logError(e: e, s: s); + ErrorHandler.logError( + e: e, + s: s, + data: { + "roomID": response?.payload, + }, + ); // Pangea# } } diff --git a/lib/utils/error_reporter.dart b/lib/utils/error_reporter.dart index 7a27d091f..a5d0884a7 100644 --- a/lib/utils/error_reporter.dart +++ b/lib/utils/error_reporter.dart @@ -29,6 +29,7 @@ class ErrorReporter { e: error, s: stackTrace, m: message ?? 'Error caught', + data: {}, ); } } diff --git a/lib/utils/matrix_sdk_extensions/flutter_matrix_dart_sdk_database/builder.dart b/lib/utils/matrix_sdk_extensions/flutter_matrix_dart_sdk_database/builder.dart index 2457ff793..225650bde 100644 --- a/lib/utils/matrix_sdk_extensions/flutter_matrix_dart_sdk_database/builder.dart +++ b/lib/utils/matrix_sdk_extensions/flutter_matrix_dart_sdk_database/builder.dart @@ -26,6 +26,7 @@ Future flutterMatrixSdkDatabaseBuilder(Client client) async { ErrorHandler.logError( e: e, s: s, + data: {"clientID": client.id}, m: "Failed to open matrix sdk database. Openning fallback database.", ); // Pangea# @@ -37,6 +38,7 @@ Future flutterMatrixSdkDatabaseBuilder(Client client) async { ErrorHandler.logError( e: e, s: s, + data: {}, m: "Failed to delete matrix database after failed construction.", ); } diff --git a/lib/utils/push_helper.dart b/lib/utils/push_helper.dart index 727131cbe..3a2ce1989 100644 --- a/lib/utils/push_helper.dart +++ b/lib/utils/push_helper.dart @@ -175,7 +175,7 @@ Future _tryPushHelper( } catch (e, s) { Logs().e('Unable to get avatar picture', e, s); // #Pangea - ErrorHandler.logError(e: e, s: s); + ErrorHandler.logError(e: e, s: s, data: {"avatarUri": avatar.toString()}); // Pangea# } try {