Skip to content

Commit eb33685

Browse files
committed
chore(editor): add composable for injecting the link handler
Signed-off-by: Jonas <jonas@freesources.org>
1 parent bf6ff24 commit eb33685

7 files changed

Lines changed: 39 additions & 29 deletions

File tree

src/components/Editor.provider.ts

Lines changed: 0 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -3,15 +3,13 @@
33
* SPDX-License-Identifier: AGPL-3.0-or-later
44
*/
55

6-
import { openLink } from '../helpers/links.js'
76
import { logger } from '../helpers/logger.js'
87

98
export const ATTACHMENT_RESOLVER = Symbol('attachment:resolver')
109
export const IS_MOBILE = Symbol('editor:is-mobile')
1110
export const EDITOR_UPLOAD = Symbol('editor:upload')
1211
export const HOOK_MENTION_SEARCH = Symbol('hook:mention-search')
1312
export const HOOK_MENTION_INSERT = Symbol('hook:mention-insert')
14-
export const OPEN_LINK_HANDLER = Symbol('editor:open-link-handler')
1513
export const HOOK_MENUBAR_LINK_CUSTOM_ACTION = Symbol('menubar:link-custom-action')
1614

1715
export const useIsMobileMixin = {
@@ -55,13 +53,3 @@ export const useMentionHook = {
5553
},
5654
},
5755
}
58-
export const useOpenLinkHandler = {
59-
inject: {
60-
$openLinkHandler: {
61-
from: OPEN_LINK_HANDLER,
62-
default: {
63-
openLink,
64-
},
65-
},
66-
},
67-
}

