From 267736e5bc054a128bbbc22501fdc89dd80d3478 Mon Sep 17 00:00:00 2001 From: Penar Musaraj Date: Wed, 14 May 2025 11:25:43 -0400 Subject: [PATCH] DEV: Show login-required splash in root route (take 2) (#32629) --- .../controllers/discovery/login-required.js | 5 + .../app/lib/homepage-router-overrides.js | 3 +- .../discourse/app/routes/app-route-map.js | 1 + .../discourse/app/routes/application.js | 3 - .../discourse/app/routes/discourse.js | 7 - .../discourse/app/routes/discovery-index.js | 12 +- .../app/routes/discovery-login-required.js | 8 + .../discourse/app/routes/discovery.js | 4 - .../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 + app/controllers/categories_controller.rb | 1 + app/controllers/custom_homepage_controller.rb | 9 - app/controllers/home_page_controller.rb | 13 + app/helpers/application_helper.rb | 2 + app/views/default/blank.html.erb | 0 .../index.erb => home_page/custom.erb} | 0 config/locales/server.en.yml | 2 +- config/routes.rb | 9 +- lib/homepage_helper.rb | 2 + spec/lib/homepage_helper_spec.rb | 12 + spec/requests/application_controller_spec.rb | 19 +- ...r_spec.rb => home_page_controller_spec.rb} | 4 +- spec/requests/list_controller_spec.rb | 14 + spec/system/login_spec.rb | 26 +- spec/system/social_authentication_spec.rb | 3 +- 30 files changed, 315 insertions(+), 239 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 delete mode 100644 app/controllers/custom_homepage_controller.rb create mode 100644 app/controllers/home_page_controller.rb create mode 100644 app/views/default/blank.html.erb rename app/views/{custom_homepage/index.erb => home_page/custom.erb} (100%) rename spec/requests/{custom_homepage_controller_spec.rb => home_page_controller_spec.rb} (95%) 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..f78162c61b3 100644 --- a/app/assets/javascripts/discourse/app/lib/homepage-router-overrides.js +++ b/app/assets/javascripts/discourse/app/lib/homepage-router-overrides.js @@ -21,7 +21,7 @@ export default function applyRouterHomepageOverrides(router) { } } -const homepageRewriteParam = "_discourse_homepage_rewrite"; +export const homepageRewriteParam = "_discourse_homepage_rewrite"; /** * Returns a magic URL which `discovery-index` will redirect to. @@ -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-index.js b/app/assets/javascripts/discourse/app/routes/discovery-index.js index 5786cde0eb5..48772209e1a 100644 --- a/app/assets/javascripts/discourse/app/routes/discovery-index.js +++ b/app/assets/javascripts/discourse/app/routes/discovery-index.js @@ -1,11 +1,16 @@ import { service } from "@ember/service"; -import { homepageDestination } from "discourse/lib/homepage-router-overrides"; +import { + homepageDestination, + homepageRewriteParam, +} from "discourse/lib/homepage-router-overrides"; import { disableImplicitInjections } from "discourse/lib/implicit-injections"; import DiscourseRoute from "./discourse"; @disableImplicitInjections export default class DiscoveryIndex extends DiscourseRoute { @service router; + @service currentUser; + @service siteSettings; beforeModel(transition) { const url = transition.intent.url; @@ -14,6 +19,11 @@ export default class DiscoveryIndex extends DiscourseRoute { if (params) { destination += `&${params}`; } + + if (this.siteSettings.login_required && !this.currentUser) { + destination = `/login-required?${homepageRewriteParam}=1`; + } + this.router.transitionTo(destination); } } 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..349b70aa717 100644 --- a/app/assets/javascripts/discourse/app/routes/discovery.js +++ b/app/assets/javascripts/discourse/app/routes/discovery.js @@ -16,10 +16,6 @@ export default class DiscoveryRoute extends DiscourseRoute { filter: { refreshModel: true }, }; - redirect() { - return this.redirectIfLoginRequired(); - } - beforeModel(transition) { const url = transition.intent.url; let matches; 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 }} -
-