opt.: migrate fl_lib

This commit is contained in:
lollipopkit
2024-05-14 22:29:37 +08:00
parent 248430e5b0
commit 04dfede535
136 changed files with 686 additions and 3896 deletions

View File

@@ -1,13 +1,11 @@
import 'dart:convert';
import 'dart:io';
import 'package:fl_lib/fl_lib.dart';
import 'package:logging/logging.dart';
import 'package:toolbox/core/persistant_store.dart';
import 'package:toolbox/data/model/server/private_key_info.dart';
import 'package:toolbox/data/model/server/server_private_info.dart';
import 'package:toolbox/data/model/server/snippet.dart';
import 'package:toolbox/data/res/logger.dart';
import 'package:toolbox/data/res/path.dart';
import 'package:toolbox/data/res/provider.dart';
import 'package:toolbox/data/res/rebuild.dart';
import 'package:toolbox/data/res/store.dart';
@@ -76,7 +74,7 @@ class Backup {
static Future<String> backup([String? name]) async {
final result = _diyEncrypt(json.encode(Backup.loadFromStore().toJson()));
final path = '${await Paths.doc}/${name ?? Paths.bakName}';
final path = '${Paths.doc}/${name ?? 'srvbox_bak.json'}';
await File(path).writeAsString(result);
return path;
}

View File

@@ -1,14 +0,0 @@
import 'package:flutter/widgets.dart';
import 'package:toolbox/core/extension/context/common.dart';
class DynamicColor {
/// 白天模式显示的颜色
final Color light;
/// 暗黑模式显示的颜色
final Color dark;
const DynamicColor(this.light, this.dark);
Color resolve(BuildContext context) => context.isDark ? dark : light;
}

View File

@@ -1,15 +1,18 @@
import 'package:flutter/material.dart';
abstract class PopMenu {
static PopupMenuItem<T> build<T>(T t, IconData icon, String text) {
static PopupMenuItem<T> build<T>(
T t,
IconData icon,
String text, {
double? iconSize,
}) {
return PopupMenuItem<T>(
value: t,
child: Row(
children: [
Icon(icon),
const SizedBox(
width: 10,
),
Icon(icon, size: iconSize),
const SizedBox(width: 10),
Text(text),
],
),

View File

@@ -1,6 +1,5 @@
import 'package:flutter/material.dart';
import 'package:toolbox/core/extension/context/locale.dart';
import 'package:toolbox/data/model/app/menu/base.dart';
enum ContainerMenu {
start,
@@ -64,10 +63,4 @@ enum ContainerMenu {
// return s.stats;
}
}
PopupMenuItem<ContainerMenu> get widget => PopMenu.build(
this,
icon,
toStr,
);
}

View File

@@ -34,14 +34,14 @@ enum ServerFuncBtn {
snippet,
].map((e) => e.index).toList();
Icon icon([double? sizeDiff]) => switch (this) {
sftp => Icon(Icons.insert_drive_file, size: 15 + (sizeDiff ?? 0)),
snippet => Icon(Icons.code, size: 15 + (sizeDiff ?? 0)),
pkg => Icon(Icons.system_security_update, size: 15 + (sizeDiff ?? 0)),
container => Icon(FontAwesome.docker_brand, size: 14 + (sizeDiff ?? 0)),
process => Icon(Icons.list_alt_outlined, size: 15 + (sizeDiff ?? 0)),
terminal => Icon(Icons.terminal, size: 15 + (sizeDiff ?? 0)),
iperf => Icon(Icons.speed, size: 15 + (sizeDiff ?? 0)),
IconData get icon => switch (this) {
sftp => Icons.insert_drive_file,
snippet => Icons.code,
pkg => Icons.system_security_update,
container => FontAwesome.docker_brand,
process => Icons.list_alt_outlined,
terminal => Icons.terminal,
iperf => Icons.speed,
};
String get toStr => switch (this) {

View File

@@ -1,4 +1,4 @@
import 'package:toolbox/core/utils/platform/path.dart';
import 'package:fl_lib/fl_lib.dart';
/// It's used on platform's file system.
/// So use [Platform.pathSeparator] to join path.
@@ -23,7 +23,7 @@ class LocalPath {
_path = '/';
return;
}
_path = joinPath(_path, newPath);
_path = _path.joinPath(newPath);
}
bool get canBack => path != '$_prefixPath/';

View File

@@ -1,7 +1,7 @@
import 'package:fl_lib/fl_lib.dart';
import 'package:flutter/material.dart';
import 'package:icons_plus/icons_plus.dart';
import 'package:toolbox/core/extension/context/locale.dart';
import 'package:toolbox/core/extension/listx.dart';
import 'package:toolbox/data/model/app/version_related.dart';
import 'package:toolbox/data/res/store.dart';

View File

@@ -1,140 +0,0 @@
/*
{
"changelog": {
"mac": "xxx",
"ios": "xxx",
"android": ""
},
"build": {
"min": {
"mac": 1,
"ios": 1,
"android": 1
},
"last": {
"mac": 1,
"ios": 1,
"android": 1
}
},
"url": {
"mac": "https://apps.apple.com/app/id1586449703",
"ios": "https://apps.apple.com/app/id1586449703",
"android": "https://cdn3.cust.app/uploads/ServerBox_262_Arm64.apk"
}
}
*/
import 'dart:convert';
import 'package:toolbox/core/utils/platform/base.dart';
class AppUpdate {
const AppUpdate({
required this.changelog,
required this.build,
required this.url,
});
final AppUpdatePlatformSpecific<String> changelog;
final Build build;
final AppUpdatePlatformSpecific<String> url;
factory AppUpdate.fromRawJson(String str) =>
AppUpdate.fromJson(json.decode(str));
String toRawJson() => json.encode(toJson());
factory AppUpdate.fromJson(Map<String, dynamic> json) => AppUpdate(
changelog: AppUpdatePlatformSpecific.fromJson(json["changelog"]),
build: Build.fromJson(json["build"]),
url: AppUpdatePlatformSpecific.fromJson(json["url"]),
);
Map<String, dynamic> toJson() => {
"changelog": changelog.toJson(),
"build": build.toJson(),
"url": url.toJson(),
};
}
class Build {
Build({
required this.min,
required this.last,
});
final AppUpdatePlatformSpecific<int> min;
final AppUpdatePlatformSpecific<int> last;
factory Build.fromRawJson(String str) => Build.fromJson(json.decode(str));
String toRawJson() => json.encode(toJson());
factory Build.fromJson(Map<String, dynamic> json) => Build(
min: AppUpdatePlatformSpecific.fromJson(json["min"]),
last: AppUpdatePlatformSpecific.fromJson(json["last"]),
);
Map<String, dynamic> toJson() => {
"min": min.toJson(),
"last": last.toJson(),
};
}
class AppUpdatePlatformSpecific<T> {
AppUpdatePlatformSpecific({
required this.mac,
required this.ios,
required this.android,
required this.windows,
required this.linux,
});
final T mac;
final T ios;
final T android;
final T windows;
final T linux;
factory AppUpdatePlatformSpecific.fromRawJson(String str) =>
AppUpdatePlatformSpecific.fromJson(json.decode(str));
String toRawJson() => json.encode(toJson());
factory AppUpdatePlatformSpecific.fromJson(Map<String, dynamic> json) =>
AppUpdatePlatformSpecific(
mac: json["mac"],
ios: json["ios"],
android: json["android"],
windows: json["windows"],
linux: json["linux"],
);
Map<String, dynamic> toJson() => {
"mac": mac,
"ios": ios,
"android": android,
"windows": windows,
"linux": linux,
};
T? get current {
switch (OS.type) {
case OS.macos:
return mac;
case OS.ios:
return ios;
case OS.android:
return android;
case OS.windows:
return windows;
case OS.linux:
return linux;
/// Not implemented yet.
case OS.web || OS.fuchsia || OS.unknown:
return null;
}
}
}

View File

@@ -1,6 +1,6 @@
import 'dart:convert';
import 'package:toolbox/core/extension/numx.dart';
import 'package:fl_lib/fl_lib.dart';
import 'package:toolbox/data/model/container/type.dart';
abstract final class ContainerImg {

View File

@@ -1,7 +1,7 @@
import 'dart:convert';
import 'package:fl_lib/fl_lib.dart';
import 'package:toolbox/core/extension/context/locale.dart';
import 'package:toolbox/core/extension/numx.dart';
import 'package:toolbox/data/model/container/type.dart';
abstract final class ContainerPs {

View File

@@ -1,4 +1,5 @@
import 'package:toolbox/data/res/logger.dart';
import 'package:fl_lib/fl_lib.dart';
/// raw dat from server:
/// ```text
@@ -92,7 +93,7 @@ abstract final class Batteries {
if (onlyLiPoly && !bat.isLiPoly) continue;
batteries.add(bat);
} catch (e, s) {
Loggers.parse.warning(e, s);
Loggers.app.warning(e, s);
}
oneBatLines.clear();
} else {

View File

@@ -1,5 +1,4 @@
import 'package:toolbox/core/extension/listx.dart';
import 'package:toolbox/core/extension/numx.dart';
import 'package:fl_lib/fl_lib.dart';
import 'package:toolbox/data/model/server/time_seq.dart';
import '../../res/misc.dart';

View File

@@ -1,4 +1,4 @@
import 'package:toolbox/core/extension/listx.dart';
import 'package:fl_lib/fl_lib.dart';
class Memory {
final int total;

View File

@@ -1,4 +1,4 @@
import 'package:toolbox/core/extension/numx.dart';
import 'package:fl_lib/fl_lib.dart';
import 'time_seq.dart';

View File

@@ -1,4 +1,4 @@
import 'package:toolbox/data/res/logger.dart';
import 'package:fl_lib/fl_lib.dart';
import '../../../data/res/misc.dart';
@@ -142,7 +142,7 @@ class PsResult {
procs.add(Proc.parse(line, map));
} catch (e, trace) {
errs.add('$line: $e');
Loggers.parse.warning('Process failed', e, trace);
Loggers.app.warning('Process failed', e, trace);
}
}

View File

@@ -1,7 +1,5 @@
import 'package:fl_lib/fl_lib.dart';
import 'package:toolbox/core/extension/context/locale.dart';
import 'package:toolbox/core/extension/duration.dart';
import 'package:toolbox/core/extension/numx.dart';
import 'package:toolbox/core/extension/order.dart';
enum PveResType {
lxc,
@@ -132,7 +130,12 @@ final class PveLxc extends PveResIface implements PveCtrlIface {
@override
String get summary {
if (available) {
return uptime.secondsToDuration().toStr;
return uptime.secondsToDuration().toAgoStr(
day: l10n.day,
hour: l10n.hour,
minute: l10n.minute,
second: l10n.second,
);
}
return l10n.stopped;
}
@@ -210,7 +213,12 @@ final class PveQemu extends PveResIface implements PveCtrlIface {
@override
String get summary {
if (available) {
return uptime.secondsToDuration().toStr;
return uptime.secondsToDuration().toAgoStr(
day: l10n.day,
hour: l10n.hour,
minute: l10n.minute,
second: l10n.second,
);
}
return l10n.stopped;
}
@@ -260,7 +268,12 @@ final class PveNode extends PveResIface {
String get topRight {
if (isRunning) {
return uptime.secondsToDuration().toStr;
return uptime.secondsToDuration().toAgoStr(
day: l10n.day,
hour: l10n.hour,
minute: l10n.minute,
second: l10n.second,
);
}
return l10n.stopped;
}

View File

@@ -1,5 +1,5 @@
import 'package:fl_lib/fl_lib.dart';
import 'package:toolbox/core/extension/context/locale.dart';
import 'package:toolbox/data/res/logger.dart';
final class SensorAdaptor {
final String raw;

View File

@@ -1,6 +1,6 @@
import 'package:dartssh2/dartssh2.dart';
import 'package:fl_lib/fl_lib.dart';
import 'package:toolbox/core/extension/context/locale.dart';
import 'package:toolbox/core/extension/listx.dart';
import 'package:toolbox/data/model/app/error.dart';
import 'package:toolbox/data/model/app/shell_func.dart';
import 'package:toolbox/data/model/server/battery.dart';

View File

@@ -1,9 +1,9 @@
import 'package:fl_lib/fl_lib.dart';
import 'package:toolbox/data/model/server/battery.dart';
import 'package:toolbox/data/model/server/nvdia.dart';
import 'package:toolbox/data/model/server/sensors.dart';
import 'package:toolbox/data/model/server/server.dart';
import 'package:toolbox/data/model/server/system.dart';
import 'package:toolbox/data/res/logger.dart';
import '../app/shell_func.dart';
import 'cpu.dart';
@@ -45,7 +45,7 @@ Future<ServerStatus> _getLinuxStatus(ServerStatusUpdateReq req) async {
final net = NetSpeed.parse(StatusCmdType.net.find(segments), time);
req.ss.netSpeed.update(net);
} catch (e, s) {
Loggers.parse.warning(e, s);
Loggers.app.warning(e, s);
}
try {
@@ -56,7 +56,7 @@ Future<ServerStatus> _getLinuxStatus(ServerStatusUpdateReq req) async {
req.ss.more[StatusCmdType.sys] = sys;
}
} catch (e, s) {
Loggers.parse.warning(e, s);
Loggers.app.warning(e, s);
}
try {
@@ -65,14 +65,14 @@ Future<ServerStatus> _getLinuxStatus(ServerStatusUpdateReq req) async {
req.ss.more[StatusCmdType.host] = host;
}
} catch (e, s) {
Loggers.parse.warning(e, s);
Loggers.app.warning(e, s);
}
try {
final cpus = SingleCpuCore.parse(StatusCmdType.cpu.find(segments));
req.ss.cpu.update(cpus);
} catch (e, s) {
Loggers.parse.warning(e, s);
Loggers.app.warning(e, s);
}
try {
@@ -81,7 +81,7 @@ Future<ServerStatus> _getLinuxStatus(ServerStatusUpdateReq req) async {
StatusCmdType.tempVal.find(segments),
);
} catch (e, s) {
Loggers.parse.warning(e, s);
Loggers.app.warning(e, s);
}
try {
@@ -90,20 +90,20 @@ Future<ServerStatus> _getLinuxStatus(ServerStatusUpdateReq req) async {
req.ss.tcp = tcp;
}
} catch (e, s) {
Loggers.parse.warning(e, s);
Loggers.app.warning(e, s);
}
try {
req.ss.disk = Disk.parse(StatusCmdType.disk.find(segments));
req.ss.diskUsage = DiskUsage.parse(req.ss.disk);
} catch (e, s) {
Loggers.parse.warning(e, s);
Loggers.app.warning(e, s);
}
try {
req.ss.mem = Memory.parse(StatusCmdType.mem.find(segments));
} catch (e, s) {
Loggers.parse.warning(e, s);
Loggers.app.warning(e, s);
}
try {
@@ -112,26 +112,26 @@ Future<ServerStatus> _getLinuxStatus(ServerStatusUpdateReq req) async {
req.ss.more[StatusCmdType.uptime] = uptime;
}
} catch (e, s) {
Loggers.parse.warning(e, s);
Loggers.app.warning(e, s);
}
try {
req.ss.swap = Swap.parse(StatusCmdType.mem.find(segments));
} catch (e, s) {
Loggers.parse.warning(e, s);
Loggers.app.warning(e, s);
}
try {
final diskio = DiskIO.parse(StatusCmdType.diskio.find(segments), time);
req.ss.diskIO.update(diskio);
} catch (e, s) {
Loggers.parse.warning(e, s);
Loggers.app.warning(e, s);
}
try {
req.ss.nvidia = NvidiaSmi.fromXml(StatusCmdType.nvidia.find(segments));
} catch (e, s) {
Loggers.parse.warning(e, s);
Loggers.app.warning(e, s);
}
try {
@@ -144,7 +144,7 @@ Future<ServerStatus> _getLinuxStatus(ServerStatusUpdateReq req) async {
req.ss.batteries.addAll(batteries);
}
} catch (e, s) {
Loggers.parse.warning(e, s);
Loggers.app.warning(e, s);
}
try {
@@ -154,7 +154,7 @@ Future<ServerStatus> _getLinuxStatus(ServerStatusUpdateReq req) async {
req.ss.sensors.addAll(sensors);
}
} catch (e, s) {
Loggers.parse.warning(e, s);
Loggers.app.warning(e, s);
}
try {
@@ -164,7 +164,7 @@ Future<ServerStatus> _getLinuxStatus(ServerStatusUpdateReq req) async {
req.ss.customCmds[key] = value;
}
} catch (e, s) {
Loggers.parse.warning(e, s);
Loggers.app.warning(e, s);
}
return req.ss;
@@ -179,25 +179,25 @@ Future<ServerStatus> _getBsdStatus(ServerStatusUpdateReq req) async {
final net = NetSpeed.parseBsd(BSDStatusCmdType.net.find(segments), time);
req.ss.netSpeed.update(net);
} catch (e, s) {
Loggers.parse.warning(e, s);
Loggers.app.warning(e, s);
}
try {
req.ss.more[StatusCmdType.sys] = BSDStatusCmdType.sys.find(segments);
} catch (e, s) {
Loggers.parse.warning(e, s);
Loggers.app.warning(e, s);
}
try {
req.ss.cpu = parseBsdCpu(BSDStatusCmdType.cpu.find(segments));
} catch (e, s) {
Loggers.parse.warning(e, s);
Loggers.app.warning(e, s);
}
// try {
// req.ss.mem = parseBsdMem(BSDStatusCmdType.mem.find(segments));
// } catch (e, s) {
// Loggers.parse.warning(e, s);
// Loggers.app.warning(e, s);
// }
try {
@@ -206,13 +206,13 @@ Future<ServerStatus> _getBsdStatus(ServerStatusUpdateReq req) async {
req.ss.more[StatusCmdType.uptime] = uptime;
}
} catch (e, s) {
Loggers.parse.warning(e, s);
Loggers.app.warning(e, s);
}
try {
req.ss.disk = Disk.parse(BSDStatusCmdType.disk.find(segments));
} catch (e, s) {
Loggers.parse.warning(e, s);
Loggers.app.warning(e, s);
}
return req.ss;
}

View File

@@ -1,4 +1,4 @@
import 'package:toolbox/core/utils/misc.dart';
import 'package:fl_lib/fl_lib.dart';
class AbsolutePath {
String _path;
@@ -24,7 +24,7 @@ class AbsolutePath {
_path = newPath;
return;
}
_path = pathJoin(_path, newPath);
_path = _path.joinPath(newPath, seperator: '/');
}
bool undo() {

View File

@@ -1,6 +1,6 @@
import 'dart:async';
import 'package:toolbox/data/res/logger.dart';
import 'package:fl_lib/fl_lib.dart';
import 'package:toolbox/data/res/store.dart';
import '../../../core/utils/server.dart';

View File

@@ -2,17 +2,15 @@ import 'dart:async';
import 'dart:convert';
import 'package:dartssh2/dartssh2.dart';
import 'package:fl_lib/fl_lib.dart';
import 'package:flutter/material.dart';
import 'package:toolbox/core/extension/listx.dart';
import 'package:toolbox/core/extension/ssh_client.dart';
import 'package:toolbox/data/model/app/shell_func.dart';
import 'package:toolbox/data/model/container/image.dart';
import 'package:toolbox/data/model/container/ps.dart';
import 'package:toolbox/data/model/app/error.dart';
import 'package:toolbox/data/model/container/type.dart';
import 'package:toolbox/data/res/logger.dart';
import 'package:toolbox/data/res/store.dart';
import 'package:toolbox/core/extension/uint8list.dart';
final _dockerNotFound =
RegExp(r"command not found|Unknown command|Command '\w+' not found");
@@ -105,7 +103,7 @@ class ContainerProvider extends ChangeNotifier {
type: ContainerErrType.segmentsNotMatch,
message: 'Container segments: ${segments.length}',
);
Loggers.parse.warning('Container segments: ${segments.length}\n$raw');
Loggers.app.warning('Container segments: ${segments.length}\n$raw');
notifyListeners();
return;
}
@@ -119,7 +117,7 @@ class ContainerProvider extends ChangeNotifier {
type: ContainerErrType.invalidVersion,
message: '$e',
);
Loggers.parse.warning('Container version failed', e, trace);
Loggers.app.warning('Container version failed', e, trace);
} finally {
notifyListeners();
}
@@ -135,7 +133,7 @@ class ContainerProvider extends ChangeNotifier {
type: ContainerErrType.parsePs,
message: '$e',
);
Loggers.parse.warning('Container ps failed', e, trace);
Loggers.app.warning('Container ps failed', e, trace);
} finally {
notifyListeners();
}
@@ -151,7 +149,7 @@ class ContainerProvider extends ChangeNotifier {
type: ContainerErrType.parseImages,
message: '$e',
);
Loggers.parse.warning('Container images failed', e, trace);
Loggers.app.warning('Container images failed', e, trace);
} finally {
notifyListeners();
}
@@ -177,7 +175,7 @@ class ContainerProvider extends ChangeNotifier {
type: ContainerErrType.parseStats,
message: '$e',
);
Loggers.parse.warning('Parse docker stats: $statsRaw', e, trace);
Loggers.app.warning('Parse docker stats: $statsRaw', e, trace);
} finally {
notifyListeners();
}

View File

@@ -1,7 +1,6 @@
import 'package:fl_lib/fl_lib.dart';
import 'package:flutter/material.dart';
import 'package:logging/logging.dart';
import 'package:toolbox/core/extension/datetime.dart';
import 'package:toolbox/data/res/ui.dart';
import '../../data/res/misc.dart';

View File

@@ -4,12 +4,12 @@ import 'dart:io';
import 'package:computer/computer.dart';
import 'package:dio/dio.dart';
import 'package:dio/io.dart';
import 'package:fl_lib/fl_lib.dart';
import 'package:flutter/material.dart';
import 'package:toolbox/core/extension/context/locale.dart';
import 'package:toolbox/data/model/app/error.dart';
import 'package:toolbox/data/model/server/pve.dart';
import 'package:toolbox/data/model/server/server_private_info.dart';
import 'package:toolbox/data/res/logger.dart';
typedef PveCtrlFunc = Future<bool> Function(String node, String id);

View File

@@ -3,22 +3,17 @@ import 'dart:io';
import 'package:computer/computer.dart';
import 'package:dartssh2/dartssh2.dart';
import 'package:fl_lib/fl_lib.dart';
import 'package:flutter/material.dart';
import 'package:toolbox/core/extension/ssh_client.dart';
import 'package:toolbox/core/extension/stringx.dart';
import 'package:toolbox/core/utils/ssh_auth.dart';
import 'package:toolbox/core/utils/platform/path.dart';
import 'package:toolbox/data/model/app/error.dart';
import 'package:toolbox/data/model/app/shell_func.dart';
import 'package:toolbox/data/model/server/system.dart';
import 'package:toolbox/data/model/sftp/req.dart';
import 'package:toolbox/data/res/logger.dart';
import 'package:toolbox/data/res/path.dart';
import 'package:toolbox/data/res/provider.dart';
import 'package:toolbox/data/res/store.dart';
import '../../core/extension/order.dart';
import '../../core/extension/uint8list.dart';
import '../../core/utils/server.dart';
import '../model/server/server.dart';
import '../model/server/server_private_info.dart';
@@ -344,7 +339,7 @@ class ServerProvider extends ChangeNotifier {
Loggers.app.warning('Write script to ${spi.name} by shell', e);
/// by sftp
final localPath = joinPath(await Paths.doc, 'install.sh');
final localPath = Paths.doc.joinPath('install.sh');
final file = File(localPath);
try {
file.writeAsBytes(scriptRaw);
@@ -455,7 +450,7 @@ class ServerProvider extends ChangeNotifier {
message: 'Parse failed: $e\n\n$raw',
);
_setServerState(s, ServerConn.failed);
Loggers.parse.warning('Server status', e, trace);
Loggers.app.warning('Server status', e, trace);
return;
}

View File

@@ -1,11 +1,10 @@
import 'dart:convert';
import 'package:fl_lib/fl_lib.dart';
import 'package:flutter/material.dart';
import 'package:toolbox/data/model/server/snippet.dart';
import 'package:toolbox/data/res/store.dart';
import '../../core/extension/order.dart';
class SnippetProvider extends ChangeNotifier {
late List<Snippet> _snippets;
List<Snippet> get snippets => _snippets;

View File

@@ -2,9 +2,9 @@
class BuildData {
static const String name = "ServerBox";
static const int build = 893;
static const int build = 896;
static const String engine = "3.19.6";
static const String buildAt = "2024-05-10 20:57:55";
static const int modifications = 8;
static const String buildAt = "2024-05-12 15:46:37";
static const int modifications = 3;
static const int script = 47;
}

View File

@@ -1,11 +0,0 @@
import 'package:flutter/material.dart';
import '../model/app/dynamic_color.dart';
var primaryColor = const Color(0xff8b2252);
abstract final class DynamicColors {
static const content = DynamicColor(Colors.black87, Colors.white70);
static const bg = DynamicColor(Colors.white, Colors.black);
static const progress = DynamicColor(Colors.black12, Colors.white10);
}

View File

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

View File

@@ -1,54 +0,0 @@
import 'dart:io';
import 'package:path_provider/path_provider.dart';
import 'package:toolbox/core/utils/platform/base.dart';
import 'package:toolbox/core/utils/platform/path.dart';
abstract final class Paths {
static String? _docDir;
static String? _sftpDir;
static String? _fontDir;
static Future<String> get doc async {
if (_docDir != null) {
return _docDir!;
}
if (isAndroid) {
final dir = await getExternalStorageDirectory();
if (dir != null) {
_docDir = dir.path;
return dir.path;
}
// fallthrough to getApplicationDocumentsDirectory
}
final dir = await getApplicationDocumentsDirectory();
_docDir = dir.path;
return dir.path;
}
static Future<String> get sftp async {
if (_sftpDir != null) {
return _sftpDir!;
}
_sftpDir = '${await doc}/sftp';
final dir = Directory(_sftpDir!);
await dir.create(recursive: true);
return _sftpDir!;
}
static Future<String> get font async {
if (_fontDir != null) {
return _fontDir!;
}
_fontDir = '${await doc}/font';
final dir = Directory(_fontDir!);
await dir.create(recursive: true);
return _fontDir!;
}
static const String bakName = 'srvbox_bak.json';
static Future<String> get bak async => '${await doc}/$bakName';
static Future<String> get dl async => joinPath(await doc, 'dl');
}

View File

@@ -4,15 +4,14 @@ import 'package:toolbox/data/provider/private_key.dart';
import 'package:toolbox/data/provider/server.dart';
import 'package:toolbox/data/provider/sftp.dart';
import 'package:toolbox/data/provider/snippet.dart';
import 'package:toolbox/locator.dart';
abstract final class Pros {
static final app = locator<AppProvider>();
static final debug = locator<DebugProvider>();
static final key = locator<PrivateKeyProvider>();
static final server = locator<ServerProvider>();
static final sftp = locator<SftpProvider>();
static final snippet = locator<SnippetProvider>();
static final app = AppProvider();
static final debug = DebugProvider();
static final key = PrivateKeyProvider();
static final server = ServerProvider();
static final sftp = SftpProvider();
static final snippet = SnippetProvider();
static void reload() {
key.load();

View File

@@ -1,19 +1,18 @@
import 'package:toolbox/core/persistant_store.dart';
import 'package:fl_lib/fl_lib.dart';
import 'package:toolbox/data/store/container.dart';
import 'package:toolbox/data/store/history.dart';
import 'package:toolbox/data/store/private_key.dart';
import 'package:toolbox/data/store/server.dart';
import 'package:toolbox/data/store/setting.dart';
import 'package:toolbox/data/store/snippet.dart';
import 'package:toolbox/locator.dart';
abstract final class Stores {
static final setting = locator<SettingStore>();
static final server = locator<ServerStore>();
static final container = locator<ContainerStore>();
static final history = locator<HistoryStore>();
static final key = locator<PrivateKeyStore>();
static final snippet = locator<SnippetStore>();
static final setting = SettingStore();
static final server = ServerStore();
static final container = ContainerStore();
static final history = HistoryStore();
static final key = PrivateKeyStore();
static final snippet = SnippetStore();
static final List<PersistentStore> all = [
setting,

View File

@@ -1,79 +0,0 @@
import 'package:flutter/material.dart';
abstract final class UIs {
/// Font style
static const text11 = TextStyle(fontSize: 11);
static const text11Bold = TextStyle(
fontSize: 11,
fontWeight: FontWeight.w500,
);
static const text11Grey = TextStyle(color: Colors.grey, fontSize: 11);
static const text12 = TextStyle(fontSize: 12);
static const text12Bold = TextStyle(
fontSize: 12,
fontWeight: FontWeight.bold,
);
static const text12Grey = TextStyle(color: Colors.grey, fontSize: 12);
static const text13 = TextStyle(fontSize: 13);
static const text13Bold = TextStyle(
fontSize: 13,
fontWeight: FontWeight.bold,
);
static const text13Grey = TextStyle(color: Colors.grey, fontSize: 13);
static const text15 = TextStyle(fontSize: 15);
static const text15Bold = TextStyle(
fontSize: 15,
fontWeight: FontWeight.bold,
);
static const text18 = TextStyle(fontSize: 18);
static const text27 = TextStyle(fontSize: 27);
static const textGrey = TextStyle(color: Colors.grey);
static const textRed = TextStyle(color: Colors.red);
/// Icon
static final appIcon = Image.asset('assets/app_icon.png');
/// Padding
static const roundRectCardPadding =
EdgeInsets.symmetric(horizontal: 17, vertical: 13);
/// SizedBox
static const placeholder = SizedBox();
static const height7 = SizedBox(height: 7);
static const height13 = SizedBox(height: 13);
static const height77 = SizedBox(height: 77);
static const width13 = SizedBox(width: 13);
static const width7 = SizedBox(width: 7);
/// Misc
static const popMenuChild = Padding(
padding: EdgeInsets.only(left: 7),
child: Icon(
Icons.more_vert,
size: 21,
),
);
static const centerLoading = Center(child: CircularProgressIndicator());
static const centerSizedLoadingSmall = SizedBox(
width: 23,
height: 23,
child: Center(
child: CircularProgressIndicator(),
),
);
static const centerSizedLoading = SizedBox(
width: 77,
height: 77,
child: Center(
child: CircularProgressIndicator(),
),
);
}

View File

@@ -1,5 +1,6 @@
abstract final class Urls {
static const cdnBase = 'https://cdn.lolli.tech/serverbox';
static const updateCfg = '$cdnBase/update.json';
static const myGithub = 'https://github.com/lollipopkit';
static const appHelp = '$myGithub/flutter_server_box#-help';
static const appWiki = '$myGithub/flutter_server_box/wiki';

View File

@@ -1,11 +0,0 @@
import 'package:dio/dio.dart';
import '../model/app/update.dart';
import '../res/url.dart';
class AppService {
Future<AppUpdate> getUpdate() async {
final resp = await Dio().get('${Urls.cdnBase}/update.json');
return AppUpdate.fromJson(resp.data);
}
}

View File

@@ -1,8 +1,7 @@
import 'package:toolbox/core/extension/listx.dart';
import 'package:fl_lib/fl_lib.dart';
import 'package:toolbox/data/model/container/type.dart';
import 'package:toolbox/data/res/store.dart';
import '../../core/persistant_store.dart';
const _keyConfig = 'providerConfig';

View File

@@ -1,5 +1,5 @@
import 'package:fl_lib/fl_lib.dart';
import 'package:hive_flutter/hive_flutter.dart';
import 'package:toolbox/core/persistant_store.dart';
/// index from 0 -> n : latest -> oldest
class _ListHistory {

View File

@@ -1,4 +1,5 @@
import '../../core/persistant_store.dart';
import 'package:fl_lib/fl_lib.dart';
import '../model/server/private_key_info.dart';
class PrivateKeyStore extends PersistentStore {

View File

@@ -1,4 +1,5 @@
import '../../core/persistant_store.dart';
import 'package:fl_lib/fl_lib.dart';
import '../model/server/server_private_info.dart';
class ServerStore extends PersistentStore {

View File

@@ -1,5 +1,4 @@
import 'package:toolbox/core/persistant_store.dart';
import 'package:toolbox/core/utils/platform/base.dart';
import 'package:fl_lib/fl_lib.dart';
import 'package:toolbox/data/model/app/menu/server_func.dart';
import 'package:toolbox/data/model/app/server_detail_card.dart';
import 'package:toolbox/data/model/ssh/virtual_key.dart';

View File

@@ -1,4 +1,5 @@
import '../../core/persistant_store.dart';
import 'package:fl_lib/fl_lib.dart';
import '../model/server/snippet.dart';
class SnippetStore extends PersistentStore {