new favourites feature
This commit is contained in:
@@ -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();
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user