FIX: simplfies previous route handling (#18895)
This commits makes sure we correctly wait for the end of the transition to reopen the drawer on the correct channel/view. Also fixes a bug when previous URL was `/` and causing a double transition.
This commit is contained in:
parent
f30f9ec5d9
commit
7fca07821b
|
@ -20,7 +20,6 @@ import discourseLater from "discourse-common/lib/later";
|
||||||
import { inject as service } from "@ember/service";
|
import { inject as service } from "@ember/service";
|
||||||
import { Promise } from "rsvp";
|
import { Promise } from "rsvp";
|
||||||
import { resetIdle } from "discourse/lib/desktop-notifications";
|
import { resetIdle } from "discourse/lib/desktop-notifications";
|
||||||
import { defaultHomepage } from "discourse/lib/utilities";
|
|
||||||
import { capitalize } from "@ember/string";
|
import { capitalize } from "@ember/string";
|
||||||
import {
|
import {
|
||||||
onPresenceChange,
|
onPresenceChange,
|
||||||
|
@ -1269,12 +1268,14 @@ export default Component.extend({
|
||||||
this.chatPreferredMode.setDrawer();
|
this.chatPreferredMode.setDrawer();
|
||||||
this.appEvents.trigger("chat:open-channel", channel);
|
this.appEvents.trigger("chat:open-channel", channel);
|
||||||
|
|
||||||
const previousRouteInfo = this.fullPageChat.exit();
|
let previousURL = this.fullPageChat.exit();
|
||||||
if (previousRouteInfo) {
|
if (!previousURL || previousURL === "/") {
|
||||||
this._transitionToRoute(previousRouteInfo);
|
previousURL = "discovery";
|
||||||
} else {
|
|
||||||
this.router.transitionTo(`discovery.${defaultHomepage()}`);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
this.router.replaceWith(previousURL).then(() => {
|
||||||
|
this.appEvents.trigger("chat:open-channel", channel);
|
||||||
|
});
|
||||||
},
|
},
|
||||||
|
|
||||||
@action
|
@action
|
||||||
|
@ -1433,18 +1434,6 @@ export default Component.extend({
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
|
|
||||||
_transitionToRoute(routeInfo) {
|
|
||||||
const routeName = routeInfo.name;
|
|
||||||
let params = [];
|
|
||||||
|
|
||||||
do {
|
|
||||||
params = Object.values(routeInfo.params).concat(params);
|
|
||||||
routeInfo = routeInfo.parent;
|
|
||||||
} while (routeInfo);
|
|
||||||
|
|
||||||
this.router.transitionTo(routeName, ...params);
|
|
||||||
},
|
|
||||||
|
|
||||||
@bind
|
@bind
|
||||||
_forceBodyScroll() {
|
_forceBodyScroll() {
|
||||||
// when keyboard is visible this will ensure body
|
// when keyboard is visible this will ensure body
|
||||||
|
|
|
@ -14,12 +14,12 @@ export default class ChatRoute extends DiscourseRoute {
|
||||||
return I18n.t("chat.title_capitalized");
|
return I18n.t("chat.title_capitalized");
|
||||||
}
|
}
|
||||||
|
|
||||||
beforeModel(transition) {
|
beforeModel() {
|
||||||
if (!this.chat.userCanChat) {
|
if (!this.chat.userCanChat) {
|
||||||
return this.transitionTo(`discovery.${defaultHomepage()}`);
|
return this.transitionTo(`discovery.${defaultHomepage()}`);
|
||||||
}
|
}
|
||||||
|
|
||||||
this.fullPageChat.enter(transition?.from);
|
this.fullPageChat.enter(this.router.currentURL);
|
||||||
}
|
}
|
||||||
|
|
||||||
activate() {
|
activate() {
|
||||||
|
|
|
@ -1,17 +1,17 @@
|
||||||
import Service from "@ember/service";
|
import Service from "@ember/service";
|
||||||
|
|
||||||
export default class FullPageChat extends Service {
|
export default class FullPageChat extends Service {
|
||||||
_previousRouteInfo = null;
|
_previousURL = null;
|
||||||
_isActive = false;
|
_isActive = false;
|
||||||
|
|
||||||
enter(previousRouteInfo) {
|
enter(previousURL) {
|
||||||
this._previousRouteInfo = previousRouteInfo;
|
this._previousURL = previousURL;
|
||||||
this._isActive = true;
|
this._isActive = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
exit() {
|
exit() {
|
||||||
this._isActive = false;
|
this._isActive = false;
|
||||||
return this._previousRouteInfo;
|
return this._previousURL;
|
||||||
}
|
}
|
||||||
|
|
||||||
get isActive() {
|
get isActive() {
|
||||||
|
|
|
@ -7,6 +7,7 @@ RSpec.describe "Navigation", type: :system, js: true do
|
||||||
fab!(:user) { Fabricate(:admin) }
|
fab!(:user) { Fabricate(:admin) }
|
||||||
fab!(:category_channel) { Fabricate(:category_channel) }
|
fab!(:category_channel) { Fabricate(:category_channel) }
|
||||||
fab!(:message) { Fabricate(:chat_message, chat_channel: category_channel) }
|
fab!(:message) { Fabricate(:chat_message, chat_channel: category_channel) }
|
||||||
|
let(:chat_page) { PageObjects::Pages::Chat.new }
|
||||||
|
|
||||||
before do
|
before do
|
||||||
# ensures we have one valid registered admin
|
# ensures we have one valid registered admin
|
||||||
|
@ -21,7 +22,7 @@ RSpec.describe "Navigation", type: :system, js: true do
|
||||||
|
|
||||||
context "when visiting /chat" do
|
context "when visiting /chat" do
|
||||||
it "opens full page" do
|
it "opens full page" do
|
||||||
visit("/chat")
|
chat_page.open_full_page
|
||||||
|
|
||||||
expect(page).to have_current_path(
|
expect(page).to have_current_path(
|
||||||
chat.channel_path(category_channel.id, category_channel.slug),
|
chat.channel_path(category_channel.id, category_channel.slug),
|
||||||
|
@ -34,7 +35,7 @@ RSpec.describe "Navigation", type: :system, js: true do
|
||||||
context "when opening chat" do
|
context "when opening chat" do
|
||||||
it "opens the drawer by default" do
|
it "opens the drawer by default" do
|
||||||
visit("/")
|
visit("/")
|
||||||
find(".open-chat").click
|
chat_page.open_from_header
|
||||||
|
|
||||||
expect(page).to have_css(".topic-chat-container.expanded.visible")
|
expect(page).to have_css(".topic-chat-container.expanded.visible")
|
||||||
end
|
end
|
||||||
|
@ -43,15 +44,15 @@ RSpec.describe "Navigation", type: :system, js: true do
|
||||||
context "when opening chat with full page as preferred mode" do
|
context "when opening chat with full page as preferred mode" do
|
||||||
it "opens the full page" do
|
it "opens the full page" do
|
||||||
visit("/")
|
visit("/")
|
||||||
find(".open-chat").click
|
chat_page.open_from_header
|
||||||
find(".topic-chat-drawer-header__full-screen-btn").click
|
chat_page.maximize_drawer
|
||||||
|
|
||||||
expect(page).to have_current_path(
|
expect(page).to have_current_path(
|
||||||
chat.channel_path(category_channel.id, category_channel.slug),
|
chat.channel_path(category_channel.id, category_channel.slug),
|
||||||
)
|
)
|
||||||
|
|
||||||
visit("/")
|
visit("/")
|
||||||
find(".open-chat").click
|
chat_page.open_from_header
|
||||||
|
|
||||||
expect(page).to have_current_path(
|
expect(page).to have_current_path(
|
||||||
chat.channel_path(category_channel.id, category_channel.slug),
|
chat.channel_path(category_channel.id, category_channel.slug),
|
||||||
|
@ -61,15 +62,36 @@ RSpec.describe "Navigation", type: :system, js: true do
|
||||||
|
|
||||||
context "when opening chat with drawer as preferred mode" do
|
context "when opening chat with drawer as preferred mode" do
|
||||||
it "opens the full page" do
|
it "opens the full page" do
|
||||||
visit("/chat")
|
chat_page.open_full_page
|
||||||
find(".chat-full-screen-button").click
|
chat_page.minimize_full_page
|
||||||
|
|
||||||
expect(page).to have_css(".topic-chat-container.expanded.visible")
|
expect(page).to have_css(".topic-chat-container.expanded.visible")
|
||||||
|
|
||||||
visit("/")
|
visit("/")
|
||||||
find(".open-chat").click
|
chat_page.open_from_header
|
||||||
|
|
||||||
expect(page).to have_css(".topic-chat-container.expanded.visible")
|
expect(page).to have_css(".topic-chat-container.expanded.visible")
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
context "when collapsing full page with no previous state" do
|
||||||
|
it "redirects to home page" do
|
||||||
|
chat_page.open_full_page
|
||||||
|
chat_page.minimize_full_page
|
||||||
|
|
||||||
|
expect(page).to have_current_path("/")
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
context "when collapsing full page with previous state" do
|
||||||
|
it "redirects to previous state" do
|
||||||
|
visit("/t/-/#{topic.id}")
|
||||||
|
chat_page.open_from_header
|
||||||
|
chat_page.maximize_drawer
|
||||||
|
chat_page.minimize_full_page
|
||||||
|
|
||||||
|
expect(page).to have_current_path("/t/#{topic.slug}/#{topic.id}")
|
||||||
|
expect(page).to have_css(".chat-message-container[data-id='#{message.id}']")
|
||||||
|
end
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -0,0 +1,23 @@
|
||||||
|
# frozen_string_literal: true
|
||||||
|
|
||||||
|
module PageObjects
|
||||||
|
module Pages
|
||||||
|
class Chat < PageObjects::Pages::Base
|
||||||
|
def open_from_header
|
||||||
|
find(".open-chat").click
|
||||||
|
end
|
||||||
|
|
||||||
|
def open_full_page
|
||||||
|
visit("/chat")
|
||||||
|
end
|
||||||
|
|
||||||
|
def maximize_drawer
|
||||||
|
find(".topic-chat-drawer-header__full-screen-btn").click
|
||||||
|
end
|
||||||
|
|
||||||
|
def minimize_full_page
|
||||||
|
find(".chat-full-screen-button").click
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
Loading…
Reference in New Issue