Files
umbrix/lib/domain/app/app_info.dart

82 lines
2.4 KiB
Dart
Raw Normal View History

2023-07-27 18:03:41 +03:30
import 'package:dartx/dartx.dart';
import 'package:freezed_annotation/freezed_annotation.dart';
2023-09-12 15:22:58 +03:30
import 'package:hiddify/domain/environment.dart';
2023-07-27 18:03:41 +03:30
2023-09-12 15:22:58 +03:30
part 'app_info.freezed.dart';
part 'app_info.g.dart';
2023-07-27 18:03:41 +03:30
@freezed
2023-09-12 15:22:58 +03:30
class AppInfo with _$AppInfo {
const AppInfo._();
2023-07-27 18:03:41 +03:30
2023-09-12 15:22:58 +03:30
const factory AppInfo({
required String name,
2023-07-27 18:03:41 +03:30
required String version,
required String buildNumber,
required Release release,
2023-07-27 18:03:41 +03:30
String? installerMedia,
2023-09-12 15:22:58 +03:30
required String operatingSystem,
required Environment environment,
}) = _AppInfo;
2023-07-27 18:03:41 +03:30
2023-09-12 15:22:58 +03:30
String get userAgent => "HiddifyNext/$version ($operatingSystem)";
2023-07-27 18:03:41 +03:30
2023-09-16 00:56:03 +03:30
String get presentVersion => environment == Environment.prod
? version
: "$version ${environment.name}";
2023-09-12 15:22:58 +03:30
factory AppInfo.fromJson(Map<String, dynamic> json) =>
_$AppInfoFromJson(json);
2023-07-27 18:03:41 +03:30
}
// 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,
2023-09-16 13:14:52 +03:30
required String url,
2023-07-27 18:03:41 +03:30
required DateTime publishedAt,
2023-09-16 00:56:03 +03:30
required Environment flavor,
2023-07-27 18:03:41 +03:30
}) = _RemoteVersionInfo;
2023-09-16 00:56:03 +03:30
String get presentVersion =>
flavor == Environment.prod ? version : "$version ${flavor.name}";
2023-07-27 18:03:41 +03:30
// 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("+");
2023-09-16 00:56:03 +03:30
var version = fullVersion.first;
var buildNumber = fullVersion.elementAtOrElse(1, (index) => "");
var flavor = Environment.prod;
for (final env in Environment.values) {
final suffix = ".${env.name}";
if (version.endsWith(suffix)) {
version = version.removeSuffix(suffix);
flavor = env;
break;
} else if (buildNumber.endsWith(suffix)) {
buildNumber = buildNumber.removeSuffix(suffix);
flavor = env;
break;
}
}
2023-07-27 18:03:41 +03:30
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,
2023-09-16 13:14:52 +03:30
url: json["html_url"] as String,
2023-07-27 18:03:41 +03:30
publishedAt: publishedAt,
2023-09-16 00:56:03 +03:30
flavor: flavor,
2023-07-27 18:03:41 +03:30
);
}
}