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 { 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); }, );