mirror of
https://github.com/discourse/discourse.git
synced 2024-12-15 18:53:40 +08:00
2d567cee26
Prior to this commit we were loading a large number of thread messages without any pagination. This commit attempts to fix this and also improves the following points: - code sharing between channels and threads: Attempts to reuse/share the code use in channels for threads. To make it possible part of this code has been extracted in dedicated helpers or has been improved to reduce the duplication needed. Examples of extracted helpers: - `stackingContextFix`: the ios hack for rendering bug when momentum scrolling is interrupted - `scrollListToMessage`, `scrollListToTop`, `scrollListToBottom`: a series of helper to correctly scroll to a specific position in the list of messages - better general performance of listing messages: One of the main changes which has been made is to remove the computation of visible message during scroll, it will only happen when needed (update last read for example). This constant recomputation of `message.visible` on intersection observer event while scrolling was consuming a lot of CPU time.
81 lines
2.8 KiB
JavaScript
81 lines
2.8 KiB
JavaScript
import { setupTest } from "ember-qunit";
|
|
import { module, test } from "qunit";
|
|
import { getOwner } from "discourse-common/lib/get-owner";
|
|
import { withPluginApi } from "discourse/lib/plugin-api";
|
|
import User from "discourse/models/user";
|
|
import ChatMessageInteractor, {
|
|
resetRemovedChatComposerSecondaryActions,
|
|
} from "discourse/plugins/chat/discourse/lib/chat-message-interactor";
|
|
import fabricators from "discourse/plugins/chat/discourse/lib/fabricators";
|
|
import pretender from "discourse/tests/helpers/create-pretender";
|
|
import { logIn } from "discourse/tests/helpers/qunit-helpers";
|
|
|
|
module("Chat | Unit | Utility | plugin-api", function (hooks) {
|
|
setupTest(hooks);
|
|
|
|
test("#sendChatMessage", async function (assert) {
|
|
const done = assert.async();
|
|
|
|
pretender.post("/chat/1", (request) => {
|
|
assert.strictEqual(request.url, "/chat/1");
|
|
assert.strictEqual(request.requestBody, "thread_id=2&message=hello");
|
|
done();
|
|
return [200, {}, {}];
|
|
});
|
|
|
|
withPluginApi("1.1.0", async (api) => {
|
|
await api.sendChatMessage(1, { message: "hello", threadId: 2 });
|
|
});
|
|
});
|
|
|
|
test("#removeChatComposerSecondaryActions", async function (assert) {
|
|
withPluginApi("1.1.0", async (api) => {
|
|
// assert that the api method is defined
|
|
assert.equal(typeof api.removeChatComposerSecondaryActions, "function");
|
|
|
|
logIn();
|
|
const currentUser = User.current();
|
|
getOwner(this).unregister("service:current-user");
|
|
getOwner(this).register("service:current-user", currentUser, {
|
|
instantiate: false,
|
|
});
|
|
|
|
const message = fabricators.message({
|
|
user: currentUser,
|
|
});
|
|
const context = "channel";
|
|
const interactor = new ChatMessageInteractor(
|
|
getOwner(this),
|
|
message,
|
|
context
|
|
);
|
|
|
|
// assert that the initial secondary actions are present
|
|
const secondaryActions = interactor.secondaryActions;
|
|
assert.ok(secondaryActions.length > 0);
|
|
|
|
try {
|
|
// remove the first secondary action listed
|
|
api.removeChatComposerSecondaryActions(secondaryActions[0].id);
|
|
|
|
const updatedSecondaryActions = interactor.secondaryActions;
|
|
|
|
// assert that the secondary action was removed
|
|
assert.ok(
|
|
updatedSecondaryActions.length < secondaryActions.length,
|
|
"the updated secondary actions must contain less items than the original"
|
|
);
|
|
assert.notOk(
|
|
updatedSecondaryActions
|
|
.map((v) => v.id)
|
|
.includes(secondaryActions[0]),
|
|
"the updated secondary actions must not include the removed action"
|
|
);
|
|
} finally {
|
|
// reset the secondary actions removed to prevent leakage to other tests
|
|
resetRemovedChatComposerSecondaryActions();
|
|
}
|
|
});
|
|
});
|
|
});
|