diff --git a/.dart_tool/flutter_gen/gen_l10n/l10n.dart b/.dart_tool/flutter_gen/gen_l10n/l10n.dart index bfad4aec..da7ae6dd 100644 --- a/.dart_tool/flutter_gen/gen_l10n/l10n.dart +++ b/.dart_tool/flutter_gen/gen_l10n/l10n.dart @@ -1406,6 +1406,12 @@ abstract class S { /// **'Terminal'** String get terminal; + /// No description provided for @test. + /// + /// In en, this message translates to: + /// **'Test'** + String get test; + /// No description provided for @theme. /// /// In en, this message translates to: diff --git a/.dart_tool/flutter_gen/gen_l10n/l10n_de.dart b/.dart_tool/flutter_gen/gen_l10n/l10n_de.dart index 9a98ee79..95539b9c 100644 --- a/.dart_tool/flutter_gen/gen_l10n/l10n_de.dart +++ b/.dart_tool/flutter_gen/gen_l10n/l10n_de.dart @@ -688,6 +688,9 @@ class SDe extends S { @override String get terminal => 'Terminal'; + @override + String get test => 'Prüfung'; + @override String get theme => 'Themen'; diff --git a/.dart_tool/flutter_gen/gen_l10n/l10n_en.dart b/.dart_tool/flutter_gen/gen_l10n/l10n_en.dart index daf35207..bea6d8ea 100644 --- a/.dart_tool/flutter_gen/gen_l10n/l10n_en.dart +++ b/.dart_tool/flutter_gen/gen_l10n/l10n_en.dart @@ -688,6 +688,9 @@ class SEn extends S { @override String get terminal => 'Terminal'; + @override + String get test => 'Test'; + @override String get theme => 'Theme'; diff --git a/.dart_tool/flutter_gen/gen_l10n/l10n_id.dart b/.dart_tool/flutter_gen/gen_l10n/l10n_id.dart index 2a0c9c0f..e50027f8 100644 --- a/.dart_tool/flutter_gen/gen_l10n/l10n_id.dart +++ b/.dart_tool/flutter_gen/gen_l10n/l10n_id.dart @@ -688,6 +688,9 @@ class SId extends S { @override String get terminal => 'Terminal'; + @override + String get test => 'pengujian'; + @override String get theme => ' Tema'; diff --git a/.dart_tool/flutter_gen/gen_l10n/l10n_zh.dart b/.dart_tool/flutter_gen/gen_l10n/l10n_zh.dart index 097825c7..bd2c0203 100644 --- a/.dart_tool/flutter_gen/gen_l10n/l10n_zh.dart +++ b/.dart_tool/flutter_gen/gen_l10n/l10n_zh.dart @@ -688,6 +688,9 @@ class SZh extends S { @override String get terminal => '终端'; + @override + String get test => '测试'; + @override String get theme => '主题'; @@ -1477,6 +1480,9 @@ class SZhTw extends SZh { @override String get terminal => '终端機'; + @override + String get test => '測試'; + @override String get theme => '主題'; diff --git a/ios/Runner.xcodeproj/project.pbxproj b/ios/Runner.xcodeproj/project.pbxproj index 48aaeb5f..af4bf1a8 100644 --- a/ios/Runner.xcodeproj/project.pbxproj +++ b/ios/Runner.xcodeproj/project.pbxproj @@ -586,7 +586,7 @@ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CLANG_ENABLE_MODULES = YES; CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements; - CURRENT_PROJECT_VERSION = 654; + CURRENT_PROJECT_VERSION = 660; DEVELOPMENT_TEAM = BA88US33G6; ENABLE_BITCODE = NO; INFOPLIST_FILE = "Runner/Info-$(CONFIGURATION).plist"; @@ -596,7 +596,7 @@ "$(inherited)", "@executable_path/Frameworks", ); - MARKETING_VERSION = 1.0.654; + MARKETING_VERSION = 1.0.660; PRODUCT_BUNDLE_IDENTIFIER = com.lollipopkit.toolbox; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; @@ -720,7 +720,7 @@ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CLANG_ENABLE_MODULES = YES; CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements; - CURRENT_PROJECT_VERSION = 654; + CURRENT_PROJECT_VERSION = 660; DEVELOPMENT_TEAM = BA88US33G6; ENABLE_BITCODE = NO; INFOPLIST_FILE = "Runner/Info-$(CONFIGURATION).plist"; @@ -730,7 +730,7 @@ "$(inherited)", "@executable_path/Frameworks", ); - MARKETING_VERSION = 1.0.654; + MARKETING_VERSION = 1.0.660; PRODUCT_BUNDLE_IDENTIFIER = com.lollipopkit.toolbox; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; @@ -748,7 +748,7 @@ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CLANG_ENABLE_MODULES = YES; CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements; - CURRENT_PROJECT_VERSION = 654; + CURRENT_PROJECT_VERSION = 660; DEVELOPMENT_TEAM = BA88US33G6; ENABLE_BITCODE = NO; INFOPLIST_FILE = "Runner/Info-$(CONFIGURATION).plist"; @@ -758,7 +758,7 @@ "$(inherited)", "@executable_path/Frameworks", ); - MARKETING_VERSION = 1.0.654; + MARKETING_VERSION = 1.0.660; PRODUCT_BUNDLE_IDENTIFIER = com.lollipopkit.toolbox; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; @@ -779,7 +779,7 @@ CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 654; + CURRENT_PROJECT_VERSION = 660; DEVELOPMENT_TEAM = BA88US33G6; GCC_C_LANGUAGE_STANDARD = gnu11; GENERATE_INFOPLIST_FILE = YES; @@ -792,7 +792,7 @@ "@executable_path/Frameworks", "@executable_path/../../Frameworks", ); - MARKETING_VERSION = 1.0.654; + MARKETING_VERSION = 1.0.660; MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; MTL_FAST_MATH = YES; PRODUCT_BUNDLE_IDENTIFIER = com.lollipopkit.toolbox.StatusWidget; @@ -818,7 +818,7 @@ CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 654; + CURRENT_PROJECT_VERSION = 660; DEVELOPMENT_TEAM = BA88US33G6; GCC_C_LANGUAGE_STANDARD = gnu11; GENERATE_INFOPLIST_FILE = YES; @@ -831,7 +831,7 @@ "@executable_path/Frameworks", "@executable_path/../../Frameworks", ); - MARKETING_VERSION = 1.0.654; + MARKETING_VERSION = 1.0.660; MTL_FAST_MATH = YES; PRODUCT_BUNDLE_IDENTIFIER = com.lollipopkit.toolbox.StatusWidget; PRODUCT_NAME = "$(TARGET_NAME)"; @@ -854,7 +854,7 @@ CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 654; + CURRENT_PROJECT_VERSION = 660; DEVELOPMENT_TEAM = BA88US33G6; GCC_C_LANGUAGE_STANDARD = gnu11; GENERATE_INFOPLIST_FILE = YES; @@ -867,7 +867,7 @@ "@executable_path/Frameworks", "@executable_path/../../Frameworks", ); - MARKETING_VERSION = 1.0.654; + MARKETING_VERSION = 1.0.660; MTL_FAST_MATH = YES; PRODUCT_BUNDLE_IDENTIFIER = com.lollipopkit.toolbox.StatusWidget; PRODUCT_NAME = "$(TARGET_NAME)"; @@ -890,7 +890,7 @@ CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 654; + CURRENT_PROJECT_VERSION = 660; DEVELOPMENT_ASSET_PATHS = ""; DEVELOPMENT_TEAM = BA88US33G6; ENABLE_PREVIEWS = YES; @@ -902,7 +902,7 @@ "$(inherited)", "@executable_path/Frameworks", ); - MARKETING_VERSION = 1.0.654; + MARKETING_VERSION = 1.0.660; MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; MTL_FAST_MATH = YES; PRODUCT_BUNDLE_IDENTIFIER = com.lollipopkit.toolbox.WatchEnd; @@ -931,7 +931,7 @@ CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 654; + CURRENT_PROJECT_VERSION = 660; DEVELOPMENT_ASSET_PATHS = ""; DEVELOPMENT_TEAM = BA88US33G6; ENABLE_PREVIEWS = YES; @@ -943,7 +943,7 @@ "$(inherited)", "@executable_path/Frameworks", ); - MARKETING_VERSION = 1.0.654; + MARKETING_VERSION = 1.0.660; MTL_FAST_MATH = YES; PRODUCT_BUNDLE_IDENTIFIER = com.lollipopkit.toolbox.WatchEnd; PRODUCT_NAME = ServerBox; @@ -969,7 +969,7 @@ CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 654; + CURRENT_PROJECT_VERSION = 660; DEVELOPMENT_ASSET_PATHS = ""; DEVELOPMENT_TEAM = BA88US33G6; ENABLE_PREVIEWS = YES; @@ -981,7 +981,7 @@ "$(inherited)", "@executable_path/Frameworks", ); - MARKETING_VERSION = 1.0.654; + MARKETING_VERSION = 1.0.660; MTL_FAST_MATH = YES; PRODUCT_BUNDLE_IDENTIFIER = com.lollipopkit.toolbox.WatchEnd; PRODUCT_NAME = ServerBox; diff --git a/lib/core/persistant_store.dart b/lib/core/persistant_store.dart index 2262557e..d9bda710 100644 --- a/lib/core/persistant_store.dart +++ b/lib/core/persistant_store.dart @@ -43,7 +43,6 @@ class PersistentStore { //encryptionCipher: SecureStore._cipher, ); - /// Get all db filenames. /// /// - [suffixs] defaults to ['.hive'] @@ -69,7 +68,6 @@ class PersistentStore { files.map((e) => e.path.replaceFirst('$docPath/', '')).toList(); return paths; } - } extension BoxX on Box { diff --git a/lib/core/utils/sync/webdav.dart b/lib/core/utils/sync/webdav.dart index 5ea7edab..418a552f 100644 --- a/lib/core/utils/sync/webdav.dart +++ b/lib/core/utils/sync/webdav.dart @@ -16,6 +16,17 @@ abstract final class Webdav { pwd: Stores.setting.webdavPwd.fetch(), ); + static Future test(String url, String user, String pwd) async { + final client = WebdavClient(url: url, user: user, pwd: pwd); + try { + await client.ping(); + return null; + } catch (e, s) { + Loggers.app.warning('Webdav test failed', e, s); + return e.toString(); + } + } + static Future upload({ required String relativePath, String? localPath, diff --git a/lib/data/model/app/error.dart b/lib/data/model/app/error.dart index 27004691..0a8c4f00 100644 --- a/lib/data/model/app/error.dart +++ b/lib/data/model/app/error.dart @@ -6,7 +6,8 @@ enum ErrFrom { ssh, status, icloud, - webdav,; + webdav, + ; } abstract class Err { @@ -73,7 +74,8 @@ class ICloudErr extends Err { enum WebdavErrType { generic, - notFound,; + notFound, + ; } class WebdavErr extends Err { diff --git a/lib/data/model/app/remote_storage.dart b/lib/data/model/app/remote_storage.dart deleted file mode 100644 index 3cc15a0b..00000000 --- a/lib/data/model/app/remote_storage.dart +++ /dev/null @@ -1,13 +0,0 @@ -abstract class RemoteStorage { - Future upload({ - required String relativePath, - String? localPath - }); - - Future download({ - required String relativePath, - String? localPath - }); - - Future delete(String relativePath); -} diff --git a/lib/data/res/build_data.dart b/lib/data/res/build_data.dart index 61a4cd70..a244145e 100644 --- a/lib/data/res/build_data.dart +++ b/lib/data/res/build_data.dart @@ -2,9 +2,9 @@ class BuildData { static const String name = "ServerBox"; - static const int build = 654; + static const int build = 660; static const String engine = "3.16.2"; - static const String buildAt = "2023-12-02 00:21:29"; - static const int modifications = 2; + static const String buildAt = "2023-12-04 13:43:20"; + static const int modifications = 11; static const int script = 31; } diff --git a/lib/l10n/app_de.arb b/lib/l10n/app_de.arb index 135b96a7..01033bf7 100644 --- a/lib/l10n/app_de.arb +++ b/lib/l10n/app_de.arb @@ -218,6 +218,7 @@ "tag": "Tags", "temperature": "Temperatur", "terminal": "Terminal", + "test": "Prüfung", "theme": "Themen", "themeMode": "Themen-Modus", "times": "x", diff --git a/lib/l10n/app_en.arb b/lib/l10n/app_en.arb index 188d048a..5e10a1e1 100644 --- a/lib/l10n/app_en.arb +++ b/lib/l10n/app_en.arb @@ -218,6 +218,7 @@ "tag": "Tags", "temperature": "Temperature", "terminal": "Terminal", + "test": "Test", "theme": "Theme", "themeMode": "Theme mode", "times": "Times", diff --git a/lib/l10n/app_id.arb b/lib/l10n/app_id.arb index 94961af1..249ae33e 100644 --- a/lib/l10n/app_id.arb +++ b/lib/l10n/app_id.arb @@ -218,6 +218,7 @@ "tag": "Tag", "temperature": "Suhu", "terminal": "Terminal", + "test": "pengujian", "theme": " Tema", "themeMode": "Mode tema", "times": "Waktu", diff --git a/lib/l10n/app_zh.arb b/lib/l10n/app_zh.arb index 5c909ae9..e053b6fd 100644 --- a/lib/l10n/app_zh.arb +++ b/lib/l10n/app_zh.arb @@ -218,6 +218,7 @@ "tag": "标签", "temperature": "温度", "terminal": "终端", + "test": "测试", "theme": "主题", "themeMode": "主题模式", "times": "次", diff --git a/lib/l10n/app_zh_tw.arb b/lib/l10n/app_zh_tw.arb index 1f68b667..b9c348fc 100644 --- a/lib/l10n/app_zh_tw.arb +++ b/lib/l10n/app_zh_tw.arb @@ -218,6 +218,7 @@ "tag": "标签", "temperature": "溫度", "terminal": "终端機", + "test": "測試", "theme": "主題", "themeMode": "主題模式", "times": "次", diff --git a/lib/view/page/backup.dart b/lib/view/page/backup.dart index 7680421c..5bbbf36c 100644 --- a/lib/view/page/backup.dart +++ b/lib/view/page/backup.dart @@ -119,9 +119,8 @@ class BackupPage extends StatelessWidget { TextButton( onPressed: () async { await backup.restore(force: true); - Pros.reload(); context.pop(); - RebuildNodes.app.rebuild(); + _reload(); }, child: Text(l10n.ok), ), @@ -156,6 +155,7 @@ class BackupPage extends StatelessWidget { icloudLoading.value = true; await ICloud.sync(); icloudLoading.value = false; + _reload(); } }, ), @@ -195,6 +195,7 @@ class BackupPage extends StatelessWidget { await compute(Backup.fromJsonString, dlFile); await dlBak.restore(force: true); icloudLoading.value = false; + _reload(); }, child: Text(l10n.download), ), @@ -251,7 +252,8 @@ class BackupPage extends StatelessWidget { mainAxisSize: MainAxisSize.min, children: [ Input( - label: 'url', + label: 'URL', + hint: 'https://example.com/webdav/', controller: urlCtrl, ), Input( @@ -271,6 +273,21 @@ class BackupPage extends StatelessWidget { }, child: Text(l10n.ok), ), + TextButton( + onPressed: () async { + final result = await Webdav.test( + urlCtrl.text, + userCtrl.text, + pwdCtrl.text, + ); + if (result == null) { + context.showSnackBar(l10n.success); + } else { + context.showSnackBar(result); + } + }, + child: Text(l10n.test), + ), ], ); if (result == true) { @@ -294,6 +311,7 @@ class BackupPage extends StatelessWidget { webdavLoading.value = true; await Webdav.sync(); webdavLoading.value = false; + _reload(); } }, ), @@ -334,6 +352,7 @@ class BackupPage extends StatelessWidget { await compute(Backup.fromJsonString, dlFile); await dlBak.restore(force: true); webdavLoading.value = false; + _reload(); }, child: Text(l10n.download), ), @@ -363,4 +382,9 @@ class BackupPage extends StatelessWidget { ), ); } + + void _reload() { + Pros.reload(); + RebuildNodes.app.rebuild(); + } } diff --git a/lib/view/page/editor.dart b/lib/view/page/editor.dart index cc5f333d..4bd69d95 100644 --- a/lib/view/page/editor.dart +++ b/lib/view/page/editor.dart @@ -2,6 +2,7 @@ import 'dart:async'; import 'dart:io'; import 'package:code_text_field/code_text_field.dart'; +import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:flutter_highlight/theme_map.dart'; import 'package:flutter_highlight/themes/a11y-light.dart'; @@ -64,15 +65,25 @@ class _EditorPageState extends State { language: Highlights.all[_langCode], ); - /// TODO: This is a temporary solution to avoid the loading stuck - Future.delayed(const Duration(milliseconds: 377)).then((value) async { - if (widget.path != null) { - final code = await File(widget.path!).readAsString(); - _controller.text = code; - } else if (widget.text != null) { - _controller.text = widget.text!; - } - }); + if (_langCode == null) { + _setupCtrl(); + } else { + Future.delayed(const Duration(milliseconds: 377)).then( + (value) async => await _setupCtrl(), + ); + } + } + + Future _setupCtrl() async { + if (widget.path != null) { + final code = await compute( + (path) async => await File(path).readAsString(), + widget.path!, + ); + _controller.text = code; + } else if (widget.text != null) { + _controller.text = widget.text!; + } } @override