Sha256: 7978ae42f6d5285cb3b6bf8833c9087ba999e929952769754c4f6efe39326a36

Contents?: true

Size: 1.85 KB

Versions: 15

Compression:

Stored size: 1.85 KB

Contents

import Mention from "@tiptap/extension-mention";
import { PluginKey } from "prosemirror-state";

import { createSuggestionRenderer, createNodeView } from "src/decidim/editor/common/suggestion";

export const HashtagPluginKey = new PluginKey("hashtag");

const searchHashtags = async (queryText) => {
  return fetch(window.Decidim.config.get("api_path"), {
    method: "POST",
    cache: "no-cache",
    headers: { "Content-Type": "application/json" },
    body: JSON.stringify({ query: `{ hashtags(name:"${queryText}") {name} }` })
  }).then((response) => {
    if (response.ok) {
      return response.json();
    }
    throw new Error("Could not retrieve data");
  }).then((json) => (json.data.hashtags || []));
};

/**
 * The hashtag extension does not yet exist in the TipTap public repository and
 * also the documentation page shows it as
 * https://tiptap.dev/api/nodes/hashtag
 */
export default Mention.extend({
  name: "hashtag",

  addOptions() {
    const options = this.parent?.();
    const suggestion = options?.suggestion;

    return {
      ...options,
      renderLabel({ node }) {
        // The labels already have the suggestion character in front of them
        // which is why we do not want to add it twice.
        return `${node.attrs.label ?? node.attrs.id}`
      },
      suggestion: {
        ...suggestion,
        char: "#",
        pluginKey: HashtagPluginKey,
        items: async ({ query }) => {
          if (query.length < 2) {
            return [];
          }

          const data = await searchHashtags(query);
          const sorted = data.sort((tag) => tag.name);
          return sorted.slice(0, 5);
        },
        render: createSuggestionRenderer(this, {
          itemConverter: (tag) => {
            return { label: `#${tag.name}` }
          }
        })
      }
    };
  },

  addNodeView() {
    return createNodeView(this);
  }
});

Version data entries

15 entries across 15 versions & 1 rubygems

Version Path
decidim-core-0.30.0.rc3 app/packs/src/decidim/editor/extensions/hashtag/index.js
decidim-core-0.30.0.rc2 app/packs/src/decidim/editor/extensions/hashtag/index.js
decidim-core-0.30.0.rc1 app/packs/src/decidim/editor/extensions/hashtag/index.js
decidim-core-0.29.2 app/packs/src/decidim/editor/extensions/hashtag/index.js
decidim-core-0.28.5 app/packs/src/decidim/editor/extensions/hashtag/index.js
decidim-core-0.29.1 app/packs/src/decidim/editor/extensions/hashtag/index.js
decidim-core-0.28.4 app/packs/src/decidim/editor/extensions/hashtag/index.js
decidim-core-0.29.0 app/packs/src/decidim/editor/extensions/hashtag/index.js
decidim-core-0.28.3 app/packs/src/decidim/editor/extensions/hashtag/index.js
decidim-core-0.29.0.rc4 app/packs/src/decidim/editor/extensions/hashtag/index.js
decidim-core-0.29.0.rc3 app/packs/src/decidim/editor/extensions/hashtag/index.js
decidim-core-0.29.0.rc2 app/packs/src/decidim/editor/extensions/hashtag/index.js
decidim-core-0.29.0.rc1 app/packs/src/decidim/editor/extensions/hashtag/index.js
decidim-core-0.28.2 app/packs/src/decidim/editor/extensions/hashtag/index.js
decidim-core-0.28.1 app/packs/src/decidim/editor/extensions/hashtag/index.js