From 17b8bbd2690fe78477d078d3734c5177f2a7211a Mon Sep 17 00:00:00 2001 From: PaperCube Date: Thu, 23 May 2024 17:12:31 +0100 Subject: [PATCH 1/2] Always display app bar in SSH Page on Linux/Windows #361 --- lib/view/page/home/appbar.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/view/page/home/appbar.dart b/lib/view/page/home/appbar.dart index 7f3c0d6c..340a487b 100644 --- a/lib/view/page/home/appbar.dart +++ b/lib/view/page/home/appbar.dart @@ -25,7 +25,7 @@ final class _AppBar extends CustomAppBar { return ValBuilder( listenable: selectIndex, builder: (idx) { - if (idx == AppTab.ssh.index) return placeholder; + if (idx == AppTab.ssh.index && !isWindows && !isLinux) return placeholder; return super.build(context); }, ); From 5888cb717240b1e6c8a9c22c81ce42d38b52636b Mon Sep 17 00:00:00 2001 From: PaperCube Date: Thu, 23 May 2024 20:41:56 +0100 Subject: [PATCH 2/2] Improve backup functionality and error handling - (Windows) Fix not selecting the right backup file in explorer - Fix progress indicator not stopping on WebDAV failure #188 #364 --- lib/view/page/backup.dart | 129 ++++++++++++++++++++++---------------- 1 file changed, 74 insertions(+), 55 deletions(-) diff --git a/lib/view/page/backup.dart b/lib/view/page/backup.dart index d9770f50..7b6d7e7a 100644 --- a/lib/view/page/backup.dart +++ b/lib/view/page/backup.dart @@ -65,14 +65,18 @@ class BackupPage extends StatelessWidget { trailing: const Icon(Icons.save), onTap: () async { final path = await Backup.backup(); + debugPrint("Backup path: $path"); /// Issue #188 - final _ = switch (Pfs.type) { - Pfs.windows => - await Process.run('explorer', ['/select,', path]), - Pfs.linux => await Process.run('xdg-open', [path]), - _ => await Pfs.sharePath(path), - }; + switch (Pfs.type) { + case Pfs.windows: + final backslashPath = path.replaceAll('/', '\\'); + await Process.run('explorer', ['/select,$backslashPath']); + case Pfs.linux: + await Process.run('xdg-open', [path]); + default: + await Pfs.sharePath(path); + } }, ), ListTile( @@ -263,64 +267,79 @@ class BackupPage extends StatelessWidget { Future _onTapWebdavDl(BuildContext context) async { webdavLoading.value = true; - final files = await Webdav.list(); - if (files.isEmpty) { - context.showSnackBar(l10n.dirEmpty); - webdavLoading.value = false; - return; - } + try { + final files = await Webdav.list(); + if (files.isEmpty) { + context.showSnackBar(l10n.dirEmpty); + webdavLoading.value = false; + return; + } - final fileName = await context.showRoundDialog( - title: l10n.restore, - child: SizedBox( - width: 300, - height: 300, - child: ListView.builder( - itemCount: files.length, - itemBuilder: (_, index) { - final file = files[index]; - return ListTile( - title: Text(file), - onTap: () => context.pop(file), - ); - }, + final fileName = await context.showRoundDialog( + title: l10n.restore, + child: SizedBox( + width: 300, + height: 300, + child: ListView.builder( + itemCount: files.length, + itemBuilder: (_, index) { + final file = files[index]; + return ListTile( + title: Text(file), + onTap: () => context.pop(file), + ); + }, + ), ), - ), - actions: [ - TextButton( - onPressed: () => context.pop(), - child: Text(l10n.cancel), - ), - ], - ); - if (fileName == null) { - webdavLoading.value = false; - return; - } + actions: [ + TextButton( + onPressed: () => context.pop(), + child: Text(l10n.cancel), + ), + ], + ); + if (fileName == null) { + webdavLoading.value = false; + return; + } - final result = await Webdav.download(relativePath: fileName); - if (result != null) { - Loggers.app.warning('Download webdav backup failed: $result'); + final result = await Webdav.download(relativePath: fileName); + if (result != null) { + Loggers.app.warning('Download webdav backup failed: $result'); + webdavLoading.value = false; + return; + } + final dlFile = await File('${Paths.doc}/$fileName').readAsString(); + final dlBak = await Computer.shared.start(Backup.fromJsonString, dlFile); + await dlBak.restore(force: true); + webdavLoading.value = false; + } catch (e) { + context.showSnackBar(e.toString()); + rethrow; + } finally { webdavLoading.value = false; - return; } - final dlFile = await File('${Paths.doc}/$fileName').readAsString(); - final dlBak = await Computer.shared.start(Backup.fromJsonString, dlFile); - await dlBak.restore(force: true); - webdavLoading.value = false; } Future _onTapWebdavUp(BuildContext context) async { - webdavLoading.value = true; - final bakName = '${DateTime.now().ymdhms()}-${Paths.bakName}'; - await Backup.backup(bakName); - final uploadResult = await Webdav.upload(relativePath: bakName); - if (uploadResult != null) { - Loggers.app.warning('Upload webdav backup failed: $uploadResult'); - } else { - Loggers.app.info('Upload webdav backup success'); + try { + webdavLoading.value = true; + final bakName = + '${DateTime.now().ymdhms(ymdSep: "-", hmsSep: "-", sep: "-")}-${Paths.bakName}'; + await Backup.backup(bakName); + final uploadResult = await Webdav.upload(relativePath: bakName); + if (uploadResult != null) { + Loggers.app.warning('Upload webdav backup failed: $uploadResult'); + context.showSnackBar(uploadResult.toString()); + } else { + Loggers.app.info('Upload webdav backup success'); + } + } catch (e) { + context.showSnackBar(e.toString()); + rethrow; + } finally { + webdavLoading.value = false; } - webdavLoading.value = false; } Future _onTapWebdavSetting(BuildContext context) async {