new favourites feature

This commit is contained in:
davmar
2026-09-10 16:25:24 +02:00
parent aec89ac41d
commit 83295439d5
22 changed files with 3168 additions and 282 deletions
+91 -3
View File
@@ -5,9 +5,12 @@ import 'dart:async';
import 'package:flutter/foundation.dart';
import '../models/home_filter_widget.dart';
import '../models/overview_favourite.dart';
import '../services/pb_sync_service.dart';
import 'auth_provider.dart';
import 'bank_provider.dart';
import 'preferences_provider.dart';
import 'tx_meta_provider.dart';
/// User-visible sync toast state (watched by [SyncFeedbackListener]).
@@ -30,11 +33,15 @@ class SyncController extends ChangeNotifier {
required AuthController auth,
required TxMetaController meta,
required BankController bank,
required PreferencesController prefs,
}) : _auth = auth,
_meta = meta,
_bank = bank {
_bank = bank,
_prefs = prefs {
_wasLoggedIn = auth.isLoggedIn;
_meta.onPersisted = _schedulePush;
_prefs.onFavouritesPersisted = _schedulePush;
_prefs.onHomeWidgetsPersisted = _schedulePush;
_auth.addListener(_onAuthChanged);
_bank.onAfterSuccessfulLoad = _onBankDataLoaded;
if (_auth.isLoggedIn) {
@@ -45,6 +52,7 @@ class SyncController extends ChangeNotifier {
final AuthController _auth;
final TxMetaController _meta;
final BankController _bank;
final PreferencesController _prefs;
bool _wasLoggedIn = false;
bool _syncing = false;
@@ -260,20 +268,77 @@ class SyncController extends ChangeNotifier {
_setProgress(0.5);
_setStatus('Merging…');
final mergedMeta = mergeTxMetaStores(_meta.exportStore(), remoteMeta);
List<OverviewFavourite> remoteFavourites = const [];
try {
remoteFavourites = await service.pullOverviewFavourites(
onStatus: _setStatus,
);
} catch (error) {
debugPrint(
'SyncController: overview_favourites pull skipped ($error)',
);
}
final mergedFavourites = mergeOverviewFavourites(
_prefs.overviewFavourites,
remoteFavourites,
);
List<HomeFilterWidget> remoteHomeWidgets = const [];
try {
remoteHomeWidgets = await service.pullHomeFilterWidgets(
onStatus: _setStatus,
);
} catch (error) {
debugPrint(
'SyncController: home_filter_widgets pull skipped ($error)',
);
}
final mergedHomeWidgets = mergeHomeFilterWidgets(
_prefs.homeFilterWidgets,
remoteHomeWidgets,
);
// Apply without notifying — one rebuild after both stores are ready.
await _meta.replaceStore(mergedMeta, notify: false);
await _bank.applySyncedTransactions(remoteTxs, notify: false);
await _prefs.replaceOverviewFavourites(
mergedFavourites,
notify: false,
);
await _prefs.replaceHomeFilterWidgets(
mergedHomeWidgets,
notify: false,
);
_meta.notifyListeners();
_bank.notifyListeners();
_prefs.notifyListeners();
_setProgress(0.55);
_setStatus('Pushing…');
final metaSummary = await service.push(
mergedMeta,
progressStart: 0.55,
progressEnd: 0.82,
progressEnd: 0.75,
onProgress: _setProgress,
onStatus: _setStatus,
);
try {
await service.pushOverviewFavourites(
mergedFavourites,
onStatus: _setStatus,
);
} catch (error) {
debugPrint(
'SyncController: overview_favourites push skipped ($error)',
);
}
try {
await service.pushHomeFilterWidgets(
mergedHomeWidgets,
onStatus: _setStatus,
);
} catch (error) {
debugPrint(
'SyncController: home_filter_widgets push skipped ($error)',
);
}
final bankSummary = await service.pushTransactions(
_bank.transactions,
progressStart: 0.82,
@@ -323,10 +388,31 @@ class SyncController extends ChangeNotifier {
final summary = await service.push(
_meta.exportStore(),
progressStart: 0.05,
progressEnd: 1.0,
progressEnd: 0.9,
onProgress: _setProgress,
onStatus: _setStatus,
);
try {
await service.pushOverviewFavourites(
_prefs.overviewFavourites,
onStatus: _setStatus,
);
} catch (error) {
debugPrint(
'SyncController: overview_favourites push skipped ($error)',
);
}
try {
await service.pushHomeFilterWidgets(
_prefs.homeFilterWidgets,
onStatus: _setStatus,
);
} catch (error) {
debugPrint(
'SyncController: home_filter_widgets push skipped ($error)',
);
}
_setProgress(1.0);
_lastSyncedAt = DateTime.now();
_lastError = null;
_lastSyncSummary = summary;
@@ -359,6 +445,8 @@ class SyncController extends ChangeNotifier {
_auth.removeListener(_onAuthChanged);
_bank.onAfterSuccessfulLoad = null;
_meta.onPersisted = null;
_prefs.onFavouritesPersisted = null;
_prefs.onHomeWidgetsPersisted = null;
super.dispose();
}
}