Problème d'argument de petit composant personnalisé d'action

Je tente de remplacer facultativement une description de petite action de publication par un CustomComponent.

Cependant, la publication n’est pas correctement transmise au transformateur de valeur.

Code principal

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

Mon code de débogage

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

Sortie :

context: Object { actionCode: "bid", post: undefined }
​​
Le test ne vérifie pas les paramètres, donc cela passe inaperçu.

Je suppose que le paramètre post devrait être this.args.post et non this.post.

J’ai essayé une solution de contournement en ajoutant inconditionnellement le composant et en le faisant vérifier lui-même ce qu’il faut faire, mais malheureusement, il semble que les arguments ne soient pas non plus transmis correctement, de sorte que la solution de contournement et une implémentation normale échouent également ici :

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

Il y a des getters dans PostSmallAction pour code, createdAt et path, mais (encore une fois) this.post n’existe pas et username() semble également avoir un bug (il n’y a pas de action_code_who dans this.args.post ?), donc ces attributs restent vides.

Je ne trouve aucune implémentation existante dans le “monde réel”. Suis-je vraiment le premier à l’utiliser ? :thinking:

2 « J'aime »

J’ai créé une PR qui corrige ce problème FIX: correct argument passing for small action post value transformer and custom component by communiteq · Pull Request #34915 · discourse/discourse · GitHub

@david @saquetim pourriez-vous jeter un œil s’il vous plaît :pleading_face:

2 « J'aime »

Merci d’avoir signalé ce problème.

Vous avez raison ; le paramètre post devrait être this.args.post au lieu de this.post.

username est un peu trompeur ici. action_code_who est en effet correct mais est utilisé par certains plugins comme le plugin assign, il n’est donc pas toujours présent dans l’objet post. Pour obtenir l’utilisateur qui a créé la petite action, vous pouvez utiliser @post.username

Je n’étais pas sûr de pouvoir pousser des modifications à votre PR, j’ai donc ouvert celle ci-dessous pour résoudre ces problèmes :

  • corriger l’argument post passé à la fois au transformateur et au composant personnalisé
  • renommer l’argument username en who afin de minimiser la confusion autour de cet argument
  • ajouter des tests pour vérifier que les arguments sont correctement passés

Je pense que oui. :smiley:

Autant que je sache, l’ancienne API n’a été utilisée dans aucune des personnalisations que nous suivons dans les dépôts all-the-*. Je n’ai ajouté celle-ci que pour fournir une alternative au cas où un auto-hébergeur l’utiliserait.

:rocket: Super !

Eh bien, merci d’avoir été proactif :slight_smile:
Je pense que discourse-encrypt l’utilisait, ainsi que trois (!) plugins privés que nous maintenons.

Merci pour l’explication, je ne comprenais pas comment cela fonctionnait, et maintenant je comprends.

Dernière faveur : votre correction pourrait-elle être rétroportée vers la version stable également ?

La correction a été rétroportée vers la version stable.

1 « J'aime »

Ce sujet a été automatiquement fermé 24 heures après la dernière réponse. Les nouvelles réponses ne sont plus autorisées.