feat: new version check (#102)

This commit is contained in:
Li Wei authored and GitHub committed 2023-04-01 15:33:58 +08:00
1 parent 701ea59035
commit 33f6325bf7
19 files changed
+235 -91

No files matched your search

+4 -1
View File
@@ -49,6 +49,9 @@
"effectAfterRestart": "Effect after restart",
"deleteTask": "Delete Task",
"deleteTaskTip": "Keep downloaded files",
"delete": "Delete"
"delete": "Delete",
"newVersionTitle": "Discover new version @version",
"newVersionUpdate": "Download Now",
"newVersionLater": "Later"
}
+8 -3
View File
@@ -8,9 +8,12 @@
"task": "کار",
"setting": "تنظیمات",
"create": "ایجاد کار",
"downloading": "دانلود کردن",
"downloaded": "دانلود شدن",
"downloadLink": "لینک دانلود",
"downloadLinkValid": "لطفا لینک دانلود را وارد کنید",
"download": "دانلود",
"noFileSelected": "لطفا حداقل یک فایل را جهت دانلود انتخاب کنید.",
"noStoragePermission": "مجوز ذخیره سازی مورد نیاز است",
"selectFile": "انتخاب فایل",
"basic": "پایه",
@@ -44,6 +47,8 @@
"effectAfterRestart": "Effect after restart",
"deleteTask": "پاک کردن کار",
"deleteTaskTip": "فایل های دانلود شده را نگه دارد",
"delete": "پاک کردن"
}
"delete": "پاک کردن",
"newVersionTitle": "@version عنوان: کشف نسخه جدید",
"newVersionUpdate": "دریافت اکنون",
"newVersionLater": "بعداً"
}
+8 -2
View File
@@ -6,6 +6,8 @@
"cancel": "Отмена",
"selectAll": "Выбрать все",
"task": "Задачи",
"downloading": "Загрузка",
"downloaded": "Загружено",
"setting": "Настройки",
"create": "Создать задачу",
"downloadLink": "Ссылка для скачивание",
@@ -13,6 +15,7 @@
"downloadLinkHit": "Пожалуйста, введите ссылку для скачивания, HTTP/HTTPS/MAGNET supported@append",
"downloadLinkHitDesktop": ", или перетащите сюда торрент-файл",
"download": "Скачать",
"noFileSelected": "Файл не выбран",
"noStoragePermission": "Требуется доступ к хранилищу",
"selectFile": "Выберать файл",
"basic": "Основные параметры",
@@ -46,5 +49,8 @@
"effectAfterRestart": "Эффект после перезагрузки",
"deleteTask": "Удалить задачу",
"deleteTaskTip": "Сохранить загруженные файлы",
"delete": "Удалить"
}
"delete": "Удалить",
"newVersionTitle": "Обнаружена новая версия @version",
"newVersionUpdate": "Скачать сейчас",
"newVersionLater": "позже"
}
+4 -1
View File
@@ -49,5 +49,8 @@
"effectAfterRestart": "此配置项将在重启应用后生效",
"deleteTask": "删除任务",
"deleteTaskTip": "保留已下载的文件",
"delete": "删除"
"delete": "删除",
"newVersionTitle": "发现新版本 @version",
"newVersionUpdate": "立即下载",
"newVersionLater": "稍后再说"
}
+9 -3
View File
@@ -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);
+21
View File
@@ -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': '稍后再说',
};
}
+12 -4
View File
@@ -41,6 +41,14 @@ packages:
url: "https://pub.flutter-io.cn"
source: hosted
version: "2.10.0"
badges:
dependency: "direct main"
description:
name: badges
sha256: d33d4e07197d6e61ddc940640f2b4dc303d3c80887011344940e24d7522f8d26
url: "https://pub.flutter-io.cn"
source: hosted
version: "3.0.3"
boolean_selector:
dependency: transitive
description:
@@ -221,10 +229,10 @@ packages:
dependency: "direct main"
description:
name: dio
sha256: "7d328c4d898a61efc3cd93655a0955858e29a0aa647f0f9e02d59b3bb275e2e8"
sha256: "0894a098594263fe1caaba3520e3016d8a855caeb010a882273189cca10f11e9"
url: "https://pub.flutter-io.cn"
source: hosted
version: "4.0.6"
version: "5.1.1"
fake_async:
dependency: transitive
description:
@@ -466,10 +474,10 @@ packages:
dependency: transitive
description:
name: logging_appenders
sha256: "013e8548b79e3b8dc0333f3efae706184356b5926c6bea59150efa126c91598c"
sha256: c2ea00fb779a81e995943f1e3e6e6969d463de3882d134d78ad58e76f2b6f1b1
url: "https://pub.flutter-io.cn"
source: hosted
version: "1.0.0"
version: "1.0.2"
lottie:
dependency: "direct main"
description:
+3 -2
View File
@@ -15,7 +15,7 @@ publish_to: "none" # Remove this line if you wish to publish to pub.dev
# In iOS, build-name is used as CFBundleShortVersionString while build-number used as CFBundleVersion.
# Read more about iOS versioning at
# https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html
version: 1.2.3+1
version: 1.3.0+1
environment:
sdk: ">=2.17.6 <3.0.0"
@@ -40,7 +40,7 @@ dependencies:
styled_widget: ^0.4.0+3
context_menus: ^1.0.2
json_annotation: ^4.6.0
dio: ^4.0.6
dio: ^5.1.1
path_provider: ^2.0.11
file_picker: ^5.2.5
macos_secure_bookmarks: ^0.2.1
@@ -53,6 +53,7 @@ dependencies:
package_info_plus: ^3.0.2
fluent_ui: ^4.4.0
path: any
badges: ^3.0.3
dev_dependencies:
flutter_test:
sdk: flutter