inline_actions_command.dart 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. import 'package:appflowy/plugins/inline_actions/inline_actions_menu.dart';
  2. import 'package:appflowy/plugins/inline_actions/inline_actions_result.dart';
  3. import 'package:appflowy/plugins/inline_actions/inline_actions_service.dart';
  4. import 'package:appflowy_editor/appflowy_editor.dart';
  5. const inlineActionCharacter = '@';
  6. CharacterShortcutEvent inlineActionsCommand(
  7. InlineActionsService inlineActionsService, {
  8. InlineActionsMenuStyle style = const InlineActionsMenuStyle.light(),
  9. }) =>
  10. CharacterShortcutEvent(
  11. key: 'Opens Inline Actions Menu',
  12. character: inlineActionCharacter,
  13. handler: (editorState) => inlineActionsCommandHandler(
  14. editorState,
  15. inlineActionsService,
  16. style,
  17. ),
  18. );
  19. InlineActionsMenuService? selectionMenuService;
  20. Future<bool> inlineActionsCommandHandler(
  21. EditorState editorState,
  22. InlineActionsService service,
  23. InlineActionsMenuStyle style,
  24. ) async {
  25. final selection = editorState.selection;
  26. if (PlatformExtension.isMobile || selection == null) {
  27. return false;
  28. }
  29. if (!selection.isCollapsed) {
  30. await editorState.deleteSelection(selection);
  31. }
  32. await editorState.insertTextAtPosition(
  33. inlineActionCharacter,
  34. position: selection.start,
  35. );
  36. final List<InlineActionsResult> initialResults = [];
  37. for (final handler in service.handlers) {
  38. final group = await handler();
  39. if (group.results.isNotEmpty) {
  40. initialResults.add(group);
  41. }
  42. }
  43. if (service.context != null) {
  44. selectionMenuService = InlineActionsMenu(
  45. context: service.context!,
  46. editorState: editorState,
  47. service: service,
  48. initialResults: initialResults,
  49. style: style,
  50. );
  51. selectionMenuService?.show();
  52. }
  53. return true;
  54. }