From 2ea061d324a7bd654c8af5364cbd4d701d7578cb Mon Sep 17 00:00:00 2001 From: lollipopkit Date: Mon, 27 Mar 2023 15:09:19 +0800 Subject: [PATCH] `backup` add `docker` --- .dart_tool/flutter_gen/gen_l10n/l10n.dart | 14 +++++++------- .dart_tool/flutter_gen/gen_l10n/l10n_en.dart | 8 ++++---- .dart_tool/flutter_gen/gen_l10n/l10n_zh.dart | 8 ++++---- ios/Runner.xcodeproj/project.pbxproj | 12 ++++++------ lib/data/model/app/backup.dart | 15 +++------------ lib/data/res/build_data.dart | 6 +++--- lib/data/res/path.dart | 4 ++-- lib/data/store/docker.dart | 4 ++++ lib/l10n/app_en.arb | 4 ++-- lib/l10n/app_zh.arb | 4 ++-- lib/view/page/backup.dart | 17 +++++++---------- lib/view/page/setting.dart | 5 +++-- lib/view/page/sftp/downloaded.dart | 2 +- lib/view/page/sftp/view.dart | 2 +- 14 files changed, 49 insertions(+), 56 deletions(-) diff --git a/.dart_tool/flutter_gen/gen_l10n/l10n.dart b/.dart_tool/flutter_gen/gen_l10n/l10n.dart index e62854e2..d741348c 100644 --- a/.dart_tool/flutter_gen/gen_l10n/l10n.dart +++ b/.dart_tool/flutter_gen/gen_l10n/l10n.dart @@ -159,10 +159,16 @@ abstract class S { /// **'Backup'** String get backup; + /// No description provided for @backupAndRestore. + /// + /// In en, this message translates to: + /// **'Backup and Restore'** + String get backupAndRestore; + /// No description provided for @backupTip. /// /// In en, this message translates to: - /// **'The exported data is simply encrypted. \nPlease keep it safe.\nRestoring will not overwrite existing data (except setting).'** + /// **'The exported data is simply encrypted. \nPlease keep it safe.\nRestoring will not overwrite existing data.'** String get backupTip; /// No description provided for @backupVersionNotMatch. @@ -507,12 +513,6 @@ abstract class S { /// **'Import'** String get import; - /// No description provided for @importAndExport. - /// - /// In en, this message translates to: - /// **'Import and Export'** - String get importAndExport; - /// No description provided for @inputDomainHere. /// /// In en, this message translates to: diff --git a/.dart_tool/flutter_gen/gen_l10n/l10n_en.dart b/.dart_tool/flutter_gen/gen_l10n/l10n_en.dart index ee8dfaa1..ff2f93cd 100644 --- a/.dart_tool/flutter_gen/gen_l10n/l10n_en.dart +++ b/.dart_tool/flutter_gen/gen_l10n/l10n_en.dart @@ -38,7 +38,10 @@ class SEn extends S { String get backup => 'Backup'; @override - String get backupTip => 'The exported data is simply encrypted. \nPlease keep it safe.\nRestoring will not overwrite existing data (except setting).'; + String get backupAndRestore => 'Backup and Restore'; + + @override + String get backupTip => 'The exported data is simply encrypted. \nPlease keep it safe.\nRestoring will not overwrite existing data.'; @override String get backupVersionNotMatch => 'Backup version is not match.'; @@ -229,9 +232,6 @@ class SEn extends S { @override String get import => 'Import'; - @override - String get importAndExport => 'Import and Export'; - @override String get inputDomainHere => 'Input Domain here'; diff --git a/.dart_tool/flutter_gen/gen_l10n/l10n_zh.dart b/.dart_tool/flutter_gen/gen_l10n/l10n_zh.dart index ee8d8fb5..bdca2913 100644 --- a/.dart_tool/flutter_gen/gen_l10n/l10n_zh.dart +++ b/.dart_tool/flutter_gen/gen_l10n/l10n_zh.dart @@ -38,7 +38,10 @@ class SZh extends S { String get backup => '备份'; @override - String get backupTip => '导出的数据仅进行了简单加密,请妥善保管。\n除了设置项,恢复的数据不会覆盖现有数据。'; + String get backupAndRestore => '备份和恢复'; + + @override + String get backupTip => '导出的数据仅进行了简单加密,请妥善保管。\n恢复的数据不会覆盖现有数据。'; @override String get backupVersionNotMatch => '备份版本不匹配,无法恢复'; @@ -229,9 +232,6 @@ class SZh extends S { @override String get import => '导入'; - @override - String get importAndExport => '导入或导出'; - @override String get inputDomainHere => '在这里输入域名'; diff --git a/ios/Runner.xcodeproj/project.pbxproj b/ios/Runner.xcodeproj/project.pbxproj index 968a9cdc..dc790a1b 100644 --- a/ios/Runner.xcodeproj/project.pbxproj +++ b/ios/Runner.xcodeproj/project.pbxproj @@ -359,7 +359,7 @@ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CLANG_ENABLE_MODULES = YES; CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements; - CURRENT_PROJECT_VERSION = 244; + CURRENT_PROJECT_VERSION = 245; DEVELOPMENT_TEAM = BA88US33G6; ENABLE_BITCODE = NO; INFOPLIST_FILE = Runner/Info.plist; @@ -367,7 +367,7 @@ "$(inherited)", "@executable_path/Frameworks", ); - MARKETING_VERSION = 1.0.244; + MARKETING_VERSION = 1.0.245; PRODUCT_BUNDLE_IDENTIFIER = com.lollipopkit.toolbox; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; @@ -490,7 +490,7 @@ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CLANG_ENABLE_MODULES = YES; CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements; - CURRENT_PROJECT_VERSION = 244; + CURRENT_PROJECT_VERSION = 245; DEVELOPMENT_TEAM = BA88US33G6; ENABLE_BITCODE = NO; INFOPLIST_FILE = Runner/Info.plist; @@ -498,7 +498,7 @@ "$(inherited)", "@executable_path/Frameworks", ); - MARKETING_VERSION = 1.0.244; + MARKETING_VERSION = 1.0.245; PRODUCT_BUNDLE_IDENTIFIER = com.lollipopkit.toolbox; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; @@ -515,7 +515,7 @@ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CLANG_ENABLE_MODULES = YES; CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements; - CURRENT_PROJECT_VERSION = 244; + CURRENT_PROJECT_VERSION = 245; DEVELOPMENT_TEAM = BA88US33G6; ENABLE_BITCODE = NO; INFOPLIST_FILE = Runner/Info.plist; @@ -523,7 +523,7 @@ "$(inherited)", "@executable_path/Frameworks", ); - MARKETING_VERSION = 1.0.244; + MARKETING_VERSION = 1.0.245; PRODUCT_BUNDLE_IDENTIFIER = com.lollipopkit.toolbox; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; diff --git a/lib/data/model/app/backup.dart b/lib/data/model/app/backup.dart index 690e78eb..96edb680 100644 --- a/lib/data/model/app/backup.dart +++ b/lib/data/model/app/backup.dart @@ -9,9 +9,7 @@ class Backup { final List spis; final List snippets; final List keys; - final int primaryColor; - final int serverStatusUpdateInterval; - final int launchPage; + final Map dockerHosts; Backup( this.version, @@ -19,9 +17,7 @@ class Backup { this.spis, this.snippets, this.keys, - this.primaryColor, - this.serverStatusUpdateInterval, - this.launchPage, + this.dockerHosts, ); Backup.fromJson(Map json) @@ -35,9 +31,7 @@ class Backup { keys = (json['keys'] as List) .map((e) => PrivateKeyInfo.fromJson(e)) .toList(), - primaryColor = json['primaryColor'], - serverStatusUpdateInterval = json['serverStatusUpdateInterval'], - launchPage = json['launchPage']; + dockerHosts = json['dockerHosts']; Map toJson() => { 'version': version, @@ -45,8 +39,5 @@ class Backup { 'spis': spis, 'snippets': snippets, 'keys': keys, - 'primaryColor': primaryColor, - 'serverStatusUpdateInterval': serverStatusUpdateInterval, - 'launchPage': launchPage, }; } diff --git a/lib/data/res/build_data.dart b/lib/data/res/build_data.dart index 0b933819..cf779de2 100644 --- a/lib/data/res/build_data.dart +++ b/lib/data/res/build_data.dart @@ -2,8 +2,8 @@ class BuildData { static const String name = "ServerBox"; - static const int build = 244; - static const String engine = "Flutter 3.7.7 • channel stable • https://github.com/flutter/flutter.git\nFramework • revision 2ad6cd72c0 (13 days ago) • 2023-03-08 09:41:59 -0800\nEngine • revision 1837b5be5f\nTools • Dart 2.19.4 • DevTools 2.20.1\n"; - static const String buildAt = "2023-03-21 15:36:44.082988"; + static const int build = 245; + static const String engine = "Flutter 3.7.7 • channel stable • https://github.com/flutter/flutter.git\nFramework • revision 2ad6cd72c0 (3 weeks ago) • 2023-03-08 09:41:59 -0800\nEngine • revision 1837b5be5f\nTools • Dart 2.19.4 • DevTools 2.20.1\n"; + static const String buildAt = "2023-03-27 13:57:46.119777"; static const int modifications = 2; } diff --git a/lib/data/res/path.dart b/lib/data/res/path.dart index 29c88779..d4da69bd 100644 --- a/lib/data/res/path.dart +++ b/lib/data/res/path.dart @@ -7,14 +7,14 @@ Future get docDir async { if (isAndroid) { final dir = await getExternalStorageDirectory(); if (dir != null) { - return Directory('${dir.path}/server_box'); + return dir; } // fallthrough to getApplicationDocumentsDirectory } return await getApplicationDocumentsDirectory(); } -Future get sftpDownloadDir async { +Future get sftpDir async { final dir = Directory('${(await docDir).path}/sftp'); return dir.create(recursive: true); } diff --git a/lib/data/store/docker.dart b/lib/data/store/docker.dart index b7986ef6..3ee8d14c 100644 --- a/lib/data/store/docker.dart +++ b/lib/data/store/docker.dart @@ -8,4 +8,8 @@ class DockerStore extends PersistentStore { void setDockerHost(String id, String host) { box.put(id, host); } + + Map fetch() { + return box.toMap().cast(); + } } diff --git a/lib/l10n/app_en.arb b/lib/l10n/app_en.arb index 16012c28..8f3e1141 100644 --- a/lib/l10n/app_en.arb +++ b/lib/l10n/app_en.arb @@ -10,7 +10,8 @@ "auto": "Auto", "backDir": "Back", "backup": "Backup", - "backupTip": "The exported data is simply encrypted. \nPlease keep it safe.\nRestoring will not overwrite existing data (except setting).", + "backupAndRestore": "Backup and Restore", + "backupTip": "The exported data is simply encrypted. \nPlease keep it safe.\nRestoring will not overwrite existing data.", "backupVersionNotMatch": "Backup version is not match.", "cancel": "Cancel", "choose": "Choose", @@ -68,7 +69,6 @@ "httpFailedWithCode": "request failed, status code: {code}", "imagesList": "Images list", "import": "Import", - "importAndExport": "Import and Export", "inputDomainHere": "Input Domain here", "install": "install", "installDockerWithUrl": "Please https://docs.docker.com/engine/install docker first.", diff --git a/lib/l10n/app_zh.arb b/lib/l10n/app_zh.arb index a24694aa..fa48b3c5 100644 --- a/lib/l10n/app_zh.arb +++ b/lib/l10n/app_zh.arb @@ -10,7 +10,8 @@ "auto": "自动", "backDir": "返回上一级", "backup": "备份", - "backupTip": "导出的数据仅进行了简单加密,请妥善保管。\n除了设置项,恢复的数据不会覆盖现有数据。", + "backupAndRestore": "备份和恢复", + "backupTip": "导出的数据仅进行了简单加密,请妥善保管。\n恢复的数据不会覆盖现有数据。", "backupVersionNotMatch": "备份版本不匹配,无法恢复", "cancel": "取消", "choose": "选择", @@ -68,7 +69,6 @@ "httpFailedWithCode": "请求失败, 状态码: {code}", "imagesList": "镜像列表", "import": "导入", - "importAndExport": "导入或导出", "inputDomainHere": "在这里输入域名", "install": "安装", "installDockerWithUrl": "请先 https://docs.docker.com/engine/install docker", diff --git a/lib/view/page/backup.dart b/lib/view/page/backup.dart index 5fd8077a..ad1d2dae 100644 --- a/lib/view/page/backup.dart +++ b/lib/view/page/backup.dart @@ -11,9 +11,9 @@ import '../../core/extension/colorx.dart'; import '../../core/utils/ui.dart'; import '../../data/model/app/backup.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'; @@ -22,10 +22,10 @@ const backupFormatVersion = 1; class BackupPage extends StatelessWidget { BackupPage({Key? key}) : super(key: key); - final _setting = locator(); final _server = locator(); final _snippet = locator(); final _privateKey = locator(); + final _dockerHosts = locator(); @override Widget build(BuildContext context) { @@ -33,7 +33,7 @@ class BackupPage extends StatelessWidget { final s = S.of(context)!; return Scaffold( appBar: AppBar( - title: Text(s.importAndExport, style: textSize18), + title: Text(s.backupAndRestore, style: textSize18), ), body: Center( child: Column( @@ -103,9 +103,7 @@ class BackupPage extends StatelessWidget { _server.fetch(), _snippet.fetch(), _privateKey.fetch(), - _setting.primaryColor.fetch() ?? Colors.pinkAccent.value, - _setting.serverStatusUpdateInterval.fetch() ?? 2, - _setting.launchPage.fetch() ?? 0, + _dockerHosts.fetch(), ), ), ); @@ -194,10 +192,9 @@ class BackupPage extends StatelessWidget { for (final s in backup.keys) { _privateKey.put(s); } - _setting.primaryColor.put(backup.primaryColor); - _setting.serverStatusUpdateInterval - .put(backup.serverStatusUpdateInterval); - _setting.launchPage.put(backup.launchPage); + for (final k in backup.dockerHosts.keys) { + _dockerHosts.setDockerHost(k, backup.dockerHosts[k]!); + } Navigator.of(context).pop(); showSnackBar(context, Text(s.restoreSuccess)); }, diff --git a/lib/view/page/setting.dart b/lib/view/page/setting.dart index 70208e9a..eae1ed6a 100644 --- a/lib/view/page/setting.dart +++ b/lib/view/page/setting.dart @@ -4,7 +4,6 @@ import 'package:flutter/material.dart'; import 'package:flutter_gen/gen_l10n/l10n.dart'; import 'package:flutter_material_color_picker/flutter_material_color_picker.dart'; import 'package:provider/provider.dart'; -import 'package:toolbox/data/res/path.dart'; import '../../core/utils/misc.dart'; import '../../core/utils/platform.dart'; @@ -15,6 +14,7 @@ import '../../data/provider/app.dart'; import '../../data/provider/server.dart'; import '../../data/res/build_data.dart'; import '../../data/res/color.dart'; +import '../../data/res/path.dart'; import '../../data/res/tab.dart'; import '../../data/res/ui.dart'; import '../../data/store/setting.dart'; @@ -61,6 +61,7 @@ class _SettingPageState extends State { _nightMode = _setting.themeMode.fetch()!; _updateInterval = _setting.serverStatusUpdateInterval.fetch()!.toDouble(); _maxRetryCount = _setting.maxRetryCount.fetch()!.toDouble(); + _selectedColorValue = _setting.primaryColor.fetch()!; } @override @@ -101,8 +102,8 @@ class _SettingPageState extends State { _buildThemeMode(), _buildAppColorPreview(), _buildLaunchPage(), - _buildCheckUpdate(), _buildFont(), + _buildCheckUpdate(), ]; if (isIOS) { children.add(_buildPushToken()); diff --git a/lib/view/page/sftp/downloaded.dart b/lib/view/page/sftp/downloaded.dart index 180cdba5..45122c3e 100644 --- a/lib/view/page/sftp/downloaded.dart +++ b/lib/view/page/sftp/downloaded.dart @@ -29,7 +29,7 @@ class _SFTPDownloadedPageState extends State { @override void initState() { super.initState(); - sftpDownloadDir.then((dir) { + sftpDir.then((dir) { _path = PathWithPrefix(dir.path); _prefixPath = '${dir.path}/'; setState(() {}); diff --git a/lib/view/page/sftp/view.dart b/lib/view/page/sftp/view.dart index a29e93b0..e75fa681 100644 --- a/lib/view/page/sftp/view.dart +++ b/lib/view/page/sftp/view.dart @@ -302,7 +302,7 @@ class _SFTPPageState extends State { final prePath = _status.path!.path; final remotePath = prePath + (prePath.endsWith('/') ? '' : '/') + name.filename; - final local = '${(await sftpDownloadDir).path}$remotePath'; + final local = '${(await sftpDir).path}$remotePath'; final pubKeyId = widget.spi.pubKeyId; locator().add(