diff --git a/lib/core/utils/ui.dart b/lib/core/utils/ui.dart index 099eb1cb..c13d3363 100644 --- a/lib/core/utils/ui.dart +++ b/lib/core/utils/ui.dart @@ -3,11 +3,17 @@ import 'dart:io'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:flutter_gen/gen_l10n/l10n.dart'; -import 'package:toolbox/core/utils/misc.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/picker.dart'; import '../persistant_store.dart'; +import '../route.dart'; +import 'misc.dart'; import 'platform.dart'; import '../extension/stringx.dart'; import '../extension/uint8list.dart'; @@ -113,3 +119,48 @@ Future loadFontFile(String? localPath) async { fontLoader.addFont(File(localPath).readAsBytes().byteData); await fontLoader.load(); } + +void showSnippetDialog( + BuildContext context, S s, Function(Snippet s) onSelected) { + final provider = locator(); + 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), + ) + ], + ); +} diff --git a/lib/view/page/server/tab.dart b/lib/view/page/server/tab.dart index 7a5dc83d..4b60a51f 100644 --- a/lib/view/page/server/tab.dart +++ b/lib/view/page/server/tab.dart @@ -11,7 +11,6 @@ import '../../../data/model/server/server.dart'; import '../../../data/model/server/server_private_info.dart'; import '../../../data/model/server/server_status.dart'; import '../../../data/provider/server.dart'; -import '../../../data/provider/snippet.dart'; import '../../../data/res/color.dart'; import '../../../data/res/menu.dart'; import '../../../data/res/ui.dart'; @@ -19,13 +18,11 @@ import '../../../data/res/url.dart'; import '../../../data/store/setting.dart'; import '../../../locator.dart'; import '../../widget/dropdown_menu.dart'; -import '../../widget/picker.dart'; import '../../widget/round_rect_card.dart'; import '../../widget/url_text.dart'; import '../docker.dart'; import '../pkg.dart'; import '../sftp/view.dart'; -import '../snippet/edit.dart'; import '../ssh.dart'; import 'detail.dart'; import 'edit.dart'; @@ -266,7 +263,21 @@ class _ServerPageState extends State AppRoute(SFTPPage(spi), 'SFTP').go(context); break; case ServerTabMenuItems.snippet: - _showSnippetDialog(spi.id); + showSnippetDialog(context, _s, (s) async { + final result = + await locator().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; case ServerTabMenuItems.edit: AppRoute(ServerEditPage(spi: spi), 'Edit server info').go(context); @@ -382,61 +393,6 @@ class _ServerPageState extends State ); } - void _showSnippetDialog(String id) { - final provider = locator(); - 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 bool get wantKeepAlive => true; diff --git a/lib/view/page/ssh.dart b/lib/view/page/ssh.dart index 2a32b929..21c87d4f 100644 --- a/lib/view/page/ssh.dart +++ b/lib/view/page/ssh.dart @@ -275,8 +275,10 @@ class _SSHPageState extends State { copy(terminalSelected); break; case VirtualKeyFunc.snippet: - // TODO: Handle this case. - // _showSnippet(); + showSnippetDialog(context, _s, (s) { + _terminal.textInput(s.script); + _terminal.keyInput(TerminalKey.enter); + }); break; } }