diff --git a/README.md b/README.md index 5d3bcc33..cdeabe85 100644 --- a/README.md +++ b/README.md @@ -31,7 +31,7 @@ Especially thanks to dartss Platform | Support | Sign --- | --- | --- [iOS](https://apps.apple.com/app/id1586449703) / [Android](https://res.lolli.tech/serverbox/latest.apk) / [macOS](https://apps.apple.com/app/id1586449703) | Full | Signed with my own certificate -[Linux](https://res.lolli.tech/serverbox/latest.AppImage) / [Windows](https://res.lolli.tech/serverbox/latest.7z) | Not tested | signed with flutter default certificate. It's advised to build your own version. +[Linux](https://res.lolli.tech/serverbox/latest.AppImage) / [Windows](https://res.lolli.tech/serverbox/latest.7z) | Not tested | Signed with flutter default certificate. It's advised to build your own version. Due to Chinese government policy and the [BEIAN](https://github.com/lollipopkit/flutter_server_box/discussions/180) issue. iOS app is now free. Please download it from other regions of AppStore. diff --git a/lib/view/page/docker.dart b/lib/view/page/docker.dart index 04b66624..8497686a 100644 --- a/lib/view/page/docker.dart +++ b/lib/view/page/docker.dart @@ -8,6 +8,7 @@ import 'package:toolbox/core/route.dart'; import 'package:toolbox/data/model/docker/image.dart'; import 'package:toolbox/data/res/provider.dart'; import 'package:toolbox/data/res/store.dart'; +import 'package:toolbox/view/widget/expand_tile.dart'; import 'package:toolbox/view/widget/input_field.dart'; import '../../data/model/docker/ps.dart'; @@ -220,17 +221,14 @@ class _DockerManagePageState extends State { } Widget _buildImage() { - final items = [ - ListTile( - title: Text(l10n.imagesList), - subtitle: Text( - l10n.dockerImagesFmt(Pros.docker.images!.length), - style: UIs.textGrey, - ), + return ExpandTile( + title: Text(l10n.imagesList), + subtitle: Text( + l10n.dockerImagesFmt(Pros.docker.images!.length), + style: UIs.textGrey, ), - ]; - items.addAll(Pros.docker.images!.map(_buildImageItem)); - return Column(children: items); + children: Pros.docker.images?.map(_buildImageItem).toList() ?? [], + ); } Widget _buildImageItem(DockerImage e) { diff --git a/lib/view/page/setting/entry.dart b/lib/view/page/setting/entry.dart index 646c2d28..c80f309e 100644 --- a/lib/view/page/setting/entry.dart +++ b/lib/view/page/setting/entry.dart @@ -15,6 +15,7 @@ import 'package:toolbox/core/utils/platform/base.dart'; import 'package:toolbox/core/utils/rebuild.dart'; import 'package:toolbox/data/res/provider.dart'; import 'package:toolbox/data/res/store.dart'; +import 'package:toolbox/view/widget/expand_tile.dart'; import '../../../core/persistant_store.dart'; import '../../../core/route.dart'; @@ -916,29 +917,24 @@ class _SettingPageState extends State { } Widget _buildServerOrder() { - return ListTile( + return ExpandTile( title: Text(l10n.serverOrder), - subtitle: Text('${l10n.serverOrder} / ${l10n.serverDetailOrder}', - style: UIs.textGrey), - trailing: const Icon(Icons.keyboard_arrow_right), - onTap: () => context.showRoundDialog( - title: Text(l10n.choose), - child: Column( - mainAxisSize: MainAxisSize.min, - children: [ - ListTile( - title: Text(l10n.serverOrder), - trailing: const Icon(Icons.keyboard_arrow_right), - onTap: () => AppRoute.serverOrder().go(context), - ), - ListTile( - title: Text(l10n.serverDetailOrder), - trailing: const Icon(Icons.keyboard_arrow_right), - onTap: () => AppRoute.serverDetailOrder().go(context), - ), - ], - ), + subtitle: Text( + '${l10n.serverOrder} / ${l10n.serverDetailOrder}', + style: UIs.textGrey, ), + children: [ + ListTile( + title: Text(l10n.serverOrder), + trailing: const Icon(Icons.keyboard_arrow_right), + onTap: () => AppRoute.serverOrder().go(context), + ), + ListTile( + title: Text(l10n.serverDetailOrder), + trailing: const Icon(Icons.keyboard_arrow_right), + onTap: () => AppRoute.serverDetailOrder().go(context), + ), + ], ); } diff --git a/lib/view/page/setting/ios.dart b/lib/view/page/setting/ios.dart index 00665fdf..976d648e 100644 --- a/lib/view/page/setting/ios.dart +++ b/lib/view/page/setting/ios.dart @@ -69,7 +69,6 @@ class _IOSSettingsPageState extends State { future: getToken(), loading: Text(l10n.gettingToken), error: (error, trace) => Text('${l10n.error}: $error'), - noData: Text(l10n.nullToken), success: (text) { _pushToken.value = text; return Text( @@ -120,7 +119,6 @@ class _IOSSettingsPageState extends State { onTap: () async => _onTapWatchApp(ctx), ); }, - noData: UIs.placeholder, ); } diff --git a/lib/view/page/setting/platform_pub.dart b/lib/view/page/setting/platform_pub.dart index fa9434f0..906702fc 100644 --- a/lib/view/page/setting/platform_pub.dart +++ b/lib/view/page/setting/platform_pub.dart @@ -21,9 +21,13 @@ class PlatformPublicSettings { success: (can) { return ListTile( title: Text(l10n.bioAuth), - subtitle: - can ? null : const Text('Not available', style: UIs.textGrey), - trailing: can + subtitle: can == true + ? null + : const Text( + 'Not available', + style: UIs.textGrey, + ), + trailing: can == true ? StoreSwitch( prop: Stores.setting.useBioAuth, func: (val) async { @@ -42,7 +46,6 @@ class PlatformPublicSettings { : null, ); }, - noData: UIs.placeholder, ); } } diff --git a/lib/view/page/storage/sftp.dart b/lib/view/page/storage/sftp.dart index 32fdc6aa..68f64773 100644 --- a/lib/view/page/storage/sftp.dart +++ b/lib/view/page/storage/sftp.dart @@ -208,7 +208,7 @@ class _SftpPageState extends State with AfterLayoutMixin { if (!Stores.setting.recordHistory.fetch()) { return []; } - return Stores.history.sftpPath.all.where( + return Stores.history.sftpGoPath.all.where( (element) => element.contains(val.text), ); }, @@ -232,7 +232,7 @@ class _SftpPageState extends State with AfterLayoutMixin { _status.path?.update(p); final suc = await _listDir(); if (suc && Stores.setting.recordHistory.fetch()) { - Stores.history.sftpPath.add(p); + Stores.history.sftpGoPath.add(p); } }, icon: const Icon(Icons.gps_fixed), diff --git a/lib/view/widget/expand_tile.dart b/lib/view/widget/expand_tile.dart new file mode 100644 index 00000000..cbf02457 --- /dev/null +++ b/lib/view/widget/expand_tile.dart @@ -0,0 +1,12 @@ +import 'package:flutter/material.dart'; + +const _shape = Border(); + +class ExpandTile extends ExpansionTile { + const ExpandTile({ + super.key, + required super.title, + super.children, + super.subtitle, + }) : super(shape: _shape, collapsedShape: _shape); +} diff --git a/lib/view/widget/future_widget.dart b/lib/view/widget/future_widget.dart index 72d87f06..1629cf1b 100644 --- a/lib/view/widget/future_widget.dart +++ b/lib/view/widget/future_widget.dart @@ -1,26 +1,25 @@ import 'package:flutter/material.dart'; +import 'package:toolbox/data/res/ui.dart'; class FutureWidget extends StatelessWidget { final Future future; final Widget loading; final Widget Function(Object? error, StackTrace? trace) error; - final Widget Function(T data) success; - final Widget noData; + final Widget Function(T? data) success; final Widget Function(AsyncSnapshot snapshot)? active; const FutureWidget({ super.key, required this.future, - required this.loading, + this.loading = UIs.placeholder, required this.error, required this.success, - required this.noData, this.active, }); @override Widget build(BuildContext context) { - return FutureBuilder( + return FutureBuilder( future: future, builder: (context, snapshot) { if (snapshot.hasError) { @@ -36,10 +35,7 @@ class FutureWidget extends StatelessWidget { } return loading; case ConnectionState.done: - if (snapshot.hasData) { - return success(snapshot.data as T); - } - return noData; + return success(snapshot.data); } }, ); diff --git a/macos/Podfile b/macos/Podfile index b52666a1..c60870ef 100644 --- a/macos/Podfile +++ b/macos/Podfile @@ -31,9 +31,9 @@ target 'Runner' do use_modular_headers! flutter_install_all_macos_pods File.dirname(File.realpath(__FILE__)) - target 'RunnerTests' do - inherit! :search_paths - end + # target 'RunnerTests' do + # inherit! :search_paths + # end end post_install do |installer| diff --git a/macos/Podfile.lock b/macos/Podfile.lock index 8a23bebf..d9d0c1ad 100644 --- a/macos/Podfile.lock +++ b/macos/Podfile.lock @@ -55,6 +55,6 @@ SPEC CHECKSUMS: shared_preferences_foundation: 5b919d13b803cadd15ed2dc053125c68730e5126 url_launcher_macos: d2691c7dd33ed713bf3544850a623080ec693d95 -PODFILE CHECKSUM: 9ebaf0ce3d369aaa26a9ea0e159195ed94724cf3 +PODFILE CHECKSUM: 8cdf29216ea1ab6b9743188287968d22b4579c1d COCOAPODS: 1.13.0 diff --git a/macos/Runner.xcodeproj/project.pbxproj b/macos/Runner.xcodeproj/project.pbxproj index e49e5e47..c2c0baee 100644 --- a/macos/Runner.xcodeproj/project.pbxproj +++ b/macos/Runner.xcodeproj/project.pbxproj @@ -55,7 +55,6 @@ /* Begin PBXFileReference section */ 0CA3C900AA7C73CA8287C8EB /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; 15AF97DF993E8968098D6EBE /* Pods-RunnerTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.release.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.release.xcconfig"; sourceTree = ""; }; - 331C80D7294CF71000263BE5 /* RunnerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RunnerTests.swift; sourceTree = ""; }; 333000ED22D3DE5D00554162 /* Warnings.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Warnings.xcconfig; sourceTree = ""; }; 335BBD1A22A9A15E00E9071D /* GeneratedPluginRegistrant.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GeneratedPluginRegistrant.swift; sourceTree = ""; }; 33CC10ED2044A3C60003C045 /* server_box.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = server_box.app; sourceTree = BUILT_PRODUCTS_DIR; }; @@ -93,14 +92,6 @@ /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ - 331C80D6294CF71000263BE5 /* RunnerTests */ = { - isa = PBXGroup; - children = ( - 331C80D7294CF71000263BE5 /* RunnerTests.swift */, - ); - path = RunnerTests; - sourceTree = ""; - }; 33BA886A226E78AF003329D5 /* Configs */ = { isa = PBXGroup; children = ( @@ -117,7 +108,6 @@ children = ( 33FAB671232836740065AC1E /* Runner */, 33CEB47122A05771004F2AC0 /* Flutter */, - 331C80D6294CF71000263BE5 /* RunnerTests */, 33CC10EE2044A3C60003C045 /* Products */, D73912EC22F37F3D000D13A0 /* Frameworks */, D29F91BB271305884DC23479 /* Pods */, diff --git a/macos/Runner/Info.plist b/macos/Runner/Info.plist index bbf8b421..4789daa6 100644 --- a/macos/Runner/Info.plist +++ b/macos/Runner/Info.plist @@ -28,7 +28,5 @@ MainMenu NSPrincipalClass NSApplication - LSApplicationCategoryType - public.app-category.developer-tools