mirror of
https://github.com/venera-app/venera.git
synced 2025-09-27 15:57:25 +00:00
Improve config updates check
This commit is contained in:
@@ -14,17 +14,15 @@ import 'package:venera/utils/translations.dart';
|
||||
class ComicSourcePage extends StatefulWidget {
|
||||
const ComicSourcePage({super.key});
|
||||
|
||||
static Future<void> checkComicSourceUpdate([bool implicit = false]) async {
|
||||
static Future<int> checkComicSourceUpdate() async {
|
||||
if (ComicSource.all().isEmpty) {
|
||||
return;
|
||||
return 0;
|
||||
}
|
||||
var controller = implicit ? null : showLoadingDialog(App.rootContext);
|
||||
var dio = AppDio();
|
||||
var res = await dio.get<String>(
|
||||
"https://raw.githubusercontent.com/venera-app/venera-configs/master/index.json");
|
||||
if (res.statusCode != 200) {
|
||||
App.rootContext.showMessage(message: "Network error".tl);
|
||||
return;
|
||||
return -1;
|
||||
}
|
||||
var list = jsonDecode(res.data!) as List;
|
||||
var versions = <String, String>{};
|
||||
@@ -34,34 +32,17 @@ class ComicSourcePage extends StatefulWidget {
|
||||
var shouldUpdate = <String>[];
|
||||
for (var source in ComicSource.all()) {
|
||||
if (versions.containsKey(source.key) &&
|
||||
versions[source.key] != source.version) {
|
||||
compareSemVer(versions[source.key]!, source.version)) {
|
||||
shouldUpdate.add(source.key);
|
||||
}
|
||||
}
|
||||
controller?.close();
|
||||
if (shouldUpdate.isEmpty) {
|
||||
if (!implicit) {
|
||||
App.rootContext.showMessage(message: "No Update Available".tl);
|
||||
if (shouldUpdate.isNotEmpty) {
|
||||
for (var key in shouldUpdate) {
|
||||
ComicSource.availableUpdates[key] = versions[key]!;
|
||||
}
|
||||
return;
|
||||
ComicSource.notifyListeners();
|
||||
}
|
||||
var msg = "";
|
||||
for (var key in shouldUpdate) {
|
||||
msg += "${ComicSource.find(key)?.name}: v${versions[key]}\n";
|
||||
}
|
||||
msg = msg.trim();
|
||||
await showConfirmDialog(
|
||||
context: App.rootContext,
|
||||
title: "Updates Available".tl,
|
||||
content: msg,
|
||||
confirmText: "Update",
|
||||
onConfirm: () async {
|
||||
for (var key in shouldUpdate) {
|
||||
var source = ComicSource.find(key);
|
||||
await _BodyState.update(source!);
|
||||
}
|
||||
},
|
||||
);
|
||||
return shouldUpdate.length;
|
||||
}
|
||||
|
||||
@override
|
||||
@@ -90,6 +71,22 @@ class _Body extends StatefulWidget {
|
||||
class _BodyState extends State<_Body> {
|
||||
var url = "";
|
||||
|
||||
void updateUI() {
|
||||
setState(() {});
|
||||
}
|
||||
|
||||
@override
|
||||
void initState() {
|
||||
super.initState();
|
||||
ComicSource.addListener(updateUI);
|
||||
}
|
||||
|
||||
@override
|
||||
void dispose() {
|
||||
super.dispose();
|
||||
ComicSource.removeListener(updateUI);
|
||||
}
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return SmoothCustomScrollView(
|
||||
@@ -102,12 +99,36 @@ class _BodyState extends State<_Body> {
|
||||
}
|
||||
|
||||
Widget buildSource(BuildContext context, ComicSource source) {
|
||||
var newVersion = ComicSource.availableUpdates[source.key];
|
||||
bool hasUpdate =
|
||||
newVersion != null && compareSemVer(newVersion, source.version);
|
||||
return SliverToBoxAdapter(
|
||||
child: Column(
|
||||
children: [
|
||||
const Divider(),
|
||||
ListTile(
|
||||
title: Text(source.name),
|
||||
title: Row(
|
||||
children: [
|
||||
Text(source.name),
|
||||
const SizedBox(width: 6),
|
||||
if (hasUpdate)
|
||||
Tooltip(
|
||||
message: newVersion,
|
||||
child: Container(
|
||||
padding: const EdgeInsets.symmetric(
|
||||
horizontal: 6, vertical: 2),
|
||||
decoration: BoxDecoration(
|
||||
color: context.colorScheme.primaryContainer,
|
||||
borderRadius: BorderRadius.circular(8),
|
||||
),
|
||||
child: Text(
|
||||
"New Version".tl,
|
||||
style: const TextStyle(fontSize: 13),
|
||||
),
|
||||
),
|
||||
)
|
||||
],
|
||||
),
|
||||
trailing: Row(
|
||||
mainAxisSize: MainAxisSize.min,
|
||||
children: [
|
||||
@@ -299,6 +320,9 @@ class _BodyState extends State<_Body> {
|
||||
controller.close();
|
||||
await ComicSourceParser().parse(res.data!, source.filePath);
|
||||
await File(source.filePath).writeAsString(res.data!);
|
||||
if (ComicSource.availableUpdates.containsKey(source.key)) {
|
||||
ComicSource.availableUpdates.remove(source.key);
|
||||
}
|
||||
} catch (e) {
|
||||
if (cancel) return;
|
||||
App.rootContext.showMessage(message: e.toString());
|
||||
@@ -368,10 +392,7 @@ class _BodyState extends State<_Body> {
|
||||
),
|
||||
ListTile(
|
||||
title: Text("Check updates".tl),
|
||||
trailing: buildButton(
|
||||
onPressed: () => ComicSourcePage.checkComicSourceUpdate(false),
|
||||
child: Text("Check".tl),
|
||||
),
|
||||
trailing: _CheckUpdatesButton(),
|
||||
),
|
||||
const SizedBox(height: 8),
|
||||
],
|
||||
@@ -619,3 +640,40 @@ class __EditFilePageState extends State<_EditFilePage> {
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
class _CheckUpdatesButton extends StatefulWidget {
|
||||
const _CheckUpdatesButton();
|
||||
|
||||
@override
|
||||
State<_CheckUpdatesButton> createState() => _CheckUpdatesButtonState();
|
||||
}
|
||||
|
||||
class _CheckUpdatesButtonState extends State<_CheckUpdatesButton> {
|
||||
bool isLoading = false;
|
||||
|
||||
void check() async {
|
||||
setState(() {
|
||||
isLoading = true;
|
||||
});
|
||||
var count = await ComicSourcePage.checkComicSourceUpdate();
|
||||
if (count == -1) {
|
||||
context.showMessage(message: "Network error".tl);
|
||||
} else if (count == 0) {
|
||||
context.showMessage(message: "No updates".tl);
|
||||
} else {
|
||||
context.showMessage(message: "@c updates".tlParams({"c": count}));
|
||||
}
|
||||
setState(() {
|
||||
isLoading = false;
|
||||
});
|
||||
}
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return Button.normal(
|
||||
onPressed: check,
|
||||
isLoading: isLoading,
|
||||
child: Text("Check".tl),
|
||||
).fixHeight(32);
|
||||
}
|
||||
}
|
||||
|
@@ -696,6 +696,30 @@ class _ComicSourceWidgetState extends State<_ComicSourceWidget> {
|
||||
}).toList(),
|
||||
).paddingHorizontal(16).paddingBottom(16),
|
||||
),
|
||||
if (ComicSource.availableUpdates.isNotEmpty)
|
||||
Container(
|
||||
padding: const EdgeInsets.symmetric(
|
||||
horizontal: 8,
|
||||
vertical: 4,
|
||||
),
|
||||
decoration: BoxDecoration(
|
||||
border: Border.all(
|
||||
color: context.colorScheme.outlineVariant,
|
||||
width: 0.6,
|
||||
),
|
||||
borderRadius: BorderRadius.circular(12),
|
||||
),
|
||||
child: Row(
|
||||
mainAxisSize: MainAxisSize.min,
|
||||
children: [
|
||||
Icon(Icons.update, color: context.colorScheme.primary, size: 20,),
|
||||
const SizedBox(width: 8),
|
||||
Text("@c updates".tlParams({
|
||||
'c': ComicSource.availableUpdates.length,
|
||||
}), style: ts.withColor(context.colorScheme.primary),),
|
||||
],
|
||||
),
|
||||
).toAlign(Alignment.centerLeft).paddingHorizontal(16).paddingBottom(8),
|
||||
],
|
||||
),
|
||||
),
|
||||
|
@@ -37,9 +37,6 @@ class _MainPageState extends State<MainPage> {
|
||||
}
|
||||
|
||||
void checkUpdates() async {
|
||||
if (!appdata.settings['checkUpdateOnStart']) {
|
||||
return;
|
||||
}
|
||||
var lastCheck = appdata.implicitData['lastCheckUpdate'] ?? 0;
|
||||
var now = DateTime.now().millisecondsSinceEpoch;
|
||||
if (now - lastCheck < 24 * 60 * 60 * 1000) {
|
||||
@@ -47,9 +44,11 @@ class _MainPageState extends State<MainPage> {
|
||||
}
|
||||
appdata.implicitData['lastCheckUpdate'] = now;
|
||||
appdata.writeImplicitData();
|
||||
await Future.delayed(const Duration(milliseconds: 300));
|
||||
await checkUpdateUi(false);
|
||||
await ComicSourcePage.checkComicSourceUpdate(true);
|
||||
ComicSourcePage.checkComicSourceUpdate();
|
||||
if (appdata.settings['checkUpdateOnStart']) {
|
||||
await Future.delayed(const Duration(milliseconds: 300));
|
||||
await checkUpdateUi(false);
|
||||
}
|
||||
}
|
||||
|
||||
@override
|
||||
|
Reference in New Issue
Block a user