Reindirizza alla pagina dopo l'acquisto

Ho add_model_callback(DiscourseSubscriptions::Customer, :after_save) do ... in un plugin. La maggior parte degli acquisti comporta la creazione di un “server” (un modello personalizzato). Oggi sono riuscito a capire come far sì che altri posti in cui viene creato un server passino alla pagina per configurare il nuovo server, con qualcosa come

      Server.createServer(server).then((result) => {
        if (result.server) {
          this.get("servers").pushObject(EmberObject.create(result.server));
          const id = result.server.id;
          window.location = getURL(`/pfaffmanager/servers/${id}`);
        }

Quello che vorrei fare ora è far sì che Discourse reindirizzi in modo simile a quella nuova pagina dopo che la finestra di dialogo “grazie per il tuo acquisto” è stata chiusa.

Non mi interessa se accade in Rails o Ember, ma immagino che debba accadere in Ember? Non capisco bene (cioè, non ho assolutamente idea) come fare per dirottare estendere il controller/modello/qualunque cosa nel plugin delle sottoscrizioni dal mio plugin.

2 Mi Piace

Probabilmente c’è un’azione closeModal (magari nel percorso).

All’interno di essa potresti eseguire DiscourseURL.routeTo(\"/iltuopercorsodidiscourse\");

1 Mi Piace

Beh, non proprio. Ma, miracolosamente, è stato sufficiente! Ho trovato questo:

E poi ho fatto questo!!

      api.modifyClass("controller:subscribe-show", {
        pluginId: "pfaffmanager",
        async _advanceSuccessfulTransaction(plan) {
          window.console.log("modifying subscription!!!", plan, this);
          this.alert("plans.success");
          this.set("loading", false);
          let servers = [];
          servers = await Server.listServers().then((result) => {
            if (currentUser && currentUser.servers !== undefined) {
              servers = currentUser.servers.sort((b, a) => {
                return ("" + a.updated_at).localeCompare(b.updated_at);
              });
              window.console.log("sorted servers", servers);
              if (servers.length > 0) {
                window.console.log(`going to first! ${servers[0].id}`);
                this.transitionToRoute(
                  "pfaffmanager.servers.show",
                  servers[0].id
                );
              } else {
                window.console.log(`server not found. going to index!`);
                this.transitionToRoute("pfaffmanager.servers.index");
              }
              // window.location = getURL(`/`);
              // window.location = getURL(`/pfaffmanager/servers/${id}`);
            }
          });
        },
      });

Che è molto, molto vicino. Il problema ora è che c’è una race condition, poiché il add_model_callback(DiscourseSubscriptions::Customer, :after_save) do potrebbe non essere terminato prima che io esegua la mia query ajax per ottenere i server.

Beh, è più strano di così. Anche se aggiungo un ritardo (usando later) prima che esegua la chiamata ajax per ottenere la nuova lista di server, ottiene ancora una lista obsoleta, non quella dopo che il nuovo server è stato aggiunto nel callback. Posso aggiornare la finestra in un’altra scheda e vedere che ottiene i dati corretti prima che esegua la chiamata ajax.

Suppongo che per ora mi arrenderò. Nel caso in cui il server esista prima dell’acquisto (che credo sia più comune: configureresti tutto e poi diresti, “sì, facciamolo”) funziona; è solo il caso in cui dicono “Sì, voglio pagare per un’installazione; pagherò e poi vedrò cosa succede”.