JavaScript Hook для Composer

Привет,

Ранее я создавал сообщение, которое не получило отклика — возможно, потому что запрос был слишком узким. Поэтому я попробую ещё раз: мне нужно интегрироваться в редактор написания сообщений, чтобы при вводе пользователем определённой последовательности символов (например, --), за которой следует поисковый запрос, отображалось всплывающее окно с результатами поиска. После выбора пользователем одного из результатов в месте ввода запроса должен быть вставлен обычная ссылка. Каковы лучшие практики для доступа к элементу редактора и получения уведомления плагина о том, что пользователь начинает composing поста? Я изучил API плагинов и несколько проектов на GitHub, но не нашёл подходящих примеров.

С уважением,
Александр

Я подозреваю, что вы хотите следовать существующему примеру.

Место, куда стоит посмотреть, я полагаю, это discourse/app/assets/javascripts/discourse/components/d-editor.js.es6 at f62b8990acb9ce4af8bfc67fc80dc0847177e458 · discourse/discourse · GitHub

А именно:

  didInsertElement() {
    this._super(...arguments);

    const $editorInput = $(this.element.querySelector(".d-editor-input"));
    this._applyEmojiAutocomplete($editorInput);
    this._applyCategoryHashtagAutocomplete($editorInput);

И, возможно, стоит также посмотреть на:

  _applyCategoryHashtagAutocomplete() {
    const siteSettings = this.siteSettings;

    $(this.element.querySelector(".d-editor-input")).autocomplete({
      template: findRawTemplate("category-tag-autocomplete"),
      key: "#",
      afterComplete: () => this._focusTextArea(),
      transformComplete: obj => {
        return obj.text;
      },
      dataSource: term => {
        if (term.match(/\s/)) {
          return null;
        }
        return searchCategoryTag(term, siteSettings);
      },
      triggerRule: (textarea, opts) => {
        return categoryHashtagTriggerRule(textarea, opts);
      }
    });
  },

NB: Я сам этим не пользовался, но это моё предположение.

Привет @merefield,
спасибо большое, это уже довольно полезно. Подскажите, где лучше всего инициализировать это? Мне стоит проверять наличие элемента .d-editor-input в функции инициализации моего плагина и подключать его соответствующим образом, или есть возможность зарегистрировать плагин как расширение для представления редактора, чтобы он загружался только тогда, когда пользователь фактически открывает редактор?
С уважением,
Александр

Это компонент, поэтому вы захотите переопределить этот метод didInsertElement() в своём инициализаторе.

Пример:

withPluginApi('0.8.12', (api) => {

      api.modifyClass('component:load-more'

отсюда https://github.com/paviliondev/discourse-topic-previews/blob/master/assets/javascripts/discourse/initializers/preview-edits.js.es6

Если вам повезёт, вы сможете просто вызвать this._super(); и добавить свою логику в конец.

Отлично! Большое спасибо. Думаю, это сработает.