import 'package:flutter/material.dart'; import 'package:flutter_gen/gen_l10n/l10n.dart'; import 'package:fluffychat/widgets/adaptive_dialogs/show_text_input_dialog.dart'; Widget markdownContextBuilder( BuildContext context, EditableTextState editableTextState, TextEditingController controller, ) { final value = editableTextState.textEditingValue; final selectedText = value.selection.textInside(value.text); final buttonItems = editableTextState.contextMenuButtonItems; final l10n = L10n.of(context); return AdaptiveTextSelectionToolbar.buttonItems( anchors: editableTextState.contextMenuAnchors, buttonItems: [ ...buttonItems, if (selectedText.isNotEmpty) ...[ ContextMenuButtonItem( label: l10n.link, onPressed: () async { final input = await showTextInputDialog( context: context, title: l10n.addLink, okLabel: l10n.ok, cancelLabel: l10n.cancel, validator: (text) { if (text.isEmpty) { return l10n.pleaseFillOut; } try { text.startsWith('http') ? Uri.parse(text) : Uri.https(text); } catch (_) { return l10n.invalidUrl; } return null; }, hintText: 'www...', keyboardType: TextInputType.url, ); final urlString = input; if (urlString == null) return; final url = urlString.startsWith('http') ? Uri.parse(urlString) : Uri.https(urlString); final selection = controller.selection; controller.text = controller.text.replaceRange( selection.start, selection.end, '[$selectedText](${url.toString()})', ); ContextMenuController.removeAny(); }, ), ContextMenuButtonItem( label: l10n.boldText, onPressed: () { final selection = controller.selection; controller.text = controller.text.replaceRange( selection.start, selection.end, '**$selectedText**', ); ContextMenuController.removeAny(); }, ), ContextMenuButtonItem( label: l10n.italicText, onPressed: () { final selection = controller.selection; controller.text = controller.text.replaceRange( selection.start, selection.end, '*$selectedText*', ); ContextMenuController.removeAny(); }, ), ContextMenuButtonItem( label: l10n.strikeThrough, onPressed: () { final selection = controller.selection; controller.text = controller.text.replaceRange( selection.start, selection.end, '~~$selectedText~~', ); ContextMenuController.removeAny(); }, ), ], ], ); }