From 10df7fdee060d44accdee7679d66d778d1136510 Mon Sep 17 00:00:00 2001 From: Penar Musaraj Date: Wed, 30 Apr 2025 12:32:18 -0400 Subject: [PATCH] DEV: Show login-required screen in root route (#32350) This changes means that login-required sites will show a splash screen on `/`. Users heading to `/login` or `/signup` will see the respective forms. --- .../controllers/discovery/login-required.js | 5 + .../app/lib/homepage-router-overrides.js | 1 + .../discourse/app/routes/app-route-map.js | 1 + .../discourse/app/routes/application.js | 3 - .../discourse/app/routes/discourse.js | 7 - .../app/routes/discovery-login-required.js | 8 + .../discourse/app/routes/discovery.js | 6 +- .../javascripts/discourse/app/routes/login.js | 4 - .../javascripts/discourse/app/routes/topic.js | 4 - .../templates/discovery/login-required.gjs | 62 ++++ .../discourse/app/templates/login.gjs | 308 +++++++----------- .../tests/acceptance/login-required-test.js | 4 +- .../discourse/tests/acceptance/static-test.js | 12 +- app/controllers/application_controller.rb | 1 + config/routes.rb | 1 + spec/requests/application_controller_spec.rb | 19 +- spec/system/login_spec.rb | 1 - spec/system/social_authentication_spec.rb | 3 +- 18 files changed, 233 insertions(+), 217 deletions(-) create mode 100644 app/assets/javascripts/discourse/app/controllers/discovery/login-required.js create mode 100644 app/assets/javascripts/discourse/app/routes/discovery-login-required.js create mode 100644 app/assets/javascripts/discourse/app/templates/discovery/login-required.gjs diff --git a/app/assets/javascripts/discourse/app/controllers/discovery/login-required.js b/app/assets/javascripts/discourse/app/controllers/discovery/login-required.js new file mode 100644 index 00000000000..022c1613c14 --- /dev/null +++ b/app/assets/javascripts/discourse/app/controllers/discovery/login-required.js @@ -0,0 +1,5 @@ +import Controller, { inject as controller } from "@ember/controller"; + +export default class LoginRequiredController extends Controller { + @controller application; +} diff --git a/app/assets/javascripts/discourse/app/lib/homepage-router-overrides.js b/app/assets/javascripts/discourse/app/lib/homepage-router-overrides.js index d8a0def3d53..1076d8528f8 100644 --- a/app/assets/javascripts/discourse/app/lib/homepage-router-overrides.js +++ b/app/assets/javascripts/discourse/app/lib/homepage-router-overrides.js @@ -35,6 +35,7 @@ function rewriteIfNeeded(url, transition) { const intentUrl = transition?.intent?.url; if ( intentUrl?.startsWith(homepageDestination()) || + intentUrl?.startsWith("/login-required") || (transition?.intent.name === `discovery.${defaultHomepage()}` && transition?.intent.queryParams[homepageRewriteParam]) ) { diff --git a/app/assets/javascripts/discourse/app/routes/app-route-map.js b/app/assets/javascripts/discourse/app/routes/app-route-map.js index d83c3dcf779..3321c871b8f 100644 --- a/app/assets/javascripts/discourse/app/routes/app-route-map.js +++ b/app/assets/javascripts/discourse/app/routes/app-route-map.js @@ -68,6 +68,7 @@ export default function () { this.route("category", { path: "/c/*category_slug_path_with_id" }); this.route("custom"); + this.route("login-required"); }); this.route("groups", { resetNamespace: true, path: "/g" }, function () { diff --git a/app/assets/javascripts/discourse/app/routes/application.js b/app/assets/javascripts/discourse/app/routes/application.js index 81f4bcb7cd8..7454793a2ed 100644 --- a/app/assets/javascripts/discourse/app/routes/application.js +++ b/app/assets/javascripts/discourse/app/routes/application.js @@ -271,9 +271,6 @@ export default class ApplicationRoute extends DiscourseRoute { } else { this.router.transitionTo("login").then((login) => { login.controller.set("canSignUp", this.controller.canSignUp); - if (this.siteSettings.login_required) { - login.controller.set("showLogin", true); - } }); } } diff --git a/app/assets/javascripts/discourse/app/routes/discourse.js b/app/assets/javascripts/discourse/app/routes/discourse.js index 8cbeb029ab1..4ffba9a2c76 100644 --- a/app/assets/javascripts/discourse/app/routes/discourse.js +++ b/app/assets/javascripts/discourse/app/routes/discourse.js @@ -36,13 +36,6 @@ export default class DiscourseRoute extends Route { once(this, this._refreshTitleOnce); } - redirectIfLoginRequired() { - const app = this.controllerFor("application"); - if (app.get("loginRequired")) { - this.router.replaceWith("login"); - } - } - isCurrentUser(user) { if (!this.currentUser) { return false; // the current user is anonymous diff --git a/app/assets/javascripts/discourse/app/routes/discovery-login-required.js b/app/assets/javascripts/discourse/app/routes/discovery-login-required.js new file mode 100644 index 00000000000..927432856dc --- /dev/null +++ b/app/assets/javascripts/discourse/app/routes/discovery-login-required.js @@ -0,0 +1,8 @@ +import StaticPage from "discourse/models/static-page"; +import DiscourseRoute from "discourse/routes/discourse"; + +export default class LoginRequiredRoute extends DiscourseRoute { + model() { + return StaticPage.find("login"); + } +} diff --git a/app/assets/javascripts/discourse/app/routes/discovery.js b/app/assets/javascripts/discourse/app/routes/discovery.js index 87d745e4e3c..ca310fd0e95 100644 --- a/app/assets/javascripts/discourse/app/routes/discovery.js +++ b/app/assets/javascripts/discourse/app/routes/discovery.js @@ -11,13 +11,17 @@ export default class DiscoveryRoute extends DiscourseRoute { @service router; @service session; @service site; + @service siteSettings; queryParams = { filter: { refreshModel: true }, }; redirect() { - return this.redirectIfLoginRequired(); + if (this.siteSettings.login_required && !this.currentUser) { + this.router.transitionTo("/login-required?_discourse_homepage_rewrite=1"); + return; + } } beforeModel(transition) { diff --git a/app/assets/javascripts/discourse/app/routes/login.js b/app/assets/javascripts/discourse/app/routes/login.js index ac6d35cc3ff..9077202282d 100644 --- a/app/assets/javascripts/discourse/app/routes/login.js +++ b/app/assets/javascripts/discourse/app/routes/login.js @@ -58,10 +58,6 @@ export default class LoginRoute extends DiscourseRoute { ); } - if (this.siteSettings.login_required) { - controller.set("showLogin", false); - } - if (this.login.isOnlyOneExternalLoginMethod) { if (this.siteSettings.auth_immediately) { controller.set("isRedirectingToExternalAuth", true); diff --git a/app/assets/javascripts/discourse/app/routes/topic.js b/app/assets/javascripts/discourse/app/routes/topic.js index 4ac337ccbdc..e072fda8856 100644 --- a/app/assets/javascripts/discourse/app/routes/topic.js +++ b/app/assets/javascripts/discourse/app/routes/topic.js @@ -48,10 +48,6 @@ export default class TopicRoute extends DiscourseRoute { }; } - redirect() { - return this.redirectIfLoginRequired(); - } - titleToken() { const model = this.modelFor("topic"); if (model) { diff --git a/app/assets/javascripts/discourse/app/templates/discovery/login-required.gjs b/app/assets/javascripts/discourse/app/templates/discovery/login-required.gjs new file mode 100644 index 00000000000..201796744b7 --- /dev/null +++ b/app/assets/javascripts/discourse/app/templates/discovery/login-required.gjs @@ -0,0 +1,62 @@ +import { hash } from "@ember/helper"; +import { htmlSafe } from "@ember/template"; +import RouteTemplate from "ember-route-template"; +import DButton from "discourse/components/d-button"; +import PluginOutlet from "discourse/components/plugin-outlet"; +import bodyClass from "discourse/helpers/body-class"; +import hideApplicationHeaderButtons from "discourse/helpers/hide-application-header-buttons"; +import hideApplicationSidebar from "discourse/helpers/hide-application-sidebar"; +import routeAction from "discourse/helpers/route-action"; + +export default RouteTemplate( + +); diff --git a/app/assets/javascripts/discourse/app/templates/login.gjs b/app/assets/javascripts/discourse/app/templates/login.gjs index c180854188d..89b0e18dd3e 100644 --- a/app/assets/javascripts/discourse/app/templates/login.gjs +++ b/app/assets/javascripts/discourse/app/templates/login.gjs @@ -1,8 +1,7 @@ import { hash } from "@ember/helper"; import { htmlSafe } from "@ember/template"; import RouteTemplate from "ember-route-template"; -import { and, not, or } from "truth-helpers"; -import DButton from "discourse/components/d-button"; +import { and } from "truth-helpers"; import FlashMessage from "discourse/components/flash-message"; import LocalLoginForm from "discourse/components/local-login-form"; import LoginButtons from "discourse/components/login-buttons"; @@ -14,7 +13,6 @@ import concatClass from "discourse/helpers/concat-class"; import hideApplicationHeaderButtons from "discourse/helpers/hide-application-header-buttons"; import hideApplicationSidebar from "discourse/helpers/hide-application-sidebar"; import loadingSpinner from "discourse/helpers/loading-spinner"; -import routeAction from "discourse/helpers/route-action"; import { i18n } from "discourse-i18n"; export default RouteTemplate( @@ -28,201 +26,143 @@ export default RouteTemplate( {{! authentication method and is being automatically redirected to it }} {{loadingSpinner}} {{else}} - {{#if - (or @controller.showLogin (not @controller.siteSettings.login_required)) - }} - {{! Show the full page login form }} -
-