Piccola azione problema argomento CustomComponent

Sto cercando di sostituire facoltativamente una descrizione di una piccola azione del post con un CustomComponent.

Tuttavia, il post non viene passato correttamente al trasformatore di valore.

Codice principale

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

Il mio codice di debug

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

Output:

context: Object { actionCode: "bid", post: undefined }
​​
Il test non controlla i parametri, quindi questo passa inosservato.

Suppongo che il parametro post dovrebbe essere this.args.post e non this.post.

Ho provato una soluzione alternativa aggiungendo incondizionatamente il componente e facendolo controllare da solo cosa fare, ma sfortunatamente sembra che anche gli argomenti non vengano passati correttamente, quindi sia la soluzione alternativa che un’implementazione normale falliscono anche qui:

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

Ci sono getter in PostSmallAction per code, createdAt e path, ma (di nuovo) this.post non esiste e anche username() sembra avere un bug (non c’è action_code_who in this.args.post?), quindi questi attributi rimangono vuoti.

Non riesco a trovare un’implementazione esistente “nel mondo reale”. Sono davvero il primo a usarlo? :thinking:

2 Mi Piace

Ho creato una PR che risolve questo problema FIX: correct argument passing for small action post value transformer and custom component by communiteq ¡ Pull Request #34915 ¡ discourse/discourse ¡ GitHub

@david @saquetim potreste dare un’occhiata per favore :pleading_face:

2 Mi Piace

Grazie per aver notato questo problema.

Hai ragione; il parametro post dovrebbe essere this.args.post invece di this.post.

username è un po’ fuorviante qui. action_code_who è effettivamente corretto ma è utilizzato da alcuni plugin come il plugin assign, quindi non è sempre presente nell’oggetto post. Per ottenere l’utente che ha creato la piccola azione, puoi usare @post.username

Non ero sicuro se potessi apportare modifiche al tuo PR, quindi ho aperto quello qui sotto per affrontare questi problemi:

  • correggere l’argomento post passato sia al transformer che al componente personalizzato
  • rinominare l’argomento username in who riducendo al minimo la confusione attorno a questo argomento
  • aggiungere test per verificare che gli argomenti vengano passati correttamente

Penso di sĂŹ. :smiley:

Per quanto ne so, la vecchia API non è stata utilizzata in nessuna delle personalizzazioni che tracciamo nei repository all-the-*. Ho aggiunto solo questa per fornire un’alternativa nel caso in cui un self-hoster la stesse utilizzando.

:rocket: fantastico!

Bene, grazie per essere proattivo :slight_smile:
Penso che discourse-encrypt lo usasse, e tre (!) plugin privati che stiamo mantenendo.

Grazie per la spiegazione, non avevo capito come funzionasse, e ora sĂŹ.

Ultimo favore da chiedere: la tua correzione potrebbe essere retroportata anche a stable?

La correzione è stata riportata a stabile.

1 Mi Piace

Questo argomento è stato chiuso automaticamente 24 ore dopo l’ultima risposta. Non sono più consentite nuove risposte.