diff --git a/.prettierrc b/.prettierrc new file mode 100644 index 0000000000000000000000000000000000000000..f272a0abed4e70c11a35003fa40cf8376935f2a7 --- /dev/null +++ b/.prettierrc @@ -0,0 +1,8 @@ +{ + "arrowParens": "avoid", + "trailingComma": "es5", + "tabWidth": 4, + "singleQuote": true, + "quoteProps": "preserve", + "printWidth": 120 +} \ No newline at end of file diff --git a/build-scss.js b/build-scss.js index afd914d7e638387ba27606b95ef620b062b8ec4a..ea8fa4334d5c3000b75bdbc7af90afc24d26e089 100644 --- a/build-scss.js +++ b/build-scss.js @@ -3,15 +3,16 @@ const sass = require('sass'); const fs = require('fs'); sass.render({ - file: 'src/styles/index.scss', - outFile: 'dist/index.css', + file: 'src/styles/index.scss', + outFile: 'dist/index.css', }, function(error, result) { - if(!error){ - if (!fs.existsSync('dist')){ - fs.mkdirSync('dist', { recursive: true }); + if (!error) { + if (!fs.existsSync('dist')) { + fs.mkdirSync('dist', { recursive: true }); + } + fs.writeFile('dist/index.css', String(result.css).replace(/\/lib\/solid-xmpp-chat/g, path), (e) => { + }); + } else { + console.error(error); } - fs.writeFile('dist/index.css', String(result.css).replace(/\/lib\/solid-xmpp-chat/g, path), (e) =>{}); - } else { - console.error(error); - } -}); \ No newline at end of file +}); diff --git a/package-lock.json b/package-lock.json index ba4b4f6d1bd230d7284076b8ee045b70be0ffa87..3134d39f7cc8095df4691c5142008cfccd44e9c7 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1864,6 +1864,12 @@ "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=" }, + "prettier": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.2.1.tgz", + "integrity": "sha512-PqyhM2yCjg/oKkFPtTGUojv7gnZAoG80ttl45O6x2Ug/rMJw4wcc9k6aaf2hibP7BGVCCM33gZoGjyvt9mm16Q==", + "dev": true + }, "process-nextick-args": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", diff --git a/package.json b/package.json index b0e3bfa472e2a7ee51ad64b18ed74c15c32159f9..218578537d7814b56bda29bdee778e98d64bbb51 100644 --- a/package.json +++ b/package.json @@ -57,6 +57,7 @@ "sass": "^1.32.5" }, "devDependencies": { + "prettier": "^2.2.1", "watch-cli": "^0.2.3" }, "scripts": { diff --git a/src/index.js b/src/index.js index 214aaca02ff69f56b18c3c03b49436e39c42bd60..52a1909885505177e57edac06693597c1d4201ad 100644 --- a/src/index.js +++ b/src/index.js @@ -1,3 +1,3 @@ import { SolidXMPPChat } from './solid-xmpp-chat.js'; -export { SolidXMPPChat } +export { SolidXMPPChat }; diff --git a/src/path.js b/src/path.js index 92c1e6f8c5803067f51daae548e32d243fbd533a..3d432789081d7d4602b63b0270e40bb24058ae6e 100644 --- a/src/path.js +++ b/src/path.js @@ -1,3 +1,3 @@ -const path = "/lib/solid-xmpp-chat"; +const path = '/lib/solid-xmpp-chat'; module.exports = path; diff --git a/src/plugins/converse-rai.js b/src/plugins/converse-rai.js index f0db84ec7bf26e51b544bfcd4c0000b4192cb053..d52f0678206f863d6a619920157cbbacea0d418f 100644 --- a/src/plugins/converse-rai.js +++ b/src/plugins/converse-rai.js @@ -1,18 +1,12 @@ -(function (root, factory) { - if (typeof define === 'function' && define.amd) { - define(["converse"], factory); - } else { - factory(converse); - } -}(this, function (converse) { - var Strophe, $iq, $msg, $pres, $build, b64_sha1, _ ,Backbone, dayjs, _converse; - var interestingServers = new Set(); - var subscribedServers = new Set(); +(function() { + let Strophe, $iq, $msg, $pres, $build, b64_sha1, _, Backbone, dayjs, _converse; + let interestingServers = new Set(); + let subscribedServers = new Set(); - converse.plugins.add("rai", { + converse.plugins.add('rai', { 'dependencies': [], - 'initialize': function () { + 'initialize': function() { _converse = this._converse; Strophe = converse.env.Strophe; @@ -27,36 +21,34 @@ _converse.api.settings.extend({ rai_notification: true, - rai_notification_label: "Room Activity Indicator" + rai_notification_label: 'Room Activity Indicator', }); - _converse.api.listen.on('connected', function () { + _converse.api.listen.on('connected', function() { setupRoomActivityIndicators(); }); - _converse.api.listen.on('chatRoomViewInitialized', function (view) - { - const jid = view.model.get("jid"); + _converse.api.listen.on('chatRoomViewInitialized', function(view) { + const jid = view.model.get('jid'); - if (view.model.get("num_unread") > 0 || view.model.get("num_unread_general") > 0) { + if (view.model.get('num_unread') > 0 || view.model.get('num_unread_general') > 0) { emitNotification(jid); } }); - _converse.api.listen.on('raiRoomsUpdated', function (rooms) { + _converse.api.listen.on('raiRoomsUpdated', function(rooms) { interestingServers = new Set(rooms.filter(room => room).map(Strophe.getDomainFromJid)); - if(_converse.api.connection.connected()) { - updateSubscriptions(); - } + if (_converse.api.connection.connected()) { + updateSubscriptions(); + } }); - _converse.api.listen.on('chatBoxScrolledDown', function (view) - { + _converse.api.listen.on('chatBoxScrolledDown', function(view) { const jid = view.chatbox.get('jid'); const id_attr = 'stanza_id ' + jid; const messages = view.chatbox.messages; - if(!getUnreadStatus(jid)) { + if (!getUnreadStatus(jid)) { return; } @@ -65,46 +57,41 @@ if (message.has(id_attr)) { let id = message.get(id_attr); - if(id != sessionStorage.getItem("rai_displayed." + jid)) { - sessionStorage.setItem("rai_displayed." + jid, id); + if (id != sessionStorage.getItem('rai_displayed.' + jid)) { + sessionStorage.setItem('rai_displayed.' + jid, id); setUnreadStatus(jid, false); - setTimeout(() => sendMarker(jid, id, "displayed"), 0); + setTimeout(() => sendMarker(jid, id, 'displayed'), 0); } break; } } }); - _converse.api.listen.on('chatBoxInsertedIntoDOM', function (view) - { - const jid = view.model.get("jid"); + _converse.api.listen.on('chatBoxInsertedIntoDOM', function(view) { + const jid = view.model.get('jid'); - if (view.model.get("num_unread") > 0) - { + if (view.model.get('num_unread') > 0) { emitNotification(jid); } }); - _converse.api.listen.on('message', function (data) - { + _converse.api.listen.on('message', function(data) { var chatbox = data.chatbox; var history = data.attrs.is_archived; var sender = data.attrs.sender; var body = data.attrs.body; - if (!history && body && chatbox && sender !== 'me') - { - const alert = chatbox.get("num_unread") > 0; - const notify = chatbox.get("num_unread_general") > 0; + if (!history && body && chatbox && sender !== 'me') { + const alert = chatbox.get('num_unread') > 0; + const notify = chatbox.get('num_unread_general') > 0; - if ( alert || notify) - { - emitNotification(chatbox.get("jid"), alert); + if (alert || notify) { + emitNotification(chatbox.get('jid'), alert); } } }); - } + }, }); @@ -112,105 +99,97 @@ const id = Math.random().toString(36).substr(2, 9); _converse.connection.send(converse.env.$pres({ to: server_name, - id: id + id: id, }).c('rai', { - 'xmlns': "xmpp:prosody.im/protocol/rai" + 'xmlns': 'xmpp:prosody.im/protocol/rai', })); } function unsubscribeServer(server_name) { _converse.connection.send(converse.env.$pres({ - to: server_name, type: "unavailable" + to: server_name, type: 'unavailable', }).c('rai', { - 'xmlns': "xmpp:prosody.im/protocol/rai" + 'xmlns': 'xmpp:prosody.im/protocol/rai', })); } function updateSubscriptions() { var new_servers = new Set([...interestingServers].filter(server => !subscribedServers.has(server))); var obsolete_servers = new Set([...subscribedServers].filter(server => !interestingServers.has(server))); - for(let server of obsolete_servers) { + for (let server of obsolete_servers) { unsubscribeServer(server); } - for(let server of new_servers) { + for (let server of new_servers) { subscribeServer(server); } } - function setupRoomActivityIndicators() - { + function setupRoomActivityIndicators() { updateSubscriptions(); // If we already have unread notifications stored for this session, emit them now - for (var i = 0; i < sessionStorage.length; i++) - { - if (sessionStorage.key(i).indexOf("rai_notify.") == 0) - { + for (var i = 0; i < sessionStorage.length; i++) { + if (sessionStorage.key(i).indexOf('rai_notify.') == 0) { const jid = sessionStorage.key(i).substring(11); emitNotification(jid); } } - // Listen for incoming RAI from the server - _converse.connection.addHandler(function (message) { - const from_jid = message.attributes.from?.nodevalue - const room_jid = from_jid?.split("/")[0] + // Listen for incoming RAI from the server + _converse.connection.addHandler(function(message) { + const from_jid = message.attributes.from?.nodevalue; + const room_jid = from_jid?.split('/')[0]; const room = ''; let ignore = false; - for (let i = 0; i < _converse.chatboxes.models.length; i++){ - if(_converse.chatboxes.models[i].id === room_jid){ + for (let i = 0; i < _converse.chatboxes.models.length; i++) { + if (_converse.chatboxes.models[i].id === room_jid) { room = _converse.chatboxes.models[i].id; break; } } - if (room && from_jid && room_jid){ - if (from_jid === room_jid+'/'+room.get('nick')){ + if (room && from_jid && room_jid) { + if (from_jid === room_jid + '/' + room.get('nick')) { ignore = true; } } - if(message && !ignore) - message.querySelectorAll('activity').forEach(function (activity) - { - if (activity && activity.namespaceURI == "xmpp:prosody.im/protocol/rai") - { + if (message && !ignore) + message.querySelectorAll('activity').forEach(function(activity) { + if (activity && activity.namespaceURI == 'xmpp:prosody.im/protocol/rai') { const jid = activity.textContent; setUnreadStatus(jid, true); emitNotification(jid); } }); - return true; + return true; }, null, 'message'); } - function setUnreadStatus(jid, flag) - { - if(flag) { - sessionStorage.setItem("rai_notify." + jid, "true"); + function setUnreadStatus(jid, flag) { + if (flag) { + sessionStorage.setItem('rai_notify.' + jid, 'true'); } else { - sessionStorage.removeItem("rai_notify." + jid); + sessionStorage.removeItem('rai_notify.' + jid); } } function getUnreadStatus(jid) { - return sessionStorage.getItem("rai_notify." + jid) == "true"; + return sessionStorage.getItem('rai_notify.' + jid) == 'true'; } - function emitNotification(jid, alert) - { + function emitNotification(jid, alert) { _converse.api.trigger('chatRoomActivityIndicators', jid); } - function sendMarker(to_jid, id, type) - { + function sendMarker(to_jid, id, type) { const stanza = converse.env.$msg({ - 'from': _converse.connection.jid, - 'id': Math.random().toString(36).substr(2,9), - 'to': to_jid, - 'type': 'groupchat' + 'from': _converse.connection.jid, + 'id': Math.random().toString(36).substr(2, 9), + 'to': to_jid, + 'type': 'groupchat', }).c(type, { - 'xmlns': converse.env.Strophe.NS.MARKERS, - 'id': id + 'xmlns': converse.env.Strophe.NS.MARKERS, + 'id': id, }); _converse.api.send(stanza); } -})); +})(); diff --git a/src/solid-xmpp-chat.js b/src/solid-xmpp-chat.js index 563716e93bf05353423824c5863b2bf9cbb2aee5..95e2078a85bb396839162eb73c98b125911c98c6 100644 --- a/src/solid-xmpp-chat.js +++ b/src/solid-xmpp-chat.js @@ -5,335 +5,339 @@ import { Sib, store, StoreMixin } from 'https://cdn.skypack.dev/@startinblox/cor import ComponentPath from './path.js'; class Deferred { - constructor() { - this.promise = new Promise(((resolve, reject) => { - this.resolve = resolve; - this.reject = reject; - }).bind(this)); - this.then = this.promise.then.bind(this.promise); - this.catch = this.promise.catch.bind(this.promise); - } + constructor() { + this.promise = new Promise(((resolve, reject) => { + this.resolve = resolve; + this.reject = reject; + }).bind(this)); + this.then = this.promise.then.bind(this.promise); + this.catch = this.promise.catch.bind(this.promise); + } } export const SolidXMPPChat = { - name: 'solid-xmpp-chat', - use: [ StoreMixin ], - attributes: { - authentication: { - type: String, - default: 'login', - }, - autoLogin: { - type: Boolean, - default: true, - }, - i18n: { - type: String, - default: 'fr', - }, - websocketUrl: { - type: String, - default: 'wss://jabber.happy-dev.fr/xmpp-websocket', + name: 'solid-xmpp-chat', + use: [StoreMixin], + attributes: { + authentication: { + type: String, + default: 'login', + }, + autoLogin: { + type: Boolean, + default: true, + }, + i18n: { + type: String, + default: 'fr', + }, + websocketUrl: { + type: String, + default: 'wss://jabber.happy-dev.fr/xmpp-websocket', + }, }, - }, - get extra_context() { - return { "foaf": 'http://xmlns.com/foaf/0.1/', "chatProfile": "http://happy-dev.fr/owl/#chatProfile", "jabberID": "foaf:jabberID" }; - }, + get extra_context() { + return { + 'foaf': 'http://xmlns.com/foaf/0.1/', + 'chatProfile': 'http://happy-dev.fr/owl/#chatProfile', + 'jabberID': 'foaf:jabberID', + }; + }, - async created() { - const check_identified = await document.querySelector('sib-auth').getUserIdToken(); - if(check_identified) { - this.element.attachShadow({ - mode: "open" - }); - this.importCSS(`${ComponentPath}/dist/conversejs/converse.min.css?min`); - this.importCSS(`${ComponentPath}/dist/index.css?min`); - if (window.converse_sib === undefined) { - this.initializeConverse(); - } - } // Else, not logged in on page load (even if not on chat) - }, + async created() { + const check_identified = await document.querySelector('sib-auth').getUserIdToken(); + if (check_identified) { + this.element.attachShadow({ + mode: 'open', + }); + this.importCSS(`${ComponentPath}/dist/conversejs/converse.min.css?min`); + this.importCSS(`${ComponentPath}/dist/index.css?min`); + if (window.converse_sib === undefined) { + this.initializeConverse(); + } + } // Else, not logged in on page load (even if not on chat) + }, - importCSS(path) { - let link = document.createElement('link'); - link.rel = 'stylesheet'; - link.href = path; - this.element.shadowRoot.append(link); - }, + importCSS(path) { + let link = document.createElement('link'); + link.rel = 'stylesheet'; + link.href = path; + this.element.shadowRoot.append(link); + }, - empty() { - this.element.innerHTML = 'Loading...'; - }, + empty() { + this.element.innerHTML = 'Loading...'; + }, - async populate() { - if(typeof converse_sib !== 'undefined') { - await converse_sib.loaded_deferred; - if (this.resource) { - if (await this.resource.jabberRoom) { - this.jid = await this.resource['jabberID']; - } else { - this.jid = await this.resource['chatProfile.jabberID']; - const user = await document.querySelector('sib-auth').getUser(); - const userProfile = await store.getData(user['@id'], this.context); - const contactsURL = await userProfile['contacts.@id']; - const contactInterval = setInterval(async () => { - let retry = false; - let userContacts = []; - for (let contact of await userProfile['contacts.ldp:contains']) { - if (contact) { - userContacts.push(await contact['contact.@id']); - } else { - retry = true; - } - } - if (!retry) { - clearInterval(contactInterval); - if(!userContacts.includes(this.resource['@id'])) { - store.post({ - "contact": this.resource['@id'], - "@context": this.context - }, contactsURL); - } - } - }, 100); - } - await converse_sib.connected_deferred; - converse_sib.service.plugins.sibChat.changeChat( - this.jid, - await this.resource.jabberRoom, - this.element.shadowRoot, - ); - window.dispatchEvent(new CustomEvent('read', { - detail: { - resource: { - "@id": this.resource['@id'] + async populate() { + if (typeof converse_sib !== 'undefined') { + await converse_sib.loaded_deferred; + if (this.resource) { + if (await this.resource.jabberRoom) { + this.jid = await this.resource['jabberID']; + } else { + this.jid = await this.resource['chatProfile.jabberID']; + const user = await document.querySelector('sib-auth').getUser(); + const userProfile = await store.getData(user['@id'], this.context); + const contactsURL = await userProfile['contacts.@id']; + const contactInterval = setInterval(async () => { + let retry = false; + let userContacts = []; + for (let contact of await userProfile['contacts.ldp:contains']) { + if (contact) { + userContacts.push(await contact['contact.@id']); + } else { + retry = true; + } + } + if (!retry) { + clearInterval(contactInterval); + if (!userContacts.includes(this.resource['@id'])) { + store.post({ + 'contact': this.resource['@id'], + '@context': this.context, + }, contactsURL); + } + } + }, 100); + } + await converse_sib.connected_deferred; + converse_sib.service.plugins.sibChat.changeChat( + this.jid, + await this.resource.jabberRoom, + this.element.shadowRoot, + ); + window.dispatchEvent(new CustomEvent('read', { + detail: { + resource: { + '@id': this.resource['@id'], + }, + }, + })); } - } - })); - } - } // Else, not logged in, on chat change - }, + } // Else, not logged in, on chat change + }, - initializeConverse() { - window.converse_sib = {}; + initializeConverse() { + window.converse_sib = {}; - // Deferred resolved at the end of this function - converse_sib.loaded_deferred = new Deferred(); + // Deferred resolved at the end of this function + converse_sib.loaded_deferred = new Deferred(); - // Deferred resolved after converse.initialize - converse_sib.connected_deferred = new Deferred(); + // Deferred resolved after converse.initialize + converse_sib.connected_deferred = new Deferred(); - // Registering window.converse_sib.service - converse_sib.service = { - 'waitUntilLoaded': converse_sib.loaded_deferred.promise, - 'initialize': function (options) { - this.waitUntilLoaded().done(this.api.initialize, options); - }, - 'waitUntilConnected': converse_sib.connected_deferred.promise, - 'plugins': {} - }; + // Registering window.converse_sib.service + converse_sib.service = { + 'waitUntilLoaded': converse_sib.loaded_deferred.promise, + 'initialize': function(options) { + this.waitUntilLoaded().done(this.api.initialize, options); + }, + 'waitUntilConnected': converse_sib.connected_deferred.promise, + 'plugins': {}, + }; - for(var key in sessionStorage){ - if(sessionStorage.hasOwnProperty(key) && /converse/.test(key)){ - sessionStorage.removeItem(key); + for (var key in sessionStorage) { + if (sessionStorage.hasOwnProperty(key) && /converse/.test(key)) { + sessionStorage.removeItem(key); + } } - } - for(var key in localStorage){ - if(localStorage.hasOwnProperty(key) && /converse/.test(key)){ - localStorage.removeItem(key); + for (var key in localStorage) { + if (localStorage.hasOwnProperty(key) && /converse/.test(key)) { + localStorage.removeItem(key); + } } - } - indexedDB.deleteDatabase('converse-persistent'); + indexedDB.deleteDatabase('converse-persistent'); - // Alias for solid-xmpp-chat use # want to un-expose converse from window later - // window.converse_sib.service.api === window.converse - converse_sib.service.api = converse; + // Alias for solid-xmpp-chat use # want to un-expose converse from window later + // window.converse_sib.service.api === window.converse + converse_sib.service.api = converse; - // Change chat plugin - converse_sib.service.plugins.sibChat = new(class { - changeChat(jid, is_groupchat, root) { - // function isEmptyMessage (attrs) { - // if (attrs && attrs.attributes) { - // attrs = attrs.attributes; - // } - // return !attrs['oob_url'] && - // !attrs['file'] && - // !(attrs['is_encrypted'] && attrs['plaintext']) && - // !attrs['message']; - // }; + // Change chat plugin + converse_sib.service.plugins.sibChat = new (class { + changeChat(jid, is_groupchat, root) { + // function isEmptyMessage (attrs) { + // if (attrs && attrs.attributes) { + // attrs = attrs.attributes; + // } + // return !attrs['oob_url'] && + // !attrs['file'] && + // !(attrs['is_encrypted'] && attrs['plaintext']) && + // !attrs['message']; + // }; - // function removeUnnecessaryDayIndicators(view) { - // const pred = (el) => - // el.matches('.date-separator') && el.nextElementSibling.matches('.date-separator'); - // const container = view.el.querySelector('.chat-content__messages'); - // const to_remove = Array.from(container.children).filter(pred); - // to_remove.forEach((el) => el.parentElement.removeChild(el)); - // }; - // function isHidden(classList){ - // for(let i = 0; i < classList.length; i++){ - // if(classList[i] === 'hidden'){ - // return true; - // } - // } - // return false; - // } - if (!jid) { - return; - } - jid = jid.toLowerCase(); - this._converse.root = root; + // function removeUnnecessaryDayIndicators(view) { + // const pred = (el) => + // el.matches('.date-separator') && el.nextElementSibling.matches('.date-separator'); + // const container = view.el.querySelector('.chat-content__messages'); + // const to_remove = Array.from(container.children).filter(pred); + // to_remove.forEach((el) => el.parentElement.removeChild(el)); + // }; + // function isHidden(classList){ + // for(let i = 0; i < classList.length; i++){ + // if(classList[i] === 'hidden'){ + // return true; + // } + // } + // return false; + // } + if (!jid) { + return; + } + jid = jid.toLowerCase(); + this._converse.root = root; - // Get the current used solid-xmpp-chat - const converse_el = Array.from(document.querySelectorAll('solid-xmpp-chat')) - .map(el => el.shadowRoot.getElementById('conversejs')) - .filter(el => el) - .pop(); + // Get the current used solid-xmpp-chat + const converse_el = Array.from(document.querySelectorAll('solid-xmpp-chat')) + .map(el => el.shadowRoot.getElementById('conversejs')) + .filter(el => el) + .pop(); - if (converse_el) { - root.appendChild(converse_el); - // if (is_groupchat) { - // const jid_to_clear = converse_el.getElementsByClassName('converse-chatboxes'); - // let room_to_clear_view = ''; - // if (jid_to_clear.length && jid_to_clear[0].children.length){ - // for (let i = 0; i < jid_to_clear[0].children.length; i++) { - // if(!isHidden(jid_to_clear[0].children[i].classList)){ - // room_to_clear_view = this._converse.chatboxviews.views[jid_to_clear[0].children[i].id.split('-')[1]]; - // break; - // } - // } - // } - // if (room_to_clear_view) { - // if (room_to_clear_view.model.messages.length > 30) { - // const non_empty_messages = room_to_clear_view.model.messages.filter((m) => !isEmptyMessage(m)); - // if (non_empty_messages.length > 30) { - // while (non_empty_messages.length > 30) { - // non_empty_messages.shift().destroy(); - // } - // removeUnnecessaryDayIndicators(room_to_clear_view); - // } - // } - // } - // } - } - if (is_groupchat) { - this._converse.api.rooms.open(jid, {}, true); - } else { - this._converse.api.chats.open(jid, {}, true); - } - } - }); - // Initialize deferred resolution plugin - setTimeout(async () => { - // Initialize change change plugin - converse.plugins.add('conversejs-changechat', converse_sib.service.plugins.sibChat); + if (converse_el) { + root.appendChild(converse_el); + // if (is_groupchat) { + // const jid_to_clear = converse_el.getElementsByClassName('converse-chatboxes'); + // let room_to_clear_view = ''; + // if (jid_to_clear.length && jid_to_clear[0].children.length){ + // for (let i = 0; i < jid_to_clear[0].children.length; i++) { + // if(!isHidden(jid_to_clear[0].children[i].classList)){ + // room_to_clear_view = this._converse.chatboxviews.views[jid_to_clear[0].children[i].id.split('-')[1]]; + // break; + // } + // } + // } + // if (room_to_clear_view) { + // if (room_to_clear_view.model.messages.length > 30) { + // const non_empty_messages = room_to_clear_view.model.messages.filter((m) => !isEmptyMessage(m)); + // if (non_empty_messages.length > 30) { + // while (non_empty_messages.length > 30) { + // non_empty_messages.shift().destroy(); + // } + // removeUnnecessaryDayIndicators(room_to_clear_view); + // } + // } + // } + // } + } + if (is_groupchat) { + this._converse.api.rooms.open(jid, {}, true); + } else { + this._converse.api.chats.open(jid, {}, true); + } + } + }); + // Initialize deferred resolution plugin + setTimeout(async () => { + // Initialize change change plugin + converse.plugins.add('conversejs-changechat', converse_sib.service.plugins.sibChat); - // Initialize deferred resolution plugin - converse.plugins.add('conversejs-sib-connected', { - initialize() { - this._converse.api.listen.on('connectionInitialized', converse_sib.connected_deferred.resolve); - } - }); + // Initialize deferred resolution plugin + converse.plugins.add('conversejs-sib-connected', { + initialize() { + this._converse.api.listen.on('connectionInitialized', converse_sib.connected_deferred.resolve); + }, + }); - // Initialize AUTHFAIL plugin - converse.plugins.add('conversejs-sib-disconnected', { - initialize() { - this._converse.api.listen.on('disconnected', () => { - if(this._converse.connfeedback.attributes.connection_status === converse.env.Strophe.Status.AUTHFAIL) { - Array.from(document.querySelectorAll('solid-xmpp-chat')).map(el => el.shadowRoot.innerHTML = - `<div style='margin:3em;line-height:32px;'><b style='color:red;'>Erreur d'authentification.</b><br /><i style='color:grey;'>Êtes-vous sur le Hubl affilié à votre compte ?</i></div>` - ); - } else { - Array.from(document.querySelectorAll('solid-xmpp-chat')).map(el => el.shadowRoot.innerHTML = - `<div style='margin:3em;line-height:32px;'><b style='color:red;'>Erreur.</b><br /><i style='color:grey;'>${this._converse.connfeedback.attributes.message}</i></div>` - ); - } - }); - } - }); + // Initialize AUTHFAIL plugin + converse.plugins.add('conversejs-sib-disconnected', { + initialize() { + this._converse.api.listen.on('disconnected', () => { + if (this._converse.connfeedback.attributes.connection_status === converse.env.Strophe.Status.AUTHFAIL) { + Array.from(document.querySelectorAll('solid-xmpp-chat')).map(el => el.shadowRoot.innerHTML = + `<div style='margin:3em;line-height:32px;'><b style='color:red;'>Erreur d'authentification.</b><br /><i style='color:grey;'>Êtes-vous sur le Hubl affilié à votre compte ?</i></div>`, + ); + } else { + Array.from(document.querySelectorAll('solid-xmpp-chat')).map(el => el.shadowRoot.innerHTML = + `<div style='margin:3em;line-height:32px;'><b style='color:red;'>Erreur.</b><br /><i style='color:grey;'>${this._converse.connfeedback.attributes.message}</i></div>`, + ); + } + }); + }, + }); - // Initialize rai plugin - converse.plugins.add('conversejs-rai', { - async initialize() { + // Initialize rai plugin + converse.plugins.add('conversejs-rai', { + async initialize() { - let userRooms = (await Promise.all([ - new Promise((resolve, reject) => { - const circleInterval = setInterval(async () => { - let retry = false; - let circles = []; - const user = await document.querySelector('sib-auth').getUser(); - const userProfile = await store.getData(user['@id'], this.context); - for (let circleMembership of await userProfile['circles.ldp:contains']) { - if (circleMembership) { - circles.push(await circleMembership['circle.jabberID']); - } else { - retry = true; - } - } - if (!retry) { - clearInterval(circleInterval); - resolve(circles); - } - }, 250); - }), - new Promise((resolve, reject) => { - const projectInterval = setInterval(async () => { - let retry = false; - let projects = []; - const user = await document.querySelector('sib-auth').getUser(); - const userProfile = await store.getData(user['@id'], this.context); - for (let projectMembership of await userProfile['projects.ldp:contains']) { - if (projectMembership) { - projects.push(await projectMembership['project.jabberID']); - } else { - retry = true; - } - } - if (!retry) { - clearInterval(projectInterval); - resolve(projects); - } - }, 250); - }) - ])).flat(); + let userRooms = (await Promise.all([ + new Promise((resolve, reject) => { + const circleInterval = setInterval(async () => { + let retry = false; + let circles = []; + const user = await document.querySelector('sib-auth').getUser(); + const userProfile = await store.getData(user['@id'], this.context); + for (let circleMembership of await userProfile['circles.ldp:contains']) { + if (circleMembership) { + circles.push(await circleMembership['circle.jabberID']); + } else { + retry = true; + } + } + if (!retry) { + clearInterval(circleInterval); + resolve(circles); + } + }, 250); + }), + new Promise((resolve, reject) => { + const projectInterval = setInterval(async () => { + let retry = false; + let projects = []; + const user = await document.querySelector('sib-auth').getUser(); + const userProfile = await store.getData(user['@id'], this.context); + for (let projectMembership of await userProfile['projects.ldp:contains']) { + if (projectMembership) { + projects.push(await projectMembership['project.jabberID']); + } else { + retry = true; + } + } + if (!retry) { + clearInterval(projectInterval); + resolve(projects); + } + }, 250); + }), + ])).flat(); - // @MattJ Here userRooms is an array of each jabberID the user is on. - this._converse.api.trigger('raiRoomsUpdated', userRooms); + // @MattJ Here userRooms is an array of each jabberID the user is on. + this._converse.api.trigger('raiRoomsUpdated', userRooms); - this._converse.api.listen.on('chatRoomActivityIndicators', function (jid) { - window.dispatchEvent(new CustomEvent('newMessage', { - detail: { - jid: jid - } - })); - }); - } - }); + this._converse.api.listen.on('chatRoomActivityIndicators', function(jid) { + window.dispatchEvent(new CustomEvent('newMessage', { + detail: { + jid: jid, + }, + })); + }); + }, + }); - // Transform hats to custom values - converse.plugins.add('custom-hats', { - overrides: { - getHats: function () { - const hat_conversions = {'admin': 'Administrateur'}; - const _converse = this; - const hats = _converse.__super__.getHats.apply(this, arguments); - if (!hat_conversions) { - return hats; - } else { - const role_affiliations = Object.keys(hat_conversions); - const custom_hats = hats.map((hat) => { - if (role_affiliations.includes(hat.title)){ - return({title: hat_conversions[hat.title]}); - } else { - return hat; - } - }) - return custom_hats - } - } - } - }); - //Highly experimental DO NOT USE + // Transform hats to custom values + converse.plugins.add('custom-hats', { + overrides: { + getHats: function() { + const hat_conversions = { 'admin': 'Administrateur' }; + const _converse = this; + const hats = _converse.__super__.getHats.apply(this, arguments); + if (!hat_conversions) { + return hats; + } else { + const role_affiliations = Object.keys(hat_conversions); + const custom_hats = hats.map((hat) => { + if (role_affiliations.includes(hat.title)) { + return ({ title: hat_conversions[hat.title] }); + } else { + return hat; + } + }); + return custom_hats; + } + }, + }, + }); + //Highly experimental DO NOT USE // converse.plugins.add('custom-storage', { // overrides: { // createStore: function () { @@ -345,107 +349,127 @@ export const SolidXMPPChat = { // } // } // }); - //Override converse's request permission with an empty function - //so that permission request for notifications don't happen - converse.plugins.add('remove-notifications', { - overrides: { - requestPermission: function () {}, - showMessageNotification: function () {}, - showChatStateNotification: function () {}, - showContactRequestNotification: function () {}, - showFeedbackNotification: function () {}, - handleChatStateNotification: function () {}, - handleMessageNotification: function () {}, - handleContactRequestNotification: function () {}, - handleFeedback: function () {}, - } - }); - // Initialize deferred resolution plugin - converse.plugins.add('conversejs-sib-focused', { - initialize() { - this._converse.api.listen.on('chatBoxFocused', function() { - // Get the currently used solid-xmpp-chat & send read event of - const resource = Array.from(document.querySelectorAll('solid-xmpp-chat')) - .filter(el => {return el.shadowRoot.getElementById('conversejs')}) - .pop() - .component.resource; - window.dispatchEvent(new CustomEvent('read', { - detail: { - resource: resource - } - })); - }); - } - }); + //Override converse's request permission with an empty function + //so that permission request for notifications don't happen + converse.plugins.add('remove-notifications', { + overrides: { + requestPermission: function() { + }, + showMessageNotification: function() { + }, + showChatStateNotification: function() { + }, + showContactRequestNotification: function() { + }, + showFeedbackNotification: function() { + }, + handleChatStateNotification: function() { + }, + handleMessageNotification: function() { + }, + handleContactRequestNotification: function() { + }, + handleFeedback: function() { + }, + }, + }); + // Initialize deferred resolution plugin + converse.plugins.add('conversejs-sib-focused', { + initialize() { + this._converse.api.listen.on('chatBoxFocused', function() { + // Get the currently used solid-xmpp-chat & send read event of + const resource = Array.from(document.querySelectorAll('solid-xmpp-chat')) + .filter(el => { + return el.shadowRoot.getElementById('conversejs'); + }) + .pop() + .component.resource; + window.dispatchEvent(new CustomEvent('read', { + detail: { + resource: resource, + }, + })); + }); + }, + }); - const user = await document.querySelector('sib-auth').getUser(); - const userProfile = await store.getData(user['@id'], this.context); - const jabberID = await userProfile['chatProfile.jabberID']; + const user = await document.querySelector('sib-auth').getUser(); + const userProfile = await store.getData(user['@id'], this.context); + const jabberID = await userProfile['chatProfile.jabberID']; - if(this.resource) { - if (await this.resource.jabberRoom) { - this.jid = await this.resource['jabberID']; - } else { - this.jid = await this.resource['chatProfile.jabberID']; - } - } else { - this.jid = jabberID; - } + if (this.resource) { + if (await this.resource.jabberRoom) { + this.jid = await this.resource['jabberID']; + } else { + this.jid = await this.resource['chatProfile.jabberID']; + } + } else { + this.jid = jabberID; + } - const idToken = await document.querySelector('sib-auth').getUserIdToken(); + const idToken = await document.querySelector('sib-auth').getUserIdToken(); - converse.initialize({ - 'assets_path': (/skypack/.test(ComponentPath) ? ComponentPath.replace('cdn.skypack.dev', 'unpkg.com') : ComponentPath) + '/dist/conversejs/', - 'authentication': this.element.dataset.authentication || 'login', - 'password': idToken, - 'allow_bookmarks': false, - 'allow_chat_pending_contacts': true, - 'allow_message_retraction': 'moderator', - 'allow_non_roster_messaging': true, - 'allow_dragresize': false, - 'allow_logout': false, - 'archived_messages_page_size': "30", - 'auto_list_rooms': true, - 'auto_login': this.element.dataset.autoLogin === 'true', - 'auto_join_on_invite': true, - 'auto_reconnect': true, - 'auto_register_muc_nickname': false, - 'websocket_url': this.element.dataset.websocketUrl || 'wss://jabber.happy-dev.fr/xmpp-websocket', - 'enable_smacks': true, - "clear_messages_on_reconnection": false, - "discover_connection_methods": false, - 'jid': jabberID.toLowerCase(), - 'i18n': this.element.dataset.i18n || 'fr', - 'loglevel': 'fatal', - 'message_archiving': 'always', - 'message_archiving_timeout': 60000, - 'muc_disable_slash_commands': true, - 'muc_hats': ['hats', 'vcard_roles', 'admin'], - 'role_affiliation_hat_conversions': {'admin': 'Administrateur'}, - 'muc_nickname_from_jid': false, - 'muc_fetch_members': true, - 'muc_show_info_messages': [], - 'play_sounds': false, - 'root': this.element.shadowRoot, - 'show_client_info': false, - 'show_desktop_notifications': false, - 'persistent_store': 'none', - 'sounds_path': ComponentPath + '/dist/conversejs/', - 'show_send_button': false, - 'view_mode': 'fullscreen', - 'visible_toolbar_buttons': { - call: false, - spoiler: false, - emoji: true, - fileupload: true, // Not working in current Converse - toggle_occupants: false - }, - 'whitelisted_plugins': ['rai', 'conversejs-sib-disconnected', 'conversejs-sib-connected', 'conversejs-sib-focused', 'conversejs-changechat', 'conversejs-rai', 'custom-hats', 'remove-notifications'], - }); + converse.initialize({ + 'assets_path': (/skypack/.test(ComponentPath) ? ComponentPath.replace('cdn.skypack.dev', 'unpkg.com') : ComponentPath) + '/dist/conversejs/', + 'authentication': this.element.dataset.authentication || 'login', + 'password': idToken, + 'allow_bookmarks': false, + 'allow_chat_pending_contacts': true, + 'allow_message_retraction': 'moderator', + 'allow_non_roster_messaging': true, + 'allow_dragresize': false, + 'allow_logout': false, + 'archived_messages_page_size': '30', + 'auto_list_rooms': true, + 'auto_login': this.element.dataset.autoLogin === 'true', + 'auto_join_on_invite': true, + 'auto_reconnect': true, + 'auto_register_muc_nickname': false, + 'websocket_url': this.element.dataset.websocketUrl || 'wss://jabber.happy-dev.fr/xmpp-websocket', + 'enable_smacks': true, + 'clear_messages_on_reconnection': false, + 'discover_connection_methods': false, + 'jid': jabberID.toLowerCase(), + 'i18n': this.element.dataset.i18n || 'fr', + 'loglevel': 'fatal', + 'message_archiving': 'always', + 'message_archiving_timeout': 60000, + 'muc_disable_slash_commands': true, + 'muc_hats': ['hats', 'vcard_roles', 'admin'], + 'role_affiliation_hat_conversions': { 'admin': 'Administrateur' }, + 'muc_nickname_from_jid': false, + 'muc_fetch_members': true, + 'muc_show_info_messages': [], + 'play_sounds': false, + 'root': this.element.shadowRoot, + 'show_client_info': false, + 'show_desktop_notifications': false, + 'persistent_store': 'none', + 'sounds_path': ComponentPath + '/dist/conversejs/', + 'show_send_button': false, + 'view_mode': 'fullscreen', + 'visible_toolbar_buttons': { + call: false, + spoiler: false, + emoji: true, + fileupload: true, // Not working in current Converse + toggle_occupants: false, + }, + 'whitelisted_plugins': [ + 'rai', + 'conversejs-sib-disconnected', + 'conversejs-sib-connected', + 'conversejs-sib-focused', + 'conversejs-changechat', + 'conversejs-rai', + 'custom-hats', + 'remove-notifications', + ], + }); - converse_sib.loaded_deferred.resolve(); - }, 0); - } + converse_sib.loaded_deferred.resolve(); + }, 0); + }, }; Sib.register(SolidXMPPChat);