diff --git a/app/editor/components/Styles.ts b/app/editor/components/Styles.ts
index c29781375..9b0c18137 100644
--- a/app/editor/components/Styles.ts
+++ b/app/editor/components/Styles.ts
@@ -728,8 +728,11 @@ const EditorStyles = styled.div<{
}
.external-link {
+ display: inline-block;
position: relative;
top: 2px;
+ width: 16px;
+ height: 16px;
}
.code-actions,
diff --git a/shared/editor/marks/Link.tsx b/shared/editor/marks/Link.tsx
index 76e35723e..5548287d7 100644
--- a/shared/editor/marks/Link.tsx
+++ b/shared/editor/marks/Link.tsx
@@ -13,12 +13,20 @@ import { EditorState, Plugin } from "prosemirror-state";
import { Decoration, DecorationSet } from "prosemirror-view";
import * as React from "react";
import ReactDOM from "react-dom";
-import { isInternalUrl } from "../../utils/urls";
+import { isExternalUrl } from "../../utils/urls";
import findLinkNodes from "../queries/findLinkNodes";
import { EventType, Dispatch } from "../types";
import Mark from "./Mark";
const LINK_INPUT_REGEX = /\[([^[]+)]\((\S+)\)$/;
+let icon: HTMLSpanElement;
+
+if (typeof window !== "undefined") {
+ const component = ;
+ icon = document.createElement("span");
+ icon.className = "external-link";
+ ReactDOM.render(component, icon);
+}
function isPlainURL(
link: ProsemirrorMark,
@@ -116,20 +124,15 @@ export default class Link extends Mark {
}
get plugins() {
- const component = ;
- const icon = document.createElement("span");
- icon.className = "external-link";
- ReactDOM.render(component, icon);
-
- const getLinkDecorations = (doc: Node) => {
+ const getLinkDecorations = (state: EditorState) => {
const decorations: Decoration[] = [];
- const links = findLinkNodes(doc);
+ const links = findLinkNodes(state.doc);
links.forEach((nodeWithPos) => {
const linkMark = nodeWithPos.node.marks.find(
(mark) => mark.type.name === "link"
);
- if (linkMark && !isInternalUrl(linkMark.attrs.href)) {
+ if (linkMark && isExternalUrl(linkMark.attrs.href)) {
decorations.push(
Decoration.widget(
// place the decoration at the end of the link
@@ -145,16 +148,16 @@ export default class Link extends Mark {
}
});
- return DecorationSet.create(doc, decorations);
+ return DecorationSet.create(state.doc, decorations);
};
const plugin: Plugin = new Plugin({
state: {
init: (config, state) => {
- return getLinkDecorations(state.doc);
+ return getLinkDecorations(state);
},
- apply: (tr, oldState) => {
- return tr.docChanged ? getLinkDecorations(tr.doc) : oldState;
+ apply: (tr, decorationSet, _oldState, newState) => {
+ return tr.docChanged ? getLinkDecorations(newState) : decorationSet;
},
},
props: {
diff --git a/shared/utils/urls.ts b/shared/utils/urls.ts
index 94077f409..a4d30c85b 100644
--- a/shared/utils/urls.ts
+++ b/shared/utils/urls.ts
@@ -28,3 +28,7 @@ export function isInternalUrl(href: string) {
return false;
}
+
+export function isExternalUrl(href: string) {
+ return !isInternalUrl(href);
+}