/** @odoo-module **/ import { rpc } from "@web/core/network/rpc"; const { xml, onMounted, useState, useExternalListener, useRef } = owl; export class ChatMsgView extends owl.Component { setup() { super.setup(...arguments); this.flag_scroll = 1; this.flag = 0; this.root = useRef("root"); onMounted(this.render_messages); useExternalListener(window, "click", this.ext_close_window, true); this.state = useState({ name: "", data: [], id: null }); } /** Function for enter key to send messages */ keyEnter(event) { if (event.key === "Enter") { this._onClickMessageSend(); } } /** Fetch old messages */ async render_messages() { try { const result = await rpc('/pos_systray/chat_message', { data: this.props.channel_id }); if (!this.root.el) return; let message_list = []; const messages = result.messages || []; messages.forEach((message) => { const htmlString = message.body; const parser = new DOMParser(); const parsedHtml = parser.parseFromString(htmlString, 'text/html'); const plainText = parsedHtml.documentElement.textContent; message_list.push({ body: plainText, author: message.author, flag: message.flag }); }); this.state.data = message_list; this.state.name = result.name; this.state.id = result.channel_id; if (this.flag_scroll === 1) { const element = this.root.el.querySelector("#msg_content"); if (element) element.scrollTop = element.scrollHeight; } if (this.flag === 0) { setTimeout(() => this.render_messages(), 1000); this.flag_scroll = 0; } } catch (error) { console.error("Error fetching messages:", error); } } /** Close chat window */ close_window() { this.__owl__.remove(); this.flag = 1; this.flag_scroll = 0; } /** Close the chat window when clicking outside */ ext_close_window(event) { if (this.root.el && !this.root.el.contains(event.target)) { this.__owl__.remove(); this.flag = 1; this.flag_scroll = 0; } } /** Send message */ async _onClickMessageSend() { if (!this.root.el) return; const input = this.root.el.querySelector("#message_to_send"); const res_id = this.root.el.querySelector("#button_send")?.getAttribute("value"); if (!input || !res_id || !input.value.trim()) return; const data = { res_id: res_id, msg_body: input.value.trim() }; try { await rpc('/pos_chatter/send_message', { data }); input.value = ""; this.render_messages(); } catch (error) { console.error("Error sending message:", error); } } } ChatMsgView.template = xml`
You