src/components/Editor.vue

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -96,11 +96,11 @@ import Autofocus from '../extensions/Autofocus.js'
9696
9797
import { provideEditor } from '../composables/useEditor.ts'
9898
import { provideEditorFlags } from '../composables/useEditorFlags.ts'
99+
import { useOpenLinkHandler } from '../composables/useOpenLinkHandler.ts'
99100
import {
100101
ATTACHMENT_RESOLVER,
101102
HOOK_MENTION_SEARCH,
102103
IS_MOBILE,
103-
OPEN_LINK_HANDLER,
104104
} from './Editor.provider.ts'
105105
import ReadonlyBar from './Menu/ReadonlyBar.vue'
106106
@@ -129,7 +129,6 @@ import {
129129
serializePlainText,
130130
} from './../EditorFactory.ts'
131131
import { createMarkdownSerializer } from './../extensions/Markdown.js'
132-
import { openLink as defaultOpenLink } from './../helpers/links.js'
133132
import markdownit from './../markdownit/index.js'
134133
import isMobile from './../mixins/isMobile.js'
135134
import AttachmentResolver from './../services/AttachmentResolver.js'
@@ -272,9 +271,7 @@ export default defineComponent({
272271
CollaborationCaret.configure({ provider: { awareness } }),
273272
]
274273
const mentionSearch = inject(HOOK_MENTION_SEARCH)
275-
const openLinkHandler = inject(OPEN_LINK_HANDLER, {
276-
openLink: defaultOpenLink,
277-
})
274+
const { openLinkHandler } = useOpenLinkHandler()
278275
const editor = isRichEditor
279276
? createRichEditor({
280277
connection,

src/components/Editor/MarkdownContentEditor.vue

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -25,17 +25,17 @@ import Wrapper from './Wrapper.vue'
2525
/* eslint-disable import/no-named-as-default */
2626
import { getCurrentUser } from '@nextcloud/auth'
2727
import { UndoRedo } from '@tiptap/extensions'
28-
import { inject, provide, watch } from 'vue'
28+
import { provide, watch } from 'vue'
2929
import { provideEditor } from '../../composables/useEditor.ts'
3030
import { editorFlagsKey } from '../../composables/useEditorFlags.ts'
3131
import { provideEditorHeadings } from '../../composables/useEditorHeadings.ts'
3232
import { useEditorMethods } from '../../composables/useEditorMethods.ts'
3333
import { provideEditorWidth } from '../../composables/useEditorWidth.ts'
34+
import { useOpenLinkHandler } from '../../composables/useOpenLinkHandler.ts'
3435
import { FocusTrap, RichText } from '../../extensions/index.js'
3536
import { createMarkdownSerializer } from '../../extensions/Markdown.js'
36-
import { openLink as defaultOpenLink } from '../../helpers/links.js'
3737
import AttachmentResolver from '../../services/AttachmentResolver.js'
38-
import { ATTACHMENT_RESOLVER, OPEN_LINK_HANDLER } from '../Editor.provider.ts'
38+
import { ATTACHMENT_RESOLVER } from '../Editor.provider.ts'
3939
import ReadonlyBar from '../Menu/ReadonlyBar.vue'
4040
import ContentContainer from './ContentContainer.vue'
4141
@@ -83,9 +83,7 @@ export default {
8383
emits: ['update:content'],
8484
8585
setup(props) {
86-
const openLinkHandler = inject(OPEN_LINK_HANDLER, {
87-
openLink: defaultOpenLink,
88-
})
86+
const { openLinkHandler } = useOpenLinkHandler()
8987
const extensions = [
9088
RichText.configure({
9189
extensions: [UndoRedo],

src/components/Editor/PreviewOptions.vue

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -72,8 +72,8 @@ import ContentCopyIcon from 'vue-material-design-icons/ContentCopy.vue'
7272
import DotsVerticalIcon from 'vue-material-design-icons/DotsVertical.vue'
7373
import OpenIcon from 'vue-material-design-icons/OpenInNew.vue'
7474
import DeleteOutlineIcon from 'vue-material-design-icons/TrashCanOutline.vue'
75+
import { useOpenLinkHandler } from '../../composables/useOpenLinkHandler.ts'
7576
import CopyToClipboardMixin from '../../mixins/CopyToClipboardMixin.js'
76-
import { useOpenLinkHandler } from '../Editor.provider.ts'
7777
7878
export default {
7979
name: 'PreviewOptions',
@@ -92,7 +92,7 @@ export default {
9292
OpenIcon,
9393
},
9494
95-
mixins: [CopyToClipboardMixin, useOpenLinkHandler],
95+
mixins: [CopyToClipboardMixin],
9696
9797
props: {
9898
type: {
@@ -105,6 +105,11 @@ export default {
105105
},
106106
},
107107
108+
setup() {
109+
const { openLinkHandler } = useOpenLinkHandler()
110+
return { openLinkHandler }
111+
},
112+
108113
data() {
109114
return {
110115
open: false,
@@ -127,7 +132,7 @@ export default {
127132
},
128133
openLink() {
129134
if (!this.href) return
130-
this.$openLinkHandler.openLink(this.href)
135+
this.openLinkHandler.openLink(this.href)
131136
},
132137
async copyLink() {
133138
await this.copyToClipboard(this.href)

src/components/Link/LinkBubbleView.vue

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -97,7 +97,7 @@ import CloseIcon from 'vue-material-design-icons/Close.vue'
9797
import OpenInNewIcon from 'vue-material-design-icons/OpenInNew.vue'
9898
import PencilOutlineIcon from 'vue-material-design-icons/PencilOutline.vue'
9999
100-
import { useOpenLinkHandler } from '../Editor.provider.ts'
100+
import { useOpenLinkHandler } from '../../composables/useOpenLinkHandler.ts'
101101
import PreviewOptions from '../Editor/PreviewOptions.vue'
102102
103103
const PROTOCOLS_WITH_PREVIEW = ['http:', 'https:']
@@ -129,6 +129,11 @@ export default {
129129
},
130130
},
131131
132+
setup() {
133+
const { openLinkHandler } = useOpenLinkHandler()
134+
return { openLinkHandler }
135+
},
136+
132137
data() {
133138
return {
134139
isEditable: false,
@@ -191,7 +196,7 @@ export default {
191196
},
192197
193198
openLink(href) {
194-
this.$openLinkHandler.openLink(href)
199+
this.openLinkHandler.openLink(href)
195200
},
196201
197202
onReferenceListLoaded() {
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
/**
2+
* SPDX-FileCopyrightText: 2026 Nextcloud GmbH and Nextcloud contributors
3+
* SPDX-License-Identifier: AGPL-3.0-or-later
4+
*/
5+
6+
import { inject } from 'vue'
7+
import { openLink } from '../helpers/links.js'
8+
9+
export const OPEN_LINK_HANDLER = Symbol('editor:open-link-handler')
10+
11+
/**
12+
* Inject provided link handler
13+
*/
14+
export function useOpenLinkHandler() {
15+
const openLinkHandler = inject(OPEN_LINK_HANDLER, { openLink })
16+
return { openLinkHandler }
17+
}

src/editor.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,9 +11,9 @@ import {
1111
HOOK_MENTION_INSERT,
1212
HOOK_MENTION_SEARCH,
1313
HOOK_MENUBAR_LINK_CUSTOM_ACTION,
14-
OPEN_LINK_HANDLER,
1514
} from './components/Editor.provider.ts'
1615
import { ACTION_ATTACHMENT_PROMPT } from './components/Editor/MediaHandler.provider.js'
16+
import { OPEN_LINK_HANDLER } from './composables/useOpenLinkHandler.ts'
1717
import { encodeAttachmentFilename } from './helpers/attachmentFilename.ts'
1818
import { openLink } from './helpers/links.js'
1919
// eslint-disable-next-line import/no-unresolved, n/no-missing-import

0 commit comments

Comments
 (0)