From 1c2a9acb01ee98a691c255a6e56ef25778ade1fe Mon Sep 17 00:00:00 2001 From: ruhnet Date: Sun, 11 Oct 2020 21:32:46 +0000 Subject: [PATCH] initial commit --- app.js | 269 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 269 insertions(+) create mode 100644 app.js diff --git a/app.js b/app.js new file mode 100644 index 0000000..e33cc80 --- /dev/null +++ b/app.js @@ -0,0 +1,269 @@ +define(function (require) { + var $ = require("jquery"), + _ = require("lodash"), + monster = require("monster"); + + var app = { + name: "switchboard", + + css: ["app"], + + i18n: { + "en-US": { customCss: false }, + }, + + // Defines API requests not included in the SDK + requests: {}, + + // Define the events available for other apps + subscribe: {}, + + // Method used by the Monster-UI Framework, shouldn't be touched unless you're doing some advanced kind of stuff! + load: function (callback) { + var self = this; + + self.initApp(function () { + callback && callback(self); + }); + }, + + // Method used by the Monster-UI Framework, shouldn't be touched unless you're doing some advanced kind of stuff! + initApp: function (callback) { + var self = this; + + // Used to init the auth token and account id of this app + monster.pub("auth.initApp", { + app: self, + callback: callback, + }); + }, + + ////////////////////////////////////////////////////////// + // Entry Point of the app + ////////////////////////////////////////////////////////// + + render: function (container) { + var self = this, + $container = _.isEmpty(container) + ? $("#monster_content") + : container, + $layout = $( + self.getTemplate({ + name: "layout", + }) + ); + + self.bindEvents({ + template: $layout, + }); + + $container.empty().append($layout); //draw the main part of the page in views/layout.html + }, + + bindEvents: function (args) { + var self = this, + $template = args.template; + + //load the parked calls on document ready, and repeat every 15 seconds + $(document).ready(function (e) { + loadParkingGarage(); + setInterval(loadParkingGarage, 30000); + }); + + //Refresh parked calls button binding event: + $template.find("#refresh").on("click", function (e) { + loadParkingGarage(); + }); + + //function to load the parked calls onto the page and set dependent bindings + function loadParkingGarage() { + self.getParkedCalls(function (listOfParkedCalls) { + var $results = $( + self.getTemplate({ + name: "results", + data: { + parkedCalls: listOfParkedCalls.slots, + }, + }) + ); + + $template.find(".results").empty().append($results); + + ///Pickup a parked call binding + $template.find(".pickup").on("click", function (e) { + //var parkNum = parkedUri.substr(0, parkedUri.indexOf('@')); //strip off the @domain.tld suffix + var parkedUri = $(this) + .closest(".parked-call") + .attr("id"); //get the id, which is the parked call URI + var parkNum = parkedUri.split("@")[0]; //strip off the @domain.tld if it exists (but doesn't fail if not) + var parkSlot = parkNum.substring(2); //strip off the first 2 chars in case it's *4 instead of *3. + self.pickupCall("*3" + parkSlot); + //console.log(parkNum); + }); + /////////////////////////////// + ///Call the parker (the device who parked the call): + $template.find(".call-parker").on("click", function (e) { + var ringbackId = $(this).attr("id"); //get the id, which is the parker device ID + self.callTheParker(ringbackId); + }); + /////////////////////////////// + }); + } //end function loadParkingGarage(); + }, //bindEvents + + getParkedCalls: function (callback) { + var self = this; + self.callApi({ + resource: "parkedCalls.list", + data: { + accountId: self.accountId, + }, + success: function (data) { + var parker_name, parker_number; + $.each(data.data.slots, function (index, slot) { + slot.parking_slot = index; + self.callApi({ + // Get info on the parker device: + resource: "device.get", + data: { + accountId: self.accountId, + deviceId: slot.ringback_id, + }, + success: function (deviceData) { + //console.log("Success getting device: "+JSON.stringify(deviceData.data)); + self.callApi({ + // Get info on the user the parker device belongs to: + resource: "user.get", + data: { + accountId: self.accountId, + userId: deviceData.data.owner_id, + }, + success: function (userData) { + slot.parker_name = userData.data.caller_id.internal.name; + slot.parker_number = userData.data.caller_id.internal.number; + slot.complete = true; + console.log( + "parker_name first: " + slot.parker_name + ); + //console.log("UserInfo for "+slot.parking_slot+": "+JSON.stringify(userData.data)); + console.log( + "first: " + JSON.stringify(data.data) + ); + }, + error: function (parsedError) { + monster.ui.alert( + "FAILED to get user info for parking slot #" + slot.parking_slot + ": " + parsedError + ); + }, + }); //end get info on user + }, + error: function (parsedError) { + monster.ui.alert( + "FAILED to get device info for device: " + slot.ringback_id + ": " + parsedError + ); + }, + }); //end get info on parker device + }); //end $.each + console.log("later: " + JSON.stringify(data.data)); + callback(data.data); + }, + error: function (parsedError) { + //console.log(parsedError); + if (data.data.error == "401") { + //if we get a 401 when refreshing parked calls, log out so user can re-auth. + monster.util.logoutAndReload(); + } + callback([]); + }, + }); //end get parked calls list + }, //end getParkedCalls + + pickupCall: function (dialNumber) { + var self = this; + + self.callApi({ + resource: "user.quickcall", + data: { + accountId: self.accountId, + userId: monster.apps.auth.currentUser.id, + //userId: 'd89c34618dc8fa28fc5deead6cc64a4d', + number: dialNumber, + }, + success: function (data) { + console.log( + "Success creating quickcall! : " + JSON.stringify(data) + ); + //monster.ui.alert("Success creating quickcall! : "+data); + //callback(data.data); + }, + error: function (parsedError) { + monster.ui.alert( + "FAILED to create call:" + + number + + " for " + + userID + + ": " + + parsedError + ); + //callback([]); + }, + }); + }, + + callTheParker: function (parkerDeviceId) { + var self = this; + + self.callApi({ + resource: "user.get", //get my extension to use for quickcall + data: { + accountId: self.accountId, + userId: monster.apps.auth.currentUser.id, + }, + success: function (data) { + console.log( + "Success getting user: " + + data.data.caller_id.internal.number + ); + self.callApi({ + resource: "device.quickcall", + data: { + accountId: self.accountId, + deviceId: parkerDeviceId, + number: data.data.caller_id.internal.number, + }, + success: function (data) { + console.log( + "Called: " + + parkerDeviceId + + " from " + + data.data.caller_id.internal.number + ); + }, + error: function (parsedError) { + monster.ui.alert( + "FAILED to create call to " + + data.data.caller_id.internal.number + + " for original parker device: " + + parkerDeviceId + + ": " + + parsedError + ); + }, + }); + }, + error: function (parsedError) { + monster.ui.alert( + "FAILED to get your extension - userId: " + + userID + + ": " + + parsedError + ); + }, + }); + }, //callTheParker + + //////////////////////////////////////////////////////// + }; + + return app; +});