diff --git a/app/assets/javascripts/discourse/app/instance-initializers/auth-complete.js b/app/assets/javascripts/discourse/app/instance-initializers/auth-complete.js index 7bfc0847876..6a0e348e32c 100644 --- a/app/assets/javascripts/discourse/app/instance-initializers/auth-complete.js +++ b/app/assets/javascripts/discourse/app/instance-initializers/auth-complete.js @@ -140,14 +140,18 @@ export default { }; if (siteSettings.full_page_login) { - router.transitionTo("signup").then((signup) => { - const signupController = - signup.controller || owner.lookup("controller:signup"); - Object.keys(createAccountProps || {}).forEach((key) => { - signupController.set(key, createAccountProps[key]); + router + .transitionTo("signup", { + queryParams: { authComplete: true }, + }) + .then((signup) => { + const signupController = + signup.controller || owner.lookup("controller:signup"); + Object.keys(createAccountProps || {}).forEach((key) => { + signupController.set(key, createAccountProps[key]); + }); + signupController.handleSkipConfirmation(); }); - signupController.handleSkipConfirmation(); - }); } else { modal.show(CreateAccount, { model: createAccountProps }); } diff --git a/app/assets/javascripts/discourse/app/routes/application.js b/app/assets/javascripts/discourse/app/routes/application.js index 630094bbd78..8fe8de6bb27 100644 --- a/app/assets/javascripts/discourse/app/routes/application.js +++ b/app/assets/javascripts/discourse/app/routes/application.js @@ -17,7 +17,6 @@ import DiscourseURL from "discourse/lib/url"; import { postRNWebviewMessage } from "discourse/lib/utilities"; import Category from "discourse/models/category"; import Composer from "discourse/models/composer"; -import { findAll } from "discourse/models/login-method"; import DiscourseRoute from "discourse/routes/discourse"; import { i18n } from "discourse-i18n"; @@ -44,17 +43,6 @@ export default class ApplicationRoute extends DiscourseRoute { @setting("title") siteTitle; @setting("short_site_description") shortSiteDescription; - get isOnlyOneExternalLoginMethod() { - return ( - !this.siteSettings.enable_local_logins && - this.externalLoginMethods.length === 1 - ); - } - - get externalLoginMethods() { - return findAll(); - } - @action loading(transition) { this.loadingSlider.transitionStarted(); @@ -295,8 +283,8 @@ export default class ApplicationRoute extends DiscourseRoute { : encodeURIComponent(window.location.pathname); window.location = getURL("/session/sso?return_path=" + returnPath); } else { - if (this.isOnlyOneExternalLoginMethod) { - this.login.externalLogin(this.externalLoginMethods[0]); + if (this.login.isOnlyOneExternalLoginMethod) { + this.login.singleExternalLogin(); } else if (this.siteSettings.full_page_login) { this.router.transitionTo("login").then((login) => { login.controller.set("canSignUp", this.controller.canSignUp); @@ -321,11 +309,9 @@ export default class ApplicationRoute extends DiscourseRoute { const returnPath = encodeURIComponent(window.location.pathname); window.location = getURL("/session/sso?return_path=" + returnPath); } else { - if (this.isOnlyOneExternalLoginMethod) { + if (this.login.isOnlyOneExternalLoginMethod) { // we will automatically redirect to the external auth service - this.login.externalLogin(this.externalLoginMethods[0], { - signup: true, - }); + this.login.singleExternalLogin({ signup: true }); } else if (this.siteSettings.full_page_login) { this.router.transitionTo("signup").then((signup) => { Object.keys(createAccountProps || {}).forEach((key) => { diff --git a/app/assets/javascripts/discourse/app/routes/login.js b/app/assets/javascripts/discourse/app/routes/login.js index 05c2ff10ce2..94cf8fa7c74 100644 --- a/app/assets/javascripts/discourse/app/routes/login.js +++ b/app/assets/javascripts/discourse/app/routes/login.js @@ -7,9 +7,12 @@ import DiscourseRoute from "discourse/routes/discourse"; export default class LoginRoute extends DiscourseRoute { @service siteSettings; @service router; + @service login; beforeModel() { - if ( + if (this.login.isOnlyOneExternalLoginMethod) { + this.login.singleExternalLogin(); + } else if ( !this.siteSettings.login_required && (!this.siteSettings.full_page_login || this.siteSettings.enable_discourse_connect) @@ -35,6 +38,10 @@ export default class LoginRoute extends DiscourseRoute { controller.set("flashType", ""); controller.set("flash", ""); + if (this.login.isOnlyOneExternalLoginMethod) { + controller.set("isRedirecting", true); + } + if (this.siteSettings.login_required) { controller.set("showLogin", false); } diff --git a/app/assets/javascripts/discourse/app/routes/signup.js b/app/assets/javascripts/discourse/app/routes/signup.js index e78b79a459f..562055e43cb 100644 --- a/app/assets/javascripts/discourse/app/routes/signup.js +++ b/app/assets/javascripts/discourse/app/routes/signup.js @@ -4,11 +4,28 @@ import { service } from "@ember/service"; import DiscourseRoute from "discourse/routes/discourse"; export default class SignupRoute extends DiscourseRoute { - @service router; @service siteSettings; + @service router; + @service login; - beforeModel() { - this.showCreateAccount(); + authComplete = false; + + beforeModel(transition) { + this.authComplete = transition.to.queryParams.authComplete || false; + + if (this.login.isOnlyOneExternalLoginMethod && !this.authComplete) { + this.login.singleExternalLogin({ signup: true }); + } else { + this.showCreateAccount(); + } + } + + setupController(controller) { + super.setupController(...arguments); + + if (this.login.isOnlyOneExternalLoginMethod && !this.authComplete) { + controller.set("isRedirecting", true); + } } @action diff --git a/app/assets/javascripts/discourse/app/services/login.js b/app/assets/javascripts/discourse/app/services/login.js index 4c92ea7e460..c6aec234e83 100644 --- a/app/assets/javascripts/discourse/app/services/login.js +++ b/app/assets/javascripts/discourse/app/services/login.js @@ -1,9 +1,12 @@ import { action } from "@ember/object"; -import Service from "@ember/service"; +import Service, { service } from "@ember/service"; import { disableImplicitInjections } from "discourse/lib/implicit-injections"; +import { findAll } from "discourse/models/login-method"; @disableImplicitInjections export default class LoginService extends Service { + @service siteSettings; + @action async externalLogin( loginMethod, @@ -16,4 +19,20 @@ export default class LoginService extends Service { setLoggingIn?.(false); } } + + @action + async singleExternalLogin(opts) { + await this.externalLogin(this.externalLoginMethods[0], opts); + } + + get isOnlyOneExternalLoginMethod() { + return ( + !this.siteSettings.enable_local_logins && + this.externalLoginMethods.length === 1 + ); + } + + get externalLoginMethods() { + return findAll(); + } } diff --git a/app/assets/javascripts/discourse/app/templates/login.hbs b/app/assets/javascripts/discourse/app/templates/login.hbs index 70310b1cc30..fc786cc4f9f 100644 --- a/app/assets/javascripts/discourse/app/templates/login.hbs +++ b/app/assets/javascripts/discourse/app/templates/login.hbs @@ -1,176 +1,183 @@ -{{#if - (and - this.siteSettings.full_page_login - (or this.showLogin (not this.siteSettings.login_required)) - ) -}} - {{hide-application-header-buttons "search" "login" "signup" "menu"}} - {{hide-application-sidebar}} - {{body-class "login-page"}} -
- {{html-safe - (i18n - "login.no_login_methods.description" - (hash adminLoginPath=this.adminLoginPath) - ) - }} -
-+ {{html-safe + (i18n + "login.no_login_methods.description" + (hash adminLoginPath=this.adminLoginPath) + ) + }} +