fix: send local analytics to correct analytics room on language update (#5194)

This commit is contained in:
ggurdin 2026-01-14 13:44:11 -05:00 committed by GitHub
parent 8a8ca1026a
commit a96e767595
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
3 changed files with 28 additions and 13 deletions

View file

@ -208,8 +208,8 @@ class AnalyticsDataService {
return analyticsRoom?.blockedConstructs ?? {};
}
Future<void> waitForSync() async {
await _syncController?.syncStream.stream.first;
Future<void> waitForSync(String analyticsRoomID) async {
await _syncController?.waitForSync(analyticsRoomID);
}
Future<DerivedAnalyticsDataModel> get derivedData async {

View file

@ -14,8 +14,6 @@ class AnalyticsSyncController {
final AnalyticsDataService dataService;
StreamSubscription? _subscription;
StreamController<List<String>> syncStream =
StreamController<List<String>>.broadcast();
AnalyticsSyncController({
required this.client,
@ -29,7 +27,6 @@ class AnalyticsSyncController {
void dispose() {
_subscription?.cancel();
_subscription = null;
syncStream.close();
}
Future<void> _onSync(SyncUpdate update) async {
@ -55,10 +52,22 @@ class AnalyticsSyncController {
if (constructEvents.isEmpty) return;
await dataService.updateServerAnalytics(constructEvents);
}
syncStream.add(
List<String>.from(constructEvents.map((e) => e.event.eventId)),
);
Future<void> 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<void> bulkUpdate() async {

View file

@ -29,8 +29,8 @@ class AnalyticsUpdateService {
LanguageModel? get _l2 => MatrixState.pangeaController.userController.userL2;
Future<Room?> _getAnalyticsRoom() async {
final l2 = _l2;
Future<Room?> _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<void> _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;
}