(function (root, factory) { if (typeof define === 'function' && define.amd) { define(["converse"], factory); } else { factory(converse); } }(this, function (converse) { var _converse = null, Strophe, $iq, $msg, $pres, $build, b64_sha1, dayjs, html, _, __, location_label, converseConn; converse.plugins.add("location", { dependencies: [], initialize: function () { _converse = this._converse; Strophe = converse.env.Strophe; $iq = converse.env.$iq; $msg = converse.env.$msg; $pres = converse.env.$pres; $build = converse.env.$build; b64_sha1 = converse.env.b64_sha1; _ = converse.env._; __ = _converse.__; dayjs = converse.env.dayjs; html = converse.env.html; location_label = __('Publish My Geo Location'); class GeoLocationDialog extends _converse.exports.BaseModal { initialize() { super.initialize(); this.listenTo(this.model, "change", () => this.requestUpdate()); this.addEventListener('shown.bs.modal', () => { const url = this.model.get("url"); const view = this.model.get("view"); if (url) { this.querySelector('.modal-body').innerHTML = ''; this.querySelector('.btn-publish').addEventListener('click', (ev) => { this.publishGeoLoc(ev); }); } }); } getModalTitle () { return location_label; } renderModal() { return html``; } publishGeoLoc() { const view = this.model.get("view"); const url = this.model.get("url"); const position = this.model.get("position"); if (view) publishUserLocation(view, url, position); } } _converse.api.elements.define('converse-pade-location-dialog', GeoLocationDialog); _converse.api.listen.on('connected', async function() { converseConn = await _converse.api.connection.get(); listenForGeoLoc(); }); _converse.api.listen.on('getToolbarButtons', function(toolbar_el, buttons) { let style = "width:18px; height:18px; fill:var(--chat-color);"; if (toolbar_el.model.get("type") === "chatroom") { style = "width:18px; height:18px; fill:var(--muc-color);"; } buttons.push(html` `); return buttons; }); _converse.api.listen.on('afterMessageBodyTransformed', function(text) { let url = text; if (url && url.indexOf("location/leaflet/index.html?accuracy=") > -1) { text.references = []; text.addTemplateResult(0, url.length, html``); } }); console.debug("location plugin is ready"); } }); function performLocation(ev) { ev.stopPropagation(); ev.preventDefault(); const toolbar_el = converse.env.utils.ancestor(ev.target, 'converse-chat-toolbar'); const view = _converse.chatboxviews.get(toolbar_el.model.get('jid')); getMyGeoLoc(function(url, position) { if (url) { const model = new converse.env.Model(); model.set("view", view); model.set("position", position); model.set("url", url); _converse.api.modal.show('converse-pade-location-dialog', { model }); } }); } function publishUserLocation(view, url, position) { console.debug("publishUserLocation", url, position); const stanza = $iq({type: 'set'}).c('pubsub', {xmlns: "http://jabber.org/protocol/pubsub"}).c('publish', {node: "http://jabber.org/protocol/geoloc"}).c('item').c('geoloc', {xmlns: "http://jabber.org/protocol/geoloc"}).c("accuracy").t(position.coords.accuracy).up().c("lat").t(position.coords.latitude).up().c("lon").t(position.coords.longitude).up(); _converse.api.sendIQ(stanza); const model = view.model; const target = (model.get('type') == 'chatbox') ? model.get('jid') : (model.get('type') == 'chatroom' ? model.get('jid') : model.get('from')); const type = (model.get('type') == 'chatroom') ? 'groupchat' : 'chat'; const msg = converse.env.stx`${url}${url}`; _converse.api.send(msg); } function getMyGeoLoc(callback) { var showPosition = function (position) { console.debug("Latitude: " + position.coords.latitude + " Longitude: " + position.coords.longitude, position); const label = _converse.xmppstatus.get('fullname') || _converse.xmppstatus.get('nickname') || _converse.bare_jid; const pos = location.href.lastIndexOf('/') + 1; const url = location.href.substring(0, pos) + "packages/location/leaflet/index.html?accuracy=" + position.coords.accuracy + "&lat=" + position.coords.latitude + "&lng=" + position.coords.longitude + "&label=" + label; callback(url, position); } var showError = function (error) { var errorMsg = ""; switch(error.code) { case error.PERMISSION_DENIED: errorMsg = "User denied the request for Geolocation." break; case error.POSITION_UNAVAILABLE: errorMsg = "Location information is unavailable." break; case error.TIMEOUT: errorMsg = "The request to get user location timed out." break; case error.UNKNOWN_ERROR: errorMsg = "An unknown error occurred." break; } console.error("location plugin - " + errorMsg, error); callback(); } navigator.geolocation.getCurrentPosition(showPosition, showError); } function listenForGeoLoc() { console.debug("listenForGeoLoc"); converseConn.addHandler(function(message) { console.debug('geoloc handler', message); const handleElement = message.querySelector('geoloc'); if (handleElement) { const accuracy = message.querySelector('accuracy').innerHTML; const lat = message.querySelector('lat').innerHTML; const lon = message.querySelector('lon').innerHTML; const label = message.getAttribute("from"); const position = {coords: {accuracy: accuracy, latitude: lat, longitude: lon}}; const pos = location.href.lastIndexOf('/') + 1; const url = location.href.substring(0, pos) + "packages/location/leaflet/index.html?accuracy=" + position.coords.accuracy + "&lat=" + position.coords.latitude + "&lon=" + position.coords.longitude + "&label=" + label; var prompt = new Notification(label, { 'body': "View Geo Location", 'lang': _converse.locale, 'icon': _converse.DEFAULT_IMAGE, 'requireInteraction': true }); prompt.onclick = function(event) { event.preventDefault(); geoLocationDialog = new GeoLocationDialog({'model': new Model({position: position, url: url}) }); geoLocationDialog.show(); } } return true; }, "http://jabber.org/protocol/geoloc", 'message'); } }));