fix & opt.

- fix: `sftpGoPath`
- opt.: `PersistentStore.toJson`
- rm: `first` store
- opt.: log print
This commit is contained in:
lollipopkit
2023-10-27 18:13:02 +08:00
parent 6579190ae4
commit 92bb653e81
14 changed files with 38 additions and 51 deletions

View File

@@ -39,6 +39,9 @@ class PersistentStore<E> {
files.map((e) => e.path.replaceFirst('$docPath/', '')).toList(); files.map((e) => e.path.replaceFirst('$docPath/', '')).toList();
return paths; return paths;
} }
/// Convert db to json
Map<String, dynamic> toJson() => {for (var e in box.keys) e: box.get(e)};
} }
abstract class StorePropertyBase<T> { abstract class StorePropertyBase<T> {

View File

@@ -60,11 +60,11 @@ class Backup {
spis = Stores.server.fetch(), spis = Stores.server.fetch(),
snippets = Stores.snippet.fetch(), snippets = Stores.snippet.fetch(),
keys = Stores.key.fetch(), keys = Stores.key.fetch(),
dockerHosts = Stores.docker.fetchAll(), dockerHosts = Stores.docker.toJson(),
settings = Stores.setting.toJson(); settings = Stores.setting.toJson();
static Future<String> backup() async { static Future<String> backup() async {
final result = _diyEncrtpt(json.encode(Backup.loadFromStore())); final result = _diyEncrypt(json.encode(Backup.loadFromStore()));
final path = await Paths.bak; final path = await Paths.bak;
await File(path).writeAsString(result); await File(path).writeAsString(result);
return path; return path;
@@ -95,7 +95,7 @@ class Backup {
: this.fromJson(json.decode(_diyDecrypt(raw))); : this.fromJson(json.decode(_diyDecrypt(raw)));
} }
String _diyEncrtpt(String raw) => json.encode( String _diyEncrypt(String raw) => json.encode(
raw.codeUnits.map((e) => e * 2 + 1).toList(growable: false), raw.codeUnits.map((e) => e * 2 + 1).toList(growable: false),
); );

View File

@@ -68,7 +68,9 @@ enum PkgManager {
list.removeWhere((element) => element.isEmpty); list.removeWhere((element) => element.isEmpty);
final endLine = list.lastIndexWhere( final endLine = list.lastIndexWhere(
(element) => element.contains('Obsoleting Packages')); (element) => element.contains('Obsoleting Packages'));
if (endLine != -1 && list.isNotEmpty) {
list = list.sublist(0, endLine); list = list.sublist(0, endLine);
}
break; break;
case PkgManager.apt: case PkgManager.apt:
// avoid other outputs // avoid other outputs

View File

@@ -3,6 +3,7 @@ import 'package:logging/logging.dart';
class Loggers { class Loggers {
const Loggers._(); const Loggers._();
static final root = Logger('Root');
static final app = Logger('App'); static final app = Logger('App');
static final parse = Logger('Parse'); static final parse = Logger('Parse');
} }

View File

@@ -1,6 +1,5 @@
import 'package:toolbox/core/persistant_store.dart'; import 'package:toolbox/core/persistant_store.dart';
import 'package:toolbox/data/store/docker.dart'; import 'package:toolbox/data/store/docker.dart';
import 'package:toolbox/data/store/first.dart';
import 'package:toolbox/data/store/history.dart'; import 'package:toolbox/data/store/history.dart';
import 'package:toolbox/data/store/private_key.dart'; import 'package:toolbox/data/store/private_key.dart';
import 'package:toolbox/data/store/server.dart'; import 'package:toolbox/data/store/server.dart';
@@ -17,7 +16,6 @@ class Stores {
static final history = locator<HistoryStore>(); static final history = locator<HistoryStore>();
static final key = locator<PrivateKeyStore>(); static final key = locator<PrivateKeyStore>();
static final snippet = locator<SnippetStore>(); static final snippet = locator<SnippetStore>();
static final first = locator<FirstStore>();
static final List<PersistentStore> all = [ static final List<PersistentStore> all = [
setting, setting,
@@ -26,6 +24,5 @@ class Stores {
history, history,
key, key,
snippet, snippet,
first,
]; ];
} }

View File

@@ -10,8 +10,4 @@ class DockerStore extends PersistentStore<String> {
void put(String id, String host) { void put(String id, String host) {
box.put(id, host); box.put(id, host);
} }
Map<String, String> fetchAll() {
return box.toMap().cast<String, String>();
}
} }

View File

@@ -1,9 +0,0 @@
import 'package:toolbox/core/persistant_store.dart';
/// It stores whether is the first time of some.
class FirstStore extends PersistentStore<bool> {
FirstStore() : super('first');
/// Show tip of suspend
late final showSuspendTip = StoreProperty(box, 'showSuspendTip', true);
}

View File

@@ -1,12 +1,9 @@
import 'package:hive_flutter/hive_flutter.dart'; import 'package:hive_flutter/hive_flutter.dart';
import 'package:toolbox/core/persistant_store.dart'; import 'package:toolbox/core/persistant_store.dart';
typedef _HistoryList = List<String>;
typedef _HistoryMap = Map<String, String>;
/// index from 0 -> n : latest -> oldest /// index from 0 -> n : latest -> oldest
class _ListHistory { class _ListHistory {
final _HistoryList _history; final List _history;
final String _name; final String _name;
final Box _box; final Box _box;
@@ -15,7 +12,7 @@ class _ListHistory {
required String name, required String name,
}) : _box = box, }) : _box = box,
_name = name, _name = name,
_history = box.get(name, defaultValue: <String>[])!; _history = box.get(name, defaultValue: [])!;
void add(String path) { void add(String path) {
_history.remove(path); _history.remove(path);
@@ -23,11 +20,11 @@ class _ListHistory {
_box.put(_name, _history); _box.put(_name, _history);
} }
_HistoryList get all => _history; List get all => _history;
} }
class _MapHistory { class _MapHistory {
final _HistoryMap _history; final Map _history;
final String _name; final String _name;
final Box _box; final Box _box;
@@ -36,7 +33,7 @@ class _MapHistory {
required String name, required String name,
}) : _box = box, }) : _box = box,
_name = name, _name = name,
_history = box.get(name, defaultValue: <String, String>{})!; _history = box.get(name, defaultValue: <dynamic, dynamic>{})!;
void put(String id, String val) { void put(String id, String val) {
_history[id] = val; _history[id] = val;

View File

@@ -8,9 +8,6 @@ import '../res/default.dart';
class SettingStore extends PersistentStore { class SettingStore extends PersistentStore {
SettingStore() : super('setting'); SettingStore() : super('setting');
/// Convert all settings into json
Map<String, dynamic> toJson() => {for (var e in box.keys) e: box.get(e)};
// ------BEGIN------ // ------BEGIN------
// //
// These settings are not displayed in the settings page // These settings are not displayed in the settings page
@@ -220,6 +217,9 @@ class SettingStore extends PersistentStore {
/// Open SFTP with last viewed path /// Open SFTP with last viewed path
late final sftpOpenLastPath = StoreProperty(box, 'sftpOpenLastPath', true); late final sftpOpenLastPath = StoreProperty(box, 'sftpOpenLastPath', true);
/// Show tip of suspend
late final showSuspendTip = StoreProperty(box, 'showSuspendTip', true);
// Never show these settings for users // Never show these settings for users
// //
// ------BEGIN------ // ------BEGIN------

View File

@@ -1,5 +1,4 @@
import 'package:get_it/get_it.dart'; import 'package:get_it/get_it.dart';
import 'package:toolbox/data/store/first.dart';
import 'data/provider/app.dart'; import 'data/provider/app.dart';
import 'data/provider/debug.dart'; import 'data/provider/debug.dart';
@@ -58,10 +57,6 @@ Future<void> _setupLocatorForStores() async {
final history = HistoryStore(); final history = HistoryStore();
await history.init(); await history.init();
locator.registerSingleton(history); locator.registerSingleton(history);
final first = FirstStore();
await first.init();
locator.registerSingleton(first);
} }
Future<void> setupLocator() async { Future<void> setupLocator() async {

View File

@@ -8,6 +8,7 @@ import 'package:provider/provider.dart';
import 'package:shared_preferences/shared_preferences.dart'; import 'package:shared_preferences/shared_preferences.dart';
import 'package:toolbox/core/channel/bg_run.dart'; import 'package:toolbox/core/channel/bg_run.dart';
import 'package:toolbox/core/utils/platform/base.dart'; import 'package:toolbox/core/utils/platform/base.dart';
import 'package:toolbox/data/res/logger.dart';
import 'package:toolbox/data/res/provider.dart'; import 'package:toolbox/data/res/provider.dart';
import 'package:toolbox/data/res/store.dart'; import 'package:toolbox/data/res/store.dart';
@@ -59,7 +60,10 @@ void _runInZone(void Function() body) {
runZonedGuarded( runZonedGuarded(
body, body,
(obj, trace) => Analysis.recordException(trace), (obj, trace) {
Analysis.recordException(trace);
Loggers.root.warning(obj, trace);
},
zoneSpecification: zoneSpec, zoneSpecification: zoneSpec,
); );
} }
@@ -94,7 +98,7 @@ void _setupProviders() {
Future<void> _initHive() async { Future<void> _initHive() async {
await Hive.initFlutter(); await Hive.initFlutter();
// typeId 为顺序 // Ordered by typeId
Hive.registerAdapter(PrivateKeyInfoAdapter()); // 1 Hive.registerAdapter(PrivateKeyInfoAdapter()); // 1
Hive.registerAdapter(SnippetAdapter()); // 2 Hive.registerAdapter(SnippetAdapter()); // 2
Hive.registerAdapter(ServerPrivateInfoAdapter()); // 3 Hive.registerAdapter(ServerPrivateInfoAdapter()); // 3

View File

@@ -44,13 +44,13 @@ class BackupPage extends StatelessWidget {
return ListView( return ListView(
padding: const EdgeInsets.all(17), padding: const EdgeInsets.all(17),
children: [ children: [
if (isMacOS || isIOS) _buildIcloudSync(context), if (isMacOS || isIOS) _buildIcloud(context),
_buildManual(context), _buildFile(context),
], ],
); );
} }
Widget _buildManual(BuildContext context) { Widget _buildFile(BuildContext context) {
return CardX( return CardX(
ExpandTile( ExpandTile(
title: Text(l10n.files), title: Text(l10n.files),
@@ -75,7 +75,7 @@ class BackupPage extends StatelessWidget {
); );
} }
Widget _buildIcloudSync(BuildContext context) { Widget _buildIcloud(BuildContext context) {
return CardX( return CardX(
ExpandTile( ExpandTile(
title: const Text('iCloud'), title: const Text('iCloud'),
@@ -109,8 +109,8 @@ class BackupPage extends StatelessWidget {
if (icloudLoading.value) { if (icloudLoading.value) {
return UIs.centerSizedLoadingSmall; return UIs.centerSizedLoadingSmall;
} }
return SizedBox( return ConstrainedBox(
width: 120, constraints: const BoxConstraints(maxWidth: 137),
child: Row( child: Row(
children: [ children: [
TextButton( TextButton(
@@ -153,7 +153,6 @@ class BackupPage extends StatelessWidget {
/// Issue #188 /// Issue #188
if (isWindows) { if (isWindows) {
await Shares.text(await File(path).readAsString()); await Shares.text(await File(path).readAsString());
} else { } else {
await Shares.files([path]); await Shares.files([path]);
} }
@@ -195,10 +194,10 @@ class BackupPage extends StatelessWidget {
), ),
TextButton( TextButton(
onPressed: () async { onPressed: () async {
backup.restore(); await backup.restore();
Pros.reload();
context.pop(); context.pop();
RebuildNodes.app.rebuild(); RebuildNodes.app.rebuild();
Pros.reload();
}, },
child: Text(l10n.ok), child: Text(l10n.ok),
), ),

View File

@@ -247,12 +247,12 @@ class _ServerPageState extends State<ServerPage>
IconButton( IconButton(
onPressed: () => _askFor( onPressed: () => _askFor(
func: () async { func: () async {
if (Stores.first.showSuspendTip.fetch()) { if (Stores.setting.showSuspendTip.fetch()) {
await context.showRoundDialog( await context.showRoundDialog(
title: Text(l10n.attention), title: Text(l10n.attention),
child: Text(l10n.suspendTip), child: Text(l10n.suspendTip),
); );
Stores.first.showSuspendTip.put(false); Stores.setting.showSuspendTip.put(false);
} }
srv.client?.execWithPwd( srv.client?.execWithPwd(
ShellFunc.suspend.exec, ShellFunc.suspend.exec,

View File

@@ -208,8 +208,10 @@ class _SftpPageState extends State<SftpPage> with AfterLayoutMixin {
if (!Stores.setting.recordHistory.fetch()) { if (!Stores.setting.recordHistory.fetch()) {
return []; return [];
} }
return Stores.history.sftpGoPath.all.where( return List<String>.from(
Stores.history.sftpGoPath.all.where(
(element) => element.contains(val.text), (element) => element.contains(val.text),
),
); );
}, },
fieldViewBuilder: (_, controller, node, __) { fieldViewBuilder: (_, controller, node, __) {