DEV: Refactor user index redirects into single place (#24369)

Previously we had similar logic in two places:

1. A DiscourseURL rewrite, based on a site setting
2. Some logic in the user-index route

This commit moves everything into (2) to make things clearer and more consistent
This commit is contained in:
David Taylor 2023-11-14 19:00:05 +00:00 committed by GitHub
parent c6ead3f5c4
commit 69a70f8159
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 44 additions and 30 deletions

View File

@ -24,19 +24,5 @@ export default {
// Initialize default homepage
let siteSettings = owner.lookup("service:site-settings");
initializeDefaultHomepage(siteSettings);
let defaultUserRoute = siteSettings.view_user_route || "summary";
if (!owner.lookup(`route:user.${defaultUserRoute}`)) {
defaultUserRoute = "summary";
}
DiscourseURL.rewrite(/^\/u\/([^\/]+)\/?$/, `/u/$1/${defaultUserRoute}`, {
exceptions: [
"/u/account-created",
"/users/account-created",
"/u/password-reset",
"/users/password-reset",
],
});
},
};

View File

@ -1,24 +1,44 @@
import { getOwner } from "@ember/application";
import { inject as service } from "@ember/service";
import DiscourseRoute from "discourse/routes/discourse";
export default DiscourseRoute.extend({
router: service(),
site: service(),
currentUser: service(),
export default class UserIndex extends DiscourseRoute {
@service router;
@service site;
@service currentUser;
@service siteSettings;
get viewingOtherUserDefaultRoute() {
let viewUserRoute = this.siteSettings.view_user_route;
if (viewUserRoute === "activity") {
viewUserRoute = "userActivity";
} else {
viewUserRoute = `user.${viewUserRoute}`;
}
if (getOwner(this).lookup(`route:${viewUserRoute}`)) {
return viewUserRoute;
} else {
// eslint-disable-next-line no-console
console.error(
`Invalid value for view_user_route '${viewUserRoute}'. Falling back to 'summary'.`
);
return "user.summary";
}
}
beforeModel() {
const viewingMe =
this.currentUser?.get("username") ===
this.modelFor("user").get("username");
const destination = viewingMe ? "userActivity" : "user.summary";
this.currentUser?.username === this.modelFor("user").username;
// HACK: Something with the way the user card intercepts clicks seems to break how the
// transition into a user's activity works. This makes the back button work on mobile
// where there is no user card as well as desktop where there is.
if (this.site.mobileView) {
this.router.replaceWith(destination);
let destination;
if (viewingMe) {
destination = "user.activity";
} else {
this.router.transitionTo(destination);
destination = this.viewingOtherUserDefaultRoute;
}
},
});
this.router.transitionTo(destination);
}
}

View File

@ -345,7 +345,7 @@ acceptance("User - Invalid view_user_route setting", function (needs) {
});
});
acceptance("User - Valid view_user_route setting", function (needs) {
acceptance("User - view_user_route setting set to activity", function (needs) {
needs.settings({
view_user_route: "activity",
});
@ -357,6 +357,14 @@ acceptance("User - Valid view_user_route setting", function (needs) {
});
});
acceptance("User - Valid view_user_route setting default", function () {
test("It defaults to summary", async function (assert) {
await visit("/u/eviltrout");
assert.strictEqual(currentRouteName(), "user.summary");
});
});
acceptance("User - Logout", function (needs) {
needs.user({ username: "eviltrout" });