Проблема с аргументом CustomComponent в Small action

Я пытаюсь опционально заменить описание небольшого действия поста на CustomComponent.

Однако пост некорректно передаётся в трансформер значений.

Код ядра

  @cached
  get CustomComponent() {
    return applyValueTransformer("post-small-action-custom-component", null, {
      actionCode: this.code,
      post: this.post,
    });
  }

Мой код отладки:

  api.registerValueTransformer(
    "post-small-action-custom-component",
    (arg) => {
      console.log(arg);
    }
  );

Вывод:

context: Object { actionCode: "bid", post: undefined }

Тест не проверяет параметры, поэтому это остаётся незамеченным.

Полагаю, параметр post должен быть this.args.post, а не this.post.

Я пробовал обходное решение — безусловно добавлять компонент и заставлять его самому решать, что делать, но, к сожалению, похоже, что аргументы тоже передаются некорректно, поэтому и обходной путь, и нормальная реализация здесь не работают:

              <this.CustomComponent
                @code={{this.code}}
                @post={{this.post}}
                @createdAt={{this.createdAt}}
                @path={{this.path}}
                @username={{this.username}}
              />

В PostSmallAction есть геттеры для code, createdAt и path, но (опять же) this.post не существует, а username() тоже, кажется, имеет баг (в this.args.post нет action_code_who?), поэтому эти атрибуты остаются пустыми.

Я не могу найти существующую «реальную» реализацию. Неужели я первый, кто пытается это использовать? :thinking:

Я создал PR, который исправляет эту проблему: FIX: correct argument passing for small action post value transformer and custom component by communiteq · Pull Request #34915 · discourse/discourse · GitHub

@david @saquetim, не могли бы вы взглянуть, пожалуйста? :pleading_face:

Спасибо, что обратили внимание на эту проблему.

Вы правы; параметр post должен быть this.args.post, а не this.post.

username здесь немного вводит в заблуждение. action_code_who действительно верен, но используется некоторыми плагинами, например плагином assign, поэтому он не всегда присутствует в объекте post. Чтобы получить пользователя, создавшего малое действие, используйте @post.username.

Я не был уверен, могу ли я внести изменения в ваш PR, поэтому открыл нижеприведённый, чтобы решить эти проблемы:

  • исправлен аргумент post, передаваемый как трансформеру, так и пользовательскому компоненту
  • аргумент username переименован в who, чтобы минимизировать путаницу вокруг этого аргумента
  • добавлены тесты для проверки корректной передачи аргументов

Думаю, да. :smiley:

Насколько мне известно, старый API не использовался ни в одной из кастомизаций, которые мы отслеживаем в репозиториях all-the-*. Я добавил этот только для того, чтобы предоставить альтернативу на случай, если кто-то, кто размещает у себя, использует его.

:rocket: отлично!

Спасибо за вашу инициативность :slight_smile:
Кажется, что discourse-encrypt раньше использовал это, а также три (!) приватных плагина, которые мы поддерживаем.

Спасибо за объяснение, я не понимал, как это работает, но теперь понимаю.

Последняя просьба: не могли бы вы перенести ваше исправление также на стабильную ветку?

Исправление было перенесено обратно в стабильную версию.