showLinkMenu function
void
showLinkMenu(
- BuildContext context,
- EditorState editorState,
- Selection selection,
- bool isHref,
Implementation
void showLinkMenu(
BuildContext context,
EditorState editorState,
Selection selection,
bool isHref,
) {
// Since link format is only available for single line selection,
// the first rect(also the only rect) is used as the starting reference point for the [overlay] position
// get link address if the selection is already a link
String? linkText;
if (isHref) {
linkText = editorState.getDeltaAttributeValueInSelection(
BuiltInAttributeKey.href,
selection,
);
}
final (left, top, right, bottom) = _getPosition(editorState, linkText);
// get node, index and length for formatting text when the link is removed
final node = editorState.getNodeAtPath(selection.end.path);
if (node == null) {
return;
}
final index = selection.normalized.startIndex;
final length = selection.length;
OverlayEntry? overlay;
void dismissOverlay() {
keepEditorFocusNotifier.decrease();
overlay?.remove();
overlay = null;
}
keepEditorFocusNotifier.increase();
overlay = FullScreenOverlayEntry(
top: top,
bottom: bottom,
left: left,
right: right,
dismissCallback: () => keepEditorFocusNotifier.decrease(),
builder: (context) {
return LinkMenu(
linkText: linkText,
editorState: editorState,
onOpenLink: () async {
await safeLaunchUrl(linkText);
},
onSubmitted: (text) async {
if (isURL(text)) {
await editorState.formatDelta(selection, {
BuiltInAttributeKey.href: text,
});
dismissOverlay();
}
},
onCopyLink: () {
AppFlowyClipboard.setData(text: linkText);
dismissOverlay();
},
onRemoveLink: () {
final transaction = editorState.transaction
..formatText(
node,
index,
length,
{BuiltInAttributeKey.href: null},
);
editorState.apply(transaction);
dismissOverlay();
},
onDismiss: dismissOverlay,
);
},
).build();
Overlay.of(context, rootOverlay: true).insert(overlay!);
}