diff --git a/lib/data/model/app/backup.dart b/lib/data/model/app/backup.dart index 01a9ce1e..78b79d7c 100644 --- a/lib/data/model/app/backup.dart +++ b/lib/data/model/app/backup.dart @@ -10,6 +10,7 @@ class Backup { final List snippets; final List keys; final Map dockerHosts; + final Map settings; Backup({ required this.version, @@ -18,6 +19,7 @@ class Backup { required this.snippets, required this.keys, required this.dockerHosts, + required this.settings, }); Backup.fromJson(Map json) @@ -31,7 +33,8 @@ class Backup { keys = (json['keys'] as List) .map((e) => PrivateKeyInfo.fromJson(e)) .toList(), - dockerHosts = json['dockerHosts'] ?? {}; + dockerHosts = json['dockerHosts'] ?? {}, + settings = json['settings'] ?? {}; Map toJson() => { 'version': version, @@ -39,5 +42,7 @@ class Backup { 'spis': spis, 'snippets': snippets, 'keys': keys, + 'dockerHosts': dockerHosts, + 'settings': settings, }; } diff --git a/lib/view/page/backup.dart b/lib/view/page/backup.dart index c58f62b8..1ea03d42 100644 --- a/lib/view/page/backup.dart +++ b/lib/view/page/backup.dart @@ -7,16 +7,16 @@ import 'package:flutter/material.dart'; import 'package:flutter_gen/gen_l10n/l10n.dart'; import 'package:toolbox/core/extension/context.dart'; import 'package:toolbox/data/res/path.dart'; +import 'package:toolbox/view/widget/round_rect_card.dart'; -import '../../core/extension/colorx.dart'; import '../../core/utils/misc.dart'; import '../../core/utils/ui.dart'; import '../../data/model/app/backup.dart'; -import '../../data/res/color.dart'; import '../../data/res/ui.dart'; import '../../data/store/docker.dart'; import '../../data/store/private_key.dart'; import '../../data/store/server.dart'; +import '../../data/store/setting.dart'; import '../../data/store/snippet.dart'; import '../../locator.dart'; import '../widget/custom_appbar.dart'; @@ -30,6 +30,7 @@ class BackupPage extends StatelessWidget { final _snippet = locator(); final _privateKey = locator(); final _dockerHosts = locator(); + final _setting = locator(); @override Widget build(BuildContext context) { @@ -56,21 +57,13 @@ class BackupPage extends StatelessWidget { textAlign: TextAlign.center, ), ), - const SizedBox(height: 107), - _buildCard(s.restore, Icons.download, media, () async { - final path = await pickOneFile(); - if (path == null) { - showSnackBar(context, Text(s.notSelected)); - return; - } - final file = File(path); - if (!file.existsSync()) { - showSnackBar(context, Text(s.fileNotExist(path))); - return; - } - final text = await file.readAsString(); - _import(text, context, s); - }), + height77, + _buildCard( + s.restore, + Icons.download, + media, + () => _onRestore(context, s), + ), height13, const SizedBox( width: 37, @@ -79,25 +72,9 @@ class BackupPage extends StatelessWidget { height13, _buildCard( s.backup, - Icons.file_upload, + Icons.save, media, - () async { - final result = _diyEncrtpt( - json.encode( - Backup( - version: backupFormatVersion, - date: DateTime.now().toString().split('.').first, - spis: _server.fetch(), - snippets: _snippet.fetch(), - keys: _privateKey.fetch(), - dockerHosts: _dockerHosts.fetchAll(), - ), - ), - ); - final path = '${(await docDir).path}/srvbox_bak.json'; - await File(path).writeAsString(result); - await shareFiles(context, [path]); - }, + () => _onBackup(context, s), ) ], )); @@ -109,24 +86,18 @@ class BackupPage extends StatelessWidget { MediaQueryData media, FutureOr Function() onTap, ) { - final textColor = primaryColor.isBrightColor ? Colors.black : Colors.white; - return GestureDetector( - onTap: onTap, - child: Container( - decoration: BoxDecoration( - borderRadius: BorderRadius.circular(37), color: primaryColor), + return RoundRectCard( + InkWell( + onTap: onTap, child: Padding( padding: const EdgeInsets.symmetric(vertical: 7, horizontal: 17), child: Row( mainAxisSize: MainAxisSize.min, mainAxisAlignment: MainAxisAlignment.center, children: [ - Icon( - icon, - color: textColor, - ), + Icon(icon, size: 20), width7, - Text(text, style: TextStyle(color: textColor)), + Text(text), ], ), ), @@ -134,6 +105,40 @@ class BackupPage extends StatelessWidget { ); } + Future _onRestore(BuildContext context, S s) async { + final path = await pickOneFile(); + if (path == null) { + showSnackBar(context, Text(s.notSelected)); + return; + } + final file = File(path); + if (!file.existsSync()) { + showSnackBar(context, Text(s.fileNotExist(path))); + return; + } + final text = await file.readAsString(); + _import(text, context, s); + } + + Future _onBackup(BuildContext context, S s) async { + final result = _diyEncrtpt( + json.encode( + Backup( + version: backupFormatVersion, + date: DateTime.now().toString().split('.').first, + spis: _server.fetch(), + snippets: _snippet.fetch(), + keys: _privateKey.fetch(), + dockerHosts: _dockerHosts.fetchAll(), + settings: _setting.toJson(), + ), + ), + ); + final path = '${(await docDir).path}/srvbox_bak.json'; + await File(path).writeAsString(result); + await shareFiles(context, [path]); + } + Future _import(String text, BuildContext context, S s) async { if (text.isEmpty) { showSnackBar(context, Text(s.fieldMustNotEmpty)); diff --git a/lib/view/page/home.dart b/lib/view/page/home.dart index 9d9545e9..c92fc219 100644 --- a/lib/view/page/home.dart +++ b/lib/view/page/home.dart @@ -241,20 +241,20 @@ class _HomePageState extends State onTap: () => AppRoute.keyList().go(context), ), ListTile( - leading: const Icon(Icons.download), - title: Text(_s.download), + leading: const Icon(Icons.file_open), + title: Text(_s.files), onTap: () => AppRoute.localStorage().go(context), ), - ListTile( - leading: const Icon(Icons.import_export), - title: Text(_s.backup), - onTap: () => AppRoute.backup().go(context), - ), ListTile( leading: const Icon(Icons.code), title: Text(_s.convert), onTap: () => AppRoute.convert().go(context), ), + ListTile( + leading: const Icon(Icons.import_export), + title: Text(_s.backupAndRestore), + onTap: () => AppRoute.backup().go(context), + ), ListTile( leading: const Icon(Icons.text_snippet), title: Text('${_s.about} & ${_s.feedback}'),