Skip to content

Commit c4dd0ce

Browse files
committed
Sync v2
1 parent fcde642 commit c4dd0ce

9 files changed

Lines changed: 2186 additions & 22 deletions

app/lib/providers/game_stats_provider.dart

Lines changed: 14 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,8 @@ import 'package:provider/provider.dart';
55
import './settings_provider.dart';
66
import '../services/logger.dart';
77
import '../services/star_transaction_service.dart';
8-
import '../services/sync_service.dart';
8+
import '../services/sync_service_v2.dart';
9+
import '../services/sync/sync_types_v2.dart';
910
import '../services/analytics_service.dart';
1011
import '../utils/automatic_error_reporter.dart';
1112
import '../error/error_handler.dart';
@@ -28,7 +29,8 @@ class GameStatsProvider extends ChangeNotifier {
2829
bool _syncListenerSetup = false;
2930
final GlobalKey<NavigatorState> navigatorKey = GlobalKey<NavigatorState>();
3031
void Function(String message)? onError;
31-
SyncService get syncService => SyncService.instance;
32+
SyncServiceV2 get syncService => SyncServiceV2.instance;
33+
void Function(Map<String, dynamic>)? _syncCallback;
3234

3335
Powerup? _activePowerup;
3436
DateTime? _powerupActivatedAt;
@@ -103,7 +105,7 @@ class GameStatsProvider extends ChangeNotifier {
103105
'game_stats',
104106
onSyncError: (key, error) {
105107
if (key == 'game_stats') {
106-
onError?.call('Synchronisatie mislukt: $error');
108+
onError?.call('Synchronisatie mislukt: ${error.message}');
107109
}
108110
},
109111
onSyncSuccess: (key) {
@@ -155,7 +157,8 @@ class GameStatsProvider extends ChangeNotifier {
155157
AppLogger.info('fetchAllData returned: $allData');
156158

157159
if (allData != null && allData.containsKey('game_stats')) {
158-
final syncedStats = allData['game_stats'];
160+
final syncedEntry = allData['game_stats'];
161+
final syncedStats = syncedEntry?.data;
159162
AppLogger.info('Found synced game stats: $syncedStats');
160163

161164
if (syncedStats != null) {
@@ -599,11 +602,12 @@ class GameStatsProvider extends ChangeNotifier {
599602
}
600603
_syncListenerSetup = true;
601604
AppLogger.info('Setting up game stats sync listener');
602-
syncService.addListener('game_stats', (data) {
605+
_syncCallback = (data) {
603606
AppLogger.info(
604607
'Received synced game stats update: ${data.keys.toList()}');
605608
loadImportData(data);
606-
});
609+
};
610+
syncService.addListener('game_stats', _syncCallback!);
607611
}
608612

609613
/// Triggers immediate sync of game stats to server
@@ -616,8 +620,11 @@ class GameStatsProvider extends ChangeNotifier {
616620
@override
617621
void dispose() {
618622
// Remove sync listeners to prevent memory leaks
619-
syncService.removeListener('game_stats');
623+
if (_syncCallback != null) {
624+
syncService.removeListener('game_stats', _syncCallback!);
625+
}
620626
_syncListenerSetup = false;
627+
_syncCallback = null;
621628
AppLogger.debug('GameStatsProvider disposed - listeners cleaned up');
622629
super.dispose();
623630
}

app/lib/providers/lesson_progress_provider.dart

Lines changed: 14 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,8 @@ import 'package:shared_preferences/shared_preferences.dart';
66

77
import '../models/lesson.dart';
88
import '../services/logger.dart';
9-
import '../services/sync_service.dart';
9+
import '../services/sync_service_v2.dart';
10+
import '../services/sync/sync_types_v2.dart';
1011

1112
/// Tracks per-lesson unlock state and best stars earned.
1213
/// Simple linear progression: lesson at index 0 starts unlocked; completing a lesson unlocks the next.
@@ -18,13 +19,14 @@ class LessonProgressProvider extends ChangeNotifier {
1819
bool _isLoading = true;
1920
String? _error;
2021
bool _syncListenerSetup = false;
22+
void Function(Map<String, dynamic>)? _syncCallback;
2123

2224
/// Number of lessons unlocked from start (sequential from index 0)
2325
int _unlockedCount = 1;
2426

2527
/// Map: lessonId -> bestStars (0..3)
2628
final Map<String, int> _bestStarsByLesson = {};
27-
SyncService get syncService => SyncService.instance;
29+
SyncServiceV2 get syncService => SyncServiceV2.instance;
2830

2931
bool get isLoading => _isLoading;
3032
String? get error => _error;
@@ -42,7 +44,7 @@ class LessonProgressProvider extends ChangeNotifier {
4244
'lesson_progress',
4345
onSyncError: (key, error) {
4446
if (key == 'lesson_progress') {
45-
_error = 'Synchronisatie mislukt: $error';
47+
_error = 'Synchronisatie mislukt: ${error.message}';
4648
notifyListeners();
4749
}
4850
},
@@ -93,7 +95,8 @@ class LessonProgressProvider extends ChangeNotifier {
9395
final allData = await syncService.fetchAllData();
9496

9597
if (allData != null && allData.containsKey('lesson_progress')) {
96-
final syncedData = allData['lesson_progress'];
98+
final syncedEntry = allData['lesson_progress'];
99+
final syncedData = syncedEntry?.data;
97100
AppLogger.info(
98101
'Found synced lesson progress, merging with local data');
99102

@@ -236,10 +239,11 @@ class LessonProgressProvider extends ChangeNotifier {
236239
}
237240
_syncListenerSetup = true;
238241
AppLogger.info('Setting up lesson progress sync listener');
239-
syncService.addListener('lesson_progress', (data) {
242+
_syncCallback = (data) {
240243
AppLogger.info('Received synced lesson progress update');
241244
loadImportData(data);
242-
});
245+
};
246+
syncService.addListener('lesson_progress', _syncCallback!);
243247
}
244248

245249
/// Triggers immediate sync of lesson progress to server
@@ -252,8 +256,11 @@ class LessonProgressProvider extends ChangeNotifier {
252256
@override
253257
void dispose() {
254258
// Remove sync listeners to prevent memory leaks
255-
syncService.removeListener('lesson_progress');
259+
if (_syncCallback != null) {
260+
syncService.removeListener('lesson_progress', _syncCallback!);
261+
}
256262
_syncListenerSetup = false;
263+
_syncCallback = null;
257264
AppLogger.debug('LessonProgressProvider disposed - listeners cleaned up');
258265
super.dispose();
259266
}

app/lib/providers/settings_provider.dart

Lines changed: 14 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,8 @@ import 'package:flutter/material.dart';
33
import 'package:shared_preferences/shared_preferences.dart';
44
import '../services/logger.dart';
55
import '../models/ai_theme.dart';
6-
import '../services/sync_service.dart';
6+
import '../services/sync_service_v2.dart';
7+
import '../services/sync/sync_types_v2.dart';
78
import '../utils/automatic_error_reporter.dart';
89
import '../error/error_handler.dart';
910
import '../error/error_types.dart';
@@ -61,6 +62,7 @@ class SettingsProvider extends ChangeNotifier {
6162
String? _error;
6263
String? _selectedCustomThemeKey;
6364
bool _syncListenerSetup = false;
65+
void Function(Map<String, dynamic>)? _syncCallback;
6466
Set<String> _unlockedThemes = {};
6567
final Map<String, AITheme> _aiThemes = {};
6668

@@ -69,7 +71,7 @@ class SettingsProvider extends ChangeNotifier {
6971
// Navigation settings
7072
bool _showNavigationLabels = true;
7173

72-
SyncService get syncService => SyncService.instance;
74+
SyncServiceV2 get syncService => SyncServiceV2.instance;
7375

7476
// Layout type enum
7577
static const String layoutGrid = 'grid';
@@ -99,7 +101,7 @@ class SettingsProvider extends ChangeNotifier {
99101
'settings',
100102
onSyncError: (key, error) {
101103
if (key == 'settings') {
102-
_error = 'Synchronisatie mislukt: $error';
104+
_error = 'Synchronisatie mislukt: ${error.message}';
103105
notifyListeners();
104106
}
105107
},
@@ -494,7 +496,7 @@ class SettingsProvider extends ChangeNotifier {
494496
AppLogger.info('fetchAllData returned: $allData');
495497

496498
if (allData != null && allData.containsKey('settings')) {
497-
final syncedSettings = allData['settings'];
499+
final syncedSettings = allData['settings']?.data;
498500
AppLogger.info('Found synced settings: $syncedSettings');
499501

500502
if (syncedSettings != null) {
@@ -515,7 +517,7 @@ class SettingsProvider extends ChangeNotifier {
515517

516518
// Merge AI themes (add themes that don't exist locally)
517519
final syncedAIThemes =
518-
syncedSettings['aiThemes'] as Map<String, dynamic>?;
520+
syncedSettings?['aiThemes'] as Map<String, dynamic>?;
519521
if (syncedAIThemes != null) {
520522
for (final entry in syncedAIThemes.entries) {
521523
final themeId = entry.key;
@@ -1158,17 +1160,21 @@ class SettingsProvider extends ChangeNotifier {
11581160
return;
11591161
}
11601162
_syncListenerSetup = true;
1161-
syncService.addListener('settings', (data) {
1163+
_syncCallback = (data) {
11621164
loadImportData(data);
1163-
});
1165+
};
1166+
syncService.addListener('settings', _syncCallback!);
11641167
}
11651168

11661169
/// Cleans up resources and listeners
11671170
@override
11681171
void dispose() {
11691172
// Remove sync listeners to prevent memory leaks
1170-
syncService.removeListener('settings');
1173+
if (_syncCallback != null) {
1174+
syncService.removeListener('settings', _syncCallback!);
1175+
}
11711176
_syncListenerSetup = false;
1177+
_syncCallback = null;
11721178
AppLogger.debug('SettingsProvider disposed - listeners cleaned up');
11731179
super.dispose();
11741180
}

0 commit comments

Comments
 (0)