#25 snippet in SSH

This commit is contained in:
lollipopkit
2023-04-16 14:08:10 +08:00
parent fd2d59b1e0
commit 8ba888a5b3
3 changed files with 71 additions and 62 deletions

View File

@@ -3,11 +3,17 @@ import 'dart:io';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter/services.dart'; import 'package:flutter/services.dart';
import 'package:flutter_gen/gen_l10n/l10n.dart'; import 'package:flutter_gen/gen_l10n/l10n.dart';
import 'package:toolbox/core/utils/misc.dart';
import 'package:url_launcher/url_launcher.dart'; import 'package:url_launcher/url_launcher.dart';
import '../../data/model/server/snippet.dart';
import '../../data/provider/snippet.dart';
import '../../locator.dart';
import '../../view/page/snippet/edit.dart';
import '../../view/widget/card_dialog.dart'; import '../../view/widget/card_dialog.dart';
import '../../view/widget/picker.dart';
import '../persistant_store.dart'; import '../persistant_store.dart';
import '../route.dart';
import 'misc.dart';
import 'platform.dart'; import 'platform.dart';
import '../extension/stringx.dart'; import '../extension/stringx.dart';
import '../extension/uint8list.dart'; import '../extension/uint8list.dart';
@@ -113,3 +119,48 @@ Future<void> loadFontFile(String? localPath) async {
fontLoader.addFont(File(localPath).readAsBytes().byteData); fontLoader.addFont(File(localPath).readAsBytes().byteData);
await fontLoader.load(); await fontLoader.load();
} }
void showSnippetDialog(
BuildContext context, S s, Function(Snippet s) onSelected) {
final provider = locator<SnippetProvider>();
if (provider.snippets.isEmpty) {
showRoundDialog(
context,
s.attention,
Text(s.noSavedSnippet),
[
TextButton(
onPressed: () => Navigator.pop(context),
child: Text(s.ok),
),
TextButton(
onPressed: () {
Navigator.of(context).pop();
AppRoute(const SnippetEditPage(), 'edit snippet').go(context);
},
child: Text(s.addOne),
)
],
);
return;
}
var snippet = provider.snippets.first;
showRoundDialog(
context,
s.choose,
buildPicker(
provider.snippets.map((e) => Text(e.name)).toList(),
(idx) => snippet = provider.snippets[idx],
),
[
TextButton(
onPressed: () async {
Navigator.of(context).pop();
onSelected(snippet);
},
child: Text(s.ok),
)
],
);
}

View File

@@ -11,7 +11,6 @@ import '../../../data/model/server/server.dart';
import '../../../data/model/server/server_private_info.dart'; import '../../../data/model/server/server_private_info.dart';
import '../../../data/model/server/server_status.dart'; import '../../../data/model/server/server_status.dart';
import '../../../data/provider/server.dart'; import '../../../data/provider/server.dart';
import '../../../data/provider/snippet.dart';
import '../../../data/res/color.dart'; import '../../../data/res/color.dart';
import '../../../data/res/menu.dart'; import '../../../data/res/menu.dart';
import '../../../data/res/ui.dart'; import '../../../data/res/ui.dart';
@@ -19,13 +18,11 @@ import '../../../data/res/url.dart';
import '../../../data/store/setting.dart'; import '../../../data/store/setting.dart';
import '../../../locator.dart'; import '../../../locator.dart';
import '../../widget/dropdown_menu.dart'; import '../../widget/dropdown_menu.dart';
import '../../widget/picker.dart';
import '../../widget/round_rect_card.dart'; import '../../widget/round_rect_card.dart';
import '../../widget/url_text.dart'; import '../../widget/url_text.dart';
import '../docker.dart'; import '../docker.dart';
import '../pkg.dart'; import '../pkg.dart';
import '../sftp/view.dart'; import '../sftp/view.dart';
import '../snippet/edit.dart';
import '../ssh.dart'; import '../ssh.dart';
import 'detail.dart'; import 'detail.dart';
import 'edit.dart'; import 'edit.dart';
@@ -266,7 +263,21 @@ class _ServerPageState extends State<ServerPage>
AppRoute(SFTPPage(spi), 'SFTP').go(context); AppRoute(SFTPPage(spi), 'SFTP').go(context);
break; break;
case ServerTabMenuItems.snippet: case ServerTabMenuItems.snippet:
_showSnippetDialog(spi.id); showSnippetDialog(context, _s, (s) async {
final result =
await locator<ServerProvider>().runSnippet(spi.id, s);
showRoundDialog(
context,
_s.result,
Text(result ?? _s.error, style: textSize13),
[
TextButton(
onPressed: () => Navigator.of(context).pop(),
child: Text(_s.ok),
)
],
);
});
break; break;
case ServerTabMenuItems.edit: case ServerTabMenuItems.edit:
AppRoute(ServerEditPage(spi: spi), 'Edit server info').go(context); AppRoute(ServerEditPage(spi: spi), 'Edit server info').go(context);
@@ -382,61 +393,6 @@ class _ServerPageState extends State<ServerPage>
); );
} }
void _showSnippetDialog(String id) {
final provider = locator<SnippetProvider>();
if (provider.snippets.isEmpty) {
showRoundDialog(
context,
_s.attention,
Text(_s.noSavedSnippet),
[
TextButton(
onPressed: () => Navigator.pop(context),
child: Text(_s.ok),
),
TextButton(
onPressed: () {
Navigator.of(context).pop();
AppRoute(const SnippetEditPage(), 'edit snippet').go(context);
},
child: Text(_s.addOne),
)
],
);
return;
}
var snippet = provider.snippets.first;
showRoundDialog(
context,
_s.choose,
buildPicker(
provider.snippets.map((e) => Text(e.name)).toList(),
(idx) => snippet = provider.snippets[idx],
),
[
TextButton(
onPressed: () async {
Navigator.of(context).pop();
final result = await _serverProvider.runSnippet(id, snippet);
showRoundDialog(
context,
_s.result,
Text(result ?? _s.error, style: textSize13),
[
TextButton(
onPressed: () => Navigator.of(context).pop(),
child: Text(_s.ok),
)
],
);
},
child: Text(_s.run),
)
],
);
}
@override @override
bool get wantKeepAlive => true; bool get wantKeepAlive => true;

View File

@@ -275,8 +275,10 @@ class _SSHPageState extends State<SSHPage> {
copy(terminalSelected); copy(terminalSelected);
break; break;
case VirtualKeyFunc.snippet: case VirtualKeyFunc.snippet:
// TODO: Handle this case. showSnippetDialog(context, _s, (s) {
// _showSnippet(); _terminal.textInput(s.script);
_terminal.keyInput(TerminalKey.enter);
});
break; break;
} }
} }