mirror of
https://github.com/gabehf/Fladder.git
synced 2026-03-07 21:48:14 -08:00
feature: Added update notification and download links per platform (#362)
Co-authored-by: PartyDonut <PartyDonut@users.noreply.github.com>
This commit is contained in:
parent
5ef7936c33
commit
2c71dde228
16 changed files with 712 additions and 8 deletions
77
lib/providers/update_provider.dart
Normal file
77
lib/providers/update_provider.dart
Normal file
|
|
@ -0,0 +1,77 @@
|
|||
import 'dart:async';
|
||||
|
||||
import 'package:flutter/foundation.dart';
|
||||
|
||||
import 'package:collection/collection.dart';
|
||||
import 'package:freezed_annotation/freezed_annotation.dart';
|
||||
import 'package:riverpod_annotation/riverpod_annotation.dart';
|
||||
|
||||
import 'package:fladder/providers/settings/client_settings_provider.dart';
|
||||
import 'package:fladder/util/update_checker.dart';
|
||||
|
||||
part 'update_provider.freezed.dart';
|
||||
part 'update_provider.g.dart';
|
||||
|
||||
Set<TargetPlatform> get _directUpdatePlatforms => {
|
||||
TargetPlatform.linux,
|
||||
TargetPlatform.macOS,
|
||||
TargetPlatform.windows,
|
||||
};
|
||||
|
||||
final hasNewUpdateProvider = Provider<bool>((ref) {
|
||||
//Disable update notification for platforms that are updated outside of Github.
|
||||
if (!_directUpdatePlatforms.contains(defaultTargetPlatform) || kIsWeb) {
|
||||
return false;
|
||||
}
|
||||
return ref.watch(clientSettingsProvider.select((value) => value.lastViewedUpdate)) !=
|
||||
ref.watch(updateProvider.select((value) => value.latestRelease?.version));
|
||||
});
|
||||
|
||||
@Riverpod(keepAlive: true)
|
||||
class Update extends _$Update {
|
||||
final updateChecker = UpdateChecker();
|
||||
|
||||
Timer? _timer;
|
||||
|
||||
@override
|
||||
UpdatesModel build() {
|
||||
final checkForUpdates = ref.watch(clientSettingsProvider.select((value) => value.checkForUpdates));
|
||||
|
||||
if (!checkForUpdates) {
|
||||
_timer?.cancel();
|
||||
return UpdatesModel();
|
||||
}
|
||||
ref.onDispose(() {
|
||||
_timer?.cancel();
|
||||
});
|
||||
|
||||
_timer?.cancel();
|
||||
|
||||
_timer = Timer.periodic(const Duration(minutes: 30), (timer) {
|
||||
_fetchLatest();
|
||||
});
|
||||
|
||||
_fetchLatest();
|
||||
|
||||
return UpdatesModel();
|
||||
}
|
||||
|
||||
Future<List<ReleaseInfo>> _fetchLatest() async {
|
||||
final latest = await updateChecker.fetchRecentReleases();
|
||||
state = state.copyWith(
|
||||
lastRelease: latest,
|
||||
);
|
||||
return latest;
|
||||
}
|
||||
}
|
||||
|
||||
@Freezed(toJson: false, fromJson: false)
|
||||
class UpdatesModel with _$UpdatesModel {
|
||||
const UpdatesModel._();
|
||||
|
||||
factory UpdatesModel({
|
||||
@Default([]) List<ReleaseInfo> lastRelease,
|
||||
}) = _UpdatesModel;
|
||||
|
||||
ReleaseInfo? get latestRelease => lastRelease.firstWhereOrNull((value) => value.isNewerThanCurrent);
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue