mirror of
https://github.com/GopeedLab/gopeed.git
synced 2026-11-08 17:40:28 +00:00
feat: new version check (#102)
This commit is contained in:
1 parent
701ea59035
commit
33f6325bf7
19 files changed
+235
-91
No files matched your search
@@ -1,7 +1,8 @@
|
||||
import 'dart:convert';
|
||||
import 'dart:io';
|
||||
|
||||
import 'package:dio/adapter.dart';
|
||||
import 'package:dio/dio.dart';
|
||||
import 'package:dio/io.dart';
|
||||
import 'package:flutter/foundation.dart';
|
||||
import 'model/resolve_result.dart';
|
||||
import '../util/util.dart';
|
||||
@@ -33,6 +34,9 @@ class _Client {
|
||||
}
|
||||
}
|
||||
dio.options.baseUrl = baseUrl;
|
||||
dio.options.contentType = Headers.jsonContentType;
|
||||
dio.options.connectTimeout = const Duration(seconds: 5);
|
||||
dio.options.receiveTimeout = const Duration(seconds: 60);
|
||||
dio.interceptors.add(InterceptorsWrapper(onRequest: (options, handler) {
|
||||
if (apiToken.isNotEmpty) {
|
||||
options.headers['X-Api-Token'] = apiToken;
|
||||
@@ -42,7 +46,7 @@ class _Client {
|
||||
|
||||
_instance!.dio = dio;
|
||||
if (isUnixSocket) {
|
||||
(_instance!.dio.httpClientAdapter as DefaultHttpClientAdapter)
|
||||
(_instance!.dio.httpClientAdapter as IOHttpClientAdapter)
|
||||
.onHttpClientCreate = (client) {
|
||||
client.connectionFactory =
|
||||
(Uri uri, String? proxyHost, int? proxyPort) {
|
||||
@@ -131,5 +135,7 @@ Future<Response<String>> proxyRequest<T>(String uri,
|
||||
options.headers ??= {};
|
||||
options.headers!["X-Target-Uri"] = uri;
|
||||
|
||||
return _client.dio.request("/api/v1/proxy", data: data, options: options);
|
||||
// add timestamp to avoid cache
|
||||
return _client.dio.request("/api/v1/proxy?t=${DateTime.now()}",
|
||||
data: data, options: options);
|
||||
}
|
||||
@@ -1,7 +1,17 @@
|
||||
import 'dart:convert';
|
||||
|
||||
import 'package:get/get.dart';
|
||||
import 'package:gopeed/api/api.dart';
|
||||
|
||||
class SettingController extends GetxController {
|
||||
final tapStatues = <String, bool>{}.obs;
|
||||
final latestVersion = "".obs;
|
||||
|
||||
@override
|
||||
void onInit() {
|
||||
super.onInit();
|
||||
fetchLatestVersion();
|
||||
}
|
||||
|
||||
// set all tap status to false
|
||||
void clearTap() {
|
||||
@@ -13,4 +23,22 @@ class SettingController extends GetxController {
|
||||
clearTap();
|
||||
tapStatues[key] = true;
|
||||
}
|
||||
|
||||
// fetch latest version
|
||||
void fetchLatestVersion() async {
|
||||
String? releaseDataStr;
|
||||
try {
|
||||
releaseDataStr =
|
||||
(await proxyRequest("https://gopeed.com/api/release")).data;
|
||||
} catch (e) {
|
||||
releaseDataStr = (await proxyRequest(
|
||||
"https://api.github.com/repos/GopeedLab/gopeed/releases/latest"))
|
||||
.data;
|
||||
}
|
||||
if (releaseDataStr == null) {
|
||||
return;
|
||||
}
|
||||
final releaseData = jsonDecode(releaseDataStr);
|
||||
latestVersion.value = releaseData["tag_name"].substring(1);
|
||||
}
|
||||
}
|
||||
@@ -7,6 +7,7 @@ import 'package:get/get.dart';
|
||||
import '../../../../util/message.dart';
|
||||
import 'package:intl/intl.dart';
|
||||
import 'package:url_launcher/url_launcher.dart';
|
||||
import 'package:badges/badges.dart' as badges;
|
||||
|
||||
import '../../../../generated/locales.g.dart';
|
||||
import '../../../../util/localeManager.dart';
|
||||
@@ -236,10 +237,45 @@ class SettingView extends GetView<SettingController> {
|
||||
mode: LaunchMode.externalApplication);
|
||||
},
|
||||
);
|
||||
buildVersion() => ListTile(
|
||||
title: Text('version'.tr),
|
||||
subtitle: Text(packageInfo.version),
|
||||
);
|
||||
buildVersion() {
|
||||
final hasNewVersion = controller.latestVersion.value != '' &&
|
||||
controller.latestVersion.value != packageInfo.version;
|
||||
return ListTile(
|
||||
title: hasNewVersion
|
||||
? badges.Badge(
|
||||
position: badges.BadgePosition.topStart(start: 36),
|
||||
child: Text('version'.tr))
|
||||
: Text('version'.tr),
|
||||
subtitle: Text(packageInfo.version),
|
||||
onTap: () {
|
||||
if (hasNewVersion) {
|
||||
showDialog(
|
||||
context: context,
|
||||
builder: (context) => AlertDialog(
|
||||
content: Text('newVersionTitle'.trParams(
|
||||
{'version': controller.latestVersion.value})),
|
||||
actions: [
|
||||
TextButton(
|
||||
onPressed: () {
|
||||
Get.back();
|
||||
},
|
||||
child: Text('newVersionLater'.tr),
|
||||
),
|
||||
TextButton(
|
||||
onPressed: () {
|
||||
launchUrl(
|
||||
Uri.parse(
|
||||
'https://github.com/GopeedLab/gopeed/releases/latest'),
|
||||
mode: LaunchMode.externalApplication);
|
||||
},
|
||||
child: Text('newVersionUpdate'.tr),
|
||||
),
|
||||
],
|
||||
));
|
||||
}
|
||||
},
|
||||
);
|
||||
}
|
||||
|
||||
// advanced config items start
|
||||
final buildApiProtocol = _buildConfigItem(
|
||||
|
||||
@@ -24,30 +24,37 @@ class BuildTaskListView extends GetView {
|
||||
Widget build(BuildContext context) {
|
||||
return Scaffold(
|
||||
appBar: AppBar(
|
||||
actions: <Widget>[
|
||||
IconButton(
|
||||
icon: const Icon(Icons.add),
|
||||
tooltip: 'create'.tr,
|
||||
onPressed: () {
|
||||
Get.rootDelegate.toNamed(Routes.CREATE);
|
||||
},
|
||||
// actions: <Widget>[
|
||||
// // IconButton(
|
||||
// // icon: const Icon(Icons.add),
|
||||
// // tooltip: 'create'.tr,
|
||||
// // onPressed: () {
|
||||
// // Get.rootDelegate.toNamed(Routes.CREATE);
|
||||
// // },
|
||||
// // ),
|
||||
// //TODO appBar toggleALl/start selected/delete selected/
|
||||
// // IconButton(
|
||||
// // icon: const Icon(Icons.pause),
|
||||
// // tooltip: 'title'.tr,
|
||||
// // onPressed: () {
|
||||
// // // pause all
|
||||
// // },
|
||||
// // ),
|
||||
// // IconButton(
|
||||
// // icon: const Icon(Icons.delete),
|
||||
// // tooltip: 'title'.tr,
|
||||
// // onPressed: () {
|
||||
// // // delete all
|
||||
// // },
|
||||
// // )
|
||||
// ],
|
||||
),
|
||||
//TODO appBar toggleALl/start selected/delete selected/
|
||||
// IconButton(
|
||||
// icon: const Icon(Icons.pause),
|
||||
// tooltip: 'title'.tr,
|
||||
// onPressed: () {
|
||||
// // pause all
|
||||
// },
|
||||
// ),
|
||||
// IconButton(
|
||||
// icon: const Icon(Icons.delete),
|
||||
// tooltip: 'title'.tr,
|
||||
// onPressed: () {
|
||||
// // delete all
|
||||
// },
|
||||
// )
|
||||
],
|
||||
floatingActionButton: FloatingActionButton(
|
||||
onPressed: () {
|
||||
Get.rootDelegate.toNamed(Routes.CREATE);
|
||||
},
|
||||
tooltip: 'create'.tr,
|
||||
child: const Icon(Icons.add),
|
||||
),
|
||||
body: Obx(() {
|
||||
return buildTaskList(context, tasks);
|
||||
|
||||
@@ -64,6 +64,9 @@ class LocaleKeys {
|
||||
static const deleteTask = 'deleteTask';
|
||||
static const deleteTaskTip = 'deleteTaskTip';
|
||||
static const delete = 'delete';
|
||||
static const newVersionTitle = 'newVersionTitle';
|
||||
static const newVersionUpdate = 'newVersionUpdate';
|
||||
static const newVersionLater = 'newVersionLater';
|
||||
}
|
||||
|
||||
class Locales {
|
||||
@@ -121,6 +124,9 @@ class Locales {
|
||||
'deleteTask': 'Delete Task',
|
||||
'deleteTaskTip': 'Keep downloaded files',
|
||||
'delete': 'Delete',
|
||||
'newVersionTitle': 'Discover new version @version',
|
||||
'newVersionUpdate': 'Download Now',
|
||||
'newVersionLater': 'Later',
|
||||
};
|
||||
static const fa_IR = {
|
||||
'label': 'فارسی',
|
||||
@@ -132,9 +138,12 @@ class Locales {
|
||||
'task': 'کار',
|
||||
'setting': 'تنظیمات',
|
||||
'create': 'ایجاد کار',
|
||||
'downloading': 'دانلود کردن',
|
||||
'downloaded': 'دانلود شدن',
|
||||
'downloadLink': 'لینک دانلود',
|
||||
'downloadLinkValid': 'لطفا لینک دانلود را وارد کنید',
|
||||
'download': 'دانلود',
|
||||
'noFileSelected': 'لطفا حداقل یک فایل را جهت دانلود انتخاب کنید.',
|
||||
'noStoragePermission': 'مجوز ذخیره سازی مورد نیاز است',
|
||||
'selectFile': 'انتخاب فایل',
|
||||
'basic': 'پایه',
|
||||
@@ -170,6 +179,9 @@ class Locales {
|
||||
'deleteTask': 'پاک کردن کار',
|
||||
'deleteTaskTip': 'فایل های دانلود شده را نگه دارد',
|
||||
'delete': 'پاک کردن',
|
||||
'newVersionTitle': '@version عنوان: کشف نسخه جدید',
|
||||
'newVersionUpdate': 'دریافت اکنون',
|
||||
'newVersionLater': 'بعداً',
|
||||
};
|
||||
static const ru_RU = {
|
||||
'label': 'Русский(Россия)',
|
||||
@@ -179,6 +191,8 @@ class Locales {
|
||||
'cancel': 'Отмена',
|
||||
'selectAll': 'Выбрать все',
|
||||
'task': 'Задачи',
|
||||
'downloading': 'Загрузка',
|
||||
'downloaded': 'Загружено',
|
||||
'setting': 'Настройки',
|
||||
'create': 'Создать задачу',
|
||||
'downloadLink': 'Ссылка для скачивание',
|
||||
@@ -187,6 +201,7 @@ class Locales {
|
||||
'Пожалуйста, введите ссылку для скачивания, HTTP/HTTPS/MAGNET supported@append',
|
||||
'downloadLinkHitDesktop': ', или перетащите сюда торрент-файл',
|
||||
'download': 'Скачать',
|
||||
'noFileSelected': 'Файл не выбран',
|
||||
'noStoragePermission': 'Требуется доступ к хранилищу',
|
||||
'selectFile': 'Выберать файл',
|
||||
'basic': 'Основные параметры',
|
||||
@@ -222,6 +237,9 @@ class Locales {
|
||||
'deleteTask': 'Удалить задачу',
|
||||
'deleteTaskTip': 'Сохранить загруженные файлы',
|
||||
'delete': 'Удалить',
|
||||
'newVersionTitle': 'Обнаружена новая версия @version',
|
||||
'newVersionUpdate': 'Скачать сейчас',
|
||||
'newVersionLater': 'позже',
|
||||
};
|
||||
static const zh_CN = {
|
||||
'label': '中文(简体)',
|
||||
@@ -275,5 +293,8 @@ class Locales {
|
||||
'deleteTask': '删除任务',
|
||||
'deleteTaskTip': '保留已下载的文件',
|
||||
'delete': '删除',
|
||||
'newVersionTitle': '发现新版本 @version',
|
||||
'newVersionUpdate': '立即下载',
|
||||
'newVersionLater': '稍后再说',
|
||||
};
|
||||
}
|
||||
Reference in new issue
Block a user