diff options
Diffstat (limited to 'comm/mail/components/im/content/joinchat.js')
-rw-r--r-- | comm/mail/components/im/content/joinchat.js | 195 |
1 files changed, 195 insertions, 0 deletions
diff --git a/comm/mail/components/im/content/joinchat.js b/comm/mail/components/im/content/joinchat.js new file mode 100644 index 0000000000..ae4029eb5a --- /dev/null +++ b/comm/mail/components/im/content/joinchat.js @@ -0,0 +1,195 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +var { IMServices } = ChromeUtils.importESModule( + "resource:///modules/IMServices.sys.mjs" +); +var { ChatIcons } = ChromeUtils.importESModule( + "resource:///modules/chatIcons.sys.mjs" +); + +var autoJoinPref = "autoJoin"; + +var joinChat = { + onload() { + var accountList = document.getElementById("accountlist"); + for (let acc of IMServices.accounts.getAccounts()) { + if (!acc.connected || !acc.canJoinChat) { + continue; + } + var proto = acc.protocol; + var item = accountList.appendItem(acc.name, acc.id, proto.name); + item.setAttribute("image", ChatIcons.getProtocolIconURI(proto)); + item.setAttribute("class", "menuitem-iconic"); + item.account = acc; + } + if (!accountList.itemCount) { + document + .getElementById("joinChatDialog") + .querySelector("dialog") + .cancelDialog(); + throw new Error("No connected MUC enabled account!"); + } + accountList.selectedIndex = 0; + }, + + onAccountSelect() { + let joinChatGrid = document.getElementById("joinChatGrid"); + while (joinChatGrid.children.length > 3) { + // leave the first 3 cols + joinChatGrid.lastChild.remove(); + } + + let acc = document.getElementById("accountlist").selectedItem.account; + let defaultValues = acc.getChatRoomDefaultFieldValues(); + joinChat._values = defaultValues; + joinChat._fields = []; + joinChat._account = acc; + + let protoId = acc.protocol.id; + document.getElementById("autojoin").hidden = !( + protoId == "prpl-irc" || + protoId == "prpl-jabber" || + protoId == "prpl-gtalk" + ); + + for (let field of acc.getChatRoomFields()) { + let div1 = document.createElementNS( + "http://www.w3.org/1999/xhtml", + "div" + ); + let label = document.createXULElement("label"); + let text = field.label; + let match = /_(.)/.exec(text); + if (match) { + label.setAttribute("accesskey", match[1]); + text = text.replace(/_/, ""); + } + label.setAttribute("value", text); + label.setAttribute("control", "field-" + field.identifier); + label.setAttribute("id", "field-" + field.identifier + "-label"); + div1.appendChild(label); + joinChatGrid.appendChild(div1); + + let div2 = document.createElementNS( + "http://www.w3.org/1999/xhtml", + "div" + ); + let input = document.createElementNS( + "http://www.w3.org/1999/xhtml", + "input" + ); + input.classList.add("input-inline"); + input.setAttribute("id", "field-" + field.identifier); + input.setAttribute( + "aria-labelledby", + "field-" + field.identifier + "-label" + ); + let val = defaultValues.getValue(field.identifier); + if (val) { + input.setAttribute("value", val); + } + if (field.type == Ci.prplIChatRoomField.TYPE_PASSWORD) { + input.setAttribute("type", "password"); + } else if (field.type == Ci.prplIChatRoomField.TYPE_INT) { + input.setAttribute("type", "number"); + input.setAttribute("min", field.min); + input.setAttribute("max", field.max); + } else { + input.setAttribute("type", "text"); + } + div2.appendChild(input); + joinChatGrid.appendChild(div2); + + let div3 = document.querySelector(".optional-col").cloneNode(true); + div3.classList.toggle("required", field.required); + joinChatGrid.appendChild(div3); + + joinChat._fields.push({ field, input }); + } + + window.sizeToContent(); + }, + + join() { + let values = joinChat._values; + for (let field of joinChat._fields) { + let val = field.input.value.trim(); + if (!val && field.field.required) { + field.input.focus(); + // FIXME: why isn't the return false enough? + throw new Error("Some required fields are empty!"); + // return false; + } + if (val) { + values.setValue(field.field.identifier, val); + } + } + let account = joinChat._account; + account.joinChat(values); + + let protoId = account.protocol.id; + if ( + protoId != "prpl-irc" && + protoId != "prpl-jabber" && + protoId != "prpl-gtalk" + ) { + return; + } + + let name; + if (protoId == "prpl-irc") { + name = values.getValue("channel"); + } else { + name = values.getValue("room") + "@" + values.getValue("server"); + } + + let conv = IMServices.conversations.getConversationByNameAndAccount( + name, + account, + true + ); + if (conv) { + let mailWindow = Services.wm.getMostRecentWindow("mail:3pane"); + if (mailWindow) { + mailWindow.focus(); + let tabmail = mailWindow.document.getElementById("tabmail"); + tabmail.openTab("chat", { convType: "focus", conv }); + } + } + + if (document.getElementById("autojoin").checked) { + // "nick" for JS-XMPP, "handle" for libpurple prpls. + let nick = values.getValue("nick") || values.getValue("handle"); + if (nick) { + name += "/" + nick; + } + + let prefBranch = Services.prefs.getBranch( + "messenger.account." + account.id + "." + ); + let autojoin = []; + if (prefBranch.prefHasUserValue(autoJoinPref)) { + let prefValue = prefBranch.getStringPref(autoJoinPref); + if (prefValue) { + autojoin = prefValue.split(","); + } + } + + if (!autojoin.includes(name)) { + autojoin.push(name); + prefBranch.setStringPref(autoJoinPref, autojoin.join(",")); + } + } + }, +}; + +document.addEventListener("dialogaccept", joinChat.join); + +window.addEventListener("DOMContentLoaded", event => { + joinChat.onload(); +}); +window.addEventListener("load", event => { + window.sizeToContent(); +}); |