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(
+
+ {{hideApplicationHeaderButtons "search" "login" "signup" "menu"}}
+ {{hideApplicationSidebar}}
+ {{bodyClass "login-page"}}
+ {{bodyClass "static-login"}}
+
+
- {{htmlSafe - (i18n - "login.no_login_methods.description" - (hash adminLoginPath=@controller.adminLoginPath) - ) - }} -
-+ {{htmlSafe + (i18n + "login.no_login_methods.description" + (hash adminLoginPath=@controller.adminLoginPath) + ) + }} +