Pequeno problema com argumento de CustomComponent de ação

Estou tentando substituir opcionalmente uma descrição de pequena ação de postagem por um CustomComponent.

No entanto, a postagem não está sendo passada corretamente para o transformador de valor.

Código principal

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

Meu código de depuração

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

Saída:

context: Object { actionCode: "bid", post: undefined }
​​
O teste não verifica os parâmetros, então isso passa despercebido.

Eu acho que o parâmetro post deveria ser this.args.post e não this.post.

Eu tenho tentado uma solução alternativa adicionando incondicionalmente o componente e fazendo com que ele verifique o que fazer, mas infelizmente parece que os argumentos não estão sendo passados corretamente também, então tanto a solução alternativa quanto uma implementação normal falham aqui também:

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

Existem getters em PostSmallAction para code, createdAt e path, mas (novamente) this.post não existe e username() parece ter um bug também (não há action_code_who em this.args.post?), então esses atributos permanecem vazios.

Não consigo encontrar uma implementação “real” existente. Sou realmente o primeiro a usar isso?:thinking:

2 curtidas

Criei um PR que corrige este problema FIX: correct argument passing for small action post value transformer and custom component by communiteq · Pull Request #34915 · discourse/discourse · GitHub

@david @saquetim vocês poderiam dar uma olhada por favor :pleading_face:

2 curtidas

Obrigado por notar este problema.

Você está correto; o parâmetro post deveria ser this.args.post em vez de this.post.

username é um pouco enganoso aqui. action_code_who está correto, mas é usado por alguns plugins como o plugin assign, então ele nem sempre está presente no objeto post. Para obter o usuário que criou a pequena ação, você pode usar @post.username

Eu não tinha certeza se poderia enviar alterações para o seu PR, então abri o abaixo para resolver esses problemas:

  • corrige o argumento post passado tanto para o transformer quanto para o componente personalizado
  • renomeia o argumento username para who, minimizando a confusão em torno deste argumento
  • adiciona testes para verificar se os argumentos são passados corretamente

Acho que sim. :smiley:

Até onde sei, a API antiga não foi usada em nenhuma das personalizações que rastreamos nos repositórios all-the-*. Adicionei esta apenas para fornecer uma alternativa caso um auto-hospedeiro a estivesse usando.

:rocket: ótimo!

Bem, obrigado por ser proativo :slight_smile:
Eu acho que discourse-encrypt costumava usá-lo, e três (!) plugins privados que estamos mantendo.

Obrigado por explicar, eu não entendia como isso funcionava, e agora eu entendo.

Último favor a pedir: seu conserto poderia ser retroportado para o estável também?

O conserto foi portado para trás para a versão estável.

1 curtida

Este tópico foi fechado automaticamente 24 horas após a última resposta. Novas respostas não são mais permitidas.