Add update checking
This commit is contained in:
3
lib/domain/app/app.dart
Normal file
3
lib/domain/app/app.dart
Normal file
@@ -0,0 +1,3 @@
|
||||
export 'update_failure.dart';
|
||||
export 'update_repository.dart';
|
||||
export 'version_info.dart';
|
||||
22
lib/domain/app/update_failure.dart
Normal file
22
lib/domain/app/update_failure.dart
Normal file
@@ -0,0 +1,22 @@
|
||||
import 'package:freezed_annotation/freezed_annotation.dart';
|
||||
import 'package:hiddify/core/locale/locale.dart';
|
||||
import 'package:hiddify/domain/failures.dart';
|
||||
|
||||
part 'update_failure.freezed.dart';
|
||||
|
||||
@freezed
|
||||
sealed class UpdateFailure with _$UpdateFailure, Failure {
|
||||
const UpdateFailure._();
|
||||
|
||||
const factory UpdateFailure.unexpected([
|
||||
Object? error,
|
||||
StackTrace? stackTrace,
|
||||
]) = UpdateUnexpectedFailure;
|
||||
|
||||
@override
|
||||
String present(TranslationsEn t) {
|
||||
return switch (this) {
|
||||
UpdateUnexpectedFailure() => t.failure.unexpected,
|
||||
};
|
||||
}
|
||||
}
|
||||
11
lib/domain/app/update_repository.dart
Normal file
11
lib/domain/app/update_repository.dart
Normal file
@@ -0,0 +1,11 @@
|
||||
import 'package:fpdart/fpdart.dart';
|
||||
import 'package:hiddify/domain/app/update_failure.dart';
|
||||
import 'package:hiddify/domain/app/version_info.dart';
|
||||
|
||||
abstract interface class UpdateRepository {
|
||||
TaskEither<UpdateFailure, InstalledVersionInfo> getCurrentVersion();
|
||||
|
||||
TaskEither<UpdateFailure, RemoteVersionInfo> getLatestVersion({
|
||||
bool includePreReleases = false,
|
||||
});
|
||||
}
|
||||
56
lib/domain/app/version_info.dart
Normal file
56
lib/domain/app/version_info.dart
Normal file
@@ -0,0 +1,56 @@
|
||||
import 'package:dartx/dartx.dart';
|
||||
import 'package:freezed_annotation/freezed_annotation.dart';
|
||||
|
||||
part 'version_info.freezed.dart';
|
||||
part 'version_info.g.dart';
|
||||
|
||||
@freezed
|
||||
class InstalledVersionInfo with _$InstalledVersionInfo {
|
||||
const InstalledVersionInfo._();
|
||||
|
||||
const factory InstalledVersionInfo({
|
||||
required String version,
|
||||
required String buildNumber,
|
||||
String? installerMedia,
|
||||
}) = _InstalledVersionInfo;
|
||||
|
||||
String get fullVersion =>
|
||||
buildNumber.isBlank ? version : "$version+$buildNumber";
|
||||
|
||||
factory InstalledVersionInfo.fromJson(Map<String, dynamic> json) =>
|
||||
_$InstalledVersionInfoFromJson(json);
|
||||
}
|
||||
|
||||
// TODO ignore drafts
|
||||
@Freezed()
|
||||
class RemoteVersionInfo with _$RemoteVersionInfo {
|
||||
const RemoteVersionInfo._();
|
||||
|
||||
const factory RemoteVersionInfo({
|
||||
required String version,
|
||||
required String buildNumber,
|
||||
required String releaseTag,
|
||||
required bool preRelease,
|
||||
required DateTime publishedAt,
|
||||
}) = _RemoteVersionInfo;
|
||||
|
||||
String get fullVersion =>
|
||||
buildNumber.isBlank ? version : "$version+$buildNumber";
|
||||
|
||||
// ignore: prefer_constructors_over_static_methods
|
||||
static RemoteVersionInfo fromJson(Map<String, dynamic> json) {
|
||||
final fullTag = json['tag_name'] as String;
|
||||
final fullVersion = fullTag.removePrefix("v").split("-").first.split("+");
|
||||
final version = fullVersion.first;
|
||||
final buildNumber = fullVersion.elementAtOrElse(1, (index) => "");
|
||||
final preRelease = json["prerelease"] as bool;
|
||||
final publishedAt = DateTime.parse(json["published_at"] as String);
|
||||
return RemoteVersionInfo(
|
||||
version: version,
|
||||
buildNumber: buildNumber,
|
||||
releaseTag: fullTag,
|
||||
preRelease: preRelease,
|
||||
publishedAt: publishedAt,
|
||||
);
|
||||
}
|
||||
}
|
||||
@@ -5,5 +5,9 @@ abstract class Constants {
|
||||
static const configFileName = "config";
|
||||
static const countryMMDBFileName = "Country";
|
||||
static const githubUrl = "https://github.com/hiddify/hiddify-next";
|
||||
static const githubReleasesApiUrl =
|
||||
"https://api.github.com/repos/hiddify/hiddify-next/releases";
|
||||
static const githubLatestReleaseUrl =
|
||||
"https://github.com/hiddify/hiddify-next/releases/latest";
|
||||
static const telegramChannelUrl = "https://t.me/hiddify";
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user