From ebe22129bc45dcb7b92d2385ea918cfed989c340 Mon Sep 17 00:00:00 2001 From: ggurdin <46800240+ggurdin@users.noreply.github.com> Date: Mon, 12 Jan 2026 10:24:55 -0500 Subject: [PATCH] fix: expose stream of newly collected constructs and use it to update new tokens cache on analytics update (#5169) --- lib/pages/chat/chat.dart | 11 +++++++++++ lib/pangea/analytics_data/analytics_data_service.dart | 7 +++++++ .../analytics_data/analytics_update_dispatcher.dart | 11 +++++++++++ .../analytics_data/analytics_update_events.dart | 5 +++++ 4 files changed, 34 insertions(+) diff --git a/lib/pages/chat/chat.dart b/lib/pages/chat/chat.dart index 38dc0583e..18a21f926 100644 --- a/lib/pages/chat/chat.dart +++ b/lib/pages/chat/chat.dart @@ -191,6 +191,8 @@ class ChatController extends State StreamSubscription? _levelSubscription; StreamSubscription? _constructsSubscription; + StreamSubscription? _tokensSubscription; + StreamSubscription? _botAudioSubscription; final timelineUpdateNotifier = _TimelineUpdateNotifier(); late final ActivityChatController activityController; @@ -477,6 +479,11 @@ class ChatController extends State ); } + void _onTokenUpdate(Set constructs) { + if (constructs.isEmpty) return; + TokensUtil.clearNewTokenCache(); + } + Future _botAudioListener(SyncUpdate update) async { if (update.rooms?.join?[roomId]?.timeline?.events == null) return; final timeline = update.rooms!.join![roomId]!.timeline!; @@ -527,6 +534,9 @@ class ChatController extends State _constructsSubscription = updater.unlockedConstructsStream.stream.listen(_onUnlockConstructs); + _tokensSubscription = + updater.newConstructsStream.stream.listen(_onTokenUpdate); + _botAudioSubscription = room.client.onSync.stream.listen(_botAudioListener); activityController = ActivityChatController( @@ -790,6 +800,7 @@ class ChatController extends State _levelSubscription?.cancel(); _botAudioSubscription?.cancel(); _constructsSubscription?.cancel(); + _tokensSubscription?.cancel(); _router.routeInformationProvider.removeListener(_onRouteChanged); choreographer.timesDismissedIT.removeListener(_onCloseIT); scrollController.dispose(); diff --git a/lib/pangea/analytics_data/analytics_data_service.dart b/lib/pangea/analytics_data/analytics_data_service.dart index f3084c061..2cfc41a01 100644 --- a/lib/pangea/analytics_data/analytics_data_service.dart +++ b/lib/pangea/analytics_data/analytics_data_service.dart @@ -380,6 +380,9 @@ class AnalyticsDataService { await _ensureInitialized(); final blocked = blockedConstructs; + final newUnusedConstructs = + updateIds.where((id) => !hasUsedConstruct(id)).toSet(); + _mergeTable.addConstructsByUses(update.addedConstructs, blocked); await _analyticsClientGetter.database.updateLocalAnalytics( update.addedConstructs, @@ -437,6 +440,10 @@ class AnalyticsDataService { events.add(ConstructBlockedEvent(update.blockedConstruct!)); } + if (newUnusedConstructs.isNotEmpty) { + events.add(NewConstructsEvent(newUnusedConstructs)); + } + return events; } diff --git a/lib/pangea/analytics_data/analytics_update_dispatcher.dart b/lib/pangea/analytics_data/analytics_update_dispatcher.dart index 84d697020..4182fec99 100644 --- a/lib/pangea/analytics_data/analytics_update_dispatcher.dart +++ b/lib/pangea/analytics_data/analytics_update_dispatcher.dart @@ -43,6 +43,9 @@ class AnalyticsUpdateDispatcher { final StreamController levelUpdateStream = StreamController.broadcast(); + final StreamController> newConstructsStream = + StreamController>.broadcast(); + final StreamController> _lemmaInfoUpdateStream = StreamController< MapEntry>.broadcast(); @@ -98,6 +101,9 @@ class AnalyticsUpdateDispatcher { case final ConstructBlockedEvent e: _onBlockedConstruct(e.blockedConstruct); break; + case final NewConstructsEvent e: + _onNewConstruct(e.newConstructs); + break; } } @@ -137,4 +143,9 @@ class AnalyticsUpdateDispatcher { ); constructUpdateStream.add(update); } + + void _onNewConstruct(Set constructIds) { + if (constructIds.isEmpty) return; + newConstructsStream.add(constructIds); + } } diff --git a/lib/pangea/analytics_data/analytics_update_events.dart b/lib/pangea/analytics_data/analytics_update_events.dart index 511de32a5..1d79afb02 100644 --- a/lib/pangea/analytics_data/analytics_update_events.dart +++ b/lib/pangea/analytics_data/analytics_update_events.dart @@ -23,3 +23,8 @@ class ConstructBlockedEvent extends AnalyticsUpdateEvent { final ConstructIdentifier blockedConstruct; ConstructBlockedEvent(this.blockedConstruct); } + +class NewConstructsEvent extends AnalyticsUpdateEvent { + final Set newConstructs; + NewConstructsEvent(this.newConstructs); +}