mirror of
https://github.com/lollipopkit/flutter_server_box.git
synced 2025-12-17 07:14:28 +01:00
new: backup support settings
This commit is contained in:
@@ -10,6 +10,7 @@ class Backup {
|
|||||||
final List<Snippet> snippets;
|
final List<Snippet> snippets;
|
||||||
final List<PrivateKeyInfo> keys;
|
final List<PrivateKeyInfo> keys;
|
||||||
final Map<String, String> dockerHosts;
|
final Map<String, String> dockerHosts;
|
||||||
|
final Map<String, dynamic> settings;
|
||||||
|
|
||||||
Backup({
|
Backup({
|
||||||
required this.version,
|
required this.version,
|
||||||
@@ -18,6 +19,7 @@ class Backup {
|
|||||||
required this.snippets,
|
required this.snippets,
|
||||||
required this.keys,
|
required this.keys,
|
||||||
required this.dockerHosts,
|
required this.dockerHosts,
|
||||||
|
required this.settings,
|
||||||
});
|
});
|
||||||
|
|
||||||
Backup.fromJson(Map<String, dynamic> json)
|
Backup.fromJson(Map<String, dynamic> json)
|
||||||
@@ -31,7 +33,8 @@ class Backup {
|
|||||||
keys = (json['keys'] as List)
|
keys = (json['keys'] as List)
|
||||||
.map((e) => PrivateKeyInfo.fromJson(e))
|
.map((e) => PrivateKeyInfo.fromJson(e))
|
||||||
.toList(),
|
.toList(),
|
||||||
dockerHosts = json['dockerHosts'] ?? {};
|
dockerHosts = json['dockerHosts'] ?? {},
|
||||||
|
settings = json['settings'] ?? {};
|
||||||
|
|
||||||
Map<String, dynamic> toJson() => {
|
Map<String, dynamic> toJson() => {
|
||||||
'version': version,
|
'version': version,
|
||||||
@@ -39,5 +42,7 @@ class Backup {
|
|||||||
'spis': spis,
|
'spis': spis,
|
||||||
'snippets': snippets,
|
'snippets': snippets,
|
||||||
'keys': keys,
|
'keys': keys,
|
||||||
|
'dockerHosts': dockerHosts,
|
||||||
|
'settings': settings,
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -7,16 +7,16 @@ import 'package:flutter/material.dart';
|
|||||||
import 'package:flutter_gen/gen_l10n/l10n.dart';
|
import 'package:flutter_gen/gen_l10n/l10n.dart';
|
||||||
import 'package:toolbox/core/extension/context.dart';
|
import 'package:toolbox/core/extension/context.dart';
|
||||||
import 'package:toolbox/data/res/path.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/misc.dart';
|
||||||
import '../../core/utils/ui.dart';
|
import '../../core/utils/ui.dart';
|
||||||
import '../../data/model/app/backup.dart';
|
import '../../data/model/app/backup.dart';
|
||||||
import '../../data/res/color.dart';
|
|
||||||
import '../../data/res/ui.dart';
|
import '../../data/res/ui.dart';
|
||||||
import '../../data/store/docker.dart';
|
import '../../data/store/docker.dart';
|
||||||
import '../../data/store/private_key.dart';
|
import '../../data/store/private_key.dart';
|
||||||
import '../../data/store/server.dart';
|
import '../../data/store/server.dart';
|
||||||
|
import '../../data/store/setting.dart';
|
||||||
import '../../data/store/snippet.dart';
|
import '../../data/store/snippet.dart';
|
||||||
import '../../locator.dart';
|
import '../../locator.dart';
|
||||||
import '../widget/custom_appbar.dart';
|
import '../widget/custom_appbar.dart';
|
||||||
@@ -30,6 +30,7 @@ class BackupPage extends StatelessWidget {
|
|||||||
final _snippet = locator<SnippetStore>();
|
final _snippet = locator<SnippetStore>();
|
||||||
final _privateKey = locator<PrivateKeyStore>();
|
final _privateKey = locator<PrivateKeyStore>();
|
||||||
final _dockerHosts = locator<DockerStore>();
|
final _dockerHosts = locator<DockerStore>();
|
||||||
|
final _setting = locator<SettingStore>();
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
@@ -56,8 +57,55 @@ class BackupPage extends StatelessWidget {
|
|||||||
textAlign: TextAlign.center,
|
textAlign: TextAlign.center,
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
const SizedBox(height: 107),
|
height77,
|
||||||
_buildCard(s.restore, Icons.download, media, () async {
|
_buildCard(
|
||||||
|
s.restore,
|
||||||
|
Icons.download,
|
||||||
|
media,
|
||||||
|
() => _onRestore(context, s),
|
||||||
|
),
|
||||||
|
height13,
|
||||||
|
const SizedBox(
|
||||||
|
width: 37,
|
||||||
|
child: Divider(),
|
||||||
|
),
|
||||||
|
height13,
|
||||||
|
_buildCard(
|
||||||
|
s.backup,
|
||||||
|
Icons.save,
|
||||||
|
media,
|
||||||
|
() => _onBackup(context, s),
|
||||||
|
)
|
||||||
|
],
|
||||||
|
));
|
||||||
|
}
|
||||||
|
|
||||||
|
Widget _buildCard(
|
||||||
|
String text,
|
||||||
|
IconData icon,
|
||||||
|
MediaQueryData media,
|
||||||
|
FutureOr Function() onTap,
|
||||||
|
) {
|
||||||
|
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, size: 20),
|
||||||
|
width7,
|
||||||
|
Text(text),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
Future<void> _onRestore(BuildContext context, S s) async {
|
||||||
final path = await pickOneFile();
|
final path = await pickOneFile();
|
||||||
if (path == null) {
|
if (path == null) {
|
||||||
showSnackBar(context, Text(s.notSelected));
|
showSnackBar(context, Text(s.notSelected));
|
||||||
@@ -70,18 +118,9 @@ class BackupPage extends StatelessWidget {
|
|||||||
}
|
}
|
||||||
final text = await file.readAsString();
|
final text = await file.readAsString();
|
||||||
_import(text, context, s);
|
_import(text, context, s);
|
||||||
}),
|
}
|
||||||
height13,
|
|
||||||
const SizedBox(
|
Future<void> _onBackup(BuildContext context, S s) async {
|
||||||
width: 37,
|
|
||||||
child: Divider(),
|
|
||||||
),
|
|
||||||
height13,
|
|
||||||
_buildCard(
|
|
||||||
s.backup,
|
|
||||||
Icons.file_upload,
|
|
||||||
media,
|
|
||||||
() async {
|
|
||||||
final result = _diyEncrtpt(
|
final result = _diyEncrtpt(
|
||||||
json.encode(
|
json.encode(
|
||||||
Backup(
|
Backup(
|
||||||
@@ -91,47 +130,13 @@ class BackupPage extends StatelessWidget {
|
|||||||
snippets: _snippet.fetch(),
|
snippets: _snippet.fetch(),
|
||||||
keys: _privateKey.fetch(),
|
keys: _privateKey.fetch(),
|
||||||
dockerHosts: _dockerHosts.fetchAll(),
|
dockerHosts: _dockerHosts.fetchAll(),
|
||||||
|
settings: _setting.toJson(),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
final path = '${(await docDir).path}/srvbox_bak.json';
|
final path = '${(await docDir).path}/srvbox_bak.json';
|
||||||
await File(path).writeAsString(result);
|
await File(path).writeAsString(result);
|
||||||
await shareFiles(context, [path]);
|
await shareFiles(context, [path]);
|
||||||
},
|
|
||||||
)
|
|
||||||
],
|
|
||||||
));
|
|
||||||
}
|
|
||||||
|
|
||||||
Widget _buildCard(
|
|
||||||
String text,
|
|
||||||
IconData icon,
|
|
||||||
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),
|
|
||||||
child: Padding(
|
|
||||||
padding: const EdgeInsets.symmetric(vertical: 7, horizontal: 17),
|
|
||||||
child: Row(
|
|
||||||
mainAxisSize: MainAxisSize.min,
|
|
||||||
mainAxisAlignment: MainAxisAlignment.center,
|
|
||||||
children: [
|
|
||||||
Icon(
|
|
||||||
icon,
|
|
||||||
color: textColor,
|
|
||||||
),
|
|
||||||
width7,
|
|
||||||
Text(text, style: TextStyle(color: textColor)),
|
|
||||||
],
|
|
||||||
),
|
|
||||||
),
|
|
||||||
),
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Future<void> _import(String text, BuildContext context, S s) async {
|
Future<void> _import(String text, BuildContext context, S s) async {
|
||||||
|
|||||||
@@ -241,20 +241,20 @@ class _HomePageState extends State<HomePage>
|
|||||||
onTap: () => AppRoute.keyList().go(context),
|
onTap: () => AppRoute.keyList().go(context),
|
||||||
),
|
),
|
||||||
ListTile(
|
ListTile(
|
||||||
leading: const Icon(Icons.download),
|
leading: const Icon(Icons.file_open),
|
||||||
title: Text(_s.download),
|
title: Text(_s.files),
|
||||||
onTap: () => AppRoute.localStorage().go(context),
|
onTap: () => AppRoute.localStorage().go(context),
|
||||||
),
|
),
|
||||||
ListTile(
|
|
||||||
leading: const Icon(Icons.import_export),
|
|
||||||
title: Text(_s.backup),
|
|
||||||
onTap: () => AppRoute.backup().go(context),
|
|
||||||
),
|
|
||||||
ListTile(
|
ListTile(
|
||||||
leading: const Icon(Icons.code),
|
leading: const Icon(Icons.code),
|
||||||
title: Text(_s.convert),
|
title: Text(_s.convert),
|
||||||
onTap: () => AppRoute.convert().go(context),
|
onTap: () => AppRoute.convert().go(context),
|
||||||
),
|
),
|
||||||
|
ListTile(
|
||||||
|
leading: const Icon(Icons.import_export),
|
||||||
|
title: Text(_s.backupAndRestore),
|
||||||
|
onTap: () => AppRoute.backup().go(context),
|
||||||
|
),
|
||||||
ListTile(
|
ListTile(
|
||||||
leading: const Icon(Icons.text_snippet),
|
leading: const Icon(Icons.text_snippet),
|
||||||
title: Text('${_s.about} & ${_s.feedback}'),
|
title: Text('${_s.about} & ${_s.feedback}'),
|
||||||
|
|||||||
Reference in New Issue
Block a user