Wire reminder scheduler interface into local repository
This commit is contained in:
@@ -7,6 +7,7 @@ import 'package:relationship_saver/features/local/storage/local_data_store.dart'
|
||||
import 'package:relationship_saver/features/local/storage/local_data_store_hive.dart';
|
||||
import 'package:relationship_saver/features/local/storage/local_data_store_provider.dart';
|
||||
import 'package:relationship_saver/features/local/storage/local_data_store_shared_prefs.dart';
|
||||
import 'package:relationship_saver/features/reminders/scheduling/reminder_scheduler_provider.dart';
|
||||
import 'package:relationship_saver/features/sync/sync_queue_repository.dart';
|
||||
import 'package:relationship_saver/integrations/backend/models/backend_models.dart';
|
||||
import 'package:uuid/uuid.dart';
|
||||
@@ -41,6 +42,7 @@ class LocalRepository extends AsyncNotifier<LocalDataState> {
|
||||
if (record == null || record.rawState.isEmpty) {
|
||||
final LocalDataState seeded = LocalDataState.seed();
|
||||
await _persist(seeded);
|
||||
await _reconcileReminderSchedule(seeded);
|
||||
return seeded;
|
||||
}
|
||||
|
||||
@@ -48,10 +50,13 @@ class LocalRepository extends AsyncNotifier<LocalDataState> {
|
||||
try {
|
||||
final Map<String, dynamic> json =
|
||||
jsonDecode(migrated.rawState) as Map<String, dynamic>;
|
||||
return LocalDataState.fromJson(json);
|
||||
final LocalDataState loaded = LocalDataState.fromJson(json);
|
||||
await _reconcileReminderSchedule(loaded);
|
||||
return loaded;
|
||||
} on FormatException {
|
||||
final LocalDataState fallback = LocalDataState.seed();
|
||||
await _persist(fallback);
|
||||
await _reconcileReminderSchedule(fallback);
|
||||
return fallback;
|
||||
}
|
||||
}
|
||||
@@ -889,6 +894,7 @@ class LocalRepository extends AsyncNotifier<LocalDataState> {
|
||||
Future<void> _setState(LocalDataState next) async {
|
||||
state = AsyncData<LocalDataState>(next);
|
||||
await _persist(next);
|
||||
await _reconcileReminderSchedule(next);
|
||||
}
|
||||
|
||||
LocalDataState _requireState() {
|
||||
@@ -908,6 +914,14 @@ class LocalRepository extends AsyncNotifier<LocalDataState> {
|
||||
);
|
||||
}
|
||||
|
||||
Future<void> _reconcileReminderSchedule(LocalDataState state) async {
|
||||
try {
|
||||
await ref.read(reminderSchedulerProvider).reconcile(state.reminders);
|
||||
} catch (_) {
|
||||
// Scheduling failures must not block local-first data updates.
|
||||
}
|
||||
}
|
||||
|
||||
Future<LocalDataRecord> _migrateIfNeeded(LocalDataRecord record) async {
|
||||
final int currentVersion = record.schemaVersion;
|
||||
if (currentVersion == _schemaVersion) {
|
||||
|
||||
@@ -0,0 +1,21 @@
|
||||
import 'package:relationship_saver/features/local/local_models.dart';
|
||||
|
||||
/// Schedules and reconciles reminder deliveries for current local state.
|
||||
abstract class ReminderScheduler {
|
||||
/// Reconciles platform schedules to match current enabled reminders.
|
||||
Future<void> reconcile(List<ReminderRule> reminders);
|
||||
|
||||
/// Clears all platform-scheduled reminder jobs.
|
||||
Future<void> clearAll();
|
||||
}
|
||||
|
||||
/// Default scheduler used until platform notifications are integrated.
|
||||
class NoopReminderScheduler implements ReminderScheduler {
|
||||
const NoopReminderScheduler();
|
||||
|
||||
@override
|
||||
Future<void> clearAll() async {}
|
||||
|
||||
@override
|
||||
Future<void> reconcile(List<ReminderRule> reminders) async {}
|
||||
}
|
||||
@@ -0,0 +1,8 @@
|
||||
import 'package:flutter_riverpod/flutter_riverpod.dart';
|
||||
import 'package:relationship_saver/features/reminders/scheduling/reminder_scheduler.dart';
|
||||
|
||||
/// Provides reminder delivery scheduler implementation.
|
||||
final Provider<ReminderScheduler> reminderSchedulerProvider =
|
||||
Provider<ReminderScheduler>((Ref ref) {
|
||||
return const NoopReminderScheduler();
|
||||
});
|
||||
Reference in New Issue
Block a user