Add update all subscriptions
This commit is contained in:
@@ -10,6 +10,8 @@ import 'package:riverpod_annotation/riverpod_annotation.dart';
|
||||
|
||||
part 'profiles_update_notifier.g.dart';
|
||||
|
||||
typedef ProfileUpdateStatus = ({String name, bool success});
|
||||
|
||||
@Riverpod(keepAlive: true)
|
||||
class ForegroundProfilesUpdateNotifier
|
||||
extends _$ForegroundProfilesUpdateNotifier with AppLogger {
|
||||
@@ -17,9 +19,9 @@ class ForegroundProfilesUpdateNotifier
|
||||
static const interval = Duration(minutes: 15);
|
||||
|
||||
@override
|
||||
Future<void> build() async {
|
||||
Stream<ProfileUpdateStatus?> build() {
|
||||
var cycleCount = 0;
|
||||
final scheduler = NeatPeriodicTaskScheduler(
|
||||
_scheduler = NeatPeriodicTaskScheduler(
|
||||
name: 'profiles update worker',
|
||||
interval: interval,
|
||||
timeout: const Duration(minutes: 5),
|
||||
@@ -30,30 +32,51 @@ class ForegroundProfilesUpdateNotifier
|
||||
);
|
||||
|
||||
ref.onDispose(() async {
|
||||
await scheduler.stop();
|
||||
await _scheduler?.stop();
|
||||
_scheduler = null;
|
||||
});
|
||||
|
||||
if (ref.watch(introCompletedProvider)) {
|
||||
loggy.debug("intro done, starting");
|
||||
return scheduler.start();
|
||||
_scheduler?.start();
|
||||
} else {
|
||||
loggy.debug("intro in process, skipping");
|
||||
}
|
||||
return const Stream.empty();
|
||||
}
|
||||
|
||||
NeatPeriodicTaskScheduler? _scheduler;
|
||||
bool _forceNextRun = false;
|
||||
|
||||
Future<void> trigger() async {
|
||||
loggy.debug("triggering update");
|
||||
_forceNextRun = true;
|
||||
await _scheduler?.trigger();
|
||||
}
|
||||
|
||||
@visibleForTesting
|
||||
Future<void> updateProfiles() async {
|
||||
var force = false;
|
||||
if (_forceNextRun) {
|
||||
force = true;
|
||||
_forceNextRun = false;
|
||||
}
|
||||
|
||||
try {
|
||||
final previousRun = DateTime.tryParse(
|
||||
ref.read(sharedPreferencesProvider).requireValue.getString(prefKey) ??
|
||||
"",
|
||||
);
|
||||
|
||||
if (previousRun != null && previousRun.add(interval) > DateTime.now()) {
|
||||
if (!force &&
|
||||
previousRun != null &&
|
||||
previousRun.add(interval) > DateTime.now()) {
|
||||
loggy.debug("too soon! previous run: [$previousRun]");
|
||||
return;
|
||||
}
|
||||
loggy.debug("running, previous run: [$previousRun]");
|
||||
loggy.debug(
|
||||
"${force ? "[FORCED] " : ""}running, previous run: [$previousRun]",
|
||||
);
|
||||
|
||||
final remoteProfiles = await ref
|
||||
.read(profileRepositoryProvider)
|
||||
@@ -69,20 +92,25 @@ class ForegroundProfilesUpdateNotifier
|
||||
|
||||
await for (final profile in Stream.fromIterable(remoteProfiles)) {
|
||||
final updateInterval = profile.options?.updateInterval;
|
||||
if (updateInterval != null &&
|
||||
updateInterval <= DateTime.now().difference(profile.lastUpdate)) {
|
||||
if (force ||
|
||||
updateInterval != null &&
|
||||
updateInterval <=
|
||||
DateTime.now().difference(profile.lastUpdate)) {
|
||||
await ref
|
||||
.read(profileRepositoryProvider)
|
||||
.requireValue
|
||||
.updateSubscription(profile)
|
||||
.mapLeft(
|
||||
(l) => loggy.debug("error updating profile [${profile.id}]", l),
|
||||
)
|
||||
.map(
|
||||
(_) =>
|
||||
loggy.debug("profile [${profile.id}] updated successfully"),
|
||||
)
|
||||
.run();
|
||||
(l) {
|
||||
loggy.debug("error updating profile [${profile.id}]", l);
|
||||
state = AsyncData((name: profile.name, success: false));
|
||||
},
|
||||
).map(
|
||||
(_) {
|
||||
loggy.debug("profile [${profile.id}] updated successfully");
|
||||
state = AsyncData((name: profile.name, success: true));
|
||||
},
|
||||
).run();
|
||||
} else {
|
||||
loggy.debug(
|
||||
"skipping profile [${profile.id}] update. last successful update: [${profile.lastUpdate}] - interval: [${profile.options?.updateInterval}]",
|
||||
|
||||
Reference in New Issue
Block a user