{"version":3,"sources":["FlexStore.js","util.js","Services/PostCallSurveyService.js","Scenario.jsx","AMCRoot.js","App.js","AppFlex.js","registerServiceWorker.js","index.js"],"names":["subscribers","subscribe","listener","push","getContactsId","contact","channels","length","id","uniqueId","PostCallSurveyService","surveyInProgress","surveyTriggeredList","checkIfSurveyWasTriggered","taskId","this","addToSurveyList","setSurveyProgress","progress","isSurveyInProgress","removeTaskFromSurveyList","flexToken","surveyURL","async","url","arguments","undefined","data","response","fetch","method","headers","body","JSON","stringify","triggerFunction","Token","taskSid","Scenario","React","Component","constructor","props","super","storeListener","bind","workerSID","workerURI","attributes","associatedData","logger","manager","taskKey","iconPack","removeSelf","resize","toggleCallControls","holdData","history","lastHoldStart","messageCount","status","taskWasTransferredToAgent","enablePostCallSurvey","surveyFunctionURL","config","autoAnswerTimer","setTimeout","autoInTimer","daVinciAppConfig","variables","UseAMCUI","useAMCUI","setState","fname","cname","logTrace","concat","key","logLoop","hasOwnProperty","state","e","logError","QueuedCallback","CallbackDomain","callbackServiceUrl","MaxRequeue","maxRequeue","EnablePostCallSurvey","SurveyFunctionURL","FlexStore","ref","createRef","interaction","interactionId","scenarioId","direction","ContactCanvasChannelApi","Inbound","scenario","interactions","operations","displayCallTimer","startTime","Date","getTime","subheaderData","image","URL","tooltip","value","properties","UIHeadersData","minimizeUrl","maximizeUrl","directionText","statusText","statusUrl","visible","componentDidMount","channelSid","store","getState","flex","worker","tasks","get","source","Flex","invokeAction","message","detail","afterWebComponentViewChecked","logDebug","nv","addEventListener","onIsAgentTyping","onNewMessage","uiInteraction","task","taskChannelUniqueName","channelType","Telephony","SMS","Chat","logWarning","directionAttribute","taskType","placeCallRetry","toLowerCase","Outbound","Internal","identifier","callback","name","caller","outbound_to","from","details","test","setPhone","setEmail","setFullName","field","setField","updateScenario","processTaskStatus","updateMessage","channel","chat","twilioMessages","messages","myself","services","users","identity","map","user","Object","values","find","author","friendlyName","username","text","type","settings","sendImage","maxHeight","isCustomerTyping","updateIsTyping","someoneElseIsTyping","members","forEach","isTyping","shouldComponentUpdate","nextProps","nextState","componentWillUnmount","removeEventListener","onMinimizedChanged","filter","el","Disconnected","PCS","Error","window","localStorage","getItem","setItem","triggerSurveyFunction","error","myAudio","document","getElementById","paused","currentTime","pause","sid","reason","showRequeueBtn","fields","Value","disableSendMessage","CallControls","AutoIn","delayLength","AutoInDelay","clearTimeout","autoIn","wrapUpOperation","requeueTaskOperation","callbackSID","catch","toString","setInteractionState","Alerting","playAudioAlert","AutoAnswer","AutoAnswerDelay","autoAnswer","interactionOperationsArray","acceptCallbackOperation","answerOperation","endOperation","RejectButtonEnabled","rejectCallbackOperation","rejectOperation","Connected","stopAudioAlert","HoldButtonEnabled","holdAudioOperation","TransferAgentButtonEnabled","agentTransferOperation","TransferQueueButtonEnabled","queueTransferOperation","DTMFButtonEnabled","playDTMFOperation","sendNotification","NOTIFICATION_TYPE","callbackSid","callbackNumber","destination","taskAttributes","completeTask","keys","operationName","icon","title","handler","operationMetadata","valueOf","resumeAudioOperation","holdCounterData","pastCallDurations","currentHoldStartTime","endTime","myAlert","play","err","workflowSid","workflowTargetSid","mgr","getInstance","json","transferTask","mode","token","queueName","then","console","log","contactId","EnableLivePresence","addContextualContacts","workers","firstName","friendly_name","BlindTransfer","transfer","clearContextualContacts","queueSid","taskQueues","queue","DTMF","digits","render","createElement","elem","AMCRoot","apiUrl","serverConfig","shouldDisableCallControls","loggerApiUrl","CADDisplay","cadDisplay","_lastHeight","finishedTasks","syncPresenceSIDtoFramework","syncPresenceSIDtoTwilio","serviceBaseUrl","serviceConfiguration","runtime_domain","amc","TwilioApp","UseDevLogger","$","Authorization","btoa","AccountSID","AuthToken","result","task_queues","presence","appName","WorkMode","activity","activitySid","Promise","resolve","pushLogsAsync","exception","workerSid","idName","validOperations","Conference","Consult","Other","WarmTransfer","validPresences","LivePresenceValidPresences","customValues","workerClient","toDial","clickToDial","phoneNumber","records","args","subscriber","componentDidUpdate","syncAgentState","attributesString","taskAssociatedData","DisplayCAD","DisplayKeyList","displayKey","displayValue","displayValueType","displayOperation","sort","arraysAreEqual","createRemoveScenario","a","b","aTask","logInformation","property","getAgentCallerId","Manager","configVariables","callerId","OutboundCallerId","height","scrollHeight","destinationNumber","className","App","AppFlex","isLocalhost","Boolean","location","hostname","match","registerValidSW","swUrl","navigator","serviceWorker","register","registration","onupdatefound","installingWorker","installing","onstatechange","controller","mountNode","isAppInitialized","renderApp","appConfig","ReactDOM","handleError","userSelectedYesSoundNotifications","element","parentNode","removeChild","spacingElement","onload","top","self","flexUIAppHeight","style","setProperty","RuntimeDomain","configuredNotificationSound","AlertingInteractionSound","soundUrl","audio","src","appendChild","generateSoundElement","String","userAgent","vendor","promptUserDiv","prepend","promptLabel","labelText","textContent","yesButton","onclick","insertBefore","nextSibling","spaceDiv","twilioConfiguration","sso","accountSid","loginPopup","componentProps","AgentDesktopView","showPanel2","provideLoginInfo","create","configuration","process","origin","indexOf","ready","unregister","reload","checkValidServiceWorker","registerServiceWorker"],"mappings":"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","file":"static/js/main.876a76fd.chunk.js","sourcesContent":["/**\r\n * This is used to allow the flex store to be unsubscribed too\r\n */\r\n\r\nlet subscribers = [];\r\n\r\nexport function subscribe(listener) {\r\n subscribers.push(listener);\r\n}\r\n\r\nexport function unsubscribe(listener) {\r\n subscribers = subscribers.filter(el => el !== listener);\r\n}\r\n\r\nexport function init(store) {\r\n store.subscribe(() => {\r\n const args = arguments;\r\n subscribers.forEach(subscriber => subscriber(...args));\r\n });\r\n}\r\n","export function getContactsId(contact) {\r\n if (contact.channels && contact.channels.length > 0) {\r\n return contact.channels[0].id;\r\n }\r\n return contact.uniqueId;\r\n}\r\n","const PostCallSurveyService = {\r\n surveyInProgress: false,\r\n surveyTriggeredList: {},\r\n\r\n checkIfSurveyWasTriggered(taskId) {\r\n if (this.surveyTriggeredList[taskId] === true) {\r\n return true;\r\n } else {\r\n return false;\r\n }\r\n },\r\n\r\n addToSurveyList(taskId) {\r\n this.surveyTriggeredList[taskId] = true;\r\n },\r\n\r\n setSurveyProgress(progress) {\r\n this.surveyInProgress = progress;\r\n },\r\n\r\n isSurveyInProgress() {\r\n return this.surveyInProgress;\r\n },\r\n\r\n removeTaskFromSurveyList(taskId) {\r\n delete this.surveyTriggeredList[taskId];\r\n },\r\n\r\n async triggerSurveyFunction(taskId, flexToken, surveyURL) {\r\n async function triggerFunction(url = '', data = {}) {\r\n const response = await fetch(url, {\r\n method: 'POST',\r\n headers: {\r\n 'Content-Type': 'application/json',\r\n },\r\n body: JSON.stringify(data),\r\n });\r\n return response;\r\n }\r\n await triggerFunction(surveyURL, {\r\n Token: flexToken,\r\n taskSid: taskId,\r\n });\r\n },\r\n};\r\n\r\nexport default PostCallSurveyService;\r\n","import React from 'react';\r\nimport * as ContactCanvasChannelApi from '@amc-technology/davinci-api';\r\nimport * as Flex from '@twilio/flex-ui';\r\nimport { addContextualContacts, clearContextualContacts, sendNotification, NOTIFICATION_TYPE } from '@amc-technology/davinci-api';\r\nimport * as FlexStore from './FlexStore';\r\nimport { getContactsId } from './util';\r\nimport PostCallSurveyService from './Services/PostCallSurveyService';\r\n\r\nexport class Scenario extends React.Component {\r\n constructor(props) {\r\n super(props);\r\n this.storeListener = this.storeListener.bind(this);\r\n this.workerSID = props.workerSID;\r\n this.flexToken = props.flexToken;\r\n this.workerURI = props.workerURI;\r\n this.attributes = props.attributes;\r\n this.associatedData = props.associatedData;\r\n this.props = props;\r\n this.logger = props.logger;\r\n this.manager = props.manager;\r\n this.taskId = props.taskId;\r\n this.taskKey = props.taskKey;\r\n this.iconPack = props.iconPack;\r\n this.removeSelf = props.removeSelf;\r\n this.resize = props.resize;\r\n this.toggleCallControls = props.toggleCallControls;\r\n this.holdData = {\r\n history: [],\r\n lastHoldStart: null,\r\n };\r\n this.messageCount = 0;\r\n this.status = '';\r\n this.taskWasTransferredToAgent = false;\r\n this.enablePostCallSurvey = false;\r\n this.surveyFunctionURL = '';\r\n this.config = props.config;\r\n this.autoAnswerTimer = setTimeout(() => {}, 1000);\r\n this.autoInTimer = setTimeout(() => {}, 1000);\r\n\r\n if (\r\n this.props.config.daVinciAppConfig.variables &&\r\n this.props.config.daVinciAppConfig.variables.UseAMCUI === false\r\n ) {\r\n this.useAMCUI = false;\r\n\r\n // Override React functions here\r\n this.setState = (data) => {\r\n const fname = 'setState';\r\n const cname = 'Scenario';\r\n\r\n try {\r\n this.logger.logTrace(`${cname} - ${fname} - START`);\r\n\r\n for (const key in data) {\r\n this.logger.logLoop(`${cname} - ${fname} - Processing key ${key}`);\r\n\r\n if (data.hasOwnProperty(key)) {\r\n // eslint-disable-next-line react/no-direct-mutation-state\r\n this.state[key] = data[key];\r\n }\r\n }\r\n } catch (e) {\r\n this.logger.logError(`${cname} - ${fname} - Error: ${JSON.stringify(e)}`);\r\n } finally {\r\n this.logger.logTrace(`${cname} - ${fname} - END`);\r\n }\r\n }\r\n } else {\r\n this.useAMCUI = true;\r\n }\r\n\r\n /**\r\n * CallbackDomain is required to call requeue task Twilio service\r\n * If CallbackDomain does not exist, requeue button will display error\r\n * Error will tell agent that CallbackDomain is not configured\r\n *\r\n * MaxRequeue limits the number of times an agent can re-queue the callback task\r\n * if MaxRequeue is '0', agent cannot requeue the callback task\r\n * if MaxRequeue is > 0, agent can requeue task MaxRequeue number of times\r\n * if MaxRequeue does NOT exist in the config, agent can requeue task without limit\r\n */\r\n if (\r\n props.config.daVinciAppConfig &&\r\n props.config.daVinciAppConfig.QueuedCallback &&\r\n props.config.daVinciAppConfig.QueuedCallback.variables\r\n ) {\r\n if (\r\n props.config.daVinciAppConfig.QueuedCallback.variables.CallbackDomain != null &&\r\n props.config.daVinciAppConfig.QueuedCallback.variables.CallbackDomain\r\n ) {\r\n this.callbackServiceUrl = props.config.daVinciAppConfig.QueuedCallback.variables.CallbackDomain;\r\n }\r\n if (\r\n props.config.daVinciAppConfig.QueuedCallback.variables.MaxRequeue != null &&\r\n props.config.daVinciAppConfig.QueuedCallback.variables.MaxRequeue >= 0\r\n ) {\r\n this.maxRequeue = props.config.daVinciAppConfig.QueuedCallback.variables.MaxRequeue;\r\n }\r\n }\r\n if (props.config.daVinciAppConfig && props.config.daVinciAppConfig.variables.EnablePostCallSurvey) {\r\n this.enablePostCallSurvey = props.config.daVinciAppConfig.variables.EnablePostCallSurvey;\r\n }\r\n if (props.config.daVinciAppConfig && props.config.daVinciAppConfig.variables.SurveyFunctionURL) {\r\n this.surveyFunctionURL = props.config.daVinciAppConfig.variables.SurveyFunctionURL;\r\n }\r\n\r\n FlexStore.subscribe(this.storeListener);\r\n this.ref = React.createRef();\r\n\r\n // AMC API interaction\r\n this.interaction = {\r\n interactionId: this.taskId,\r\n scenarioId: this.taskId,\r\n direction: ContactCanvasChannelApi.INTERACTION_DIRECTION_TYPES.Inbound,\r\n };\r\n\r\n // UI Lib interaction\r\n this.state = {\r\n scenario: {\r\n interactions: [\r\n {\r\n interactionId: this.taskId,\r\n operations: [],\r\n associatedData: [],\r\n displayCallTimer: true,\r\n startTime: new Date().getTime(),\r\n subheaderData: {\r\n image: new URL(this.iconPack + 'Phone_Number_Icon.png'),\r\n tooltip: '',\r\n value: '',\r\n },\r\n properties: [],\r\n UIHeadersData: {\r\n minimizeUrl: new URL(this.iconPack + 'section_collapse.png'),\r\n maximizeUrl: new URL(this.iconPack + 'section_expand.png'),\r\n directionText: 'Inbound',\r\n statusText: 'Ringing',\r\n statusUrl: new URL(this.iconPack + 'Status_Ringing.png'),\r\n },\r\n },\r\n ],\r\n },\r\n visible: true,\r\n };\r\n\r\n if (!this.useAMCUI) {\r\n this.componentDidMount();\r\n }\r\n\r\n }\r\n\r\n async onIsAgentTyping() {\r\n try {\r\n const channelSid = this.manager.store.getState().flex.worker.tasks.get(this.taskKey).source.attributes.channelSid;\r\n await Flex.Actions.invokeAction('SendTyping', {\r\n channelSid: channelSid,\r\n });\r\n } catch (e) {\r\n this.logger.logError(`Error on send typing: task=${this.taskId} error=${e.message}`);\r\n }\r\n }\r\n async onNewMessage(message) {\r\n try {\r\n const channelSid = this.manager.store.getState().flex.worker.tasks.get(this.taskKey).source.attributes.channelSid;\r\n await Flex.Actions.invokeAction('SendMessage', {\r\n channelSid: channelSid,\r\n body: message.detail,\r\n });\r\n } catch (e) {\r\n this.logger.logError(`Error on new message: task=${this.taskId} error=${e.message}`);\r\n }\r\n }\r\n afterWebComponentViewChecked() {\r\n this.resize();\r\n }\r\n async componentDidMount() {\r\n try {\r\n this.logger.logDebug(`Scenario componentDidMount: taskId=${this.taskId}`);\r\n\r\n if (this.useAMCUI) {\r\n this.nv.addEventListener('isAgentTyping', this.onIsAgentTyping.bind(this));\r\n this.nv.addEventListener('newMessage', this.onNewMessage.bind(this));\r\n this.nv.addEventListener('afterViewChecked', this.afterWebComponentViewChecked.bind(this));\r\n }\r\n\r\n const uiInteraction = { ...this.state.scenario.interactions[0] };\r\n const flexState = this.manager.store.getState();\r\n const task = flexState.flex.worker.tasks.get(this.taskKey);\r\n\r\n if (task) {\r\n this.logger.logDebug(`Scenario componentDidMount: taskId=${this.taskId} channelName=${task.source.taskChannelUniqueName}`);\r\n\r\n switch (task.source.taskChannelUniqueName) {\r\n case 'voice':\r\n this.interaction.channelType = ContactCanvasChannelApi.CHANNEL_TYPES.Telephony;\r\n uiInteraction.subheaderData.image = new URL(this.iconPack + 'Phone_Number_Icon.png');\r\n uiInteraction.subheaderData.tooltip = 'Phone';\r\n break;\r\n case 'chat':\r\n case 'sms':\r\n if (task.attributes.channelType === 'sms') {\r\n this.interaction.channelType = ContactCanvasChannelApi.CHANNEL_TYPES.SMS;\r\n\r\n uiInteraction.subheaderData.image = new URL(this.iconPack + 'chat_symbol.png');\r\n uiInteraction.subheaderData.tooltip = 'SMS';\r\n } else {\r\n this.interaction.channelType = ContactCanvasChannelApi.CHANNEL_TYPES.Chat;\r\n\r\n uiInteraction.subheaderData.image = new URL(this.iconPack + 'chat_symbol.png');\r\n uiInteraction.subheaderData.tooltip = 'Chat';\r\n }\r\n break;\r\n default:\r\n this.logger.logWarning(\r\n `Unknown channel, defaulting to phone. taskId=${this.taskId} channelName=${task.source.taskChannelUniqueName}`\r\n );\r\n this.interaction.channelType = ContactCanvasChannelApi.CHANNEL_TYPES.Telephony;\r\n\r\n uiInteraction.subheaderData.image = new URL(this.iconPack + 'Phone_Number_Icon.png');\r\n uiInteraction.subheaderData.tooltip = 'Phone';\r\n }\r\n\r\n const directionAttribute = task.source.attributes.direction;\r\n const taskType = task.source.attributes.taskType;\r\n\r\n let placeCallRetry;\r\n this.logger.logDebug(\r\n `Scenario componentDidMount checking for placeCallRetry variable: taskId=${this.taskId} channelName=${task.source.taskChannelUniqueName}`\r\n );\r\n if (task.source.attributes.placeCallRetry != null && task.source.attributes.placeCallRetry) {\r\n this.logger.logDebug(\r\n `Scenario componentDidMount assigning placeCallRetry: taskId=${this.taskId} channelName=${task.source.taskChannelUniqueName}`\r\n );\r\n placeCallRetry = task.source.attributes.placeCallRetry;\r\n }\r\n\r\n if (directionAttribute !== undefined && directionAttribute.toLowerCase() === 'inbound' && taskType !== 'callback') {\r\n uiInteraction.UIHeadersData.directionText = 'Inbound';\r\n this.interaction.direction = ContactCanvasChannelApi.INTERACTION_DIRECTION_TYPES.Inbound;\r\n } else if (directionAttribute !== undefined && directionAttribute.toLowerCase() === 'inbound' && taskType === 'callback') {\r\n this.logger.logDebug(\r\n `Scenario componentDidMount callback detected: taskId=${this.taskId} channelName=${task.source.taskChannelUniqueName}`\r\n );\r\n if (this.maxRequeue != null && this.maxRequeue > 0) {\r\n uiInteraction.UIHeadersData.directionText = `Callback ${placeCallRetry} of ${this.maxRequeue}`;\r\n } else if (this.maxRequeue != null && this.maxRequeue <= 0) {\r\n uiInteraction.UIHeadersData.directionText = `Callback ${placeCallRetry}`;\r\n } else {\r\n uiInteraction.UIHeadersData.directionText = `Callback ${placeCallRetry}`;\r\n }\r\n this.interaction.direction = ContactCanvasChannelApi.INTERACTION_DIRECTION_TYPES.Inbound;\r\n } else if (directionAttribute !== undefined && directionAttribute.toLowerCase() === 'outbound') {\r\n uiInteraction.UIHeadersData.directionText = 'Outbound';\r\n this.interaction.direction = ContactCanvasChannelApi.INTERACTION_DIRECTION_TYPES.Outbound;\r\n } else if (directionAttribute !== undefined && directionAttribute.toLowerCase() === 'internal') {\r\n uiInteraction.UIHeadersData.directionText = 'Internal';\r\n this.interaction.direction = ContactCanvasChannelApi.INTERACTION_DIRECTION_TYPES.Internal;\r\n }\r\n\r\n const identifier =\r\n task.source.attributes.callback ||\r\n task.source.attributes.name ||\r\n task.source.attributes.contact ||\r\n task.source.attributes.caller ||\r\n task.source.attributes.outbound_to ||\r\n task.source.attributes.from;\r\n uiInteraction.subheaderData.value = identifier;\r\n\r\n const details = new ContactCanvasChannelApi.RecordItem('', '', '');\r\n if (this.interaction.channelType === ContactCanvasChannelApi.CHANNEL_TYPES.Chat) {\r\n if (/^[+]?[(]?[0-9]{3}[)]?[-\\s.]?[0-9]{3}[-\\s.]?[0-9]{4,6}$/im.test(identifier)) {\r\n // Verify if identifier is a Phone Number\r\n /*Valid formats:\r\n\r\n (123) 456-7890\r\n (123)456-7890\r\n 123-456-7890\r\n 123.456.7890\r\n 1234567890\r\n +31636363634\r\n 075-63546725\r\n */\r\n details.setPhone('', '', identifier);\r\n } else if (/^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/.test(identifier)) {\r\n // Verify if identifier is an Email address\r\n /*It allows the following formats:\r\n\r\n 1. prettyandsimple@example.com\r\n 2. very.common@example.com\r\n 3. disposable.style.email.with+symbol@example.com\r\n 4. other.email-with-dash@example.com\r\n 9. #!$%&'*+-/=?^_`{}|~@example.org\r\n 6. \"()[]:,;@\\\\\\\"!#$%&'*+-/=?^_`{}| ~.a\"@example.org\r\n 7. \" \"@example.org (space between the quotes)\r\n 8. üñîçøðé@example.com (Unicode characters in local part)\r\n 9. üñîçøðé@üñîçøðé.com (Unicode characters in domain part)\r\n 10. Pelé@example.com (Latin)\r\n 11. δοκιμή@παράδειγμα.δοκιμή (Greek)\r\n 12. 我買@屋企.香港 (Chinese)\r\n 13. 甲斐@黒川.日本 (Japanese)\r\n 14. чебурашка@ящик-с-апельсинами.рф (Cyrillic)\r\n */\r\n\r\n details.setEmail('', '', identifier);\r\n } else {\r\n // Else assume identifier as a Full Name\r\n details.setFullName('', '', identifier);\r\n }\r\n } else {\r\n details.setPhone('', '', identifier);\r\n }\r\n if (task.source.attributes) {\r\n for (const field in task.source.attributes) {\r\n details.setField(field, '', '', task.source.attributes[field]);\r\n }\r\n }\r\n this.interaction.details = details;\r\n if (this.associatedData) {\r\n uiInteraction.associatedData = this.associatedData;\r\n }\r\n\r\n this.updateScenario(uiInteraction);\r\n await this.processTaskStatus(task.source.status);\r\n }\r\n\r\n this.resize();\r\n } catch (e) {\r\n this.logger.logError(`Error componentDidMount: task=${this.taskId} error=${e.message}`);\r\n }\r\n }\r\n\r\n updateMessage(state) {\r\n try {\r\n this.logger.logDebug(`updateMessage taskId=${this.taskId}`);\r\n const channelSid = state.flex.worker.tasks.get(this.taskKey).source.attributes.channelSid;\r\n const channel = state.flex.chat.channels[channelSid];\r\n const twilioMessages = channel.messages;\r\n const myself = channel.source.services.users.myself.state.identity;\r\n if (twilioMessages.length > this.messageCount) {\r\n this.logger.logDebug(`updateMessage. new message! taskId=${this.taskId}`);\r\n this.messageCount = twilioMessages.length;\r\n const messages = twilioMessages.map((message) => {\r\n let user = Object.values(state.flex.chat.users).find((user) => user.identity === message.source.state.author);\r\n if (user === undefined) {\r\n user = {\r\n friendlyName: message.source.state.author,\r\n identity: message.source.state.author,\r\n };\r\n }\r\n return {\r\n username: user.friendlyName,\r\n text: message.source.state.body,\r\n type: myself === user.identity ? 'AGENT' : undefined,\r\n };\r\n });\r\n {\r\n const interaction = { ...state.scenario.interactions[0] };\r\n if (!interaction.chat) {\r\n interaction.chat = {\r\n settings: {\r\n sendImage: new URL(this.iconPack + 'request_send.png'),\r\n maxHeight: '300px',\r\n },\r\n messages: [],\r\n isCustomerTyping: false,\r\n };\r\n }\r\n interaction.chat.messages = messages;\r\n\r\n this.updateScenario(interaction);\r\n }\r\n }\r\n } catch (e) {\r\n this.logger.logError(`Error updateMessage: task=${this.taskId} error=${e.message}`);\r\n }\r\n }\r\n updateIsTyping(state) {\r\n try {\r\n const channelSid = state.flex.worker.tasks.get(this.taskKey).source.attributes.channelSid;\r\n const channel = state.flex.chat.channels[channelSid];\r\n const myself = channel.source.services.users.myself.state.identity;\r\n let someoneElseIsTyping = false;\r\n channel.members.forEach((user, identity) => {\r\n const isTyping = user.source.state.isTyping;\r\n if (isTyping && myself !== identity) {\r\n someoneElseIsTyping = true;\r\n }\r\n });\r\n if (this.state.scenario.interactions[0].chat && this.state.scenario.interactions[0].chat.isCustomerTyping !== someoneElseIsTyping) {\r\n this.logger.logDebug(`isCustomerTyping=${someoneElseIsTyping} taskId=${this.taskId}`);\r\n\r\n {\r\n const interaction = { ...state.scenario.interactions[0] };\r\n if (!interaction.chat) {\r\n interaction.chat = {\r\n settings: {\r\n sendImage: new URL(this.iconPack + 'request_send.png'),\r\n maxHeight: '300px',\r\n },\r\n messages: [],\r\n isCustomerTyping: false,\r\n };\r\n }\r\n interaction.chat.isCustomerTyping = someoneElseIsTyping;\r\n\r\n this.updateScenario(interaction);\r\n }\r\n }\r\n } catch (e) {\r\n this.logger.logError(`Error updateIsTyping: task=${this.taskId} error=${e.message}`);\r\n }\r\n }\r\n shouldComponentUpdate(nextProps, nextState) {\r\n this.nv.scenario = nextState.scenario;\r\n return false;\r\n }\r\n componentWillUnmount() {\r\n this.logger.logDebug(`componentWillUnmount taskId=${this.taskId}`);\r\n\r\n if (this.useAMCUI) {\r\n this.nv.removeEventListener('minimizedChanged', this.onMinimizedChanged);\r\n this.nv.removeEventListener('isAgentTyping', this.onIsAgentTyping);\r\n this.nv.removeEventListener('newMessage', this.onNewMessage);\r\n }\r\n\r\n FlexStore.unsubscribe(this.storeListener);\r\n }\r\n\r\n updateScenario(interaction) {\r\n const functionName = 'updateScenario';\r\n\r\n try {\r\n this.logger.logLoop(`updateScenario: Updating scenario with interactionId: ${interaction.interactionId}`);\r\n this.state.scenario.interactions[0] = interaction;\r\n this.nv.scenario = this.state.scenario;\r\n } catch (e) {\r\n this.logger.logError(`Error updateScenario: ${JSON.stringify(e)}`);\r\n }\r\n }\r\n\r\n async setInteractionState(state) {\r\n const functionName = 'setInteractionState';\r\n try {\r\n if (this.interaction.state !== state && this.interaction.state !== ContactCanvasChannelApi.INTERACTION_STATES.Disconnected) {\r\n this.logger.logDebug(`setInteraction taskId=${this.taskId} state=${state}`);\r\n this.interaction.state = state;\r\n\r\n this.interaction.details.setField('TwilioFlexworkerSID', 'TwilioFlexworkerSID', 'TwilioFlexworkerSID', this.workerSID);\r\n this.interaction.details.setField('TwilioFlexToken', 'TwilioFlexToken', 'TwilioFlexToken', this.flexToken);\r\n this.interaction.details.setField('TwilioFlexworkerURI', 'TwilioFlexworkerURI', 'TwilioFlexworkerURI', this.workerURI);\r\n\r\n ContactCanvasChannelApi.setInteraction(this.interaction);\r\n\r\n if (state === ContactCanvasChannelApi.INTERACTION_STATES.Disconnected) {\r\n if (\r\n this.attributes.PCS &&\r\n (this.attributes.PCS === 'voice' || this.attributes.PCS === 'SMS') &&\r\n this.enablePostCallSurvey === true\r\n ) {\r\n try {\r\n if (this.surveyFunctionURL === '') {\r\n throw new Error('The Survey Function URL was not provided');\r\n }\r\n //Custom Enhancement - Post Call Survey\r\n //Trigger a Post Call Survey based on a Presidio custom enhancement.\r\n //Can be disabled via the enablePostCallSurvey configuration in Creator's Studio\r\n if (window.localStorage.getItem('lastSurveyTask') !== this.taskId) {\r\n this.logger.logDebug(`${functionName} : Beginning Post Call Survey Function for task ${this.taskId}`);\r\n window.localStorage.setItem('lastSurveyTask', this.taskId);\r\n await PostCallSurveyService.triggerSurveyFunction(this.taskId, this.flexToken, this.surveyFunctionURL);\r\n this.logger.logDebug(`${functionName} : Post Call Survey Complete for task ${this.taskId}`);\r\n }\r\n } catch (error) {\r\n this.logger.logError(\r\n `${functionName} : Post Call Survey Failed for task ${this.taskId} Error Message: ${error.message || JSON.stringify(error)}`\r\n );\r\n }\r\n }\r\n\r\n var myAudio = document.getElementById('AudioHTML');\r\n if (!myAudio.paused || myAudio.currentTime) {\r\n myAudio.pause();\r\n myAudio.currentTime = 0;\r\n }\r\n\r\n // TODO: What is this? Need to see if this setState is doing anything at all\r\n this.setState({ visible: false });\r\n this.removeSelf(this.taskWasTransferredToAgent);\r\n }\r\n }\r\n } catch (e) {\r\n this.logger.logError(`Error setInteractionState: task=${this.taskId} state=${state} error=${e.message}`);\r\n }\r\n }\r\n\r\n async completeTask() {\r\n try {\r\n this.logger.logDebug(`completing task: taskId=${this.taskId}`);\r\n\r\n const task = this.manager.store.getState().flex.worker.tasks.get(this.taskKey);\r\n\r\n if (task) {\r\n await Flex.Actions.invokeAction('CompleteTask', {\r\n sid: this.taskKey,\r\n reason: 'TaskComplete',\r\n });\r\n } else {\r\n this.logger.logWarning(`Task with taskKey: ${this.taskKey} and taskId: ${this.taskId} is undefined, cannot complete this task in this state`);\r\n }\r\n } catch (e) {\r\n this.logger.logError(`Error completeTask: task=${this.taskId} error=${e.message}`);\r\n }\r\n }\r\n\r\n async processTaskStatus(status) {\r\n try {\r\n let callback = false;\r\n let showRequeueBtn = true;\r\n this.logger.logDebug(`Scenario processTaskStatus - checking if task is callback task: taskId=${this.taskId}`);\r\n if (this.interaction.details.fields.callback != null && this.interaction.details.fields.callback.Value) {\r\n callback = true;\r\n this.logger.logDebug(`Scenario processTaskStatus - task is callback task: taskId=${this.taskId} callback=${callback}`);\r\n }\r\n\r\n this.logger.logDebug(`Scenario processTaskStatus - checking if placeCallRetry has reached maxRequeue limit: taskId=${this.taskId}`);\r\n\r\n if (\r\n this.interaction.details.fields.placeCallRetry != null &&\r\n this.interaction.details.fields.placeCallRetry.Value >= this.maxRequeue\r\n ) {\r\n showRequeueBtn = false;\r\n this.logger.logDebug(\r\n `Scenario processTaskStatus - placeCallRetry has reached maxRequeue. requeue disabled: taskId=${this.taskId} showRequeueBtn=${showRequeueBtn}`\r\n );\r\n }\r\n if (status !== this.status) {\r\n this.status = status;\r\n this.logger.logDebug(`processTaskStatus taskId=${this.taskId} status=${status}`);\r\n switch (status) {\r\n case 'wrapping': {\r\n this.logger.logDebug(`Scenario processTaskStatus - status is wrapping: taskId=${this.taskId} status=${status}`);\r\n const interaction = { ...this.state.scenario.interactions[0] };\r\n interaction.UIHeadersData.statusText = 'Wrap up';\r\n interaction.UIHeadersData.statusUrl = new URL(this.iconPack + 'Status_TwilioFlex_WrapUp.png');\r\n if (interaction.chat) {\r\n interaction.chat = {\r\n settings: {\r\n sendImage: new URL(this.iconPack + 'request_send.png'),\r\n disableSendMessage: true,\r\n },\r\n messages: interaction.chat.messages,\r\n isCustomerTyping: false,\r\n };\r\n }\r\n if (\r\n this.config.daVinciAppConfig.CallControls &&\r\n this.config.daVinciAppConfig.CallControls.variables.AutoIn === true &&\r\n !callback\r\n ) {\r\n let delayLength = 1500;\r\n if (this.config.daVinciAppConfig.CallControls.variables.AutoInDelay >= 0) {\r\n this.logger.logDebug(`autoIn operation delay: taskId=${this.taskId}`);\r\n delayLength = this.config.daVinciAppConfig.CallControls.variables.AutoInDelay;\r\n }\r\n clearTimeout(this.autoInTimer);\r\n this.autoInTimer = setTimeout(() => {\r\n this.autoIn();\r\n }, delayLength); // after the delay calls autoIn\r\n } else if (\r\n this.config.daVinciAppConfig.QueuedCallback &&\r\n this.config.daVinciAppConfig.QueuedCallback.variables.AutoIn === true &&\r\n callback\r\n ) {\r\n let delayLength = 15000;\r\n if (this.config.daVinciAppConfig.QueuedCallback.variables.AutoInDelay >= 0) {\r\n this.logger.logDebug(`autoIn callback operation delay: taskId=${this.taskId}`);\r\n delayLength = this.config.daVinciAppConfig.QueuedCallback.variables.AutoInDelay;\r\n }\r\n clearTimeout(this.autoInTimer);\r\n this.autoInTimer = setTimeout(() => {\r\n this.autoIn();\r\n }, delayLength); // after the delay calls autoIn\r\n }\r\n interaction.operations = [this.wrapUpOperation()];\r\n this.logger.logDebug(\r\n `Scenario processTaskStatus - wrapping - checking if task is callback task and showRequeueBtn is TRUE: taskId=${this.taskId} callback=${callback} showRequeueBtn=${showRequeueBtn}`\r\n );\r\n if (callback && showRequeueBtn) {\r\n this.logger.logDebug(\r\n `Scenario processTaskStatus - wrapping - task is callback and showRequeueBtn is TRUE: taskId=${this.taskId} callback=${callback} showRequeueBtn=${showRequeueBtn}`\r\n );\r\n interaction.operations.push(this.requeueTaskOperation());\r\n }\r\n\r\n // if this call came from a callback task, wrap the callback also\r\n this.logger.logDebug(`Scenario processTaskStatus - checking if call originated from callback task: taskId=${this.taskId}`);\r\n\r\n if (this.interaction.details.fields.callbackSID &&\r\n this.interaction.details.fields.callbackSID.Value != null &&\r\n this.interaction.details.fields.callbackSID.Value) {\r\n this.logger.logDebug(`Scenario processTaskStatus - call originated from callback. Wrapping callback task: taskId=${this.taskId}`);\r\n\r\n await Flex.Actions.invokeAction('WrapupTask', {\r\n sid: this.interaction.details.fields.callbackSID.Value,\r\n }).catch((error) => {\r\n this.logger.logDebug('Error in processTaskStatus, failure in action callback WrapupTask : ' + error.toString());\r\n });\r\n }\r\n\r\n this.updateScenario(interaction);\r\n break;\r\n }\r\n case 'pending': {\r\n break;\r\n }\r\n case 'reserved': {\r\n this.logger.logDebug(`Scenario processTaskStatus - status is reserved: taskId=${this.taskId} status=${status}`);\r\n this.setInteractionState(ContactCanvasChannelApi.INTERACTION_STATES.Alerting);\r\n if (\r\n (localStorage.getItem('isChrome') === 'false' ||\r\n (localStorage.getItem('isChrome') === 'true' && localStorage.getItem('SoundNotifications') === 'true')) &&\r\n localStorage.getItem('SoundIsConfigured') === 'true'\r\n ) {\r\n this.playAudioAlert();\r\n }\r\n const interaction = { ...this.state.scenario.interactions[0] };\r\n interaction.UIHeadersData.statusText = 'Alerting';\r\n interaction.UIHeadersData.statusUrl = new URL(this.iconPack + 'Status_Ringing.png');\r\n if (this.config.daVinciAppConfig.CallControls && this.config.daVinciAppConfig.CallControls.variables.AutoAnswer === true) {\r\n let delayLength = 1500;\r\n if (this.config.daVinciAppConfig.CallControls.variables.AutoAnswerDelay >= 0) {\r\n this.logger.logDebug(`autoAnswerOperation delay=${this.taskId}`);\r\n delayLength = this.config.daVinciAppConfig.CallControls.variables.AutoAnswerDelay;\r\n }\r\n clearTimeout(this.autoAnswerTimer);\r\n this.autoAnswerTimer = setTimeout(this.autoAnswer.bind(this), delayLength); // after the delay calls autoAnswer\r\n }\r\n\r\n let interactionOperationsArray = [];\r\n if (interaction.UIHeadersData.directionText !== 'Outbound') {\r\n this.logger.logDebug(\r\n `Scenario processTaskStatus - reserved - checking if task is callback: taskId=${this.taskId} callback=${callback}`\r\n );\r\n if (callback) {\r\n this.logger.logDebug(\r\n `Scenario processTaskStatus - reserved - task is callback. push acceptCallbackOperation: taskId=${this.taskId} callback=${callback}`\r\n );\r\n interactionOperationsArray.push(this.acceptCallbackOperation());\r\n } else {\r\n this.logger.logDebug(\r\n `Scenario processTaskStatus - reserved - task is not callback. push answerOperation: taskId=${this.taskId} callback=${callback}`\r\n );\r\n interactionOperationsArray.push(this.answerOperation());\r\n }\r\n }\r\n if (interaction.UIHeadersData.directionText === 'Outbound') {\r\n interactionOperationsArray.push(this.endOperation());\r\n }\r\n if (this.config.daVinciAppConfig.CallControls) {\r\n if (\r\n this.config.daVinciAppConfig.CallControls.variables.RejectButtonEnabled === true &&\r\n interaction.UIHeadersData.directionText !== 'Outbound'\r\n ) {\r\n if (callback) {\r\n this.logger.logDebug(\r\n `Scenario processTaskStatus - reserved - task is callback. push rejectCallbackOperation: taskId=${this.taskId} callback=${callback}`\r\n );\r\n interactionOperationsArray.push(this.rejectCallbackOperation());\r\n } else {\r\n this.logger.logDebug(\r\n `Scenario processTaskStatus - reserved - task is not callback. push rejectOperation: taskId=${this.taskId} callback=${callback}`\r\n );\r\n interactionOperationsArray.push(this.rejectOperation());\r\n }\r\n }\r\n } else {\r\n // if the new configs aren't added the operation must be enabled\r\n if (interaction.UIHeadersData.directionText !== 'Outbound') {\r\n if (callback) {\r\n this.logger.logDebug(\r\n `Scenario processTaskStatus - reserved - no CallControl detected. task is callback. push rejectCallbackOperation: taskId=${this.taskId} callback=${callback}`\r\n );\r\n interactionOperationsArray.push(this.rejectCallbackOperation());\r\n } else {\r\n this.logger.logDebug(\r\n `Scenario processTaskStatus - reserved - no CallControl detected. task is not callback. push rejectOperation: taskId=${this.taskId} callback=${callback}`\r\n );\r\n interactionOperationsArray.push(this.rejectOperation());\r\n }\r\n }\r\n }\r\n\r\n interaction.operations = interactionOperationsArray;\r\n\r\n this.updateScenario(interaction);\r\n break;\r\n }\r\n case 'assigned':\r\n case 'accepted': {\r\n this.logger.logDebug(`Scenario processTaskStatus - status is accepted: taskId=${this.taskId} status=${status}`);\r\n this.setInteractionState(ContactCanvasChannelApi.INTERACTION_STATES.Connected);\r\n this.stopAudioAlert();\r\n const interaction = { ...this.state.scenario.interactions[0] };\r\n interaction.UIHeadersData.statusText = 'Connected';\r\n interaction.UIHeadersData.statusUrl = new URL(this.iconPack + 'Status_OnCall.png');\r\n if (this.interaction.channelType === ContactCanvasChannelApi.CHANNEL_TYPES.Telephony) {\r\n let interactionOperationsArray = [];\r\n if (!callback) {\r\n this.logger.logDebug(\r\n `Scenario processTaskStatus - accepted - task not callback. push endOperation: taskId=${this.taskId} callback=${callback}`\r\n );\r\n interactionOperationsArray.push(this.endOperation());\r\n }\r\n if (this.config.daVinciAppConfig.CallControls) {\r\n if (this.config.daVinciAppConfig.CallControls.variables.HoldButtonEnabled === true && !callback) {\r\n // adding Hold Operation to list of Operations\r\n this.logger.logDebug(\r\n `Scenario processTaskStatus - accepted - task not callback and HoldButtonEnabled is TRUE: taskId=${this.taskId} callback=${callback}`\r\n );\r\n interactionOperationsArray.push(this.holdAudioOperation());\r\n }\r\n if (\r\n this.config.daVinciAppConfig.CallControls.variables.TransferAgentButtonEnabled === true &&\r\n interaction.UIHeadersData.directionText !== 'Outbound' &&\r\n !callback\r\n ) {\r\n // adding agent transfer operation to list of operations\r\n this.logger.logDebug(\r\n `Scenario processTaskStatus - accepted - task not callback and TransferAgentButtonEnabled is TRUE and not outbound call: taskId=${this.taskId} callback=${callback} directionText=${interaction.UIHeadersData.directionText}`\r\n );\r\n interactionOperationsArray.push(this.agentTransferOperation());\r\n }\r\n if (\r\n this.config.daVinciAppConfig.CallControls.variables.TransferQueueButtonEnabled === true &&\r\n interaction.UIHeadersData.directionText !== 'Outbound' &&\r\n !callback\r\n ) {\r\n // adding queue transfer to list of operations\r\n this.logger.logDebug(\r\n `Scenario processTaskStatus - accepted - task not callback and TransferQueueButtonEnabled is TRUE and not outbound call: taskId=${this.taskId} callback=${callback} directionText=${interaction.UIHeadersData.directionText}`\r\n );\r\n interactionOperationsArray.push(this.queueTransferOperation());\r\n }\r\n if (this.config.daVinciAppConfig.CallControls.variables.DTMFButtonEnabled === true && !callback) {\r\n // adding Hold Operation to list of Operations\r\n this.logger.logDebug(\r\n `Scenario processTaskStatus - accepted - task not callback and DTMFButtonEnabled is TRUE: taskId=${this.taskId} callback=${callback}`\r\n );\r\n interactionOperationsArray.push(this.playDTMFOperation());\r\n }\r\n } else {\r\n // adding all operations since if the using the older configs\r\n if (!callback) {\r\n this.logger.logDebug(\r\n `Scenario processTaskStatus - accepted - no CallControl detected. task is not callback: taskId=${this.taskId} callback=${callback} directionText=${interaction.UIHeadersData.directionText}`\r\n );\r\n interactionOperationsArray.push(this.holdAudioOperation());\r\n if (interaction.UIHeadersData.directionText !== 'Outbound') {\r\n interactionOperationsArray.push(this.agentTransferOperation());\r\n interactionOperationsArray.push(this.queueTransferOperation());\r\n }\r\n interactionOperationsArray.push(this.playDTMFOperation());\r\n }\r\n }\r\n interaction.operations = interactionOperationsArray;\r\n } else {\r\n if (!interaction.chat) {\r\n interaction.chat = {\r\n settings: {\r\n sendImage: new URL(this.iconPack + 'request_send.png'),\r\n maxHeight: '300px',\r\n },\r\n messages: [],\r\n isCustomerTyping: false,\r\n };\r\n }\r\n interaction.operations = [this.endOperation()];\r\n }\r\n\r\n this.updateScenario(interaction);\r\n break;\r\n }\r\n default:\r\n this.setInteractionState(ContactCanvasChannelApi.INTERACTION_STATES.Disconnected);\r\n }\r\n }\r\n } catch (e) {\r\n this.logger.logError(`Error processTaskStatus: task=${this.taskId} status=${status} error=${e.message}`);\r\n }\r\n }\r\n async autoAnswer() {\r\n try {\r\n this.logger.logDebug(`autoAnswerOperation taskId=${this.taskId}`);\r\n\r\n const task = this.manager.store.getState().flex.worker.tasks.get(this.taskKey);\r\n\r\n if (task) {\r\n\r\n await Flex.Actions.invokeAction('AcceptTask', {\r\n sid: this.taskKey,\r\n }).catch((error) => {\r\n if (error !== 'Action is pending' && error !== 'Action has been blocked' && error.message !== 'Action is blocked') {\r\n sendNotification('Auto Answer failed.', NOTIFICATION_TYPE.Error);\r\n }\r\n this.logger.logDebug('Error in auto answerOperation, failure in action AcceptTask : ' + error.toString());\r\n });\r\n } else {\r\n this.logger.logWarning(`Task with taskKey: ${this.taskKey} and taskId: ${this.taskId} is undefined, cannot auto-accept this task in this state`);\r\n }\r\n } catch (e) {\r\n this.logger.logError(`Error auto answerOperation: task=${this.taskId} error=${e.message}`);\r\n }\r\n try {\r\n // If autoAnswer on callback task, create outbound call\r\n this.logger.logDebug(`autoAnswerOperation. StartOutboundCall Attempt : taskId=${this.taskId}`);\r\n let callbackSid = this.taskKey;\r\n if (this.interaction.details.fields.callback && this.interaction.details.fields.callback.Value != null) {\r\n let callbackNumber = this.interaction.details.fields.callback.Value;\r\n await Flex.Actions.invokeAction('StartOutboundCall', {\r\n destination: callbackNumber,\r\n taskAttributes: {\r\n callbackSID: callbackSid,\r\n },\r\n });\r\n this.logger.logDebug(`autoAnswerOperation. StartOutboundCall Complete : taskId=${this.taskId}`);\r\n }\r\n } catch (e) {\r\n this.logger.logError(`Error autoAnswer Operation: StartOutboundCall: task=${this.taskId} error=${e.message}`);\r\n }\r\n }\r\n\r\n autoIn() {\r\n try {\r\n this.logger.logDebug(`autoIn wrapUpOperation taskId=${this.taskId}`);\r\n this.completeTask();\r\n this.setInteractionState(ContactCanvasChannelApi.INTERACTION_STATES.Disconnected);\r\n } catch (e) {\r\n sendNotification('Wrap-Up failed.', NOTIFICATION_TYPE.Error);\r\n this.logger.logError(`Error wrapUpOperation: task=${this.taskId} error=${e.message}`);\r\n }\r\n }\r\n\r\n async storeListener() {\r\n try {\r\n const state = this.manager.store.getState();\r\n\r\n const task = state.flex.worker.tasks.get(this.taskKey);\r\n if (task) {\r\n await this.processTaskStatus(task.status);\r\n\r\n if (Object.keys(state.flex.chat.channels).length > 0) {\r\n this.updateMessage(state);\r\n this.updateIsTyping(state);\r\n }\r\n } else {\r\n // if this call came from a callback task, wrap the callback also\r\n this.logger.logDebug(`Scenario processTaskStatus - checking if call originated from callback task: taskId=${this.taskId}`);\r\n\r\n if (this.interaction.details.fields.callbackSID &&\r\n this.interaction.details.fields.callbackSID.Value != null &&\r\n this.interaction.details.fields.callbackSID.Value) {\r\n this.logger.logDebug(`Scenario processTaskStatus - call originated from callback. Wrapping callback task: taskId=${this.taskId}`);\r\n\r\n await Flex.Actions.invokeAction('WrapupTask', {\r\n sid: this.interaction.details.fields.callbackSID.Value,\r\n }).catch((error) => {\r\n this.logger.logDebug('Error in processTaskStatus, failure in action callback WrapupTask : ' + error.toString());\r\n });\r\n }\r\n\r\n this.setInteractionState(ContactCanvasChannelApi.INTERACTION_STATES.Disconnected);\r\n }\r\n } catch (e) {\r\n this.logger.logError(`Error scenario storeListener: task=${this.taskId} error=${e.message}`);\r\n }\r\n }\r\n holdAudioOperation() {\r\n try {\r\n return {\r\n operationName: 'Hold',\r\n icon: new URL(this.iconPack + 'voice_hold_normal.png'),\r\n title: 'Hold',\r\n handler: async (operationName, operationMetadata) => {\r\n try {\r\n this.logger.logDebug(`holdAudioOperation taskId=${this.taskId}`);\r\n await Flex.Actions.invokeAction('HoldCall', {\r\n sid: this.taskKey,\r\n }).catch((error) => {\r\n if (error !== 'Action is pending') {\r\n sendNotification('Hold operation failed.', NOTIFICATION_TYPE.Error);\r\n }\r\n this.logger.logDebug('Error in holdAudioOperation, failure in action HoldCall : ' + error.toString());\r\n });\r\n\r\n if (!this.holdData.lastHoldStart) {\r\n const startTime = new Date().valueOf();\r\n this.holdData.lastHoldStart = startTime;\r\n\r\n const interaction = { ...this.state.scenario.interactions[0] };\r\n interaction.UIHeadersData.statusText = 'On Hold';\r\n interaction.UIHeadersData.statusUrl = new URL(this.iconPack + 'Status_OnHold.png');\r\n interaction.operations = [this.resumeAudioOperation()];\r\n interaction.holdCounterData = {\r\n pastCallDurations: this.holdData.history,\r\n currentHoldStartTime: startTime,\r\n };\r\n\r\n this.updateScenario(interaction);\r\n }\r\n } catch (e) {\r\n this.logger.logError(`Error holdAudioOperation: task=${this.taskId} error=${e.message}`);\r\n }\r\n },\r\n };\r\n } catch (e) {\r\n this.logger.logError(`Error creating holdAudioOperation: task=${this.taskId} error=${e.message}`);\r\n }\r\n }\r\n resumeAudioOperation() {\r\n try {\r\n return {\r\n operationName: 'Resume',\r\n icon: new URL(this.iconPack + 'voice_unhold_normal.png'),\r\n title: 'Resume',\r\n handler: async (operationName, operationMetadata) => {\r\n try {\r\n this.logger.logDebug(`resumeAudioOperation taskId=${this.taskId}`);\r\n await Flex.Actions.invokeAction('UnholdCall', {\r\n sid: this.taskKey,\r\n }).catch((error) => {\r\n if (error !== 'Action is pending') {\r\n sendNotification('Unhold operation failed.', NOTIFICATION_TYPE.Error);\r\n }\r\n this.logger.logDebug('Error in resumeAudioOperation, failure in action UnholdCall : ' + error.toString());\r\n });\r\n\r\n if (this.holdData.lastHoldStart) {\r\n const endTime = new Date().valueOf();\r\n this.holdData.history.push({\r\n startTime: this.holdData.lastHoldStart,\r\n endTime: endTime,\r\n });\r\n this.holdData.lastHoldStart = null;\r\n\r\n const interaction = { ...this.state.scenario.interactions[0] };\r\n interaction.UIHeadersData.statusText = 'Connected';\r\n interaction.UIHeadersData.statusUrl = new URL(this.iconPack + 'Status_OnCall.png');\r\n if (interaction.UIHeadersData.directionText === 'Outbound') {\r\n interaction.operations = [this.endOperation(), this.holdAudioOperation()];\r\n } else {\r\n interaction.operations = [\r\n this.endOperation(),\r\n this.holdAudioOperation(),\r\n this.agentTransferOperation(),\r\n this.queueTransferOperation(),\r\n ];\r\n }\r\n\r\n this.updateScenario(interaction);\r\n }\r\n } catch (e) {\r\n this.logger.logError(`Error resumeAudioOperation: task=${this.taskId} error=${e.message}`);\r\n }\r\n },\r\n };\r\n } catch (e) {\r\n this.logger.logError(`Error creating resumeAudioOperation: task=${this.taskId} error=${e.message}`);\r\n }\r\n }\r\n acceptCallbackOperation() {\r\n try {\r\n return {\r\n operationName: 'Accept',\r\n operationMetadata: [\r\n {\r\n key: 'this',\r\n value: this,\r\n },\r\n ],\r\n icon:\r\n this.interaction.channelType === ContactCanvasChannelApi.CHANNEL_TYPES.Telephony\r\n ? new URL(this.iconPack + 'Accept_Callback_Twilioflex.png')\r\n : new URL(this.iconPack + 'chat_check_normal.gif'),\r\n title: 'Accept',\r\n handler: async (operationName, operationMetadata) => {\r\n try {\r\n clearTimeout(this.autoAnswerTimer);\r\n this.logger.logDebug(`acceptCallbackOperation taskId=${this.taskId}`);\r\n await Flex.Actions.invokeAction('AcceptTask', {\r\n sid: this.taskKey,\r\n }).catch((error) => {\r\n if (error !== 'Action is pending' && error !== 'Action has been blocked' && error.message !== 'Action is blocked') {\r\n sendNotification('Accept failed.', NOTIFICATION_TYPE.Error);\r\n }\r\n this.logger.logDebug('Error in acceptCallbackOperation, failure in action AcceptTask : ' + error.toString());\r\n });\r\n } catch (e) {\r\n this.logger.logError(`Error acceptCallbackOperation AcceptTask: taskId=${this.taskId} error=${e.message}`);\r\n }\r\n try {\r\n let callbackSid = this.taskKey;\r\n let callbackNumber = this.interaction.details.fields.callback.Value;\r\n await Flex.Actions.invokeAction('StartOutboundCall', {\r\n destination: callbackNumber,\r\n taskAttributes: {\r\n callbackSID: callbackSid,\r\n },\r\n }).catch((error) => {\r\n sendNotification('Outbound Call failed.', NOTIFICATION_TYPE.Error);\r\n this.logger.logDebug('Error in acceptCallbackOperation, failure in action StartOutboundCall : ' + error.toString());\r\n });\r\n } catch (e) {\r\n this.logger.logError(`Error acceptCallbackOperation StartOutboundCall: taskId=${this.taskId} error=${e.message}`);\r\n }\r\n },\r\n };\r\n } catch (e) {\r\n this.logger.logError(`Error creating acceptCallbackOperation: taskId=${this.taskId} error=${e.message}`);\r\n }\r\n }\r\n rejectCallbackOperation() {\r\n try {\r\n return {\r\n operationName: 'Reject',\r\n icon:\r\n this.interaction.channelType === ContactCanvasChannelApi.CHANNEL_TYPES.Telephony\r\n ? new URL(this.iconPack + 'Reject_Callback_Twilioflex.png')\r\n : new URL(this.iconPack + 'chat_end_normal.png'),\r\n title: 'Reject',\r\n handler: async (operationName, operationMetadata) => {\r\n try {\r\n this.stopAudioAlert();\r\n this.logger.logDebug(`rejectCallbackOperation taskId=${this.taskId}`);\r\n await Flex.Actions.invokeAction('RejectTask', {\r\n sid: this.taskKey,\r\n }).catch((error) => {\r\n if (error !== 'Action is pending') {\r\n sendNotification('Reject failed.', NOTIFICATION_TYPE.Error);\r\n }\r\n this.logger.logDebug('Error in rejectCallbackOperation, failure in action RejectTask : ' + error.toString());\r\n });\r\n } catch (e) {\r\n this.logger.logError(`Error rejectCallbackOperation: task=${this.taskId} error=${e.message}`);\r\n }\r\n },\r\n };\r\n } catch (e) {\r\n this.logger.logError(`Error creating rejectOperation: task=${this.taskId} error=${e.message}`);\r\n }\r\n }\r\n answerOperation() {\r\n try {\r\n return {\r\n operationName: 'Answer',\r\n operationMetadata: [\r\n {\r\n key: 'this',\r\n value: this,\r\n },\r\n ],\r\n icon:\r\n this.interaction.channelType === ContactCanvasChannelApi.CHANNEL_TYPES.Telephony\r\n ? new URL(this.iconPack + 'voice_alerting_answer_normal.gif')\r\n : new URL(this.iconPack + 'chat_check_normal.gif'),\r\n title: 'Answer',\r\n handler: async (operationName, operationMetadata) => {\r\n try {\r\n clearTimeout(this.autoAnswerTimer);\r\n this.logger.logDebug(`answerOperation taskId=${this.taskId}`);\r\n\r\n\r\n await Flex.Actions.invokeAction('AcceptTask', {\r\n sid: this.taskKey,\r\n }).catch((error) => {\r\n if (error !== 'Action is pending' && error !== 'Action has been blocked' && error.message !== 'Action is blocked') {\r\n sendNotification('Answer failed.', NOTIFICATION_TYPE.Error);\r\n }\r\n this.logger.logDebug('Error in answerOperation, failure in action AcceptTask : ' + error.toString());\r\n });\r\n } catch (e) {\r\n this.logger.logError(`Error answerOperation: task=${this.taskId} error=${e.message}`);\r\n }\r\n },\r\n };\r\n } catch (e) {\r\n this.logger.logError(`Error creating answerOperation: task=${this.taskId} error=${e.message}`);\r\n }\r\n }\r\n rejectOperation() {\r\n try {\r\n return {\r\n operationName: 'Reject',\r\n icon:\r\n this.interaction.channelType === ContactCanvasChannelApi.CHANNEL_TYPES.Telephony\r\n ? new URL(this.iconPack + 'voice_end_normal.png')\r\n : new URL(this.iconPack + 'chat_end_normal.png'),\r\n title: 'Reject',\r\n handler: async (operationName, operationMetadata) => {\r\n try {\r\n this.stopAudioAlert();\r\n this.logger.logDebug(`rejectOperation taskId=${this.taskId}`);\r\n await Flex.Actions.invokeAction('RejectTask', {\r\n sid: this.taskKey,\r\n }).catch((error) => {\r\n if (error !== 'Action is pending') {\r\n sendNotification('Reject failed.', NOTIFICATION_TYPE.Error);\r\n }\r\n this.logger.logDebug('Error in rejectOperation, failure in action RejectTask : ' + error.toString());\r\n });\r\n } catch (e) {\r\n this.logger.logError(`Error rejectOperation: task=${this.taskId} error=${e.message}`);\r\n }\r\n },\r\n };\r\n } catch (e) {\r\n this.logger.logError(`Error creating rejectOperation: task=${this.taskId} error=${e.message}`);\r\n }\r\n }\r\n stopAudioAlert() {\r\n try {\r\n var myAlert = document.getElementById('AudioHTML');\r\n myAlert.pause();\r\n myAlert.currentTime = 0;\r\n } catch (e) {\r\n this.logger.logError(`Scenario.jsx, StopAudioAlert, error=${e.message}`);\r\n }\r\n }\r\n\r\n playAudioAlert() {\r\n try {\r\n var myAlert = document.getElementById('AudioHTML');\r\n myAlert.play();\r\n } catch (e) {\r\n this.logger.logError(`Scenario.jsx, playAudioAlert, error=${e.message}`);\r\n }\r\n }\r\n endOperation() {\r\n const functionName = 'endOperation';\r\n try {\r\n return {\r\n operationName: 'End',\r\n icon:\r\n this.interaction.channelType === ContactCanvasChannelApi.CHANNEL_TYPES.Telephony\r\n ? new URL(this.iconPack + 'voice_end_normal.png')\r\n : new URL(this.iconPack + 'chat_end_normal.png'),\r\n title: 'End',\r\n handler: async (operationName, operationMetadata) => {\r\n try {\r\n this.logger.logDebug(`endOperation taskId=${this.taskId}`);\r\n if (this.interaction.channelType === ContactCanvasChannelApi.CHANNEL_TYPES.Telephony) {\r\n if (\r\n this.attributes.PCS &&\r\n (this.attributes.PCS === 'voice' || this.attributes.PCS === 'SMS') &&\r\n this.enablePostCallSurvey === true\r\n ) {\r\n try {\r\n if (this.surveyFunctionURL === '') {\r\n throw new Error('The Survey Function URL was not provided');\r\n }\r\n //Custom Enhancement - Post Call Survey\r\n // Trigger a Post Call Survey based on a Presidio custom enhancement.\r\n //Can be disabled via the enablePostCallSurvey configuration in Creator's Studio\r\n if (window.localStorage.getItem('lastSurveyTask') !== this.taskId) {\r\n this.logger.logDebug(`${functionName} : Beginning Post Call Survey Function for task ${this.taskId}`);\r\n window.localStorage.setItem('lastSurveyTask', this.taskId);\r\n await PostCallSurveyService.triggerSurveyFunction(this.taskId, this.flexToken, this.surveyFunctionURL);\r\n this.logger.logDebug(`${functionName} : Post Call Survey Complete for task ${this.taskId}`);\r\n }\r\n } catch (error) {\r\n this.logger.logError(\r\n `${functionName} : Post Call Survey Failed for task ${this.taskId} Error Message: ${\r\n error.message || JSON.stringify(error)\r\n }`\r\n );\r\n }\r\n }\r\n await Flex.Actions.invokeAction('HangupCall', {\r\n sid: this.taskKey,\r\n }).catch((error) => {\r\n if (error !== 'Action is pending') {\r\n sendNotification('End phone call failed.', NOTIFICATION_TYPE.Error);\r\n }\r\n this.logger.logDebug('Error in endOperation, failure in action HangupCall: ' + error.toString());\r\n });\r\n }\r\n await Flex.Actions.invokeAction('WrapupTask', {\r\n sid: this.taskKey,\r\n }).catch((error) => {\r\n this.logger.logDebug('Error in endOperation, failure in action WrapupTask : ' + error.toString());\r\n });\r\n } catch (error) {\r\n this.logger.logError(`Error endOperation: task=${this.taskId} error=${error.message}`);\r\n }\r\n },\r\n };\r\n } catch (err) {\r\n this.logger.logError(`Error creating endOperation: task=${this.taskId} error=${err.message}`);\r\n }\r\n }\r\n\r\n wrapUpOperation() {\r\n try {\r\n return {\r\n operationName: 'Complete',\r\n icon: new URL(this.iconPack + 'Complete_WrapUp_TwilioFlex.png'),\r\n title: 'Complete',\r\n handler: async (operationName, operationMetadata) => {\r\n try {\r\n clearTimeout(this.autoInTimer);\r\n this.logger.logDebug(`wrapUpOperation taskId=${this.taskId}`);\r\n this.completeTask();\r\n this.setInteractionState(ContactCanvasChannelApi.INTERACTION_STATES.Disconnected);\r\n } catch (e) {\r\n sendNotification('Wrap-Up failed.', NOTIFICATION_TYPE.Error);\r\n this.logger.logError(`Error wrapUpOperation: task=${this.taskId} error=${e.message}`);\r\n }\r\n },\r\n };\r\n } catch (e) {\r\n sendNotification('Wrap-Up failed.', NOTIFICATION_TYPE.Error);\r\n this.logger.logError(`Error creating wrapUpOperation: task=${this.taskId} error=${e.message}`);\r\n }\r\n }\r\n\r\n requeueTaskOperation() {\r\n try {\r\n return {\r\n operationName: 'Requeue',\r\n icon: new URL(this.iconPack + 'Requeue_Callback_Twilioflex.png'),\r\n title: 'Requeue',\r\n handler: async (operationName, operationMetadata) => {\r\n try {\r\n clearTimeout(this.autoInTimer);\r\n this.logger.logDebug(`requeueTaskOperation started taskId=${this.taskId}`);\r\n let workflowSid;\r\n this.logger.logDebug(`requeueTaskOperation - checking for workflowTargetSid: taskId=${this.taskId}`);\r\n if (\r\n this.interaction.details.fields.workflowTargetSid.Value != null &&\r\n this.interaction.details.fields.workflowTargetSid.Value\r\n ) {\r\n this.logger.logDebug(`requeueTaskOperation - workflowTargetSid found: taskId=${this.taskId}`);\r\n workflowSid = this.interaction.details.fields.workflowTargetSid.Value;\r\n const state = this.manager.store.getState();\r\n const task = state.flex.worker.tasks.get(this.taskKey);\r\n async function transferTask(url = '', data = {}) {\r\n const response = await fetch(url, {\r\n method: 'POST',\r\n headers: {\r\n 'Content-Type': 'application/json',\r\n },\r\n body: JSON.stringify(data),\r\n });\r\n return await response.json();\r\n }\r\n this.logger.logDebug(`requeueTaskOperation - start transferTask: taskId=${this.taskId}`);\r\n const mgr = Flex.Manager.getInstance();\r\n if (this.callbackServiceUrl != null && this.callbackServiceUrl) {\r\n const postUrl = `https://${this.callbackServiceUrl}/inqueue-utils`;\r\n transferTask(postUrl, {\r\n mode: 'requeueTasks',\r\n type: 'callback',\r\n Token: mgr.user.token,\r\n taskSid: this.taskId,\r\n attributes: this.attributes,\r\n workflowSid: workflowSid,\r\n queueName: task.queueName,\r\n state: false,\r\n })\r\n .then(() => {\r\n console.log('==== requeue web service success ===');\r\n this.logger.logDebug(`requeueTaskOperation - transferTask complete: taskId=${this.taskId}`);\r\n this.setInteractionState(ContactCanvasChannelApi.INTERACTION_STATES.Disconnected);\r\n })\r\n .catch((error) => {\r\n console.log('requeue web service error', error);\r\n this.logger.logError('Error requeueTaskOperation : ' + error.toString());\r\n });\r\n } else {\r\n sendNotification('CallbackDomain not configured.');\r\n }\r\n }\r\n } catch (e) {\r\n sendNotification('Requeue failed.', NOTIFICATION_TYPE.Error);\r\n this.logger.logError(`Error requeueTaskOperation: task=${this.taskId} error=${e.message}`);\r\n }\r\n },\r\n };\r\n } catch (e) {\r\n sendNotification('Requeue failed.', NOTIFICATION_TYPE.Error);\r\n this.logger.logError(`Error creating requeueTaskOperation: task=${this.taskId} error=${e.message}`);\r\n }\r\n }\r\n agentTransferOperation() {\r\n try {\r\n return {\r\n operationName: 'agentTransfer',\r\n icon: new URL(this.iconPack + 'voice_blindtransfer_normal.png'),\r\n title: 'Transfer to agent',\r\n handler: async (operationName, operationMetadata) => {\r\n try {\r\n this.toggleCallControls();\r\n this.logger.logDebug(`agentTransferOperation taskId=${this.taskId}`);\r\n\r\n if (!this.props.config.daVinciAppConfig.variables.EnableLivePresence) {\r\n await addContextualContacts(\r\n this.props.workers.map((worker) => ({\r\n firstName: worker.friendly_name,\r\n uniqueId: worker.sid,\r\n channels: [],\r\n }))\r\n ).catch((error) => {\r\n this.logger.logDebug('Error in queueTransferOperation, failure in action addContextualContacts : ' + error.toString());\r\n });\r\n }\r\n\r\n let contactId;\r\n try {\r\n let contact = await ContactCanvasChannelApi.contextualOperation(\r\n ContactCanvasChannelApi.CONTEXTUAL_OPERATION_TYPE.BlindTransfer\r\n ).catch((error) => {\r\n if (error !== 'Canceled by user!') {\r\n sendNotification('Transfer failed.', NOTIFICATION_TYPE.Error);\r\n }\r\n });\r\n contactId = getContactsId(contact);\r\n } catch (e) {\r\n this.logger.logDebug(`agentTransferOperation canceled taskId=${this.taskId}`);\r\n }\r\n this.logger.logDebug(`agentTransferOperation contact=${contactId} taskId=${this.taskId}`);\r\n\r\n if (contactId) {\r\n this.logger.logDebug(`agentTransferOperation worker=${contactId} taskId=${this.taskId}`);\r\n const state = this.manager.store.getState();\r\n const task = state.flex.worker.tasks.get(this.taskKey);\r\n await task\r\n .transfer(contactId, {\r\n mode: 'COLD',\r\n })\r\n .catch((error) => {\r\n this.logger.logDebug('Error in agentTransferOperation, failure in action transfer : ' + error.toString());\r\n if (error !== 'Canceled by user!') {\r\n sendNotification('Transfer failed.', NOTIFICATION_TYPE.Error);\r\n }\r\n });\r\n this.taskWasTransferredToAgent = true;\r\n } else {\r\n this.logger.logDebug(`agentTransferOperation no worker found taskId=${this.taskId}`);\r\n }\r\n } catch (e) {\r\n this.logger.logError(`Error agentTransferOperation: task=${this.taskId} error=${e.message}`);\r\n } finally {\r\n this.toggleCallControls();\r\n clearContextualContacts();\r\n }\r\n },\r\n };\r\n } catch (e) {\r\n this.logger.logError(`Error creating agentTransferOperation: task=${this.taskId} error=${e.message}`);\r\n }\r\n }\r\n queueTransferOperation() {\r\n try {\r\n return {\r\n operationName: 'queueTransfer',\r\n icon: new URL(this.iconPack + 'work_transfertoqueue.png'),\r\n title: 'Transfer to queue',\r\n handler: async (operationName, operationMetadata) => {\r\n try {\r\n this.toggleCallControls();\r\n this.logger.logDebug(`queueTransferOperation taskId=${this.taskId}`);\r\n await addContextualContacts(\r\n this.props.taskQueues.map((queue) => ({\r\n firstName: queue.friendly_name,\r\n uniqueId: queue.sid,\r\n channels: [],\r\n }))\r\n ).catch((error) => {\r\n this.logger.logDebug('Error in queueTransferOperation, failure in action addContextualContacts : ' + error.toString());\r\n });\r\n\r\n let queueSid;\r\n try {\r\n let contact = await ContactCanvasChannelApi.contextualOperation(\r\n ContactCanvasChannelApi.CONTEXTUAL_OPERATION_TYPE.BlindTransfer\r\n ).catch((error) => {\r\n if (error !== 'Canceled by user!') {\r\n sendNotification('Transfer failed.', NOTIFICATION_TYPE.Error);\r\n }\r\n });\r\n queueSid = getContactsId(contact);\r\n } catch (e) {\r\n this.logger.logDebug(`queueTransferOperation canceled taskId=${this.taskId}`);\r\n }\r\n this.logger.logDebug(`queueTransferOperation contact=${queueSid} taskId=${this.taskId}`);\r\n\r\n if (queueSid) {\r\n this.logger.logDebug(`queueTransferOperation queue=${queueSid} taskId=${this.taskId}`);\r\n const state = this.manager.store.getState();\r\n const task = state.flex.worker.tasks.get(this.taskKey);\r\n task\r\n .transfer(queueSid, {\r\n mode: 'COLD',\r\n })\r\n .catch((error) => {\r\n this.logger.logDebug('Error in queueTransferOperation, failure in action transfer : ' + error.toString());\r\n if (error !== 'Canceled by user!') {\r\n sendNotification('Transfer failed.', NOTIFICATION_TYPE.Error);\r\n }\r\n });\r\n }\r\n } catch (e) {\r\n this.logger.logError(`Error queueTransferOperation: task=${this.taskId} error=${e.message}`);\r\n } finally {\r\n this.toggleCallControls();\r\n clearContextualContacts();\r\n }\r\n },\r\n };\r\n } catch (e) {\r\n this.logger.logError(`Error creating queueTransferOperation: task=${this.taskId} error=${e.message}`);\r\n }\r\n }\r\n playDTMFOperation() {\r\n try {\r\n return {\r\n operationName: 'DTMF',\r\n icon: new URL(this.iconPack + 'Dialpad.png'),\r\n title: 'Show DTMF',\r\n handler: async (operationName, operationMetadata) => {\r\n try {\r\n this.toggleCallControls();\r\n this.logger.logDebug(`playDTMFOperation taskId=${this.taskId}`);\r\n await ContactCanvasChannelApi.contextualOperation(\r\n ContactCanvasChannelApi.CONTEXTUAL_OPERATION_TYPE.DTMF,\r\n ContactCanvasChannelApi.CHANNEL_TYPES.Telephony,\r\n async (contact) => {\r\n await Flex.Actions.invokeAction('SendDTMFDigits', {\r\n sid: this.taskKey,\r\n digits: contact.uniqueId,\r\n });\r\n }\r\n )\r\n .then(async (contact) => {})\r\n .catch((error) => {\r\n this.logger.logError('playDTMFOperation - Unable to play DTMF tone: ' + error);\r\n });\r\n } catch (e) {\r\n this.logger.logError(`Error playDTMFOperation: task=${this.taskId} error=${e.message}`);\r\n } finally {\r\n this.toggleCallControls();\r\n clearContextualContacts();\r\n }\r\n },\r\n };\r\n } catch (e) {\r\n this.logger.logError(`Error creating playDTMFOperation: task=${this.taskId} error=${e.message}`);\r\n }\r\n }\r\n\r\n render() {\r\n const { manager } = this.props;\r\n\r\n if (!manager || !this.state.visible) {\r\n return null;\r\n }\r\n if (this.useAMCUI) {\r\n return (this.nv = elem)} />;\r\n } else {\r\n return null;\r\n }\r\n }\r\n}\r\n","import React from \"react\";\r\nimport * as Flex from \"@twilio/flex-ui\";\r\nimport { Scenario } from \"./Scenario\";\r\nimport * as amc from \"@amc-technology/davinci-api\";\r\nimport * as $ from \"jquery\";\r\nimport * as FlexStore from \"./FlexStore\";\r\nimport { getContactsId } from \"./util\";\r\n\r\nexport class AMCRoot extends React.Component {\r\n constructor(props) {\r\n super(props);\r\n this.toggleCallControls = this.toggleCallControls.bind(this);\r\n this.storeListener = this.storeListener.bind(this);\r\n\r\n this.state = {\r\n tasks: [],\r\n apiUrl: props.config.serverConfig.apiUrl,\r\n iconPack: props.config.serverConfig.iconPack,\r\n shouldDisableCallControls: false,\r\n loggerApiUrl: props.config.serverConfig.loggerApiUrl,\r\n };\r\n\r\n this.props = props;\r\n if (\r\n this.props.config.daVinciAppConfig &&\r\n this.props.config.daVinciAppConfig.CADDisplay &&\r\n this.props.config.daVinciAppConfig.CADDisplay.variables\r\n ) {\r\n this.cadDisplay = this.props.config.daVinciAppConfig.CADDisplay.variables;\r\n }\r\n\r\n if (\r\n this.props.config.daVinciAppConfig.variables &&\r\n this.props.config.daVinciAppConfig.variables.UseAMCUI === false\r\n ) {\r\n this.useAMCUI = false;\r\n\r\n // Override React functions here\r\n this.setState = (data) => {\r\n const fname = 'setState';\r\n const cname = 'AMCRoot';\r\n\r\n try {\r\n this.logger.logTrace(`${cname} - ${fname} - START`);\r\n\r\n for (const key in data) {\r\n this.logger.logLoop(`${cname} - ${fname} - Processing key ${key}`);\r\n\r\n if (data.hasOwnProperty(key)) {\r\n // eslint-disable-next-line react/no-direct-mutation-state\r\n this.state[key] = data[key];\r\n }\r\n }\r\n } catch (e) {\r\n this.logger.logError(`${cname} - ${fname} - Error: ${JSON.stringify(e)}`);\r\n } finally {\r\n this.logger.logTrace(`${cname} - ${fname} - END`);\r\n }\r\n }\r\n } else {\r\n this.useAMCUI = true;\r\n }\r\n\r\n this._lastHeight = 0;\r\n this.finishedTasks = {};\r\n this.syncPresenceSIDtoFramework = undefined;\r\n this.syncPresenceSIDtoTwilio = undefined;\r\n this.serviceBaseUrl = `https://${this.props.manager.serviceConfiguration.runtime_domain}`;\r\n this.logger = new amc.Logger(\r\n amc.LOG_SOURCE.TwilioApp,\r\n (props.config.serverConfig.UseDevLogger &&\r\n props.config.serverConfig.UseDevLogger.toLowerCase() === \"true\") ||\r\n false,\r\n this.state.loggerApiUrl\r\n );\r\n\r\n $.ajax({\r\n url: `https://taskrouter.twilio.com/v1/Workspaces/${props.manager.serviceConfiguration[\"taskrouter_workspace_sid\"]}/Workers`,\r\n headers: {\r\n Authorization:\r\n \"Basic \" +\r\n btoa(\r\n props.config.daVinciAppConfig.variables.AccountSID +\r\n \":\" +\r\n props.config.daVinciAppConfig.variables.AuthToken\r\n ),\r\n },\r\n }).then((result) => this.setState({ workers: result.workers }));\r\n $.ajax({\r\n url: `https://taskrouter.twilio.com/v1/Workspaces/${props.manager.serviceConfiguration[\"taskrouter_workspace_sid\"]}/TaskQueues`,\r\n headers: {\r\n Authorization:\r\n \"Basic \" +\r\n btoa(\r\n props.config.daVinciAppConfig.variables.AccountSID +\r\n \":\" +\r\n props.config.daVinciAppConfig.variables.AuthToken\r\n ),\r\n },\r\n }).then((result) => this.setState({ taskQueues: result.task_queues }));\r\n\r\n amc.registerOnPresenceChanged((presence, reason, appName) => {\r\n if (appName !== this.props.config.daVinciAppConfig.name) {\r\n if (\r\n this.syncPresenceSIDtoFramework ===\r\n this.props.config.daVinciAppConfig.variables.WorkMode[presence] &&\r\n this.syncPresenceSIDtoTwilio ===\r\n this.props.config.daVinciAppConfig.variables.WorkMode[presence]\r\n ) {\r\n this.logger.logDebug(\r\n \"Skip Set Presence, already in \" +\r\n presence +\r\n \" \" +\r\n this.props.config.daVinciAppConfig.variables.WorkMode[presence]\r\n );\r\n } else {\r\n try {\r\n const activity = this.props.config.daVinciAppConfig.variables\r\n .WorkMode[presence];\r\n this.logger.logDebug(\r\n `on presence changed; presence=${presence}; activity=${activity}`\r\n );\r\n if (\r\n this.props.config.daVinciAppConfig.variables.WorkMode[presence]\r\n ) {\r\n Flex.Actions.invokeAction(\"SetActivity\", {\r\n activitySid: activity,\r\n }).catch((error) =>\r\n this.logger.logError(`Error12; ${error.message}`)\r\n );\r\n this.syncPresenceSIDtoTwilio = this.props.config.daVinciAppConfig.variables.WorkMode[\r\n presence\r\n ];\r\n }\r\n } catch (e) {\r\n this.logger.logError(`Error on presence changed: ${e.message}`);\r\n }\r\n }\r\n return Promise.resolve();\r\n }\r\n });\r\n\r\n amc.registerOnLogout(async () => {\r\n try {\r\n this.logger.logDebug(\"Logout\");\r\n await this.logger.pushLogsAsync();\r\n await Flex.Actions.invokeAction(\"Logout\", {\r\n activitySid: this.props.config.daVinciAppConfig.variables.WorkMode[\r\n \"Logout\"\r\n ],\r\n });\r\n\r\n this.syncPresenceSIDtoTwilio = this.props.config.daVinciAppConfig.variables.WorkMode[\r\n \"Logout\"\r\n ];\r\n } catch (exception) {\r\n this.logger.logError(`Error on logout: ${exception.message}`);\r\n\r\n // TODO: Throw error here to reject the promise if we need to\r\n }\r\n });\r\n\r\n if (this.props.config.daVinciAppConfig.variables.EnableLivePresence) {\r\n const state = this.props.manager.store.getState();\r\n const workerSid = state.flex.worker.worker.sid;\r\n amc\r\n .setSupportedChannels([\r\n {\r\n channelType: amc.CHANNEL_TYPES.Telephony,\r\n idName: \"worker\",\r\n id: workerSid,\r\n validOperations: [\r\n amc.CONTEXTUAL_OPERATION_TYPE.BlindTransfer,\r\n amc.CONTEXTUAL_OPERATION_TYPE.Conference,\r\n amc.CONTEXTUAL_OPERATION_TYPE.Consult,\r\n amc.CONTEXTUAL_OPERATION_TYPE.Other,\r\n amc.CONTEXTUAL_OPERATION_TYPE.WarmTransfer,\r\n ],\r\n validPresences:\r\n this.props.config.daVinciAppConfig.variables\r\n .LivePresenceValidPresences || [],\r\n customValues: {\r\n token: this.props.manager.user.token,\r\n workerSID: this.props.manager.workerClient[\"sid\"],\r\n workerURI: this.props.manager.workerClient.attributes[\r\n \"contact_uri\"\r\n ],\r\n },\r\n },\r\n ])\r\n .catch((error) =>\r\n this.logger.logError(\r\n `AMCRoot - setSupportedChannels problem: ${error.message}`\r\n )\r\n );\r\n }\r\n\r\n amc\r\n .initializeComplete(this.logger)\r\n .then(() => {\r\n amc.addContextualContacts([]);\r\n this.resize();\r\n amc.enableClickToDial(true);\r\n this.logger.logDebug(\"initializeComplete\");\r\n })\r\n .catch((error) =>\r\n this.logger.logError(`AMCRoot - initializeComplete - ${error.message} `)\r\n );\r\n\r\n amc.registerContextualControls((contact) => {\r\n try {\r\n const toDial = getContactsId(contact);\r\n this.logger.logDebug(\r\n `Register Contextual Controls : Outbound : phone number =${toDial}`\r\n );\r\n this.clickToDial(toDial);\r\n } catch (error) {\r\n this.logger.logError(\r\n `RegisterContextualControls callback : Error = ${error.message}`\r\n );\r\n }\r\n\r\n return Promise.resolve();\r\n });\r\n\r\n amc.registerClickToDial((phoneNumber, records) => {\r\n try {\r\n this.logger.logDebug(\r\n `Register Click to Dial : phone number = ${phoneNumber}`\r\n );\r\n this.clickToDial(phoneNumber);\r\n } catch (error) {\r\n this.logger.logError(\r\n `Error on registerClickToDial: Error = ${error.message}`\r\n );\r\n }\r\n\r\n return Promise.resolve();\r\n });\r\n\r\n // Set starting activity\r\n Flex.Actions.invokeAction(\"SetActivity\", {\r\n activitySid: this.props.config.daVinciAppConfig.variables.WorkMode[\r\n \"Not Ready\"\r\n ],\r\n });\r\n\r\n if (!this.useAMCUI) {\r\n this.componentDidMount();\r\n }\r\n }\r\n\r\n async componentDidMount() {\r\n try {\r\n FlexStore.init(this.props.manager.store);\r\n FlexStore.subscribe(this.storeListener);\r\n await this.storeListener();\r\n this.resize();\r\n } catch (error) {\r\n this.logger.logError(\r\n `Error on componentDidMount: Error = ${error.message}`\r\n );\r\n }\r\n }\r\n componentDidUpdate() {\r\n this.resize();\r\n }\r\n\r\n async storeListener() {\r\n try {\r\n const state = this.props.manager.store.getState();\r\n await this.syncAgentState(state);\r\n const tasks = [];\r\n const finishedTasks = this.finishedTasks;\r\n state.flex.worker.tasks.forEach((task, key) => {\r\n const attributesString =\r\n task.attributes !== undefined\r\n ? JSON.stringify(task.attributes)\r\n : \"undefined\";\r\n this.logger.logDebug(\r\n `Handling Task : SID = ${task.taskSid}, Task attributes = ${attributesString}`\r\n );\r\n const channel = task.source.taskChannelUniqueName;\r\n if (\r\n (channel === \"voice\" ||\r\n channel === \"chat\" ||\r\n channel === \"sms\" ||\r\n channel === \"callback\") &&\r\n !finishedTasks[task.attributes.from]\r\n ) {\r\n this.logger.logDebug(\r\n `Handling Task : SID = ${task.taskSid}, Task attributes = ${attributesString}`\r\n );\r\n let taskAssociatedData = [];\r\n if (\r\n task.attributes &&\r\n this.cadDisplay &&\r\n this.cadDisplay.DisplayCAD\r\n ) {\r\n for (const key in this.cadDisplay.DisplayKeyList) {\r\n if (task.attributes[key]) {\r\n taskAssociatedData.push({\r\n displayKey: this.cadDisplay.DisplayKeyList[key],\r\n displayValue: task.attributes[key],\r\n displayValueType: null,\r\n visible: true,\r\n displayOperation: null,\r\n });\r\n }\r\n }\r\n }\r\n this.logger.logDebug(\r\n `Sending Task To Twilio : taskSid = ${task.taskSid}, taskKey = ${key},` +\r\n ` attributes = ${attributesString}, associatedData = ${taskAssociatedData},` +\r\n ` workerSID = ${state.flex.worker.worker.sid}, flexToken = ${this.props.manager.user.token},` +\r\n ` workerURI = ${state.flex.worker.worker.attributes[\"contact_uri\"]}`\r\n );\r\n tasks.push({\r\n taskSid: task.taskSid,\r\n taskKey: key,\r\n attributes: task.attributes,\r\n associatedData: taskAssociatedData,\r\n workerSID: state.flex.worker.worker.sid,\r\n flexToken: this.props.manager.user.token,\r\n workerURI: state.flex.worker.worker.attributes[\"contact_uri\"],\r\n });\r\n }\r\n });\r\n tasks.sort();\r\n\r\n if (!this.arraysAreEqual(this.state.tasks, tasks)) {\r\n this.setState({ tasks: tasks });\r\n\r\n if (!this.useAMCUI) {\r\n const { manager } = this.props;\r\n\r\n if (!manager || !this.state.iconPack) {\r\n return null;\r\n }\r\n\r\n for (const task of tasks) {\r\n new Scenario({\r\n manager:manager,\r\n key:task.taskKey,\r\n taskId:task.taskSid,\r\n taskKey:task.taskKey,\r\n iconPack:this.state.iconPack,\r\n removeSelf:this.createRemoveScenario(task),\r\n resize:this.resize,\r\n workers:this.state.workers,\r\n logger:this.logger,\r\n taskQueues:this.state.taskQueues,\r\n associatedData:task.associatedData,\r\n toggleCallControls:this.toggleCallControls,\r\n config:this.props.config,\r\n flexToken:task.flexToken,\r\n workerSID:task.workerSID,\r\n workerURI:task.workerURI,\r\n attributes:task.attributes\r\n });\r\n }\r\n\r\n return null;\r\n }\r\n }\r\n } catch (error) {\r\n this.logger.logError(`Store listener, Error = ${error.message}`);\r\n }\r\n }\r\n\r\n arraysAreEqual(a, b) {\r\n return JSON.stringify(a) === JSON.stringify(b);\r\n }\r\n\r\n createRemoveScenario(task) {\r\n return (taskWasTransferredToAgent) => {\r\n try {\r\n if (taskWasTransferredToAgent) {\r\n // This is a hacky fix for transferring tasks to agents.\r\n // We receive a new task when transfer occurs\r\n // Here we are ignoring tasks from the same phone number to avoid new setInteractions\r\n this.finishedTasks[task.attributes.from] = true;\r\n setTimeout(\r\n () => delete this.finishedTasks[task.attributes.from],\r\n 4 * 1000\r\n );\r\n }\r\n\r\n const tasks = this.state.tasks.filter(\r\n (aTask) => aTask.taskSid !== task.taskSid\r\n );\r\n\r\n if (!this.arraysAreEqual(this.state.tasks, tasks)) {\r\n this.setState({ tasks: tasks });\r\n } else {\r\n this.setState(null);\r\n }\r\n } catch (error) {\r\n this.logger.logError(`createRemoveScenario, Error = ${error.message}`);\r\n }\r\n };\r\n }\r\n\r\n async syncAgentState(state) {\r\n try {\r\n // Only Sync presence if Logout is not raised\r\n if (\r\n this.syncPresenceSIDtoFramework !==\r\n this.props.config.daVinciAppConfig.variables.WorkMode[\"Logout\"]\r\n ) {\r\n // If Logout is not triggered but, Flex is still offline and this.syncPresenceSID is still not initialized then, Sync the state from DaVinci Agent to Flex\r\n if (\r\n state.flex.worker.activity.sid ===\r\n this.props.config.daVinciAppConfig.variables.WorkMode[\"Logout\"] &&\r\n this.syncPresenceSIDtoFramework === undefined\r\n ) {\r\n try {\r\n amc.getPresence().then((data) => {\r\n if (\r\n this.syncPresenceSIDtoFramework !==\r\n this.props.config.daVinciAppConfig.variables.WorkMode[\r\n data.presence\r\n ]\r\n ) {\r\n try {\r\n Flex.Actions.invokeAction(\"SetActivity\", {\r\n activitySid: this.props.config.daVinciAppConfig.variables\r\n .WorkMode[data.presence],\r\n });\r\n this.syncPresenceSIDtoFramework = this.props.config.daVinciAppConfig.variables.WorkMode[\r\n data.presence\r\n ];\r\n } catch (error) {\r\n this.logger.logError(\r\n \"Sync Presence from DaVinci To Flex - SetActivity, Error\" +\r\n error.message\r\n );\r\n }\r\n this.logger.logInformation(\r\n \"Sync Presence from DaVinci To Flex, \" +\r\n data.presence +\r\n \" \" +\r\n this.props.config.daVinciAppConfig.variables.WorkMode[\r\n data.presence\r\n ]\r\n );\r\n } else {\r\n this.logger.logDebug(\r\n \"Skip Sync Presence - already in \" +\r\n data.presence +\r\n \" \" +\r\n this.props.config.daVinciAppConfig.variables.WorkMode[\r\n data.presence\r\n ]\r\n );\r\n }\r\n return Promise.resolve();\r\n });\r\n } catch (error) {\r\n this.logger.logError(\r\n `Sync Presence from DaVinci To Flex, Error = ${error.message}`\r\n );\r\n }\r\n } else if (\r\n state.flex.worker.activity.sid ===\r\n this.props.config.daVinciAppConfig.variables.WorkMode[\"Logout\"] &&\r\n this.syncPresenceSIDtoFramework !== undefined\r\n ) {\r\n // Agent logged out of Flex from Twilio side; Logout DaVinci Agent\r\n try {\r\n await this.logger.pushLogsAsync();\r\n amc.logout();\r\n this.syncPresenceSIDtoFramework = state.flex.worker.activity.sid;\r\n } catch (error) {\r\n this.logger.logError(\r\n \"Sync Presence logout from Flex, Error\" + error.message\r\n );\r\n }\r\n } else {\r\n // Sync the state from Flex to DaVinci Agent\r\n if (\r\n this.syncPresenceSIDtoFramework !== state.flex.worker.activity.sid\r\n ) {\r\n try {\r\n for (var property in this.props.config.daVinciAppConfig.variables\r\n .WorkMode) {\r\n if (\r\n !this.props.config.daVinciAppConfig.variables.WorkMode.hasOwnProperty(\r\n property\r\n )\r\n )\r\n continue;\r\n\r\n if (\r\n this.props.config.daVinciAppConfig.variables.WorkMode[\r\n property\r\n ] === state.flex.worker.activity.sid\r\n ) {\r\n this.syncPresenceSIDtoFramework =\r\n state.flex.worker.activity.sid;\r\n amc.setPresence(property);\r\n this.logger.logInformation(\r\n \"Sync Presence from Flex to DaVinci \" +\r\n property +\r\n \" \" +\r\n state.flex.worker.activity.sid\r\n );\r\n break;\r\n }\r\n }\r\n } catch (error) {\r\n this.logger.logError(\r\n `Sync Presence from Flex to DaVinci, Error = ${error.message}`\r\n );\r\n }\r\n }\r\n }\r\n }\r\n } catch (error) {\r\n this.logError.logError(`AMCRoot - synAgentState : ${error.message}`);\r\n }\r\n }\r\n\r\n /**\r\n * getAgentCallerId\r\n *\r\n * @param {object} Manager Flex Manager\r\n * @param {object} [configVariables] parameters configuration object\r\n */\r\n getAgentCallerId(Manager, configVariables) {\r\n try {\r\n if (\r\n Manager.workerClient &&\r\n Manager.workerClient.attributes &&\r\n Manager.workerClient.attributes.callerId\r\n ) {\r\n return Manager.workerClient.attributes.callerId;\r\n }\r\n\r\n return (\r\n (configVariables && configVariables.OutboundCallerId) || \"NO_CALLER_ID\"\r\n );\r\n\r\n } catch (error) {\r\n this.logger.logError(`AMCRoot - getAgentCallerId : ${error.message}`);\r\n }\r\n }\r\n\r\n resize() {\r\n try {\r\n const height = document.body.scrollHeight + 1;\r\n if (height !== this._lastHeight) {\r\n this.logger.logDebug(\"Updating height\");\r\n this._lastHeight = height;\r\n\r\n if (this.useAMCUI) {\r\n amc.setAppHeight(height);\r\n }\r\n }\r\n } catch (e) {\r\n this.logger.logError(`Error on presence changed: ${e.message}`);\r\n }\r\n }\r\n\r\n toggleCallControls() {\r\n try {\r\n this.setState((state) => ({\r\n shouldDisableCallControls: !state.shouldDisableCallControls,\r\n }));\r\n } catch (error) {\r\n this.logger.logError(`AMCRoot - toggleCallControls: ${error.message}`);\r\n }\r\n }\r\n\r\n clickToDial(destinationNumber) {\r\n // Outbound dial\r\n try {\r\n this.logger.logDebug(\r\n `Sending number to flex : phone number = ${destinationNumber}`\r\n );\r\n Flex.Actions.invokeAction(\"StartOutboundCall\", {\r\n destination: destinationNumber,\r\n });\r\n } catch (error) {\r\n this.logger.logError(`Error on initiating call: ${error.message}`);\r\n }\r\n }\r\n\r\n render() {\r\n try {\r\n const { manager } = this.props;\r\n if (!manager || !this.state.iconPack) {\r\n return null;\r\n }\r\n\r\n return (\r\n \r\n {this.state.tasks.map((task) => {\r\n return (\r\n \r\n );\r\n })}\r\n \r\n );\r\n\r\n } catch (error) {\r\n this.logger.logError(`AMCRoot - render: ${error.message}`);\r\n }\r\n }\r\n}\r\n","import React from 'react';\r\nimport * as Flex from '@twilio/flex-ui';\r\nimport { AMCRoot } from './AMCRoot';\r\n\r\nclass App extends React.Component {\r\n render() {\r\n const { manager, config } = this.props;\r\n\r\n if (!manager) {\r\n return null;\r\n }\r\n\r\n return (\r\n \r\n {/*AMC - DO NOT Load FlexUI Load AMC UI below*/}\r\n \r\n \r\n );\r\n }\r\n}\r\n\r\nexport default App;\r\n","import React from 'react';\r\nimport * as Flex from '@twilio/flex-ui';\r\n\r\nclass AppFlex extends React.Component {\r\n render() {\r\n const { manager } = this.props;\r\n\r\n if (!manager) {\r\n return null;\r\n }\r\n\r\n return (\r\n \r\n \r\n \r\n );\r\n }\r\n}\r\n\r\nexport default AppFlex;\r\n","// In production, we register a service worker to serve assets from local cache.\r\n// This lets the app load faster on subsequent visits in production, and gives\r\n// it offline capabilities. However, it also means that developers (and users)\r\n// will only see deployed updates on the \"N+1\" visit to a page, since previously\r\n// cached resources are updated in the background.\r\n// To learn more about the benefits of this model, read https://goo.gl/KwvDNy.\r\n// This link also includes instructions on opting out of this behavior.\r\nconst isLocalhost = Boolean(\r\n window.location.hostname === 'localhost' ||\r\n // [::1] is the IPv6 localhost address.\r\n window.location.hostname === '[::1]' ||\r\n // 127.0.0.1/8 is considered localhost for IPv4.\r\n window.location.hostname.match(\r\n /^127(?:\\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}$/\r\n )\r\n);\r\nexport default function register() {\r\n if (process.env.NODE_ENV === 'production' && 'serviceWorker' in navigator) {\r\n // The URL constructor is available in all browsers that support SW.\r\n const publicUrl = new URL(process.env.PUBLIC_URL, window.location);\r\n if (publicUrl.origin !== window.location.origin) {\r\n // Our service worker won't work if PUBLIC_URL is on a different origin\r\n // from what our page is served on. This might happen if a CDN is used to\r\n // serve assets; see https://github.com/facebookincubator/create-react-app/issues/2374\r\n return;\r\n }\r\n window.addEventListener('load', () => {\r\n const swUrl = `${process.env.PUBLIC_URL}/service-worker.js`;\r\n if (isLocalhost) {\r\n // This is running on localhost. Lets check if a service worker still exists or not.\r\n checkValidServiceWorker(swUrl);\r\n // Add some additional logging to localhost, pointing developers to the\r\n // service worker/PWA documentation.\r\n navigator.serviceWorker.ready.then(() => {\r\n console.log(\r\n 'This web app is being served cache-first by a service ' +\r\n 'worker. To learn more, visit https://goo.gl/SC7cgQ'\r\n );\r\n });\r\n } else {\r\n // Is not local host. Just register service worker\r\n registerValidSW(swUrl);\r\n }\r\n });\r\n }\r\n}\r\nfunction registerValidSW(swUrl) {\r\n navigator.serviceWorker\r\n .register(swUrl)\r\n .then(registration => {\r\n registration.onupdatefound = () => {\r\n const installingWorker = registration.installing;\r\n installingWorker.onstatechange = () => {\r\n if (installingWorker.state === 'installed') {\r\n if (navigator.serviceWorker.controller) {\r\n // At this point, the old content will have been purged and\r\n // the fresh content will have been added to the cache.\r\n // It's the perfect time to display a \"New content is\r\n // available; please refresh.\" message in your web app.\r\n console.log('New content is available; please refresh.');\r\n } else {\r\n // At this point, everything has been precached.\r\n // It's the perfect time to display a\r\n // \"Content is cached for offline use.\" message.\r\n console.log('Content is cached for offline use.');\r\n }\r\n }\r\n };\r\n };\r\n })\r\n .catch(error => {\r\n console.error('Error during service worker registration:', error);\r\n });\r\n}\r\nfunction checkValidServiceWorker(swUrl) {\r\n // Check if the service worker can be found. If it can't reload the page.\r\n fetch(swUrl)\r\n .then(response => {\r\n // Ensure service worker exists, and that we really are getting a JS file.\r\n if (\r\n response.status === 404 ||\r\n response.headers.get('content-type').indexOf('javascript') === -1\r\n ) {\r\n // No service worker found. Probably a different app. Reload the page.\r\n navigator.serviceWorker.ready.then(registration => {\r\n registration.unregister().then(() => {\r\n window.location.reload();\r\n });\r\n });\r\n } else {\r\n // Service worker found. Proceed as normal.\r\n registerValidSW(swUrl);\r\n }\r\n })\r\n .catch(() => {\r\n console.log(\r\n 'No internet connection found. App is running in offline mode.'\r\n );\r\n });\r\n}\r\nexport function unregister() {\r\n if ('serviceWorker' in navigator) {\r\n navigator.serviceWorker.ready.then(registration => {\r\n registration.unregister();\r\n });\r\n }\r\n}\r\n","import React from 'react';\r\nimport ReactDOM from 'react-dom';\r\nimport 'regenerator-runtime/runtime';\r\nimport * as Flex from '@twilio/flex-ui';\r\nimport './index.css';\r\nimport App from './App';\r\nimport AppFlex from './AppFlex';\r\nimport registerServiceWorker from './registerServiceWorker';\r\nimport * as amc from '@amc-technology/davinci-api';\r\nimport { AMCRoot } from './AMCRoot';\r\n\r\nconst mountNode = document.getElementById('root');\r\nvar isAppInitialized = false;\r\nvar useAMCUI = true;\r\n\r\nwindow.onload = () => {\r\n fetch('ClientConfiguration')\r\n .then(response => response.json())\r\n .then(serverConfig => {\r\n if(window.top !== window.self) {\r\n // This code executes when Twilio Flex App get loaded with in DaVinci UI as an App\r\n\r\n amc.getConfig().then(daVinciAppConfig => {\r\n const appConfig = {\r\n daVinciAppConfig,\r\n serverConfig\r\n };\r\n\r\n if (\r\n daVinciAppConfig.variables &&\r\n daVinciAppConfig.variables.UseAMCUI === false\r\n ) {\r\n useAMCUI = false;\r\n }\r\n\r\n if (!useAMCUI) {\r\n const flexUIAppHeight = daVinciAppConfig.variables.flexUIAppHeight || 400;\r\n mountNode.style.setProperty('height', `${flexUIAppHeight}px`);\r\n amc.setAppHeight(flexUIAppHeight);\r\n }\r\n\r\n const serviceBaseUrl =\r\n 'https://' + daVinciAppConfig.variables.RuntimeDomain;\r\n\r\n const configuredNotificationSound =\r\n daVinciAppConfig.variables.AlertingInteractionSound;\r\n\r\n if (configuredNotificationSound.length > 0) {\r\n localStorage.setItem('SoundIsConfigured', true);\r\n } else {\r\n localStorage.setItem('SoundIsConfigured', false);\r\n }\r\n generateSoundElement(String(configuredNotificationSound));\r\n\r\n var isChrome = /Chrome/.test(navigator.userAgent) && /Google Inc/.test(navigator.vendor);\r\n if (isChrome && configuredNotificationSound.length > 0) {\r\n localStorage.setItem('isChrome', true);\r\n localStorage.setItem('SoundNotifications', false);\r\n\r\n //Construct a div for the user to click on yes/no for sound notifications\r\n var promptUserDiv = document.createElement('div');\r\n promptUserDiv.id = 'promptUserForSoundDiv';\r\n promptUserDiv.style = 'background-color: #F4F5FB; height: 24.6px;';\r\n\r\n if (useAMCUI) {\r\n document.body.appendChild(promptUserDiv);\r\n } else {\r\n document.body.prepend(promptUserDiv);\r\n }\r\n\r\n var promptLabel = document.createElement('label');\r\n promptLabel.id = 'promptLabelID';\r\n promptLabel.style = 'margin-left: 10px;';\r\n promptUserDiv.appendChild(promptLabel);\r\n\r\n var labelText = document.createElement('b');\r\n labelText.textContent = 'Sound Notifications';\r\n labelText.style = 'font-size: 0.8em; font-weight: 700; font-family: Arial; color: #333; '\r\n promptLabel.appendChild(labelText);\r\n\r\n var yesButton = document.createElement('button');\r\n yesButton.textContent = 'Allow';\r\n yesButton.style = 'margin-left: 10px; background-color: #1e72ba; border: 0; color: white; height: 70%; width: 60px; font-size: 70%;';\r\n yesButton.onclick = userSelectedYesSoundNotifications;\r\n promptLabel.parentNode.insertBefore(yesButton, promptLabel.nextSibling);\r\n\r\n var spaceDiv = document.createElement('div');\r\n spaceDiv.style = 'height: 5px; background-color: white;';\r\n spaceDiv.id = 'spaceDiv';\r\n promptUserDiv.parentNode.insertBefore(spaceDiv, promptUserDiv.nextSibling);\r\n } else {\r\n localStorage.setItem('isChrome', false);\r\n }\r\n\r\n // TODO: Make Flex UI configurable (panel 2 etc.)\r\n const predefinedConfig = {\r\n serviceBaseUrl: serviceBaseUrl + '/',\r\n sso: {\r\n accountSid: daVinciAppConfig.variables.AccountSID,\r\n loginPopup: true\r\n },\r\n componentProps: {\r\n AgentDesktopView: {\r\n showPanel2: false\r\n }\r\n }\r\n };\r\n\r\n const twilioConfiguration = {\r\n ...predefinedConfig,\r\n };\r\n\r\n Flex\r\n .progress(mountNode)\r\n .provideLoginInfo(twilioConfiguration, mountNode)\r\n .then(() => Flex.Manager.create(twilioConfiguration))\r\n .then(manager => renderApp(manager, appConfig))\r\n .catch(error => handleError(error));\r\n });\r\n } else {\r\n // This code only executes on SSO POPUP Redirect to the Twilio Flex URL\r\n // Upon authentication, URL gets redirected back to DaVinci Flex App URL\r\n // and below default code detects the same and does the necessary to notify\r\n // Twilio Flex App on the Success and closes automatically\r\n\r\n const predefinedConfig = window.appConfig || {};\r\n\r\n // TODO: Make Flex UI configurable (panel 2 etc.)\r\n const configuration = {\r\n ...predefinedConfig,\r\n };\r\n\r\n Flex\r\n .progress(mountNode)\r\n .provideLoginInfo(configuration, mountNode)\r\n .then(() => Flex.Manager.create(configuration))\r\n .then(manager => renderApp(manager))\r\n .catch(error => handleError(error));\r\n }\r\n });\r\n};\r\n\r\nfunction renderApp(manager, appConfig) {\r\n if (!useAMCUI) {\r\n if (!isAppInitialized) {\r\n isAppInitialized = true;\r\n new AMCRoot({manager: manager, config: appConfig});\r\n }\r\n\r\n ReactDOM.render(, mountNode);\r\n } else {\r\n ReactDOM.render(, mountNode);\r\n }\r\n\r\n}\r\n\r\nfunction generateSoundElement(soundUrl) {\r\n var audio = document.createElement('audio');\r\n audio.src = soundUrl;\r\n audio.id = 'AudioHTML';\r\n audio.type = 'audio/mpeg';\r\n audio.addEventListener('ended', function() {\r\n this.currentTime = 0;\r\n this.play();\r\n }, false);\r\n document.body.appendChild(audio);\r\n}\r\n\r\nfunction handleError(error) {\r\n console.error('Failed to initialize Flex', error);\r\n\r\n const missingAccountSid =\r\n error instanceof Flex.ConfigError && error.key === 'accountSid';\r\n\r\n if (!missingAccountSid) {\r\n throw error;\r\n }\r\n}\r\n\r\nfunction userSelectedYesSoundNotifications() {\r\n localStorage.setItem('SoundNotifications', true);\r\n\r\n if (useAMCUI) {\r\n amc.setAppHeight(10);\r\n }\r\n\r\n var element = document.getElementById('promptUserForSoundDiv');\r\n element.parentNode.removeChild(element);\r\n var spacingElement = document.getElementById('spaceDiv');\r\n spacingElement.parentNode.removeChild(spacingElement);\r\n}\r\n\r\nregisterServiceWorker();\r\n"],"sourceRoot":""}