From 75b60781af38fb0588b08d30fdb00e8ecd2d1cb2 Mon Sep 17 00:00:00 2001 From: ggurdin Date: Fri, 19 Dec 2025 16:12:45 -0500 Subject: [PATCH] fix: use construct id json in route for analytics details page --- lib/config/routes.dart | 10 ++++++---- .../morph_analytics_list_view.dart | 4 +++- .../vocab_analytics_details_view.dart | 8 ++++++++ .../vocab_analytics_list_view.dart | 4 +++- .../analytics_misc/lemma_emoji_setter_mixin.dart | 4 +++- lib/pangea/chat/utils/unlocked_morphs_snackbar.dart | 3 ++- 6 files changed, 25 insertions(+), 8 deletions(-) diff --git a/lib/config/routes.dart b/lib/config/routes.dart index 0fb764142..d14e93a99 100644 --- a/lib/config/routes.dart +++ b/lib/config/routes.dart @@ -1,4 +1,5 @@ import 'dart:async'; +import 'dart:convert'; import 'package:flutter/material.dart'; @@ -540,9 +541,10 @@ abstract class AppRoutes { GoRoute( path: ':construct', pageBuilder: (context, state) { - final construct = ConstructIdentifier.fromString( - state.pathParameters['construct']!, + final construct = ConstructIdentifier.fromJson( + jsonDecode(state.pathParameters['construct']!), ); + return defaultPageBuilder( context, state, @@ -571,8 +573,8 @@ abstract class AppRoutes { GoRoute( path: ':construct', pageBuilder: (context, state) { - final construct = ConstructIdentifier.fromString( - state.pathParameters['construct']!, + final construct = ConstructIdentifier.fromJson( + jsonDecode(state.pathParameters['construct']!), ); return defaultPageBuilder( context, diff --git a/lib/pangea/analytics_details_popup/morph_analytics_list_view.dart b/lib/pangea/analytics_details_popup/morph_analytics_list_view.dart index 2f709581c..52a20e4e9 100644 --- a/lib/pangea/analytics_details_popup/morph_analytics_list_view.dart +++ b/lib/pangea/analytics_details_popup/morph_analytics_list_view.dart @@ -1,3 +1,5 @@ +import 'dart:convert'; + import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; @@ -164,7 +166,7 @@ class MorphFeatureBox extends StatelessWidget { morphTag: morphTag, constructAnalytics: analytics, onTap: () => context.go( - "/rooms/analytics/${id.type.string}/${Uri.encodeComponent(id.string)}", + "/rooms/analytics/${id.type.string}/${Uri.encodeComponent(jsonEncode(id.toJson()))}", ), ); }, diff --git a/lib/pangea/analytics_details_popup/vocab_analytics_details_view.dart b/lib/pangea/analytics_details_popup/vocab_analytics_details_view.dart index 7f5e4d1f4..88ecd5be8 100644 --- a/lib/pangea/analytics_details_popup/vocab_analytics_details_view.dart +++ b/lib/pangea/analytics_details_popup/vocab_analytics_details_view.dart @@ -36,6 +36,14 @@ class VocabDetailsViewState extends State { _emojiNotifier.value = constructId.userLemmaInfo.emojis?.firstOrNull; } + @override + void didUpdateWidget(covariant VocabDetailsView oldWidget) { + super.didUpdateWidget(oldWidget); + if (oldWidget.constructId != widget.constructId) { + _emojiNotifier.value = constructId.userLemmaInfo.emojis?.firstOrNull; + } + } + @override void dispose() { _emojiNotifier.dispose(); diff --git a/lib/pangea/analytics_details_popup/vocab_analytics_list_view.dart b/lib/pangea/analytics_details_popup/vocab_analytics_list_view.dart index d166c2b2d..bf3f18b0f 100644 --- a/lib/pangea/analytics_details_popup/vocab_analytics_list_view.dart +++ b/lib/pangea/analytics_details_popup/vocab_analytics_list_view.dart @@ -1,3 +1,5 @@ +import 'dart:convert'; + import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; @@ -182,7 +184,7 @@ class VocabAnalyticsListView extends StatelessWidget { .userController.userL2Code!, ); context.go( - "/rooms/analytics/${vocabItem.id.type.string}/${Uri.encodeComponent(vocabItem.id.string)}", + "/rooms/analytics/${vocabItem.id.type.string}/${Uri.encodeComponent(jsonEncode(vocabItem.id.toJson()))}", ); }, constructId: vocabItem.id, diff --git a/lib/pangea/analytics_misc/lemma_emoji_setter_mixin.dart b/lib/pangea/analytics_misc/lemma_emoji_setter_mixin.dart index 92d3ea982..a94c4ce7d 100644 --- a/lib/pangea/analytics_misc/lemma_emoji_setter_mixin.dart +++ b/lib/pangea/analytics_misc/lemma_emoji_setter_mixin.dart @@ -1,3 +1,5 @@ +import 'dart:convert'; + import 'package:flutter/material.dart'; import 'package:go_router/go_router.dart'; @@ -55,7 +57,7 @@ mixin LemmaEmojiSetter { onTap: () { ScaffoldMessenger.of(context).hideCurrentSnackBar(); context.go( - "/rooms/analytics/${constructId.type.name}/${Uri.encodeComponent(constructId.string)}", + "/rooms/analytics/${constructId.type.name}/${Uri.encodeComponent(jsonEncode(constructId.toJson()))}", ); }, ), diff --git a/lib/pangea/chat/utils/unlocked_morphs_snackbar.dart b/lib/pangea/chat/utils/unlocked_morphs_snackbar.dart index 68b0bb22b..f53116f18 100644 --- a/lib/pangea/chat/utils/unlocked_morphs_snackbar.dart +++ b/lib/pangea/chat/utils/unlocked_morphs_snackbar.dart @@ -1,6 +1,7 @@ // ignore_for_file: depend_on_referenced_packages, implementation_imports import 'dart:async'; +import 'dart:convert'; import 'package:flutter/material.dart'; @@ -168,7 +169,7 @@ class ConstructNotificationOverlayState void _showDetails() { context.go( - "/rooms/analytics/${ConstructTypeEnum.morph.string}/${Uri.encodeComponent(widget.construct.string)}", + "/rooms/analytics/${ConstructTypeEnum.morph.string}/${Uri.encodeComponent(jsonEncode(widget.construct.toJson()))}", ); }