mirror of
https://gh.wpcy.net/https://github.com/discourse/discourse.git
synced 2026-05-24 00:52:52 +08:00
Commit f06fd595f6 introduced a regression where opening fullscreen chat
on desktop would show a broken UI with the starred channels panel
floating over the main chat view.
The issue was a circular redirect: `lastKnownChatURL` returned
`/chat/starred-channels` when users had starred channels, but this route
redirects away on desktop (since starred channels are shown in the
sidebar). The redirect used `lastKnownChatURL` again, causing a loop.
This fix ensures `lastKnownChatURL` only defaults to
`/chat/starred-channels` when in mobile view or drawer mode, where the
dedicated route is needed. On desktop fullscreen, it defaults to `/chat`
since starred channels are already visible in the sidebar.
Internal ref - t/170435
183 lines
5 KiB
JavaScript
Vendored
183 lines
5 KiB
JavaScript
Vendored
import { getOwner } from "@ember/owner";
|
|
import { setupTest } from "ember-qunit";
|
|
import { module, test } from "qunit";
|
|
import sinon from "sinon";
|
|
import { forceMobile } from "discourse/lib/mobile";
|
|
import {
|
|
addChatDrawerStateCallback,
|
|
resetChatDrawerStateCallbacks,
|
|
} from "discourse/plugins/chat/discourse/services/chat-state-manager";
|
|
|
|
module(
|
|
"Discourse Chat | Unit | Service | chat-state-manager",
|
|
function (hooks) {
|
|
setupTest(hooks);
|
|
|
|
hooks.beforeEach(function () {
|
|
this.subject = getOwner(this).lookup("service:chat-state-manager");
|
|
});
|
|
|
|
hooks.afterEach(function () {
|
|
this.subject.reset();
|
|
});
|
|
|
|
test("isFullPagePreferred", function (assert) {
|
|
assert.false(this.subject.isFullPagePreferred);
|
|
|
|
this.subject.prefersFullPage();
|
|
|
|
assert.true(this.subject.isFullPagePreferred);
|
|
|
|
this.subject.prefersDrawer();
|
|
|
|
assert.false(this.subject.isFullPagePreferred);
|
|
|
|
this.subject.prefersDrawer();
|
|
forceMobile();
|
|
|
|
assert.true(this.subject.isFullPagePreferred);
|
|
});
|
|
|
|
test("isDrawerPreferred", function (assert) {
|
|
assert.true(this.subject.isDrawerPreferred);
|
|
|
|
this.subject.prefersFullPage();
|
|
|
|
assert.false(this.subject.isDrawerPreferred);
|
|
|
|
this.subject.prefersDrawer();
|
|
|
|
assert.true(this.subject.isDrawerPreferred);
|
|
});
|
|
|
|
test("hasNoPreferredMode", async function (assert) {
|
|
assert.true(this.subject.hasNoPreferredMode);
|
|
|
|
this.subject.prefersFullPage();
|
|
|
|
assert.false(this.subject.hasNoPreferredMode);
|
|
|
|
this.subject.prefersDrawer();
|
|
|
|
assert.false(this.subject.hasNoPreferredMode);
|
|
});
|
|
|
|
test("lastKnownChatURL", function (assert) {
|
|
assert.strictEqual(this.subject.lastKnownChatURL, "/chat");
|
|
|
|
this.subject.storeChatURL("/bar");
|
|
assert.strictEqual(this.subject.lastKnownChatURL, "/bar");
|
|
});
|
|
|
|
test("lastKnownChatURL defaults to starred channels only in drawer mode", function (assert) {
|
|
const chatChannelsManager = getOwner(this).lookup(
|
|
"service:chat-channels-manager"
|
|
);
|
|
sinon.stub(chatChannelsManager, "hasStarredChannels").get(() => true);
|
|
|
|
assert.strictEqual(
|
|
this.subject.lastKnownChatURL,
|
|
"/chat/starred-channels",
|
|
"defaults to starred-channels in drawer mode"
|
|
);
|
|
|
|
this.subject.prefersFullPage();
|
|
assert.strictEqual(
|
|
this.subject.lastKnownChatURL,
|
|
"/chat",
|
|
"defaults to /chat in fullscreen mode (starred channels in sidebar)"
|
|
);
|
|
});
|
|
|
|
test("lastKnownAppURL", function (assert) {
|
|
assert.strictEqual(this.subject.lastKnownAppURL, "/latest");
|
|
|
|
sinon.stub(this.subject.router, "currentURL").value("/foo");
|
|
this.subject.storeAppURL();
|
|
|
|
assert.strictEqual(this.subject.lastKnownAppURL, "/foo");
|
|
|
|
this.subject.storeAppURL("/bar");
|
|
|
|
assert.strictEqual(this.subject.lastKnownAppURL, "/bar");
|
|
});
|
|
|
|
test("isFullPageActive", function (assert) {
|
|
sinon.stub(this.subject.router, "currentRouteName").value("foo");
|
|
assert.false(this.subject.isFullPageActive);
|
|
|
|
sinon.stub(this.subject.router, "currentRouteName").value("chat");
|
|
assert.true(this.subject.isFullPageActive);
|
|
});
|
|
|
|
test("didCollapseDrawer", function (assert) {
|
|
this.subject.didCollapseDrawer();
|
|
|
|
assert.false(this.subject.isDrawerExpanded);
|
|
assert.true(this.subject.isDrawerActive);
|
|
});
|
|
|
|
test("didExpandDrawer", function (assert) {
|
|
const stub = sinon.stub(
|
|
this.owner.lookup("service:chat"),
|
|
"updatePresence"
|
|
);
|
|
|
|
this.subject.didExpandDrawer();
|
|
|
|
assert.true(this.subject.isDrawerExpanded);
|
|
assert.true(this.subject.isDrawerActive);
|
|
sinon.assert.calledOnce(stub);
|
|
});
|
|
|
|
test("didCloseDrawer", function (assert) {
|
|
const stub = sinon.stub(
|
|
this.owner.lookup("service:chat"),
|
|
"updatePresence"
|
|
);
|
|
|
|
this.subject.didCloseDrawer();
|
|
|
|
assert.false(this.subject.isDrawerExpanded);
|
|
assert.false(this.subject.isDrawerActive);
|
|
sinon.assert.calledOnce(stub);
|
|
});
|
|
|
|
test("didOpenDrawer", function (assert) {
|
|
const stub = sinon.stub(
|
|
this.owner.lookup("service:chat"),
|
|
"updatePresence"
|
|
);
|
|
|
|
this.subject.didOpenDrawer();
|
|
|
|
assert.true(this.subject.isDrawerExpanded);
|
|
assert.true(this.subject.isDrawerActive);
|
|
assert.strictEqual(this.subject.lastKnownChatURL, "/chat");
|
|
|
|
this.subject.didOpenDrawer("/foo");
|
|
|
|
assert.strictEqual(this.subject.lastKnownChatURL, "/foo");
|
|
sinon.assert.calledTwice(stub);
|
|
});
|
|
|
|
test("callbacks", function (assert) {
|
|
this.state = null;
|
|
addChatDrawerStateCallback((state) => {
|
|
this.state = state;
|
|
});
|
|
|
|
this.subject.didOpenDrawer();
|
|
|
|
assert.true(this.state.isDrawerActive);
|
|
assert.true(this.state.isDrawerExpanded);
|
|
|
|
this.subject.didCloseDrawer();
|
|
|
|
assert.false(this.state.isDrawerActive);
|
|
assert.false(this.state.isDrawerExpanded);
|
|
|
|
resetChatDrawerStateCallbacks();
|
|
});
|
|
}
|
|
);
|