class MapEventHandler { constructor(options, dashmap, ssl) { this.options = options; this.dashmap = dashmap; this.ssl = ssl; } connect(user_id, host, port) { var d = new Date(); var client_id = "dash-" + user_id + "-" + d.getMonth() + "-" + d.getDate() + "-" + d.getHours() + "-" + d.getMinutes() + "-" + d.getSeconds() + "-" + d.getMilliseconds(); console.log(client_id); this.mqtt = new Paho.MQTT.Client(host, port, client_id); var options = { useSSL: this.ssl, timeout: 3, invocationContext: this, onSuccess: this.onConnect.bind(this), }; this.mqtt.onMessageArrived = this.onMessage.bind(this); console.log('connecting to mqtt server...'); this.mqtt.connect(options); } onConnect(icontext) { console.log('mqtt connected!'); var my = icontext.invocationContext; if (my.options.track_rider) { // subscribe to rider locations console.log('subscribing to ' + my.options.channels.rider_location); my.mqtt.subscribe(my.options.channels.rider_location); // subscribe to rider status console.log('subscribing to ' + my.options.channels.rider_status); my.mqtt.subscribe(my.options.channels.rider_status); // subscribe to rider availability console.log('subscribing to ' + my.options.channels.rider_availability); my.mqtt.subscribe(my.options.channels.rider_availability); } if (my.options.track_jo) { // subscribe to jo locations console.log('subscribing to ' + my.options.channels.jo_location); my.mqtt.subscribe(my.options.channels.jo_location); // subscribe to jo status console.log('subscribing to ' + my.options.channels.jo_status); my.mqtt.subscribe(my.options.channels.jo_status); // subscribe to jo origin console.log('subscribing to ' + my.options.channels.jo_origin); my.mqtt.subscribe(my.options.channels.jo_origin); } } onMessage(msg) { // console.log(msg); console.log('received message'); var channel = msg.destinationName; var chan_split = channel.split('/'); var payload = msg.payloadString; // handle different channels switch (chan_split[0]) { case "rider": this.handleRider(chan_split, payload); break; case "jo": this.handleJobOrder(chan_split, payload); break; } } handleRider(chan_split, payload) { //console.log("rider message"); switch (chan_split[2]) { case "location": console.log("got location for rider " + chan_split[1] + " - " + payload); var pl_split = payload.split(':'); console.log(pl_split); // check for correct format if (pl_split.length != 2) break; var lat = parseFloat(pl_split[0]); var lng = parseFloat(pl_split[1]); // TODO: check if available or not this.dashmap.putRiderAvailableMarker(chan_split[1], lat, lng); break; case "status": console.log("got status for rider " + chan_split[1] + " - " + payload); switch (payload) { case 'available': this.dashmap.switchRiderStatus(chan_split[1], 'available'); break; case 'jo': console.log('jo status'); this.dashmap.switchRiderStatus(chan_split[1], 'jo'); break; case 'logout': this.dashmap.removeRiderMarker(chan_split[1]); break; } break; case "availability": console.log("got availability for rider " + chan_split[1] + " - " + payload); var obj = JSON.parse(payload); var status = obj.status; // console.log("status " + status); switch (status) { case 'rider_offline': this.dashmap.rider_availability[chan_split[1]] = false; this.dashmap.removeRiderMarker(chan_split[1]); break; case 'rider_online': this.dashmap.rider_availability[chan_split[1]] = true; var lat = parseFloat(obj.latitude); var lng = parseFloat(obj.longitude); // check if rider is available / unavailable var dashmap = this.dashmap; var url = dashmap.options.rider_availability_url; var rider_availability_url = url.replace('[id]', chan_split[1]); $.get(rider_availability_url).done(function(data) { console.log('rider availability - ' + data); switch (data) { case 'available': console.log('putting available marker ' + chan_split[1] + ' ' + lat + ':' + lng); dashmap.switchRiderStatus(chan_split[1], 'available'); dashmap.putRiderAvailableMarker(chan_split[1], lat, lng); break; case 'unavailable': console.log('putting active jo marker ' + chan_split[1] + ' ' + lat + ':' + lng); dashmap.switchRiderStatus(chan_split[1], 'jo'); dashmap.putRiderActiveJOMarker(chan_split[1], lat, lng); break; } }); break; } break; } } handleJobOrder(chan_split, payload) { console.log("jo message"); var id = chan_split[1]; switch (chan_split[2]) { case "location": // var my = this; console.log("got location for jo " + id + " - " + payload); var pl_split = payload.split(':'); // check for correct format if (pl_split.length != 2) break; var lat = parseFloat(pl_split[0]); var lng = parseFloat(pl_split[1]); // move marker console.log(lat + ' - ' + lng); this.dashmap.putCustomerMarker(id, lat, lng); break; case "status": console.log("got status for jo " + payload); switch (payload) { case 'cancel': case 'fulfill': case 'delete': this.dashmap.removeCustomerMarker(id); break; } break; case "origin": console.log("got origin for jo " + payload); if (payload == 'mobile_app') { this.dashmap.switchJobOrderOrigin(chan_split[1], 'mobile'); } break; } } }