Add update checking

This commit is contained in:
problematicconsumer
2023-07-27 18:03:41 +03:30
parent f9545df308
commit 429f1aadf0
13 changed files with 383 additions and 22 deletions

3
lib/domain/app/app.dart Normal file
View File

@@ -0,0 +1,3 @@
export 'update_failure.dart';
export 'update_repository.dart';
export 'version_info.dart';

View 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,
};
}
}

View 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,
});
}

View 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,
);
}
}

View File

@@ -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";
}