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();
return paths;
}
/// Convert db to json
Map<String, dynamic> toJson() => {for (var e in box.keys) e: box.get(e)};
}
abstract class StorePropertyBase<T> {

View File

@@ -60,11 +60,11 @@ class Backup {
spis = Stores.server.fetch(),
snippets = Stores.snippet.fetch(),
keys = Stores.key.fetch(),
dockerHosts = Stores.docker.fetchAll(),
dockerHosts = Stores.docker.toJson(),
settings = Stores.setting.toJson();
static Future<String> backup() async {
final result = _diyEncrtpt(json.encode(Backup.loadFromStore()));
final result = _diyEncrypt(json.encode(Backup.loadFromStore()));
final path = await Paths.bak;
await File(path).writeAsString(result);
return path;
@@ -95,7 +95,7 @@ class Backup {
: 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),
);

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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