mirror of
https://github.com/lollipopkit/flutter_server_box.git
synced 2025-12-17 07:14:28 +01:00
fix & opt.
- fix: `sftpGoPath` - opt.: `PersistentStore.toJson` - rm: `first` store - opt.: log print
This commit is contained in:
@@ -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> {
|
||||
|
||||
@@ -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),
|
||||
);
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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');
|
||||
}
|
||||
|
||||
@@ -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,
|
||||
];
|
||||
}
|
||||
|
||||
@@ -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>();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
@@ -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;
|
||||
|
||||
@@ -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------
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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),
|
||||
),
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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, __) {
|
||||
|
||||
Reference in New Issue
Block a user