mirror of
https://github.com/lollipopkit/flutter_server_box.git
synced 2025-12-17 07:14:28 +01:00
new: Providers
This commit is contained in:
@@ -472,7 +472,7 @@
|
||||
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
|
||||
CLANG_ENABLE_MODULES = YES;
|
||||
CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements;
|
||||
CURRENT_PROJECT_VERSION = 550;
|
||||
CURRENT_PROJECT_VERSION = 551;
|
||||
DEVELOPMENT_TEAM = BA88US33G6;
|
||||
ENABLE_BITCODE = NO;
|
||||
INFOPLIST_FILE = "Runner/Info-$(CONFIGURATION).plist";
|
||||
@@ -480,7 +480,7 @@
|
||||
"$(inherited)",
|
||||
"@executable_path/Frameworks",
|
||||
);
|
||||
MARKETING_VERSION = 1.0.550;
|
||||
MARKETING_VERSION = 1.0.551;
|
||||
PRODUCT_BUNDLE_IDENTIFIER = com.lollipopkit.toolbox;
|
||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||
SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
|
||||
@@ -604,7 +604,7 @@
|
||||
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
|
||||
CLANG_ENABLE_MODULES = YES;
|
||||
CODE_SIGN_ENTITLEMENTS = Runner/RunnerDebug.entitlements;
|
||||
CURRENT_PROJECT_VERSION = 550;
|
||||
CURRENT_PROJECT_VERSION = 551;
|
||||
DEVELOPMENT_TEAM = BA88US33G6;
|
||||
ENABLE_BITCODE = NO;
|
||||
INFOPLIST_FILE = "Runner/Info-$(CONFIGURATION).plist";
|
||||
@@ -612,7 +612,7 @@
|
||||
"$(inherited)",
|
||||
"@executable_path/Frameworks",
|
||||
);
|
||||
MARKETING_VERSION = 1.0.550;
|
||||
MARKETING_VERSION = 1.0.551;
|
||||
PRODUCT_BUNDLE_IDENTIFIER = com.lollipopkit.toolbox;
|
||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||
SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
|
||||
@@ -630,7 +630,7 @@
|
||||
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
|
||||
CLANG_ENABLE_MODULES = YES;
|
||||
CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements;
|
||||
CURRENT_PROJECT_VERSION = 550;
|
||||
CURRENT_PROJECT_VERSION = 551;
|
||||
DEVELOPMENT_TEAM = BA88US33G6;
|
||||
ENABLE_BITCODE = NO;
|
||||
INFOPLIST_FILE = "Runner/Info-$(CONFIGURATION).plist";
|
||||
@@ -638,7 +638,7 @@
|
||||
"$(inherited)",
|
||||
"@executable_path/Frameworks",
|
||||
);
|
||||
MARKETING_VERSION = 1.0.550;
|
||||
MARKETING_VERSION = 1.0.551;
|
||||
PRODUCT_BUNDLE_IDENTIFIER = com.lollipopkit.toolbox;
|
||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||
SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
|
||||
@@ -659,7 +659,7 @@
|
||||
CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
|
||||
CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
|
||||
CODE_SIGN_STYLE = Automatic;
|
||||
CURRENT_PROJECT_VERSION = 550;
|
||||
CURRENT_PROJECT_VERSION = 551;
|
||||
DEVELOPMENT_TEAM = BA88US33G6;
|
||||
GCC_C_LANGUAGE_STANDARD = gnu11;
|
||||
GENERATE_INFOPLIST_FILE = YES;
|
||||
@@ -672,7 +672,7 @@
|
||||
"@executable_path/Frameworks",
|
||||
"@executable_path/../../Frameworks",
|
||||
);
|
||||
MARKETING_VERSION = 1.0.550;
|
||||
MARKETING_VERSION = 1.0.551;
|
||||
MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;
|
||||
MTL_FAST_MATH = YES;
|
||||
PRODUCT_BUNDLE_IDENTIFIER = com.lollipopkit.toolbox.StatusWidget;
|
||||
@@ -698,7 +698,7 @@
|
||||
CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
|
||||
CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
|
||||
CODE_SIGN_STYLE = Automatic;
|
||||
CURRENT_PROJECT_VERSION = 550;
|
||||
CURRENT_PROJECT_VERSION = 551;
|
||||
DEVELOPMENT_TEAM = BA88US33G6;
|
||||
GCC_C_LANGUAGE_STANDARD = gnu11;
|
||||
GENERATE_INFOPLIST_FILE = YES;
|
||||
@@ -711,7 +711,7 @@
|
||||
"@executable_path/Frameworks",
|
||||
"@executable_path/../../Frameworks",
|
||||
);
|
||||
MARKETING_VERSION = 1.0.550;
|
||||
MARKETING_VERSION = 1.0.551;
|
||||
MTL_FAST_MATH = YES;
|
||||
PRODUCT_BUNDLE_IDENTIFIER = com.lollipopkit.toolbox.StatusWidget;
|
||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||
@@ -734,7 +734,7 @@
|
||||
CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
|
||||
CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
|
||||
CODE_SIGN_STYLE = Automatic;
|
||||
CURRENT_PROJECT_VERSION = 550;
|
||||
CURRENT_PROJECT_VERSION = 551;
|
||||
DEVELOPMENT_TEAM = BA88US33G6;
|
||||
GCC_C_LANGUAGE_STANDARD = gnu11;
|
||||
GENERATE_INFOPLIST_FILE = YES;
|
||||
@@ -747,7 +747,7 @@
|
||||
"@executable_path/Frameworks",
|
||||
"@executable_path/../../Frameworks",
|
||||
);
|
||||
MARKETING_VERSION = 1.0.550;
|
||||
MARKETING_VERSION = 1.0.551;
|
||||
MTL_FAST_MATH = YES;
|
||||
PRODUCT_BUNDLE_IDENTIFIER = com.lollipopkit.toolbox.StatusWidget;
|
||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||
|
||||
@@ -1,11 +1,10 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_gen/gen_l10n/l10n.dart';
|
||||
import 'package:toolbox/core/extension/context/common.dart';
|
||||
import 'package:toolbox/data/res/provider.dart';
|
||||
|
||||
import '../../../data/model/server/snippet.dart';
|
||||
import '../../../data/provider/snippet.dart';
|
||||
import '../../../data/res/ui.dart';
|
||||
import '../../../locator.dart';
|
||||
import '../../../view/widget/input_field.dart';
|
||||
import '../../../view/widget/picker.dart';
|
||||
import '../../route.dart';
|
||||
@@ -59,8 +58,7 @@ extension DialogX on BuildContext {
|
||||
S s,
|
||||
void Function(Snippet s) onSelected,
|
||||
) {
|
||||
final provider = locator<SnippetProvider>();
|
||||
if (provider.snippets.isEmpty) {
|
||||
if (Providers.snippet.snippets.isEmpty) {
|
||||
showRoundDialog(
|
||||
child: Text(s.noSavedSnippet),
|
||||
actions: [
|
||||
@@ -80,12 +78,12 @@ extension DialogX on BuildContext {
|
||||
return;
|
||||
}
|
||||
|
||||
var snippet = provider.snippets.first;
|
||||
var snippet = Providers.snippet.snippets.first;
|
||||
showRoundDialog(
|
||||
title: Text(s.choose),
|
||||
child: Picker(
|
||||
items: provider.snippets.map((e) => Text(e.name)).toList(),
|
||||
onSelected: (idx) => snippet = provider.snippets[idx],
|
||||
items: Providers.snippet.snippets.map((e) => Text(e.name)).toList(),
|
||||
onSelected: (idx) => snippet = Providers.snippet.snippets[idx],
|
||||
),
|
||||
actions: [
|
||||
TextButton(
|
||||
|
||||
@@ -10,8 +10,8 @@ import 'package:toolbox/core/extension/context/snackbar.dart';
|
||||
import 'package:toolbox/data/model/app/update.dart';
|
||||
import 'package:toolbox/data/res/logger.dart';
|
||||
import 'package:toolbox/data/res/path.dart';
|
||||
import 'package:toolbox/data/res/provider.dart';
|
||||
|
||||
import '../data/provider/app.dart';
|
||||
import '../data/res/build_data.dart';
|
||||
import '../data/service/app.dart';
|
||||
import '../locator.dart';
|
||||
@@ -39,7 +39,7 @@ Future<void> doUpdate(BuildContext context, {bool force = false}) async {
|
||||
return;
|
||||
}
|
||||
|
||||
locator<AppProvider>().newestBuild = newest;
|
||||
Providers.app.newestBuild = newest;
|
||||
|
||||
if (!force && newest <= BuildData.build) {
|
||||
Loggers.app.info('Update ignored: ${BuildData.build} >= $newest');
|
||||
|
||||
@@ -6,13 +6,10 @@ import 'package:flutter/widgets.dart';
|
||||
import 'package:flutter_gen/gen_l10n/l10n.dart';
|
||||
import 'package:plain_notification_token/plain_notification_token.dart';
|
||||
import 'package:share_plus/share_plus.dart';
|
||||
import 'package:toolbox/data/res/provider.dart';
|
||||
|
||||
import '../../data/provider/app.dart';
|
||||
import '../../locator.dart';
|
||||
import 'platform.dart';
|
||||
|
||||
final _app = locator<AppProvider>();
|
||||
|
||||
Future<bool> shareFiles(BuildContext context, List<String> filePaths) async {
|
||||
for (final filePath in filePaths) {
|
||||
if (!await File(filePath).exists()) {
|
||||
@@ -25,10 +22,10 @@ Future<bool> shareFiles(BuildContext context, List<String> filePaths) async {
|
||||
} else {
|
||||
text = '${filePaths.length} ${S.of(context)!.files}';
|
||||
}
|
||||
_app.moveBg = false;
|
||||
Providers.app.moveBg = false;
|
||||
// ignore: deprecated_member_use
|
||||
await Share.shareFiles(filePaths, subject: 'ServerBox -> $text');
|
||||
_app.moveBg = true;
|
||||
Providers.app.moveBg = true;
|
||||
return filePaths.isNotEmpty;
|
||||
}
|
||||
|
||||
@@ -37,9 +34,9 @@ void copy2Clipboard(String text) {
|
||||
}
|
||||
|
||||
Future<String?> pickOneFile() async {
|
||||
_app.moveBg = false;
|
||||
Providers.app.moveBg = false;
|
||||
final result = await FilePicker.platform.pickFiles(type: FileType.any);
|
||||
_app.moveBg = true;
|
||||
Providers.app.moveBg = true;
|
||||
return result?.files.single.path;
|
||||
}
|
||||
|
||||
|
||||
@@ -1,4 +1,6 @@
|
||||
import 'package:hive_flutter/hive_flutter.dart';
|
||||
import 'package:toolbox/data/model/server/server.dart';
|
||||
import 'package:toolbox/data/res/provider.dart';
|
||||
|
||||
import '../app/error.dart';
|
||||
|
||||
@@ -68,6 +70,8 @@ class ServerPrivateInfo {
|
||||
return data;
|
||||
}
|
||||
|
||||
Server? get findServer => Providers.server.servers[id];
|
||||
|
||||
bool shouldReconnect(ServerPrivateInfo old) {
|
||||
return id != old.id ||
|
||||
pwd != old.pwd ||
|
||||
|
||||
@@ -325,7 +325,7 @@ class ServerProvider extends ChangeNotifier {
|
||||
return await client.run(snippets.map((e) => e.script).join('&&')).string;
|
||||
}
|
||||
|
||||
Future<List<String?>> runSnippetsOnMulti(
|
||||
Future<List<String?>> runSnippetsMulti(
|
||||
List<String> ids,
|
||||
List<Snippet> snippets,
|
||||
) async {
|
||||
|
||||
@@ -2,8 +2,8 @@ import 'package:flutter/widgets.dart';
|
||||
import 'package:toolbox/data/res/store.dart';
|
||||
import 'package:xterm/core.dart';
|
||||
|
||||
class VirtualKeyboard extends TerminalInputHandler with ChangeNotifier {
|
||||
VirtualKeyboard();
|
||||
class VirtKeyProvider extends TerminalInputHandler with ChangeNotifier {
|
||||
VirtKeyProvider();
|
||||
|
||||
bool _ctrl = false;
|
||||
bool get ctrl => _ctrl;
|
||||
|
||||
@@ -2,9 +2,9 @@
|
||||
|
||||
class BuildData {
|
||||
static const String name = "ServerBox";
|
||||
static const int build = 550;
|
||||
static const int build = 551;
|
||||
static const String engine = "3.13.2";
|
||||
static const String buildAt = "2023-09-13 15:19:48";
|
||||
static const int modifications = 45;
|
||||
static const String buildAt = "2023-09-13 16:03:39";
|
||||
static const int modifications = 31;
|
||||
static const int script = 15;
|
||||
}
|
||||
|
||||
22
lib/data/res/provider.dart
Normal file
22
lib/data/res/provider.dart
Normal file
@@ -0,0 +1,22 @@
|
||||
import 'package:toolbox/data/provider/app.dart';
|
||||
import 'package:toolbox/data/provider/debug.dart';
|
||||
import 'package:toolbox/data/provider/docker.dart';
|
||||
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/data/provider/virtual_keyboard.dart';
|
||||
import 'package:toolbox/locator.dart';
|
||||
|
||||
class Providers {
|
||||
const Providers._();
|
||||
|
||||
static final app = locator<AppProvider>();
|
||||
static final debug = locator<DebugProvider>();
|
||||
static final docker = locator<DockerProvider>();
|
||||
static final key = locator<PrivateKeyProvider>();
|
||||
static final server = locator<ServerProvider>();
|
||||
static final sftp = locator<SftpProvider>();
|
||||
static final snippet = locator<SnippetProvider>();
|
||||
static final virtKey = locator<VirtKeyProvider>();
|
||||
}
|
||||
@@ -27,7 +27,7 @@ void _setupLocatorForProviders() {
|
||||
locator.registerSingleton(DebugProvider());
|
||||
locator.registerSingleton(DockerProvider());
|
||||
locator.registerSingleton(ServerProvider());
|
||||
locator.registerSingleton(VirtualKeyboard());
|
||||
locator.registerSingleton(VirtKeyProvider());
|
||||
locator.registerSingleton(SnippetProvider());
|
||||
locator.registerSingleton(PrivateKeyProvider());
|
||||
locator.registerSingleton(SftpProvider());
|
||||
|
||||
@@ -6,6 +6,7 @@ import 'package:logging/logging.dart';
|
||||
import 'package:macos_window_utils/window_manipulator.dart';
|
||||
import 'package:provider/provider.dart';
|
||||
import 'package:shared_preferences/shared_preferences.dart';
|
||||
import 'package:toolbox/data/res/provider.dart';
|
||||
import 'package:toolbox/data/res/store.dart';
|
||||
|
||||
import 'app.dart';
|
||||
@@ -32,8 +33,6 @@ import 'locator.dart';
|
||||
import 'view/widget/custom_appbar.dart';
|
||||
import 'view/widget/rebuild.dart';
|
||||
|
||||
DebugProvider? _debug;
|
||||
|
||||
Future<void> main() async {
|
||||
_runInZone(() async {
|
||||
await initApp();
|
||||
@@ -45,7 +44,7 @@ Future<void> main() async {
|
||||
ChangeNotifierProvider(create: (_) => locator<DockerProvider>()),
|
||||
ChangeNotifierProvider(create: (_) => locator<ServerProvider>()),
|
||||
ChangeNotifierProvider(create: (_) => locator<SnippetProvider>()),
|
||||
ChangeNotifierProvider(create: (_) => locator<VirtualKeyboard>()),
|
||||
ChangeNotifierProvider(create: (_) => locator<VirtKeyProvider>()),
|
||||
ChangeNotifierProvider(create: (_) => locator<PrivateKeyProvider>()),
|
||||
ChangeNotifierProvider(create: (_) => locator<SftpProvider>()),
|
||||
],
|
||||
@@ -77,9 +76,6 @@ Future<void> initApp() async {
|
||||
// Base of all data.
|
||||
await _initHive();
|
||||
await setupLocator();
|
||||
|
||||
// Setup [DebugProvider] first to catch all logs.
|
||||
_debug = locator<DebugProvider>();
|
||||
_setupLogger();
|
||||
_setupProviders();
|
||||
|
||||
@@ -101,8 +97,8 @@ Future<void> initApp() async {
|
||||
}
|
||||
|
||||
void _setupProviders() {
|
||||
locator<SnippetProvider>().loadData();
|
||||
locator<PrivateKeyProvider>().loadData();
|
||||
Providers.snippet.loadData();
|
||||
Providers.key.loadData();
|
||||
}
|
||||
|
||||
Future<void> _initHive() async {
|
||||
@@ -119,14 +115,14 @@ void _setupLogger() {
|
||||
Logger.root.level = Level.ALL;
|
||||
Logger.root.onRecord.listen((record) {
|
||||
var str = '[${record.loggerName}][${record.level.name}]: ${record.message}';
|
||||
_debug?.addText(str);
|
||||
Providers.debug.addText(str);
|
||||
if (record.error != null) {
|
||||
str += '\n${record.error}';
|
||||
_debug?.addMultiline(record.error.toString(), Colors.red);
|
||||
Providers.debug.addMultiline(record.error.toString(), Colors.red);
|
||||
}
|
||||
if (record.stackTrace != null) {
|
||||
str += '\n${record.stackTrace}';
|
||||
_debug?.addMultiline(record.stackTrace.toString(), Colors.white);
|
||||
Providers.debug.addMultiline(record.stackTrace.toString(), Colors.white);
|
||||
}
|
||||
// ignore: avoid_print
|
||||
print(str);
|
||||
|
||||
@@ -6,18 +6,17 @@ import 'package:toolbox/core/extension/context/dialog.dart';
|
||||
import 'package:toolbox/core/extension/context/snackbar.dart';
|
||||
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/input_field.dart';
|
||||
|
||||
import '../../data/model/docker/ps.dart';
|
||||
import '../../data/model/server/server_private_info.dart';
|
||||
import '../../data/provider/docker.dart';
|
||||
import '../../data/provider/server.dart';
|
||||
import '../../data/model/app/error.dart';
|
||||
import '../../data/model/app/menu.dart';
|
||||
import '../../data/res/ui.dart';
|
||||
import '../../data/res/url.dart';
|
||||
import '../../locator.dart';
|
||||
import '../widget/custom_appbar.dart';
|
||||
import '../widget/popup_menu.dart';
|
||||
import '../widget/round_rect_card.dart';
|
||||
@@ -33,14 +32,13 @@ class DockerManagePage extends StatefulWidget {
|
||||
}
|
||||
|
||||
class _DockerManagePageState extends State<DockerManagePage> {
|
||||
final _docker = locator<DockerProvider>();
|
||||
final _textController = TextEditingController();
|
||||
late S _s;
|
||||
|
||||
@override
|
||||
void dispose() {
|
||||
super.dispose();
|
||||
_docker.clear();
|
||||
Providers.docker.clear();
|
||||
_textController.dispose();
|
||||
}
|
||||
|
||||
@@ -53,17 +51,19 @@ class _DockerManagePageState extends State<DockerManagePage> {
|
||||
@override
|
||||
void initState() {
|
||||
super.initState();
|
||||
final client = locator<ServerProvider>().servers[widget.spi.id]?.client;
|
||||
final client = widget.spi.findServer?.client;
|
||||
if (client == null) {
|
||||
return;
|
||||
}
|
||||
_docker.init(
|
||||
Providers.docker
|
||||
..init(
|
||||
client,
|
||||
widget.spi.user,
|
||||
(user) async => await context.showPwdDialog(user),
|
||||
widget.spi.id,
|
||||
context,
|
||||
);
|
||||
)
|
||||
..refresh();
|
||||
}
|
||||
|
||||
@override
|
||||
@@ -77,7 +77,7 @@ class _DockerManagePageState extends State<DockerManagePage> {
|
||||
IconButton(
|
||||
onPressed: () async {
|
||||
context.showLoadingDialog();
|
||||
await _docker.refresh();
|
||||
await Providers.docker.refresh();
|
||||
context.pop();
|
||||
},
|
||||
icon: const Icon(Icons.refresh),
|
||||
@@ -85,7 +85,8 @@ class _DockerManagePageState extends State<DockerManagePage> {
|
||||
],
|
||||
),
|
||||
body: _buildMain(),
|
||||
floatingActionButton: _docker.error == null ? _buildFAB() : null,
|
||||
floatingActionButton:
|
||||
Providers.docker.error == null ? _buildFAB() : null,
|
||||
);
|
||||
});
|
||||
}
|
||||
@@ -162,7 +163,7 @@ class _DockerManagePageState extends State<DockerManagePage> {
|
||||
onPressed: () async {
|
||||
context.pop();
|
||||
context.showLoadingDialog();
|
||||
final result = await _docker.run(cmd);
|
||||
final result = await Providers.docker.run(cmd);
|
||||
context.pop();
|
||||
if (result != null) {
|
||||
context.showSnackBar(result.message ?? _s.unknownError);
|
||||
@@ -188,7 +189,7 @@ class _DockerManagePageState extends State<DockerManagePage> {
|
||||
}
|
||||
|
||||
Widget _buildMain() {
|
||||
if (_docker.error != null && _docker.items == null) {
|
||||
if (Providers.docker.error != null && Providers.docker.items == null) {
|
||||
return SizedBox.expand(
|
||||
child: Column(
|
||||
mainAxisAlignment: MainAxisAlignment.center,
|
||||
@@ -199,22 +200,17 @@ class _DockerManagePageState extends State<DockerManagePage> {
|
||||
size: 37,
|
||||
),
|
||||
const SizedBox(height: 27),
|
||||
Text(_docker.error?.message ?? _s.unknownError),
|
||||
Text(Providers.docker.error?.message ?? _s.unknownError),
|
||||
const SizedBox(height: 27),
|
||||
Padding(
|
||||
padding: const EdgeInsets.all(17),
|
||||
child: _buildSolution(_docker.error!),
|
||||
child: _buildSolution(Providers.docker.error!),
|
||||
)
|
||||
],
|
||||
),
|
||||
);
|
||||
}
|
||||
if (_docker.items == null || _docker.images == null) {
|
||||
Future.delayed(const Duration(milliseconds: 37), () {
|
||||
if (mounted) {
|
||||
_docker.refresh();
|
||||
}
|
||||
});
|
||||
if (Providers.docker.items == null || Providers.docker.images == null) {
|
||||
return UIs.centerLoading;
|
||||
}
|
||||
|
||||
@@ -236,12 +232,12 @@ class _DockerManagePageState extends State<DockerManagePage> {
|
||||
ListTile(
|
||||
title: Text(_s.imagesList),
|
||||
subtitle: Text(
|
||||
_s.dockerImagesFmt(_docker.images!.length),
|
||||
_s.dockerImagesFmt(Providers.docker.images!.length),
|
||||
style: UIs.textGrey,
|
||||
),
|
||||
),
|
||||
];
|
||||
items.addAll(_docker.images!.map(_buildImageItem));
|
||||
items.addAll(Providers.docker.images!.map(_buildImageItem));
|
||||
return Column(children: items);
|
||||
}
|
||||
|
||||
@@ -270,7 +266,7 @@ class _DockerManagePageState extends State<DockerManagePage> {
|
||||
TextButton(
|
||||
onPressed: () async {
|
||||
context.pop();
|
||||
final result = await _docker.run(
|
||||
final result = await Providers.docker.run(
|
||||
'docker rmi ${e.id} -f',
|
||||
);
|
||||
if (result != null) {
|
||||
@@ -284,7 +280,7 @@ class _DockerManagePageState extends State<DockerManagePage> {
|
||||
}
|
||||
|
||||
Widget _buildLoading() {
|
||||
if (_docker.runLog == null) return UIs.placeholder;
|
||||
if (Providers.docker.runLog == null) return UIs.placeholder;
|
||||
return Padding(
|
||||
padding: const EdgeInsets.all(17),
|
||||
child: Column(
|
||||
@@ -293,7 +289,7 @@ class _DockerManagePageState extends State<DockerManagePage> {
|
||||
child: CircularProgressIndicator(),
|
||||
),
|
||||
UIs.height13,
|
||||
Text(_docker.runLog ?? '...'),
|
||||
Text(Providers.docker.runLog ?? '...'),
|
||||
],
|
||||
),
|
||||
);
|
||||
@@ -334,8 +330,8 @@ class _DockerManagePageState extends State<DockerManagePage> {
|
||||
child: Row(
|
||||
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
||||
children: [
|
||||
Text(_docker.edition ?? _s.unknown),
|
||||
Text(_docker.version ?? _s.unknown),
|
||||
Text(Providers.docker.edition ?? _s.unknown),
|
||||
Text(Providers.docker.version ?? _s.unknown),
|
||||
],
|
||||
),
|
||||
);
|
||||
@@ -346,12 +342,12 @@ class _DockerManagePageState extends State<DockerManagePage> {
|
||||
ListTile(
|
||||
title: Text(_s.containerStatus),
|
||||
subtitle: Text(
|
||||
_buildPsCardSubtitle(_docker.items!),
|
||||
_buildPsCardSubtitle(Providers.docker.items!),
|
||||
style: UIs.textGrey,
|
||||
),
|
||||
),
|
||||
];
|
||||
items.addAll(_docker.items!.map(_buildPsItem));
|
||||
items.addAll(Providers.docker.items!.map(_buildPsItem));
|
||||
return Column(
|
||||
mainAxisSize: MainAxisSize.min,
|
||||
children: items,
|
||||
@@ -387,7 +383,7 @@ class _DockerManagePageState extends State<DockerManagePage> {
|
||||
onPressed: () async {
|
||||
context.pop();
|
||||
context.showLoadingDialog();
|
||||
await _docker.delete(dItem.containerId);
|
||||
await Providers.docker.delete(dItem.containerId);
|
||||
context.pop();
|
||||
},
|
||||
child: Text(_s.ok),
|
||||
@@ -397,17 +393,17 @@ class _DockerManagePageState extends State<DockerManagePage> {
|
||||
break;
|
||||
case DockerMenuType.start:
|
||||
context.showLoadingDialog();
|
||||
await _docker.start(dItem.containerId);
|
||||
await Providers.docker.start(dItem.containerId);
|
||||
context.pop();
|
||||
break;
|
||||
case DockerMenuType.stop:
|
||||
context.showLoadingDialog();
|
||||
await _docker.stop(dItem.containerId);
|
||||
await Providers.docker.stop(dItem.containerId);
|
||||
context.pop();
|
||||
break;
|
||||
case DockerMenuType.restart:
|
||||
context.showLoadingDialog();
|
||||
await _docker.restart(dItem.containerId);
|
||||
await Providers.docker.restart(dItem.containerId);
|
||||
context.pop();
|
||||
break;
|
||||
case DockerMenuType.logs:
|
||||
@@ -456,7 +452,7 @@ class _DockerManagePageState extends State<DockerManagePage> {
|
||||
|
||||
Widget _buildEditHost() {
|
||||
final children = <Widget>[];
|
||||
if (_docker.items!.isEmpty && _docker.images!.isEmpty) {
|
||||
if (Providers.docker.items!.isEmpty && Providers.docker.images!.isEmpty) {
|
||||
children.add(Padding(
|
||||
padding: const EdgeInsets.fromLTRB(17, 17, 17, 0),
|
||||
child: Text(
|
||||
@@ -499,6 +495,6 @@ class _DockerManagePageState extends State<DockerManagePage> {
|
||||
void _onSaveDockerHost(String val) {
|
||||
context.pop();
|
||||
Stores.docker.put(widget.spi.id, val.trim());
|
||||
_docker.refresh();
|
||||
Providers.docker.refresh();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -10,9 +10,9 @@ import 'package:provider/provider.dart';
|
||||
import 'package:toolbox/core/route.dart';
|
||||
import 'package:toolbox/data/model/server/disk.dart';
|
||||
import 'package:toolbox/data/provider/server.dart';
|
||||
import 'package:toolbox/data/res/provider.dart';
|
||||
import 'package:toolbox/data/res/store.dart';
|
||||
import 'package:toolbox/data/res/ui.dart';
|
||||
import 'package:toolbox/locator.dart';
|
||||
|
||||
import '../../core/analysis.dart';
|
||||
import '../../core/update.dart';
|
||||
@@ -38,7 +38,6 @@ class _FullScreenPageState extends State<FullScreenPage> with AfterLayoutMixin {
|
||||
late int _rotateQuarter;
|
||||
|
||||
final _pageController = PageController(initialPage: 0);
|
||||
final _serverProvider = locator<ServerProvider>();
|
||||
|
||||
@override
|
||||
void initState() {
|
||||
@@ -372,8 +371,8 @@ class _FullScreenPageState extends State<FullScreenPage> with AfterLayoutMixin {
|
||||
doUpdate(context);
|
||||
}
|
||||
await GetIt.I.allReady();
|
||||
await _serverProvider.loadLocalData();
|
||||
await _serverProvider.refreshData();
|
||||
await Providers.server.loadLocalData();
|
||||
await Providers.server.refreshData();
|
||||
if (!Analysis.enabled) {
|
||||
await Analysis.init();
|
||||
}
|
||||
|
||||
@@ -7,6 +7,7 @@ import 'package:get_it/get_it.dart';
|
||||
import 'package:toolbox/core/extension/context/dialog.dart';
|
||||
import 'package:toolbox/data/res/github_id.dart';
|
||||
import 'package:toolbox/data/res/logger.dart';
|
||||
import 'package:toolbox/data/res/provider.dart';
|
||||
import 'package:toolbox/data/res/store.dart';
|
||||
|
||||
import '../../core/analysis.dart';
|
||||
@@ -16,13 +17,10 @@ import '../../core/utils/platform.dart';
|
||||
import '../../core/utils/ui.dart';
|
||||
import '../../data/model/app/github_id.dart';
|
||||
import '../../data/model/app/tab.dart';
|
||||
import '../../data/provider/app.dart';
|
||||
import '../../data/provider/server.dart';
|
||||
import '../../data/res/build_data.dart';
|
||||
import '../../data/res/misc.dart';
|
||||
import '../../data/res/ui.dart';
|
||||
import '../../data/res/url.dart';
|
||||
import '../../locator.dart';
|
||||
import '../widget/custom_appbar.dart';
|
||||
import '../widget/round_rect_card.dart';
|
||||
import '../widget/url_text.dart';
|
||||
@@ -40,9 +38,6 @@ class _HomePageState extends State<HomePage>
|
||||
AutomaticKeepAliveClientMixin,
|
||||
AfterLayoutMixin,
|
||||
WidgetsBindingObserver {
|
||||
final _serverProvider = locator<ServerProvider>();
|
||||
final _app = locator<AppProvider>();
|
||||
|
||||
late final PageController _pageController;
|
||||
|
||||
final _selectIndex = ValueNotifier(0);
|
||||
@@ -73,7 +68,7 @@ class _HomePageState extends State<HomePage>
|
||||
void dispose() {
|
||||
super.dispose();
|
||||
WidgetsBinding.instance.removeObserver(this);
|
||||
_serverProvider.closeServer();
|
||||
Providers.server.closeServer();
|
||||
_pageController.dispose();
|
||||
}
|
||||
|
||||
@@ -84,20 +79,20 @@ class _HomePageState extends State<HomePage>
|
||||
|
||||
switch (state) {
|
||||
case AppLifecycleState.resumed:
|
||||
if (!_serverProvider.isAutoRefreshOn) {
|
||||
_serverProvider.startAutoRefresh();
|
||||
if (!Providers.server.isAutoRefreshOn) {
|
||||
Providers.server.startAutoRefresh();
|
||||
}
|
||||
updateHomeWidget();
|
||||
break;
|
||||
case AppLifecycleState.paused:
|
||||
// Keep running in background on Android device
|
||||
if (isAndroid && Stores.setting.bgRun.fetch()) {
|
||||
if (_app.moveBg) {
|
||||
if (Providers.app.moveBg) {
|
||||
Miscs.bgRunChannel.invokeMethod('sendToBackground');
|
||||
}
|
||||
} else {
|
||||
_serverProvider.setDisconnected();
|
||||
_serverProvider.stopAutoRefresh();
|
||||
Providers.server.setDisconnected();
|
||||
Providers.server.stopAutoRefresh();
|
||||
}
|
||||
break;
|
||||
default:
|
||||
@@ -148,7 +143,7 @@ class _HomePageState extends State<HomePage>
|
||||
return IconButton(
|
||||
icon: const Icon(Icons.refresh, size: 23),
|
||||
tooltip: 'Refresh',
|
||||
onPressed: () => _serverProvider.refreshData(onlyFailed: true),
|
||||
onPressed: () => Providers.server.refreshData(onlyFailed: true),
|
||||
);
|
||||
},
|
||||
),
|
||||
@@ -346,8 +341,8 @@ class _HomePageState extends State<HomePage>
|
||||
}
|
||||
updateHomeWidget();
|
||||
await GetIt.I.allReady();
|
||||
await _serverProvider.loadLocalData();
|
||||
await _serverProvider.refreshData();
|
||||
await Providers.server.loadLocalData();
|
||||
await Providers.server.refreshData();
|
||||
if (!Analysis.enabled) {
|
||||
Analysis.init();
|
||||
}
|
||||
|
||||
@@ -6,15 +6,14 @@ import 'package:flutter_gen/gen_l10n/l10n.dart';
|
||||
import 'package:toolbox/core/extension/context/common.dart';
|
||||
import 'package:toolbox/core/extension/context/dialog.dart';
|
||||
import 'package:toolbox/core/extension/context/snackbar.dart';
|
||||
import 'package:toolbox/core/extension/uint8list.dart';
|
||||
import 'package:toolbox/core/utils/misc.dart';
|
||||
import 'package:toolbox/data/res/provider.dart';
|
||||
import 'package:toolbox/view/widget/value_notifier.dart';
|
||||
|
||||
import '../../core/extension/uint8list.dart';
|
||||
import '../../data/model/server/ping_result.dart';
|
||||
import '../../data/provider/server.dart';
|
||||
import '../../data/res/color.dart';
|
||||
import '../../data/res/ui.dart';
|
||||
import '../../locator.dart';
|
||||
import '../widget/input_field.dart';
|
||||
import '../widget/round_rect_card.dart';
|
||||
|
||||
@@ -32,7 +31,6 @@ class _PingPageState extends State<PingPage>
|
||||
with AutomaticKeepAliveClientMixin, AfterLayoutMixin {
|
||||
late TextEditingController _textEditingController;
|
||||
final _results = ValueNotifier(<PingResult>[]);
|
||||
final _serverProvider = locator<ServerProvider>();
|
||||
late S _s;
|
||||
|
||||
bool get isInit => _results.value.isEmpty;
|
||||
@@ -176,7 +174,7 @@ class _PingPageState extends State<PingPage>
|
||||
return;
|
||||
}
|
||||
|
||||
if (_serverProvider.servers.isEmpty) {
|
||||
if (Providers.server.servers.isEmpty) {
|
||||
context.showSnackBar(_s.pingNoServer);
|
||||
return;
|
||||
}
|
||||
@@ -187,7 +185,7 @@ class _PingPageState extends State<PingPage>
|
||||
return;
|
||||
}
|
||||
|
||||
await Future.wait(_serverProvider.servers.values.map((e) async {
|
||||
await Future.wait(Providers.server.servers.values.map((e) async {
|
||||
if (e.client == null) {
|
||||
return;
|
||||
}
|
||||
@@ -207,9 +205,9 @@ class _PingPageState extends State<PingPage>
|
||||
|
||||
@override
|
||||
Future<FutureOr<void>> afterFirstLayout(BuildContext context) async {
|
||||
if (_serverProvider.servers.isEmpty) {
|
||||
await _serverProvider.loadLocalData();
|
||||
await _serverProvider.refreshData();
|
||||
if (Providers.server.servers.isEmpty) {
|
||||
await Providers.server.loadLocalData();
|
||||
await Providers.server.refreshData();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -10,13 +10,12 @@ import 'package:toolbox/core/extension/context/snackbar.dart';
|
||||
import 'package:toolbox/core/extension/numx.dart';
|
||||
import 'package:toolbox/core/utils/misc.dart';
|
||||
import 'package:toolbox/data/res/misc.dart';
|
||||
import 'package:toolbox/data/res/provider.dart';
|
||||
import 'package:toolbox/view/widget/input_field.dart';
|
||||
|
||||
import '../../../core/utils/server.dart';
|
||||
import '../../../data/model/server/private_key_info.dart';
|
||||
import '../../../data/provider/private_key.dart';
|
||||
import '../../../data/res/ui.dart';
|
||||
import '../../../locator.dart';
|
||||
import '../../widget/custom_appbar.dart';
|
||||
|
||||
const _format = 'text/plain';
|
||||
@@ -39,7 +38,6 @@ class _PrivateKeyEditPageState extends State<PrivateKeyEditPage> {
|
||||
final _pwdNode = FocusNode();
|
||||
|
||||
late FocusScopeNode _focusScope;
|
||||
final _provider = locator<PrivateKeyProvider>();
|
||||
late S _s;
|
||||
|
||||
Widget? _loading;
|
||||
@@ -99,7 +97,7 @@ class _PrivateKeyEditPageState extends State<PrivateKeyEditPage> {
|
||||
actions: [
|
||||
TextButton(
|
||||
onPressed: () {
|
||||
_provider.delete(widget.pki!);
|
||||
Providers.key.delete(widget.pki!);
|
||||
context.pop();
|
||||
context.pop();
|
||||
},
|
||||
@@ -139,9 +137,9 @@ class _PrivateKeyEditPageState extends State<PrivateKeyEditPage> {
|
||||
final decrypted = await compute(decyptPem, [key, pwd]);
|
||||
final pki = PrivateKeyInfo(id: name, key: decrypted);
|
||||
if (widget.pki != null) {
|
||||
_provider.update(widget.pki!, pki);
|
||||
Providers.key.update(widget.pki!, pki);
|
||||
} else {
|
||||
_provider.add(pki);
|
||||
Providers.key.add(pki);
|
||||
}
|
||||
} catch (e) {
|
||||
context.showSnackBar(e.toString());
|
||||
|
||||
@@ -8,14 +8,13 @@ import 'package:toolbox/core/extension/context/dialog.dart';
|
||||
import 'package:toolbox/core/extension/context/snackbar.dart';
|
||||
import 'package:toolbox/core/extension/uint8list.dart';
|
||||
import 'package:toolbox/core/utils/misc.dart';
|
||||
import 'package:toolbox/data/res/provider.dart';
|
||||
import 'package:toolbox/data/res/store.dart';
|
||||
|
||||
import '../../data/model/app/shell_func.dart';
|
||||
import '../../data/model/server/proc.dart';
|
||||
import '../../data/model/server/server_private_info.dart';
|
||||
import '../../data/provider/server.dart';
|
||||
import '../../data/res/ui.dart';
|
||||
import '../../locator.dart';
|
||||
import '../widget/custom_appbar.dart';
|
||||
import '../widget/round_rect_card.dart';
|
||||
import '../widget/two_line_text.dart';
|
||||
@@ -44,12 +43,10 @@ class _ProcessPageState extends State<ProcessPage> {
|
||||
ProcSortMode _procSortMode = ProcSortMode.cpu;
|
||||
List<ProcSortMode> _sortModes = List.from(ProcSortMode.values);
|
||||
|
||||
final _serverProvider = locator<ServerProvider>();
|
||||
|
||||
@override
|
||||
void initState() {
|
||||
super.initState();
|
||||
_client = _serverProvider.servers[widget.spi.id]?.client;
|
||||
_client = Providers.server.servers[widget.spi.id]?.client;
|
||||
final duration =
|
||||
Duration(seconds: Stores.setting.serverStatusUpdateInterval.fetch());
|
||||
_timer = Timer.periodic(duration, (_) => _refresh());
|
||||
|
||||
@@ -4,14 +4,13 @@ import 'package:provider/provider.dart';
|
||||
import 'package:toolbox/core/extension/context/common.dart';
|
||||
import 'package:toolbox/core/extension/context/dialog.dart';
|
||||
import 'package:toolbox/core/extension/context/snackbar.dart';
|
||||
import 'package:toolbox/data/res/provider.dart';
|
||||
|
||||
import '../../../core/route.dart';
|
||||
import '../../../data/model/server/private_key_info.dart';
|
||||
import '../../../data/model/server/server_private_info.dart';
|
||||
import '../../../data/provider/private_key.dart';
|
||||
import '../../../data/provider/server.dart';
|
||||
import '../../../data/res/ui.dart';
|
||||
import '../../../locator.dart';
|
||||
import '../../widget/custom_appbar.dart';
|
||||
import '../../widget/input_field.dart';
|
||||
import '../../widget/round_rect_card.dart';
|
||||
@@ -43,9 +42,6 @@ class _ServerEditPageState extends State<ServerEditPage> {
|
||||
late FocusScopeNode _focusScope;
|
||||
late S _s;
|
||||
|
||||
final _srvs = locator<ServerProvider>();
|
||||
final _keys = locator<PrivateKeyProvider>();
|
||||
|
||||
final _keyIdx = ValueNotifier<int?>(null);
|
||||
final _autoConnect = ValueNotifier(true);
|
||||
|
||||
@@ -63,7 +59,7 @@ class _ServerEditPageState extends State<ServerEditPage> {
|
||||
if (widget.spi?.pubKeyId == null) {
|
||||
_passwordController.text = widget.spi?.pwd ?? '';
|
||||
} else {
|
||||
_keyIdx.value = _keys.pkis.indexWhere(
|
||||
_keyIdx.value = Providers.key.pkis.indexWhere(
|
||||
(e) => e.id == widget.spi!.pubKeyId,
|
||||
);
|
||||
}
|
||||
@@ -121,7 +117,7 @@ class _ServerEditPageState extends State<ServerEditPage> {
|
||||
actions: [
|
||||
TextButton(
|
||||
onPressed: () {
|
||||
_srvs.delServer(widget.spi!.id);
|
||||
Providers.server.delServer(widget.spi!.id);
|
||||
context.pop();
|
||||
context.pop(true);
|
||||
},
|
||||
@@ -190,8 +186,8 @@ class _ServerEditPageState extends State<ServerEditPage> {
|
||||
tags: _tags,
|
||||
onChanged: (p0) => _tags = p0,
|
||||
s: _s,
|
||||
allTags: [..._srvs.tags],
|
||||
onRenameTag: _srvs.renameTag,
|
||||
allTags: [...Providers.server.tags],
|
||||
onRenameTag: Providers.server.renameTag,
|
||||
),
|
||||
_buildAuth(),
|
||||
ListTile(
|
||||
@@ -364,7 +360,7 @@ class _ServerEditPageState extends State<ServerEditPage> {
|
||||
user: _usernameController.text,
|
||||
pwd: _passwordController.text.isEmpty ? null : _passwordController.text,
|
||||
pubKeyId: _keyIdx.value != null
|
||||
? _keys.pkis.elementAt(_keyIdx.value!).id
|
||||
? Providers.key.pkis.elementAt(_keyIdx.value!).id
|
||||
: null,
|
||||
tags: _tags,
|
||||
alterUrl: _altUrlController.text.isEmpty ? null : _altUrlController.text,
|
||||
@@ -372,9 +368,9 @@ class _ServerEditPageState extends State<ServerEditPage> {
|
||||
);
|
||||
|
||||
if (widget.spi == null) {
|
||||
_srvs.addServer(spi);
|
||||
Providers.server.addServer(spi);
|
||||
} else {
|
||||
_srvs.updateServer(widget.spi!, spi);
|
||||
Providers.server.updateServer(widget.spi!, spi);
|
||||
}
|
||||
|
||||
context.pop();
|
||||
|
||||
@@ -8,6 +8,7 @@ import 'package:toolbox/core/extension/context/dialog.dart';
|
||||
import 'package:toolbox/core/extension/media_queryx.dart';
|
||||
import 'package:toolbox/core/extension/ssh_client.dart';
|
||||
import 'package:toolbox/data/model/app/shell_func.dart';
|
||||
import 'package:toolbox/data/res/provider.dart';
|
||||
import 'package:toolbox/data/res/store.dart';
|
||||
|
||||
import '../../../core/route.dart';
|
||||
@@ -21,7 +22,6 @@ import '../../../data/model/server/server_status.dart';
|
||||
import '../../../data/provider/server.dart';
|
||||
import '../../../data/res/color.dart';
|
||||
import '../../../data/res/ui.dart';
|
||||
import '../../../locator.dart';
|
||||
import '../../widget/round_rect_card.dart';
|
||||
import '../../widget/server_func_btns.dart';
|
||||
import '../../widget/tag.dart';
|
||||
@@ -39,7 +39,6 @@ class _ServerPageState extends State<ServerPage>
|
||||
late S _s;
|
||||
|
||||
final _flipedCardIds = <String>{};
|
||||
final _serverProvider = locator<ServerProvider>();
|
||||
|
||||
String? _tag;
|
||||
bool _useDoubleColumn = false;
|
||||
@@ -96,7 +95,7 @@ class _ServerPageState extends State<ServerPage>
|
||||
}
|
||||
return RefreshIndicator(
|
||||
onRefresh: () async =>
|
||||
await _serverProvider.refreshData(onlyFailed: true),
|
||||
await Providers.server.refreshData(onlyFailed: true),
|
||||
child: child,
|
||||
);
|
||||
}
|
||||
@@ -308,7 +307,7 @@ class _ServerPageState extends State<ServerPage>
|
||||
Widget? rightCorner;
|
||||
if (!(spi.autoConnect ?? true) && cs == ServerState.disconnected) {
|
||||
rightCorner = InkWell(
|
||||
onTap: () => _serverProvider.refreshData(spi: spi),
|
||||
onTap: () => Providers.server.refreshData(spi: spi),
|
||||
child: const Padding(
|
||||
padding: EdgeInsets.symmetric(horizontal: 7),
|
||||
child: Icon(
|
||||
@@ -459,10 +458,10 @@ class _ServerPageState extends State<ServerPage>
|
||||
@override
|
||||
Future<void> afterFirstLayout(BuildContext context) async {
|
||||
await GetIt.I.allReady();
|
||||
if (_serverProvider.servers.isEmpty) {
|
||||
await _serverProvider.loadLocalData();
|
||||
if (Providers.server.servers.isEmpty) {
|
||||
await Providers.server.loadLocalData();
|
||||
}
|
||||
_serverProvider.startAutoRefresh();
|
||||
Providers.server.startAutoRefresh();
|
||||
}
|
||||
|
||||
List<String> _filterServers(ServerProvider pro) => pro.serverOrder
|
||||
|
||||
@@ -12,6 +12,7 @@ import 'package:toolbox/core/extension/context/snackbar.dart';
|
||||
import 'package:toolbox/core/extension/locale.dart';
|
||||
import 'package:toolbox/core/extension/context/dialog.dart';
|
||||
import 'package:toolbox/core/extension/stringx.dart';
|
||||
import 'package:toolbox/data/res/provider.dart';
|
||||
import 'package:toolbox/data/res/store.dart';
|
||||
|
||||
import '../../../core/persistant_store.dart';
|
||||
@@ -21,12 +22,10 @@ import '../../../core/utils/platform.dart';
|
||||
import '../../../core/update.dart';
|
||||
import '../../../data/model/app/net_view.dart';
|
||||
import '../../../data/provider/app.dart';
|
||||
import '../../../data/provider/server.dart';
|
||||
import '../../../data/res/build_data.dart';
|
||||
import '../../../data/res/color.dart';
|
||||
import '../../../data/res/path.dart';
|
||||
import '../../../data/res/ui.dart';
|
||||
import '../../../locator.dart';
|
||||
import '../../widget/color_picker.dart';
|
||||
import '../../widget/custom_appbar.dart';
|
||||
import '../../widget/future_widget.dart';
|
||||
@@ -52,7 +51,6 @@ class _SettingPageState extends State<SettingPage> {
|
||||
final _keyboardTypeKey = GlobalKey<PopupMenuButtonState<int>>();
|
||||
final _rotateQuarterKey = GlobalKey<PopupMenuButtonState<int>>();
|
||||
final _netViewTypeKey = GlobalKey<PopupMenuButtonState<NetViewType>>();
|
||||
final _serverProvider = locator<ServerProvider>();
|
||||
final _setting = Stores.setting;
|
||||
|
||||
late S _s;
|
||||
@@ -108,8 +106,8 @@ class _SettingPageState extends State<SettingPage> {
|
||||
appBar: CustomAppBar(
|
||||
title: Text(_s.setting),
|
||||
actions: [
|
||||
IconButton(
|
||||
onPressed: () => context.showRoundDialog(
|
||||
InkWell(
|
||||
onTap: () => context.showRoundDialog(
|
||||
title: Text(_s.attention),
|
||||
child: Text(_s.sureDelete(_s.all)),
|
||||
actions: [
|
||||
@@ -123,7 +121,26 @@ class _SettingPageState extends State<SettingPage> {
|
||||
),
|
||||
],
|
||||
),
|
||||
icon: const Icon(Icons.delete),
|
||||
onDoubleTap: () => context.showRoundDialog(
|
||||
title: Text(_s.attention),
|
||||
child: Text(_s.sureDelete(_s.all)),
|
||||
actions: [
|
||||
TextButton(
|
||||
onPressed: () {
|
||||
Stores.docker.box.deleteFromDisk();
|
||||
Stores.server.box.deleteFromDisk();
|
||||
Stores.setting.box.deleteFromDisk();
|
||||
Stores.history.box.deleteFromDisk();
|
||||
Stores.snippet.box.deleteFromDisk();
|
||||
Stores.key.box.deleteFromDisk();
|
||||
context.pop();
|
||||
context.showSnackBar(_s.success);
|
||||
},
|
||||
child: Text(_s.ok, style: const TextStyle(color: Colors.red)),
|
||||
),
|
||||
],
|
||||
),
|
||||
child: const Icon(Icons.delete),
|
||||
),
|
||||
],
|
||||
),
|
||||
@@ -282,7 +299,7 @@ class _SettingPageState extends State<SettingPage> {
|
||||
onSelected: (int val) {
|
||||
_updateInterval.value = val;
|
||||
_setting.serverStatusUpdateInterval.put(val);
|
||||
_serverProvider.startAutoRefresh();
|
||||
Providers.server.startAutoRefresh();
|
||||
if (val == 0) {
|
||||
context.showSnackBar(_s.updateIntervalEqual0);
|
||||
}
|
||||
@@ -968,7 +985,7 @@ class _SettingPageState extends State<SettingPage> {
|
||||
child: Text(_s.sureDelete(e)),
|
||||
actions: [
|
||||
TextButton(
|
||||
onPressed: () => _serverProvider.delServer(e),
|
||||
onPressed: () => Providers.server.delServer(e),
|
||||
child: Text(_s.ok),
|
||||
)
|
||||
],
|
||||
|
||||
@@ -1,11 +1,10 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_gen/gen_l10n/l10n.dart';
|
||||
import 'package:toolbox/core/extension/order.dart';
|
||||
import 'package:toolbox/data/res/provider.dart';
|
||||
import 'package:toolbox/data/res/store.dart';
|
||||
import 'package:toolbox/view/widget/round_rect_card.dart';
|
||||
|
||||
import '../../../data/provider/server.dart';
|
||||
import '../../../locator.dart';
|
||||
import '../../widget/custom_appbar.dart';
|
||||
|
||||
class ServerOrderPage extends StatefulWidget {
|
||||
@@ -16,8 +15,6 @@ class ServerOrderPage extends StatefulWidget {
|
||||
}
|
||||
|
||||
class _ServerOrderPageState extends State<ServerOrderPage> {
|
||||
final _provider = locator<ServerProvider>();
|
||||
|
||||
late S _s;
|
||||
|
||||
@override
|
||||
@@ -40,7 +37,7 @@ class _ServerOrderPageState extends State<ServerOrderPage> {
|
||||
return ReorderableListView.builder(
|
||||
footer: const SizedBox(height: 77),
|
||||
onReorder: (oldIndex, newIndex) => setState(() {
|
||||
_provider.serverOrder.move(
|
||||
Providers.server.serverOrder.move(
|
||||
oldIndex,
|
||||
newIndex,
|
||||
property: Stores.setting.serverOrder,
|
||||
@@ -49,13 +46,13 @@ class _ServerOrderPageState extends State<ServerOrderPage> {
|
||||
padding: const EdgeInsets.symmetric(horizontal: 7, vertical: 3),
|
||||
buildDefaultDragHandles: false,
|
||||
itemBuilder: (_, index) =>
|
||||
_buildItem(index, _provider.serverOrder[index]),
|
||||
itemCount: _provider.serverOrder.length,
|
||||
_buildItem(index, Providers.server.serverOrder[index]),
|
||||
itemCount: Providers.server.serverOrder.length,
|
||||
);
|
||||
}
|
||||
|
||||
Widget _buildItem(int index, String id) {
|
||||
final spi = _provider.servers[id]?.spi;
|
||||
final spi = Providers.server.servers[id]?.spi;
|
||||
if (spi == null) {
|
||||
return const SizedBox();
|
||||
}
|
||||
|
||||
@@ -3,12 +3,11 @@ import 'package:flutter/material.dart';
|
||||
import 'package:flutter_gen/gen_l10n/l10n.dart';
|
||||
import 'package:toolbox/core/extension/context/common.dart';
|
||||
import 'package:toolbox/core/extension/context/snackbar.dart';
|
||||
import 'package:toolbox/data/res/provider.dart';
|
||||
import 'package:toolbox/view/widget/input_field.dart';
|
||||
|
||||
import '../../../data/model/server/snippet.dart';
|
||||
import '../../../data/provider/snippet.dart';
|
||||
import '../../../data/res/ui.dart';
|
||||
import '../../../locator.dart';
|
||||
import '../../widget/custom_appbar.dart';
|
||||
import '../../widget/tag.dart';
|
||||
|
||||
@@ -28,17 +27,10 @@ class _SnippetEditPageState extends State<SnippetEditPage>
|
||||
final _noteController = TextEditingController();
|
||||
final _scriptNode = FocusNode();
|
||||
|
||||
late SnippetProvider _provider;
|
||||
late S _s;
|
||||
|
||||
List<String> _tags = [];
|
||||
|
||||
@override
|
||||
void initState() {
|
||||
super.initState();
|
||||
_provider = locator<SnippetProvider>();
|
||||
}
|
||||
|
||||
@override
|
||||
void dispose() {
|
||||
super.dispose();
|
||||
@@ -72,7 +64,7 @@ class _SnippetEditPageState extends State<SnippetEditPage>
|
||||
return [
|
||||
IconButton(
|
||||
onPressed: () {
|
||||
_provider.del(widget.snippet!);
|
||||
Providers.snippet.del(widget.snippet!);
|
||||
context.pop();
|
||||
},
|
||||
tooltip: _s.delete,
|
||||
@@ -100,9 +92,9 @@ class _SnippetEditPageState extends State<SnippetEditPage>
|
||||
note: note.isEmpty ? null : note,
|
||||
);
|
||||
if (widget.snippet != null) {
|
||||
_provider.update(widget.snippet!, snippet);
|
||||
Providers.snippet.update(widget.snippet!, snippet);
|
||||
} else {
|
||||
_provider.add(snippet);
|
||||
Providers.snippet.add(snippet);
|
||||
}
|
||||
context.pop();
|
||||
},
|
||||
@@ -135,9 +127,9 @@ class _SnippetEditPageState extends State<SnippetEditPage>
|
||||
_tags = p0;
|
||||
}),
|
||||
s: _s,
|
||||
allTags: [..._provider.tags],
|
||||
allTags: [...Providers.server.tags],
|
||||
onRenameTag: (old, n) => setState(() {
|
||||
_provider.renameTag(old, n);
|
||||
Providers.server.renameTag(old, n);
|
||||
}),
|
||||
),
|
||||
Input(
|
||||
|
||||
@@ -3,14 +3,13 @@ import 'package:flutter_gen/gen_l10n/l10n.dart';
|
||||
import 'package:provider/provider.dart';
|
||||
import 'package:toolbox/core/extension/context/dialog.dart';
|
||||
import 'package:toolbox/core/extension/order.dart';
|
||||
import 'package:toolbox/data/res/provider.dart';
|
||||
import 'package:toolbox/data/res/store.dart';
|
||||
|
||||
import '../../../core/utils/misc.dart';
|
||||
import '../../../data/model/server/server.dart';
|
||||
import '../../../data/model/server/snippet.dart';
|
||||
import '../../../data/provider/server.dart';
|
||||
import '../../../data/res/ui.dart';
|
||||
import '../../../locator.dart';
|
||||
import '../../widget/tag.dart';
|
||||
import '/core/route.dart';
|
||||
import '/data/provider/snippet.dart';
|
||||
@@ -130,19 +129,18 @@ class _SnippetListPageState extends State<SnippetListPage> {
|
||||
}
|
||||
|
||||
Future<void> _runSnippet(Snippet snippet) async {
|
||||
final provider = locator<ServerProvider>();
|
||||
final servers = await showDialog<List<Server>>(
|
||||
context: context,
|
||||
builder: (_) => TagPicker<Server>(
|
||||
items: provider.servers.values.toList(),
|
||||
tags: provider.tags.toSet(),
|
||||
items: Providers.server.servers.values.toList(),
|
||||
tags: Providers.server.tags.toSet(),
|
||||
),
|
||||
);
|
||||
if (servers == null) {
|
||||
return;
|
||||
}
|
||||
final ids = servers.map((e) => e.spi.id).toList();
|
||||
final results = await provider.runSnippetsOnMulti(ids, [snippet]);
|
||||
final results = await Providers.server.runSnippetsMulti(ids, [snippet]);
|
||||
if (results.isNotEmpty) {
|
||||
// SERVER_NAME: RESULT
|
||||
final result = Map.fromIterables(
|
||||
|
||||
@@ -37,7 +37,7 @@ class SSHPage extends StatefulWidget {
|
||||
}
|
||||
|
||||
class _SSHPageState extends State<SSHPage> {
|
||||
final _keyboard = locator<VirtualKeyboard>();
|
||||
final _keyboard = locator<VirtKeyProvider>();
|
||||
late final _terminal = Terminal(inputHandler: _keyboard);
|
||||
final TerminalController _terminalController = TerminalController();
|
||||
final List<List<VirtKey>> _virtKeysList = [];
|
||||
@@ -146,7 +146,7 @@ class _SSHPageState extends State<SSHPage> {
|
||||
child: Container(
|
||||
color: _terminalTheme.background,
|
||||
height: _virtKeysHeight,
|
||||
child: Consumer<VirtualKeyboard>(
|
||||
child: Consumer<VirtKeyProvider>(
|
||||
builder: (_, __, ___) => _buildVirtualKey(),
|
||||
),
|
||||
),
|
||||
|
||||
@@ -6,10 +6,8 @@ import 'package:toolbox/core/extension/context/common.dart';
|
||||
import 'package:toolbox/core/extension/context/dialog.dart';
|
||||
import 'package:toolbox/core/extension/context/snackbar.dart';
|
||||
import 'package:toolbox/data/model/sftp/req.dart';
|
||||
import 'package:toolbox/data/provider/server.dart';
|
||||
import 'package:toolbox/data/provider/sftp.dart';
|
||||
import 'package:toolbox/data/res/misc.dart';
|
||||
import 'package:toolbox/locator.dart';
|
||||
import 'package:toolbox/data/res/provider.dart';
|
||||
import 'package:toolbox/view/widget/input_field.dart';
|
||||
import 'package:toolbox/view/widget/picker.dart';
|
||||
import 'package:toolbox/view/widget/round_rect_card.dart';
|
||||
@@ -284,8 +282,7 @@ class _LocalStoragePageState extends State<LocalStoragePage> {
|
||||
title: Text(_s.upload),
|
||||
onTap: () async {
|
||||
context.pop();
|
||||
final serverProvider = locator<ServerProvider>();
|
||||
final ids = serverProvider.serverOrder;
|
||||
final ids = Providers.server.serverOrder;
|
||||
var idx = 0;
|
||||
await context.showRoundDialog(
|
||||
title: Text(_s.server),
|
||||
@@ -299,7 +296,7 @@ class _LocalStoragePageState extends State<LocalStoragePage> {
|
||||
],
|
||||
);
|
||||
final id = ids[idx];
|
||||
final spi = serverProvider.servers[id]?.spi;
|
||||
final spi = Providers.server.servers[id]?.spi;
|
||||
if (spi == null) {
|
||||
return;
|
||||
}
|
||||
@@ -310,7 +307,7 @@ class _LocalStoragePageState extends State<LocalStoragePage> {
|
||||
if (remotePath == null) {
|
||||
return;
|
||||
}
|
||||
locator<SftpProvider>().add(SftpReq(
|
||||
Providers.sftp.add(SftpReq(
|
||||
spi,
|
||||
'$remotePath/$fileName',
|
||||
file.absolute.path,
|
||||
|
||||
@@ -10,6 +10,7 @@ import 'package:toolbox/core/extension/context/snackbar.dart';
|
||||
import 'package:toolbox/core/extension/sftpfile.dart';
|
||||
import 'package:toolbox/data/res/logger.dart';
|
||||
import 'package:toolbox/data/res/misc.dart';
|
||||
import 'package:toolbox/data/res/provider.dart';
|
||||
import 'package:toolbox/data/res/store.dart';
|
||||
import 'package:toolbox/view/widget/round_rect_card.dart';
|
||||
|
||||
@@ -22,11 +23,8 @@ import '../../../data/model/server/server_private_info.dart';
|
||||
import '../../../data/model/sftp/absolute_path.dart';
|
||||
import '../../../data/model/sftp/browser_status.dart';
|
||||
import '../../../data/model/sftp/req.dart';
|
||||
import '../../../data/provider/server.dart';
|
||||
import '../../../data/provider/sftp.dart';
|
||||
import '../../../data/res/path.dart';
|
||||
import '../../../data/res/ui.dart';
|
||||
import '../../../locator.dart';
|
||||
import '../../widget/custom_appbar.dart';
|
||||
import '../../widget/fade_in.dart';
|
||||
import '../../widget/input_field.dart';
|
||||
@@ -51,8 +49,6 @@ class SftpPage extends StatefulWidget {
|
||||
class _SftpPageState extends State<SftpPage> with AfterLayoutMixin {
|
||||
final SftpBrowserStatus _status = SftpBrowserStatus();
|
||||
|
||||
final _sftp = locator<SftpProvider>();
|
||||
|
||||
late S _s;
|
||||
|
||||
SSHClient? _client;
|
||||
@@ -66,8 +62,7 @@ class _SftpPageState extends State<SftpPage> with AfterLayoutMixin {
|
||||
@override
|
||||
void initState() {
|
||||
super.initState();
|
||||
final serverProvider = locator<ServerProvider>();
|
||||
_client = serverProvider.servers[widget.spi.id]?.client;
|
||||
_client = Providers.server.servers[widget.spi.id]?.client;
|
||||
}
|
||||
|
||||
@override
|
||||
@@ -184,7 +179,7 @@ class _SftpPageState extends State<SftpPage> with AfterLayoutMixin {
|
||||
context.showSnackBar('remote path is null');
|
||||
return;
|
||||
}
|
||||
_sftp.add(
|
||||
Providers.sftp.add(
|
||||
SftpReq(
|
||||
widget.spi,
|
||||
'$remotePath/${path.split('/').last}',
|
||||
@@ -382,14 +377,15 @@ class _SftpPageState extends State<SftpPage> with AfterLayoutMixin {
|
||||
localPath,
|
||||
SftpReqType.download,
|
||||
);
|
||||
_sftp.add(req, completer: completer);
|
||||
Providers.sftp.add(req, completer: completer);
|
||||
context.showLoadingDialog();
|
||||
await completer.future;
|
||||
context.pop();
|
||||
|
||||
final result = await AppRoute.editor(path: localPath).go<bool>(context);
|
||||
if (result != null && result) {
|
||||
_sftp.add(SftpReq(req.spi, remotePath, localPath, SftpReqType.upload));
|
||||
Providers.sftp
|
||||
.add(SftpReq(req.spi, remotePath, localPath, SftpReqType.upload));
|
||||
context.showSnackBar(_s.added2List);
|
||||
}
|
||||
}
|
||||
@@ -408,7 +404,7 @@ class _SftpPageState extends State<SftpPage> with AfterLayoutMixin {
|
||||
context.pop();
|
||||
final remotePath = _getRemotePath(name);
|
||||
|
||||
_sftp.add(
|
||||
Providers.sftp.add(
|
||||
SftpReq(
|
||||
widget.spi,
|
||||
remotePath,
|
||||
|
||||
@@ -5,7 +5,7 @@ import 'package:toolbox/core/extension/context/common.dart';
|
||||
import 'package:toolbox/core/extension/datetime.dart';
|
||||
import 'package:toolbox/core/extension/context/dialog.dart';
|
||||
import 'package:toolbox/core/route.dart';
|
||||
import 'package:toolbox/locator.dart';
|
||||
import 'package:toolbox/data/res/provider.dart';
|
||||
|
||||
import '../../../core/extension/numx.dart';
|
||||
import '../../../core/utils/misc.dart';
|
||||
@@ -149,7 +149,7 @@ class _SftpMissionPageState extends State<SftpMissionPage> {
|
||||
actions: [
|
||||
TextButton(
|
||||
onPressed: () {
|
||||
locator<SftpProvider>().cancel(id);
|
||||
Providers.sftp.cancel(id);
|
||||
context.pop();
|
||||
},
|
||||
child: Text(_s.ok),
|
||||
|
||||
@@ -9,6 +9,7 @@ import 'package:toolbox/core/extension/ssh_client.dart';
|
||||
import 'package:toolbox/core/extension/uint8list.dart';
|
||||
import 'package:toolbox/data/model/pkg/manager.dart';
|
||||
import 'package:toolbox/data/model/server/dist.dart';
|
||||
import 'package:toolbox/data/res/provider.dart';
|
||||
|
||||
import '../../core/route.dart';
|
||||
import '../../core/utils/misc.dart';
|
||||
@@ -18,9 +19,6 @@ import '../../data/model/app/menu.dart';
|
||||
import '../../data/model/pkg/upgrade_info.dart';
|
||||
import '../../data/model/server/server_private_info.dart';
|
||||
import '../../data/model/server/snippet.dart';
|
||||
import '../../data/provider/server.dart';
|
||||
import '../../data/provider/snippet.dart';
|
||||
import '../../locator.dart';
|
||||
import 'popup_menu.dart';
|
||||
import 'tag.dart';
|
||||
|
||||
@@ -102,19 +100,17 @@ void _onTapMoreBtns(
|
||||
);
|
||||
break;
|
||||
case ServerTabMenuType.snippet:
|
||||
final provider = locator<SnippetProvider>();
|
||||
final snippets = await showDialog<List<Snippet>>(
|
||||
context: context,
|
||||
builder: (_) => TagPicker<Snippet>(
|
||||
items: provider.snippets,
|
||||
tags: provider.tags.toSet(),
|
||||
items: Providers.snippet.snippets,
|
||||
tags: Providers.server.tags.toSet(),
|
||||
),
|
||||
);
|
||||
if (snippets == null) {
|
||||
return;
|
||||
}
|
||||
final result =
|
||||
await locator<ServerProvider>().runSnippets(spi.id, snippets);
|
||||
final result = await Providers.server.runSnippets(spi.id, snippets);
|
||||
if (result != null && result.isNotEmpty) {
|
||||
context.showRoundDialog(
|
||||
title: Text(s.result),
|
||||
@@ -196,7 +192,7 @@ Future<void> _gotoSSH(
|
||||
}
|
||||
|
||||
bool _checkClient(BuildContext context, String id, String msg) {
|
||||
final server = locator<ServerProvider>().servers[id];
|
||||
final server = Providers.server.servers[id];
|
||||
if (server == null || server.client == null) {
|
||||
context.showSnackBar(msg);
|
||||
return false;
|
||||
@@ -205,7 +201,7 @@ bool _checkClient(BuildContext context, String id, String msg) {
|
||||
}
|
||||
|
||||
Future<void> _onPkg(BuildContext context, S s, ServerPrivateInfo spi) async {
|
||||
final server = locator<ServerProvider>().servers[spi.id];
|
||||
final server = spi.findServer;
|
||||
if (server == null) {
|
||||
context.showSnackBar(s.noClient);
|
||||
return;
|
||||
|
||||
@@ -476,9 +476,9 @@
|
||||
baseConfigurationReference = C1C758C41C4E208965A68933 /* Pods-RunnerTests.debug.xcconfig */;
|
||||
buildSettings = {
|
||||
BUNDLE_LOADER = "$(TEST_HOST)";
|
||||
CURRENT_PROJECT_VERSION = 550;
|
||||
CURRENT_PROJECT_VERSION = 551;
|
||||
GENERATE_INFOPLIST_FILE = YES;
|
||||
MARKETING_VERSION = 1.0.550;
|
||||
MARKETING_VERSION = 1.0.551;
|
||||
PRODUCT_BUNDLE_IDENTIFIER = tech.lolli.serverBox.RunnerTests;
|
||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||
SWIFT_VERSION = 5.0;
|
||||
@@ -491,9 +491,9 @@
|
||||
baseConfigurationReference = 15AF97DF993E8968098D6EBE /* Pods-RunnerTests.release.xcconfig */;
|
||||
buildSettings = {
|
||||
BUNDLE_LOADER = "$(TEST_HOST)";
|
||||
CURRENT_PROJECT_VERSION = 550;
|
||||
CURRENT_PROJECT_VERSION = 551;
|
||||
GENERATE_INFOPLIST_FILE = YES;
|
||||
MARKETING_VERSION = 1.0.550;
|
||||
MARKETING_VERSION = 1.0.551;
|
||||
PRODUCT_BUNDLE_IDENTIFIER = tech.lolli.serverBox.RunnerTests;
|
||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||
SWIFT_VERSION = 5.0;
|
||||
@@ -506,9 +506,9 @@
|
||||
baseConfigurationReference = 7CFA7DE7FABA75685DFB6948 /* Pods-RunnerTests.profile.xcconfig */;
|
||||
buildSettings = {
|
||||
BUNDLE_LOADER = "$(TEST_HOST)";
|
||||
CURRENT_PROJECT_VERSION = 550;
|
||||
CURRENT_PROJECT_VERSION = 551;
|
||||
GENERATE_INFOPLIST_FILE = YES;
|
||||
MARKETING_VERSION = 1.0.550;
|
||||
MARKETING_VERSION = 1.0.551;
|
||||
PRODUCT_BUNDLE_IDENTIFIER = tech.lolli.serverBox.RunnerTests;
|
||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||
SWIFT_VERSION = 5.0;
|
||||
|
||||
Reference in New Issue
Block a user