import 'dart:io'; import 'package:dio/dio.dart'; import 'package:fpdart/fpdart.dart'; import 'package:hiddify/data/repository/exception_handlers.dart'; import 'package:hiddify/domain/app/app.dart'; import 'package:hiddify/domain/constants.dart'; import 'package:hiddify/domain/environment.dart'; import 'package:hiddify/utils/custom_loggers.dart'; import 'package:package_info_plus/package_info_plus.dart'; class AppRepositoryImpl with ExceptionHandler, InfraLogger implements AppRepository { AppRepositoryImpl(this.dio); final Dio dio; static Future getAppInfo(Environment environment) async { final packageInfo = await PackageInfo.fromPlatform(); return AppInfo( name: packageInfo.appName, version: packageInfo.version, buildNumber: packageInfo.buildNumber, installerMedia: packageInfo.installerStore, operatingSystem: Platform.operatingSystem, environment: environment, ); } @override TaskEither getLatestVersion({ bool includePreReleases = false, }) { return exceptionHandler( () async { final response = await dio.get(Constants.githubReleasesApiUrl); if (response.statusCode != 200 || response.data == null) { loggy.warning("failed to fetch latest version info"); return left(const AppFailure.unexpected()); } final releases = response.data! .map((e) => RemoteVersionInfo.fromJson(e as Map)); late RemoteVersionInfo latest; if (includePreReleases) { latest = releases.first; } else { latest = releases.firstWhere((e) => e.preRelease == false); } return right(latest); }, AppFailure.unexpected, ); } }