summaryrefslogtreecommitdiff
path: root/app/assets/javascripts/content_editor/extensions/attachment.js
blob: e7a6af30266c163e50989d24ac1117afd5a7666c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
import { Extension } from '@tiptap/core';
import { Plugin, PluginKey } from '@tiptap/pm/state';
import { handleFileEvent } from '../services/upload_helpers';

const processFiles = ({ files, uploadsPath, renderMarkdown, eventHub, editor }) => {
  if (!files.length) {
    return false;
  }

  let handled = true;

  for (const file of files) {
    handled = handled && handleFileEvent({ editor, file, uploadsPath, renderMarkdown, eventHub });
  }

  return handled;
};

export default Extension.create({
  name: 'attachment',

  addOptions() {
    return {
      uploadsPath: null,
      renderMarkdown: null,
      eventHub: null,
    };
  },

  addCommands() {
    return {
      uploadAttachment: ({ file }) => () => {
        const { uploadsPath, renderMarkdown, eventHub } = this.options;

        return handleFileEvent({
          file,
          uploadsPath,
          renderMarkdown,
          editor: this.editor,
          eventHub,
        });
      },
    };
  },
  addProseMirrorPlugins() {
    const { editor } = this;

    return [
      new Plugin({
        key: new PluginKey('attachment'),
        props: {
          handlePaste: (_, event) => {
            return processFiles({
              files: event.clipboardData.files,
              editor,
              ...this.options,
            });
          },
          handleDrop: (_, event) => {
            return processFiles({
              files: event.dataTransfer.files,
              editor,
              ...this.options,
            });
          },
        },
      }),
    ];
  },
});