Comment accéder à un modèle différent dans un connecteur ?

Je suis presque arrivé au bout, mais je n’arrive pas à trouver la solution. J’ai créé un connecteur ici connectors/revision-user-details-after :

Dans ma classe de connecteur, je peux accéder à args et component via la méthode shouldRender, ce qui me permet d’obtenir le nom d’utilisateur actuel et l’identifiant du message :

export default {
  shouldRender(args, component) {
    console.log('postAuthor', args.model.username)
    console.log('postId', args.model.id)
  }
};

J’aimerais également obtenir le nom d’utilisateur de l’utilisateur qui a modifié le message (dans ce cas, “nachocab”), mais args.model est un Post et non un PostRevision.

Voici à quoi ressemble la fenêtre modale d’historique :

https://github.com/discourse/discourse/blob/main/app/assets/javascripts/discourse/app/templates/modal/history.hbs#L5

Et le contrôleur d’historique :

https://github.com/discourse/discourse/blob/main/app/assets/javascripts/discourse/app/controllers/history.js#L74

Comment puis-je accéder à la révision dans le connecteur ?

Ah, je viens de réaliser que je peux faire cela !

import Post from "discourse/models/post";

Post.loadRevision(args.model.id, args.model.version).then((result) => {
  const editorUsername = result.username;
  doSomethingElse();
});

MISE À JOUR
@eviltrout Je pensais avoir résolu ce problème, mais je viens de réaliser que puisque Post.loadRevision retourne une Promise, je ne peux pas l’inclure dans shouldRender() :

import Post from 'discourse/models/post';

export default {
  shouldRender(args, component) {
    // retourner une Promise ne fonctionne pas
    return Post.loadRevision(args.model.id, args.model.version).then((revision) => {
      return args.model.username !== revision.username;
    });
  },
};

Existe-t-il une autre façon de procéder ?

Vous pourriez le déplacer hors du connecteur vers un nouveau composant que vous insérez, et afficher un état « Chargement… » jusqu’à ce que la promesse soit résolue, moment auquel vous set la valeur et l’affichez.

Merci, Robin. Ton astuce était exactement ce dont j’avais besoin. :tada:

Cela fonctionne, mais je me demande si l’appel ajax direct est nécessaire (lorsque j’ai emprunté le chemin du connecteur, j’avais accès au Post mais pas à la Révision ; maintenant que j’ai pris le chemin du composant, j’ai accès à la Révision, mais pas au Post :thinking:)

{{! templates/connectors/revision-user-details-after/reply-to-editor.hbs }}
{{reply-to-editor
  postId=model.post_id
  postVersion=model.current_version
  revisionAuthor=model.username
}}
{{! templates/components/reply-to-editor.hbs }}
{{#if isVisible}}
  {{d-button
    action=(action 'replyToEditor')
    label='test'
  }}
{{/if}}
{{! javascripts/discourse/components/reply-to-editor.js.es6 }}
import { ajax } from 'discourse/lib/ajax';

export default Ember.Component.extend({
  isVisible: true,

  didRender() {
    if (!this.get('postId')) return;

    ajax(`/posts/${this.get('postId')}`).then((post) => {
      // n'afficher le bouton que si l'auteur de la révision n'est pas l'auteur du post
      this.set('isVisible', this.get('revisionAuthor') !== post.username);
    });
  }
});

Je ne sais pas pourquoi vous n’avez pas accès aux mêmes variables dans le modèle que dans le connecteur. Cela devrait être identique !