diff --git a/addons/mail/controllers/discuss/channel.py b/addons/mail/controllers/discuss/channel.py index 83bb5099e2f..4cf6d3b34b0 100644 --- a/addons/mail/controllers/discuss/channel.py +++ b/addons/mail/controllers/discuss/channel.py @@ -28,7 +28,10 @@ class ChannelController(http.Controller): @http.route("/discuss/channel/info", methods=["POST"], type="json", auth="public") @add_guest_to_context def discuss_channel_info(self, channel_id): - return request.env["discuss.channel"].search([("id", "=", channel_id)])._channel_info() + channel = request.env["discuss.channel"].search([("id", "=", channel_id)]) + if not channel: + return + return channel._channel_info()[0] @http.route("/discuss/channel/messages", methods=["POST"], type="json", auth="public") @add_guest_to_context diff --git a/addons/mail/static/src/core/common/thread_service.js b/addons/mail/static/src/core/common/thread_service.js index 7eb371c93cc..8cf6145b55a 100644 --- a/addons/mail/static/src/core/common/thread_service.js +++ b/addons/mail/static/src/core/common/thread_service.js @@ -44,10 +44,13 @@ export class ThreadService { /** * @param {import("models).Thread} thread * @param {number} id - * @returns {Promise} + * @returns {Promise} */ async fetchChannel(id) { - const [channelData] = await this.rpc("/discuss/channel/info", { channel_id: id }); + const channelData = await this.rpc("/discuss/channel/info", { channel_id: id }); + if (!channelData) { + return; + } return this.store.Thread.insert({ ...channelData, model: "discuss.channel", diff --git a/addons/mail/static/src/core/web/discuss_client_action.js b/addons/mail/static/src/core/web/discuss_client_action.js index b4263ac1c49..16cdb6e6302 100644 --- a/addons/mail/static/src/core/web/discuss_client_action.js +++ b/addons/mail/static/src/core/web/discuss_client_action.js @@ -58,6 +58,9 @@ export class DiscussClientAction extends Component { const thread = this.store.Thread.get({ model, id }) ?? (await this.threadService.fetchChannel(parseInt(id))); + if (!thread) { + return; + } if (!thread.is_pinned) { await this.threadService.pin(thread); } diff --git a/addons/mail/static/src/discuss/core/common/discuss_core_common_service.js b/addons/mail/static/src/discuss/core/common/discuss_core_common_service.js index 85294ae4ca6..f3e7850b07b 100644 --- a/addons/mail/static/src/discuss/core/common/discuss_core_common_service.js +++ b/addons/mail/static/src/discuss/core/common/discuss_core_common_service.js @@ -233,12 +233,10 @@ export class DiscussCoreCommon { const { id, message: messageData } = notif.payload; let channel = this.store.Thread.get({ model: "discuss.channel", id }); if (!channel || !channel.type) { - const [channelData] = await this.rpc("/discuss/channel/info", { channel_id: id }); - channel = this.store.Thread.insert({ - model: "discuss.channel", - type: channelData.channel_type, - ...channelData, - }); + channel = await this.threadService.fetchChannel(id); + if (!channel) { + return; + } } if (!channel.is_pinned) { this.threadService.pin(channel); diff --git a/addons/mail/static/tests/discuss/core/web/discuss_tests.js b/addons/mail/static/tests/discuss/core/web/discuss_tests.js index 571da2ea63a..857ff05c9f6 100644 --- a/addons/mail/static/tests/discuss/core/web/discuss_tests.js +++ b/addons/mail/static/tests/discuss/core/web/discuss_tests.js @@ -193,3 +193,10 @@ QUnit.test("Chat is added to discuss on other tab that the one that joined", asy await contains(".o-mail-DiscussSidebarChannel", { target: tab1.target, text: "Jerry Golay" }); await contains(".o-mail-DiscussSidebarChannel", { target: tab2.target, text: "Jerry Golay" }); }); + +QUnit.test("no conversation selected when opening non-existing channel in discuss", async () => { + await startServer(); + const { openDiscuss } = await start(); + await openDiscuss(200); // non-existing id + await contains("h4", { text: "No conversation selected." }); +}); diff --git a/addons/mail/static/tests/helpers/mock_server/models/discuss_channel.js b/addons/mail/static/tests/helpers/mock_server/models/discuss_channel.js index afcff843c6a..5b91aeb723b 100644 --- a/addons/mail/static/tests/helpers/mock_server/models/discuss_channel.js +++ b/addons/mail/static/tests/helpers/mock_server/models/discuss_channel.js @@ -89,7 +89,7 @@ patch(MockServer.prototype, { } if (route === "/discuss/channel/info") { const id = args.channel_id; - return this._mockDiscussChannelChannelInfo([id]); + return this._mockDiscussChannelChannelInfo([id])[0]; } if (args.model === "discuss.channel" && args.method === "add_members") { const ids = args.args[0]; diff --git a/addons/mail/static/tests/helpers/test_utils.js b/addons/mail/static/tests/helpers/test_utils.js index 14d87216347..e3e0dc9ad99 100644 --- a/addons/mail/static/tests/helpers/test_utils.js +++ b/addons/mail/static/tests/helpers/test_utils.js @@ -34,27 +34,13 @@ registryNamesToCloneWithCleanup.push("mock_server_callbacks", "discuss.model"); function getOpenDiscuss(webClient, { context = {}, params = {}, ...props } = {}) { return async function openDiscuss(pActiveId) { const actionOpenDiscuss = { + context: { ...context, active_id: pActiveId }, // hardcoded actionId, required for discuss_container props validation. id: 104, - context, params, tag: "mail.action_discuss", type: "ir.actions.client", }; - const activeId = - pActiveId ?? context.active_id ?? params.default_active_id ?? "mail.box_inbox"; - let [threadModel, threadId] = - typeof activeId === "number" ? ["discuss.channel", activeId] : activeId.split("_"); - if (threadModel === "discuss.channel") { - threadId = parseInt(threadId, 10); - } - // TODO-DISCUSS-REFACTORING: remove when activeId will be handled. - webClient.env.services["mail.thread"].setDiscussThread( - webClient.env.services["mail.store"].Thread.insert({ - model: threadModel, - id: threadId, - }) - ); await doAction(webClient, actionOpenDiscuss, { props }); }; }