From a96e767595c2bdd5794080a0218f77d1319ad658 Mon Sep 17 00:00:00 2001 From: ggurdin <46800240+ggurdin@users.noreply.github.com> Date: Wed, 14 Jan 2026 13:44:11 -0500 Subject: [PATCH] fix: send local analytics to correct analytics room on language update (#5194) --- .../analytics_data_service.dart | 4 ++-- .../analytics_sync_controller.dart | 21 +++++++++++++------ .../analytics_update_service.dart | 16 +++++++++----- 3 files changed, 28 insertions(+), 13 deletions(-) diff --git a/lib/pangea/analytics_data/analytics_data_service.dart b/lib/pangea/analytics_data/analytics_data_service.dart index 2cfc41a01..50af5f3a5 100644 --- a/lib/pangea/analytics_data/analytics_data_service.dart +++ b/lib/pangea/analytics_data/analytics_data_service.dart @@ -208,8 +208,8 @@ class AnalyticsDataService { return analyticsRoom?.blockedConstructs ?? {}; } - Future waitForSync() async { - await _syncController?.syncStream.stream.first; + Future waitForSync(String analyticsRoomID) async { + await _syncController?.waitForSync(analyticsRoomID); } Future get derivedData async { diff --git a/lib/pangea/analytics_data/analytics_sync_controller.dart b/lib/pangea/analytics_data/analytics_sync_controller.dart index d0aaaccee..53ccd760a 100644 --- a/lib/pangea/analytics_data/analytics_sync_controller.dart +++ b/lib/pangea/analytics_data/analytics_sync_controller.dart @@ -14,8 +14,6 @@ class AnalyticsSyncController { final AnalyticsDataService dataService; StreamSubscription? _subscription; - StreamController> syncStream = - StreamController>.broadcast(); AnalyticsSyncController({ required this.client, @@ -29,7 +27,6 @@ class AnalyticsSyncController { void dispose() { _subscription?.cancel(); _subscription = null; - syncStream.close(); } Future _onSync(SyncUpdate update) async { @@ -55,10 +52,22 @@ class AnalyticsSyncController { if (constructEvents.isEmpty) return; await dataService.updateServerAnalytics(constructEvents); + } - syncStream.add( - List.from(constructEvents.map((e) => e.event.eventId)), - ); + Future waitForSync(String analyticsRoomId) async { + await client.onSync.stream.firstWhere((update) { + final roomUpdate = update.rooms?.join?[analyticsRoomId]; + if (roomUpdate == null) return false; + + final hasAnalyticsEvent = roomUpdate.timeline?.events?.any( + (e) => + e.type == PangeaEventTypes.construct && + e.senderId == client.userID, + ) ?? + false; + + return hasAnalyticsEvent; + }); } Future bulkUpdate() async { diff --git a/lib/pangea/analytics_data/analytics_update_service.dart b/lib/pangea/analytics_data/analytics_update_service.dart index 29c0cbaf9..cdb832650 100644 --- a/lib/pangea/analytics_data/analytics_update_service.dart +++ b/lib/pangea/analytics_data/analytics_update_service.dart @@ -29,8 +29,8 @@ class AnalyticsUpdateService { LanguageModel? get _l2 => MatrixState.pangeaController.userController.userL2; - Future _getAnalyticsRoom() async { - final l2 = _l2; + Future _getAnalyticsRoom({LanguageModel? l2Override}) async { + final l2 = l2Override ?? _l2; if (l2 == null) return null; final analyticsRoom = await dataService.getAnalyticsRoom(l2); @@ -101,11 +101,17 @@ class AnalyticsUpdateService { Future _updateAnalytics({LanguageModel? l2Override}) async { final localConstructs = await dataService.getLocalUses(); if (localConstructs.isEmpty) return; - final analyticsRoom = await _getAnalyticsRoom(); + final analyticsRoom = await _getAnalyticsRoom(l2Override: l2Override); + if (analyticsRoom == null) { + debugPrint( + "No analytics room found for L2 Override: ${l2Override?.langCode}", + ); + return; + } // and send cached analytics data to the room - final future = dataService.waitForSync(); - await analyticsRoom?.sendConstructsEvent(localConstructs); + final future = dataService.waitForSync(analyticsRoom.id); + await analyticsRoom.sendConstructsEvent(localConstructs); await future; }