From 79dd7aae952aaf270e6a1ea832d25169af1eeedf Mon Sep 17 00:00:00 2001 From: Kunal Sharma Date: Thu, 4 Jul 2024 15:32:02 +0530 Subject: [PATCH] TP-11|Kunal|Ameyo diagnostic tool (#1008) * TP-11|Kunal| created fixed height virtualization component * TP-11|Kunal| created fixed height virtualization component * TP-111|Kunal|ameyo diagnostic tool * TP-111|Kunal|ameyo diagnostic tool * TP-68653|Kunal|Ameyo diagnostic tool * TP-68653|Kunal|Ameyo diagnostic tool * TP-68653|Kunal|Ameyo diagnostic tool * TP-68653|Kunal|Ameyo diagnostic tool * TP-68653|Kunal|resolved PR comments * TP-68653|Kunal|resolved PR comments --- .../Ameyo/AmeyoCollapsibleToolbarV3.tsx | 87 +++++++++++++- src/constants/ameyoConstants.ts | 112 ++++++++++++++++++ src/hooks/useAmeyoDiagnostics.tsx | 39 ++++++ src/layout/DefaultLayout.tsx | 13 ++ src/pages/Dashboard/HrDashBoard.tsx | 88 ++++++++++++-- src/service/naviExtension.service.ts | 30 ++++- src/utils/ApiHelper.ts | 4 +- src/utils/ameyoDiagnostics.ts | 7 ++ src/utils/extension.utils.ts | 22 +++- 9 files changed, 387 insertions(+), 15 deletions(-) create mode 100644 src/hooks/useAmeyoDiagnostics.tsx create mode 100644 src/utils/ameyoDiagnostics.ts diff --git a/src/components/Ameyo/AmeyoCollapsibleToolbarV3.tsx b/src/components/Ameyo/AmeyoCollapsibleToolbarV3.tsx index 2550d62a..e162fbd7 100644 --- a/src/components/Ameyo/AmeyoCollapsibleToolbarV3.tsx +++ b/src/components/Ameyo/AmeyoCollapsibleToolbarV3.tsx @@ -77,6 +77,7 @@ import { LOCAL_STORAGE_KEYS } from '@cp/src/constants/StorageKeys'; import { resetState, setAmeyoCallData, + setAmeyoDowntimeTooltipVisiblity, setAmeyoExtensionToggleOn, setButtonLoadingStates, setConnectedCustomerData, @@ -90,10 +91,17 @@ import { setShouldPlayRingtone, setShowAmeyoErroneousMsg, setTelephoneSource, - setToolbarAuthState, - setAmeyoDowntimeTooltipVisiblity + setToolbarAuthState } from '@cp/reducers/ameyoSlice'; -import { BUBBLE_COLORS, BUTTON_ENABLED_TIMEOUT } from '@cp/constants/ameyoConstants'; +import { + AMEYO_DIAGNOSTIC_EVENT_INTERVAL, + AmeyoDiagnosticEventGroup, + AmeyoDiagnosticEventNames, + AmeyoDiagnosticsMetricTypes, + BUBBLE_COLORS, + BUTTON_ENABLED_TIMEOUT, + GAUGE_METRIC +} from '@cp/constants/ameyoConstants'; import { poll } from '@cp/utils/polling'; import { getCallBridgeData } from '@cp/pages/auth/AuthActions'; import { noop } from '@utils/common'; @@ -105,7 +113,7 @@ import { PopperTrigger } from '@cp/components/Popper/Popper'; import AmeyoPopper from '@cp/components/Ameyo/components/AmeyoPopper'; -import { FloatingContext } from '@floating-ui/react'; +import useAmeyoDiagnostics from '@cp/hooks/useAmeyoDiagnostics'; type IInteractionData = { interactionId: string; @@ -180,6 +188,7 @@ export const AmeyoCollapsibleToolbarV3 = (props: { const [callCountEnabled, setCallCountEnabled] = useState(false); const ameyoCallsCountIntervalRef = useRef<() => void>(); const isAgentOnline = useSelector((store: RootState) => store.common.isAgentOnline); + const { sendAmeyoDiagnostics } = useAmeyoDiagnostics(); // --------------- ***** --------------------- // there is a third state called authError, in which the user @@ -373,6 +382,12 @@ export const AmeyoCollapsibleToolbarV3 = (props: { function onAmeyoAvailabiltyChanged(isAvailable: boolean) { dispatch(setIsAvailable(isAvailable)); + sendAmeyoDiagnostics({ + metricName: AmeyoDiagnosticEventNames.ameyoAvailabilityStatus.name, + metricType: AmeyoDiagnosticEventNames.ameyoAvailabilityStatus.metricType, + value: isAvailable ? GAUGE_METRIC.ON : GAUGE_METRIC.OFF, + group: AmeyoDiagnosticEventGroup.TELE + }); } function onAmeyoCallDataChanged(callData: AmeyoCallData) { @@ -400,11 +415,23 @@ export const AmeyoCollapsibleToolbarV3 = (props: { campaignId, ameyoStatus: ExtensionHandler.currentAmeyoStatus() }); - dispatch(setIsAmeyoErronous(true)); + sendAmeyoDiagnostics({ + metricName: AmeyoDiagnosticEventNames.ameyoErroneousCount.name, + metricType: AmeyoDiagnosticEventNames.ameyoErroneousCount.metricType, + value: '', + group: AmeyoDiagnosticEventGroup.TELE + }); }; const onToggleAmeyoStatus = (onToggleAmeyoStatusData: onToggleAmeyoStatusDataProps) => { + sendAmeyoDiagnostics({ + metricName: AmeyoDiagnosticEventNames.extensionStatus.name, + metricType: AmeyoDiagnosticEventNames.extensionStatus.metricType, + value: + onToggleAmeyoStatusData.ameyoToggleNewStatus === 'ON' ? GAUGE_METRIC.ON : GAUGE_METRIC.OFF, + group: AmeyoDiagnosticEventGroup.TELE + }); if (onToggleAmeyoStatusData.ameyoToggleNewStatus === AmeyoToggleNewStatus.OFF) { addClickstreamEvent(AMEYO_SESSION_EVENTS.LH_AMEYO_EXTENSION_TOGGLE_OFF_CLICKED, { campaignId, @@ -986,11 +1013,37 @@ export const AmeyoCollapsibleToolbarV3 = (props: { ); }, []); + const onAmeyoDiagnosticEventCallback = (messageType: string) => { + sendAmeyoDiagnostics({ + metricName: messageType, + metricType: AmeyoDiagnosticEventNames?.[messageType] + .metricType as AmeyoDiagnosticsMetricTypes, + value: '', + group: AmeyoDiagnosticEventGroup.TELE + }); + }; + useEffect(() => { ExtensionHelper.addExtensionListener( EXTENSION_LISTENER_TYPES.toggleAmeyoStatus, onToggleAmeyoStatus ); + ExtensionHelper.addExtensionListener( + EXTENSION_LISTENER_TYPES.acceptCallClickFailure, + onAmeyoDiagnosticEventCallback + ); + ExtensionHelper.addExtensionListener( + EXTENSION_LISTENER_TYPES.rejectCallClickFailure, + onAmeyoDiagnosticEventCallback + ); + ExtensionHelper.addExtensionListener( + EXTENSION_LISTENER_TYPES.disconnectCallClickFailure, + onAmeyoDiagnosticEventCallback + ); + ExtensionHelper.addExtensionListener( + EXTENSION_LISTENER_TYPES.disposeCallClickFailure, + onAmeyoDiagnosticEventCallback + ); }, []); useEffect(() => { @@ -1022,6 +1075,30 @@ export const AmeyoCollapsibleToolbarV3 = (props: { }; }, [isVisible]); + const extensionOnPolling = useRef<() => void>(); + useEffect(() => { + if (ameyoExtensionToggleOn) { + extensionOnPolling.current = poll( + () => { + sendAmeyoDiagnostics({ + metricName: AmeyoDiagnosticEventNames.extensionOnTime.name, + metricType: AmeyoDiagnosticEventNames.extensionOnTime.metricType, + value: '', + group: AmeyoDiagnosticEventGroup.TELE + }); + }, + undefined, + AMEYO_DIAGNOSTIC_EVENT_INTERVAL, + noop + ); + } else { + isFunction(extensionOnPolling.current) && extensionOnPolling.current(); + } + return () => { + isFunction(extensionOnPolling.current) && extensionOnPolling.current(); + }; + }, [ameyoExtensionToggleOn]); + return (
diff --git a/src/constants/ameyoConstants.ts b/src/constants/ameyoConstants.ts index 344e15d1..2308dd73 100644 --- a/src/constants/ameyoConstants.ts +++ b/src/constants/ameyoConstants.ts @@ -1,3 +1,5 @@ +import { Roles } from '@cp/pages/auth/constants/AuthConstants'; + export const BUBBLE_COLORS = { TRANSPARENT: 'rgba(250,250,250,0)', // default/don't know ORANGE: '#FA9E33', // ready @@ -6,3 +8,113 @@ export const BUBBLE_COLORS = { }; export const BUTTON_ENABLED_TIMEOUT = 10000; + +export enum AmeyoDiagnosticsMetricTypes { + COUNTER = 'COUNTER', + GAUGE = 'GAUGE', + HISTOGRAM = 'HISTOGRAM' +} + +export interface IAmeyoDiagnosticsEventNames { + name: string; + metricType: AmeyoDiagnosticsMetricTypes; + description?: string; +} + +export enum AmeyoDiagnosticEventGroup { + TELE = 'TELE', + FIELD = 'FIELD', + HRC = 'HRC' +} + +export interface IAmeyoDiagnosticPayload { + metricName: string; + metricType: AmeyoDiagnosticsMetricTypes; + value: number | string; + group: AmeyoDiagnosticEventGroup; + subFlow?: string; + metaData?: Record; +} + +export interface IPublishMetricPayload { + agentReferenedId?: string; + agentExtensionVersion: string; + latestExtensionVersion: string; + campaignId: string; + flow: string; + metricType: AmeyoDiagnosticsMetricTypes; + value: string; + roles?: Roles[]; + group: AmeyoDiagnosticEventGroup; + clientTs: number; + subFlow?: string; + metaData?: Record; +} + +interface AmeyoDiagnosticsEvents { + [key: string]: T; +} + +export const AmeyoDiagnosticEventNames: AmeyoDiagnosticsEvents = + Object.freeze({ + agentExtensionVersion: { + name: 'agentExtensionVersion', + metricType: AmeyoDiagnosticsMetricTypes.GAUGE, + description: 'Agent Extension Version' + }, + latestExtensionVersion: { + name: 'latestExtensionVersion', + metricType: AmeyoDiagnosticsMetricTypes.GAUGE, + description: 'Latest Extension Version' + }, + ameyoErroneousCount: { + name: 'ameyoErroneousCount', + metricType: AmeyoDiagnosticsMetricTypes.COUNTER, + description: 'Ameyo Erroneous Count' + }, + extensionStatus: { + name: 'extensionStatus', + metricType: AmeyoDiagnosticsMetricTypes.GAUGE, + description: 'Extension Status (ON/OFF)' + }, + ameyoAvailabilityStatus: { + name: 'ameyoAvailabilityStatus', + metricType: AmeyoDiagnosticsMetricTypes.GAUGE + }, + lastAmeyoActiveTimeStamp: { + name: 'lastAmeyoActiveTimeStamp', + metricType: AmeyoDiagnosticsMetricTypes.GAUGE + }, + amverageCallHandlingTime: { + name: 'amverageCallHandlingTime', + metricType: AmeyoDiagnosticsMetricTypes.GAUGE + }, + acceptButtonClickFailedCount: { + name: 'acceptButtonClickFailedCount', + metricType: AmeyoDiagnosticsMetricTypes.COUNTER + }, + rejectButtonClickFailedCount: { + name: 'rejectButtonClickFailedCount', + metricType: AmeyoDiagnosticsMetricTypes.COUNTER + }, + disconnectButtonClickFailedCount: { + name: 'disconnectButtonClickFailedCount', + metricType: AmeyoDiagnosticsMetricTypes.COUNTER + }, + disposeButtonClickFailedCount: { + name: 'disconnectButtonClickFailedCount', + metricType: AmeyoDiagnosticsMetricTypes.COUNTER + }, + extensionOnTime: { + name: 'extensionOnTime', + metricType: AmeyoDiagnosticsMetricTypes.COUNTER, + description: 'Extension On Time' + } + }); + +export const AMEYO_DIAGNOSTIC_EVENT_INTERVAL = 30 * 1000; // 30 seconds + +export enum GAUGE_METRIC { + ON = 1, + OFF = 0 +} diff --git a/src/hooks/useAmeyoDiagnostics.tsx b/src/hooks/useAmeyoDiagnostics.tsx new file mode 100644 index 00000000..2f0cd879 --- /dev/null +++ b/src/hooks/useAmeyoDiagnostics.tsx @@ -0,0 +1,39 @@ +import { RootState } from '@cp/src/store'; +import { useSelector } from 'react-redux'; +import { publishMetric } from '@cp/utils/ameyoDiagnostics'; +import { useMemo } from 'react'; +import { Roles } from '@cp/pages/auth/constants/AuthConstants'; +import { LocalStorage } from '@cp/utils/StorageUtils'; +import { WA_PLUGIN_VERSION } from '@cp/pages/auth/AuthActions'; +import { IAmeyoDiagnosticPayload } from '@cp/constants/ameyoConstants'; + +const useAmeyoDiagnostics = () => { + const { referenceId, roles } = useSelector((state: RootState) => state.common.userData); + const teleAmeyoCampaignId = useSelector( + (store: RootState) => store?.common?.userData?.campaignId + ); + const hrcAmeyoCampaignId = useSelector((store: RootState) => store?.humanReminder?.campaignId); + const isHRCAgent = useMemo(() => roles?.includes(Roles.ROLE_HUMAN_REMINDER_AGENT), [roles]); + const latestExtensionVersion = useSelector((state: RootState) => state?.common?.extensionVersion); + + const sendAmeyoDiagnostics = (diagnostics: IAmeyoDiagnosticPayload) => { + publishMetric({ + agentReferenedId: referenceId, + agentExtensionVersion: LocalStorage.getItem(WA_PLUGIN_VERSION), + latestExtensionVersion: latestExtensionVersion, + campaignId: `${isHRCAgent ? hrcAmeyoCampaignId : teleAmeyoCampaignId}`, + flow: diagnostics?.metricName, + metricType: diagnostics?.metricType, + value: diagnostics?.value, + roles: roles as Roles[], + group: diagnostics?.group, + clientTs: new Date().getTime(), + subFlow: diagnostics?.subFlow || '', + metaData: diagnostics?.metaData + }); + }; + + return { sendAmeyoDiagnostics }; +}; + +export default useAmeyoDiagnostics; diff --git a/src/layout/DefaultLayout.tsx b/src/layout/DefaultLayout.tsx index f8912785..6ce93cde 100644 --- a/src/layout/DefaultLayout.tsx +++ b/src/layout/DefaultLayout.tsx @@ -69,6 +69,12 @@ import UpdateExtensionNudge from '@cp/components/UpdateExtensionNudge'; import BreakTime from '@cp/components/BreakTime/BreakTime'; import { ameyoDowntimeEventProcessor } from '@cp/utils/fcmProcessors'; import downloadAssetsFromFirestore from '../pages/LonghornTheme'; +import { + AmeyoDiagnosticEventGroup, + AmeyoDiagnosticEventNames, + AmeyoDiagnosticsMetricTypes +} from '@cp/constants/ameyoConstants'; +import useAmeyoDiagnostics from '@cp/hooks/useAmeyoDiagnostics'; const defaultRoute = { key: 'DEFAULT', @@ -382,10 +388,17 @@ function DefaultLayout() { agentRefrenceId: referenceId }); }; + const { sendAmeyoDiagnostics } = useAmeyoDiagnostics(); useEffect(() => { if (extensionVersion) { const currentExtensionVersion = LocalStorage.getItem(WA_PLUGIN_VERSION); + sendAmeyoDiagnostics({ + metricName: AmeyoDiagnosticEventNames.latestExtensionVersion.name, + metricType: AmeyoDiagnosticEventNames.latestExtensionVersion.metricType, + value: '', + group: isDc97User ? AmeyoDiagnosticEventGroup.HRC : AmeyoDiagnosticEventGroup.TELE + }); if (currentExtensionVersion !== extensionVersion && currentExtensionVersion) { setShowUpdateExtensionPopper(true); } else { diff --git a/src/pages/Dashboard/HrDashBoard.tsx b/src/pages/Dashboard/HrDashBoard.tsx index 8013258f..c459fb9a 100644 --- a/src/pages/Dashboard/HrDashBoard.tsx +++ b/src/pages/Dashboard/HrDashBoard.tsx @@ -13,7 +13,6 @@ import store, { RootState } from 'src/store'; import { refreshCallData, setCampaignId, - setDisconnectApiLoading, setIsAgentOnline, setIsAmeyoErroneous, setIsCallConnected, @@ -36,7 +35,6 @@ import { getAgentStats, getCustomerDetails, getCustomerDetailsRecalibrate, - getCustomerImage, sendSlackAlert, setAgentAvailability, setCallStatus, @@ -47,7 +45,6 @@ import ameyoRinging from '../../assets/audio/ring.wav'; import CallWaitingScreen from './dc-97/CallWaitingScreen'; import { resetHumanReminderCustomerDetails, - setHumanReminderCustomerDetails, setHumanReminderCustomerDetailsLoading } from 'src/reducers/commonSlice'; import HrCustomerDetails from './HrCustomerDetails'; @@ -66,12 +63,19 @@ import { } from './dc-97/dc97Constant'; import { pushToLocalStorage } from '../../utils/StorageUtils'; import { noop } from '@utils/common'; -import { resetState, setCurrentState } from '@cp/reducers/ameyoSlice'; -import { AmeyoCallState } from '@cp/components/Ameyo/constants'; +import { resetState } from '@cp/reducers/ameyoSlice'; import isLitmusExperimentEnabled from '@cp/utils/isLitmusExperimentEnabled'; import { LITMUS_EXPERIMENT_NAMES } from '@cp/constants/litmusExperimentNames'; -import { getCurrentAmeyoCallState } from '@cp/components/Ameyo/utils'; -import axiosInstance, { ApiKeys, getApiUrl, logError } from '@cp/utils/ApiHelper'; +import { + AMEYO_DIAGNOSTIC_EVENT_INTERVAL, + AmeyoDiagnosticEventGroup, + AmeyoDiagnosticEventNames, + AmeyoDiagnosticsMetricTypes, + GAUGE_METRIC +} from '@cp/constants/ameyoConstants'; +import useAmeyoDiagnostics from '@cp/hooks/useAmeyoDiagnostics'; +import { poll } from '@cp/utils/polling'; +import { isFunction } from '@cp/utils/commonUtils'; const HrDashBoard = () => { const dispatch = useDispatch(); @@ -114,6 +118,7 @@ const HrDashBoard = () => { })); const callDisconnectSource = useRef(null); + const { sendAmeyoDiagnostics } = useAmeyoDiagnostics(); const sendSlackNotification = (refId: string) => { setAgentAvailability(AGENT_AVAILABILITY.AGENT_IDLE, refId); @@ -200,6 +205,30 @@ const HrDashBoard = () => { } }, [userData]); + const extensionOnPolling = useRef<() => void>(); + useEffect(() => { + if (isAgentOnline) { + extensionOnPolling.current = poll( + () => { + sendAmeyoDiagnostics({ + metricName: AmeyoDiagnosticEventNames.extensionOnTime.name, + metricType: AmeyoDiagnosticEventNames.extensionOnTime.metricType, + value: '', + group: AmeyoDiagnosticEventGroup.HRC + }); + }, + undefined, + AMEYO_DIAGNOSTIC_EVENT_INTERVAL, + noop + ); + } else { + isFunction(extensionOnPolling.current) && extensionOnPolling.current(); + } + return () => { + isFunction(extensionOnPolling.current) && extensionOnPolling.current(); + }; + }, [isAgentOnline]); + const onCallAcceptedHandler = () => { ExtensionHandler.acceptCall(); setShowCallingPopup(false); @@ -273,6 +302,12 @@ const HrDashBoard = () => { campaignId, agentReferenceId: userData?.referenceId }); + sendAmeyoDiagnostics({ + metricName: AmeyoDiagnosticEventNames.ameyoErroneousCount.name, + metricType: AmeyoDiagnosticEventNames.ameyoErroneousCount.metricType, + value: '', + group: AmeyoDiagnosticEventGroup.HRC + }); dispatch(setIsAmeyoErroneous(true)); }; @@ -301,6 +336,13 @@ const HrDashBoard = () => { ameyoTogglePrevStatus: 'OFF' | 'ON'; ameyoToggleNewStatus: 'OFF' | 'ON'; }) => { + sendAmeyoDiagnostics({ + metricName: AmeyoDiagnosticEventNames.extensionStatus.name, + metricType: AmeyoDiagnosticEventNames.extensionStatus.metricType, + value: + onToggleAmeyoStatusData.ameyoToggleNewStatus === 'ON' ? GAUGE_METRIC.ON : GAUGE_METRIC.OFF, + group: AmeyoDiagnosticEventGroup.HRC + }); addClickstreamEvent(HRC_CLICKSTREAM.HRC_TOGGLE_AMEYO_CLICKED, { reminderRefId, campaignId, @@ -335,6 +377,16 @@ const HrDashBoard = () => { }); }; + const onAmeyoDiagnosticEventCallback = (messageType: string) => { + sendAmeyoDiagnostics({ + metricName: messageType, + metricType: AmeyoDiagnosticEventNames?.[messageType] + .metricType as AmeyoDiagnosticsMetricTypes, + value: '', + group: AmeyoDiagnosticEventGroup.HRC + }); + }; + useEffect(() => { const onCallInComingCallback = (phoneNumber: number, lan: string, crtObjectId: string) => { addClickstreamEvent(HRC_CLICKSTREAM[HRC_EVENTS.HRC_CALL_RINGING_EVENT], { @@ -411,6 +463,12 @@ const HrDashBoard = () => { setAgentAvailability( isAvailable ? AGENT_AVAILABILITY.AGENT_ONLINE : AGENT_AVAILABILITY.AGENT_OFFLINE ); + sendAmeyoDiagnostics({ + metricName: AmeyoDiagnosticEventNames.ameyoAvailabilityStatus.name, + metricType: AmeyoDiagnosticEventNames.ameyoAvailabilityStatus.metricType, + value: isAvailable ? GAUGE_METRIC.ON : GAUGE_METRIC.OFF, + group: AmeyoDiagnosticEventGroup.HRC + }); }; const onSendCurrentCallStatus = async (ameyoData: IAmeyoRecalibratedData) => { @@ -605,6 +663,22 @@ const HrDashBoard = () => { EXTENSION_LISTENER_TYPES.sendCurrentCallStatusAndRecalibrate, onSendCurrentCallStatus ); + ExtensionHelper.addExtensionListener( + EXTENSION_LISTENER_TYPES.acceptCallClickFailure, + onAmeyoDiagnosticEventCallback + ); + ExtensionHelper.addExtensionListener( + EXTENSION_LISTENER_TYPES.rejectCallClickFailure, + onAmeyoDiagnosticEventCallback + ); + ExtensionHelper.addExtensionListener( + EXTENSION_LISTENER_TYPES.disconnectCallClickFailure, + onAmeyoDiagnosticEventCallback + ); + ExtensionHelper.addExtensionListener( + EXTENSION_LISTENER_TYPES.disposeCallClickFailure, + onAmeyoDiagnosticEventCallback + ); }, []); const onCallDisConnectedCallback = (phoneNumber: number, lan: string, crtObjectId: string) => { diff --git a/src/service/naviExtension.service.ts b/src/service/naviExtension.service.ts index 50651b08..d7179a94 100644 --- a/src/service/naviExtension.service.ts +++ b/src/service/naviExtension.service.ts @@ -116,6 +116,18 @@ const originalCallbacks = { }, sendCurrentCallStatusAndRecalibrate: (data?: IAmeyoRecalibratedData) => { console.log('AMEYO_LH on sendCurrentCallStatusAndRecalibrate call callback found '); + }, + acceptCallClickFailure: (messageType: MessagingType) => { + console.log('AMEYO_LH on acceptCallClickFailure call callback found '); + }, + rejectCallClickFailure: (messageType: MessagingType) => { + console.log('AMEYO_LH on rejectCallClickFailure call callback found '); + }, + disconnectCallClickFailure: (messageType: MessagingType) => { + console.log('AMEYO_LH on disconnectCallClickFailure call callback found '); + }, + disposeCallClickFailure: (messageType: MessagingType) => { + console.log('AMEYO_LH on disposeCallClickFailure call callback found '); } //when ameyo becomes loggedout, reset the state() }; @@ -489,6 +501,18 @@ function msgListner(msg: any) { if (message.type === MessagingType.SEND_CURRENT_CALL_STATUS_AND_RECALIBRATE) { extensionCallbacks.sendCurrentCallStatusAndRecalibrate(message?.data); } + if (message.type === MessagingType.ACCEPT_CALL_CLICK_FAILURE) { + extensionCallbacks.acceptCallClickFailure(message.type); + } + if (message.type === MessagingType.REJECT_CALL_CLICK_FAILURE) { + extensionCallbacks.rejectCallClickFailure(message.type); + } + if (message.type === MessagingType.DISCONNECT_CALL_CLICK_FAILURE) { + extensionCallbacks.disconnectCallClickFailure(message.type); + } + if (message.type === MessagingType.DISPOSE_CALL_CLICK_FAILURE) { + extensionCallbacks.disposeCallClickFailure(message.type); + } } export interface NaviExtensionCallbackRegister { onCallIncoming: (phoneNumber: string, lan: string, crtObjectId: string) => void; @@ -552,7 +576,11 @@ enum MessagingType { SEND_CURRENT_CALL_STATUS = 'sendCurrentCallStatus', ACCEPT_CALL_ERROR = 'acceptCallError', SEND_CURRENT_CALL_STATUS_AND_RECALIBRATE = 'sendCurrentCallStatusAndRecalibrate', - FOCUS_CHROME_EXTENSIONS_PAGE = 'focusChromeExtensionsPage' + FOCUS_CHROME_EXTENSIONS_PAGE = 'focusChromeExtensionsPage', + ACCEPT_CALL_CLICK_FAILURE = 'acceptCallClickFailure', + REJECT_CALL_CLICK_FAILURE = 'rejectCallClickFailure', + DISCONNECT_CALL_CLICK_FAILURE = 'disconnectCallClickFailure', + DISPOSE_CALL_CLICK_FAILURE = 'disposeCallClickFailure' } interface MessagingRequest { diff --git a/src/utils/ApiHelper.ts b/src/utils/ApiHelper.ts index 40e06270..637f247d 100644 --- a/src/utils/ApiHelper.ts +++ b/src/utils/ApiHelper.ts @@ -224,7 +224,8 @@ export enum ApiKeys { GET_ALLOCATION_ORIGINAL_FILE, GET_ALLOCATION_FAILURE_REPORT, DOWNLOAD_ALLOCATION_ORIGINAL_FILE, - REQUEST_LOAN_ACCOUNT_STATEMENT + REQUEST_LOAN_ACCOUNT_STATEMENT, + PUBLISH_METRICS_TO_GRAPHANA } // TODO: try to get rid of `as` @@ -448,6 +449,7 @@ API_URLS[ApiKeys.GET_ALLOCATION_FAILURE_REPORT] = 'uploads/{referenceId}/failure API_URLS[ApiKeys.DOWNLOAD_ALLOCATION_ORIGINAL_FILE] = '/case-allocations/{referenceId}/uploaded-file'; API_URLS[ApiKeys.REQUEST_LOAN_ACCOUNT_STATEMENT] = '/documents/{lan}/loan-account-statement'; +API_URLS[ApiKeys.PUBLISH_METRICS_TO_GRAPHANA] = '/ameyo-stats/publish-diagnostic-data'; // TODO: try to get rid of `as` const MOCK_API_URLS: Record = {} as Record; diff --git a/src/utils/ameyoDiagnostics.ts b/src/utils/ameyoDiagnostics.ts new file mode 100644 index 00000000..f94dbf64 --- /dev/null +++ b/src/utils/ameyoDiagnostics.ts @@ -0,0 +1,7 @@ +import axiosInstance, { ApiKeys, getApiUrl } from '@cp/utils/ApiHelper'; +import { IPublishMetricPayload } from '@cp/constants/ameyoConstants'; + +export const publishMetric = (payload: IPublishMetricPayload) => { + const url = getApiUrl(ApiKeys.PUBLISH_METRICS_TO_GRAPHANA); + axiosInstance.post(url, payload); +}; diff --git a/src/utils/extension.utils.ts b/src/utils/extension.utils.ts index 6a4e89f0..9e72ff45 100644 --- a/src/utils/extension.utils.ts +++ b/src/utils/extension.utils.ts @@ -29,7 +29,11 @@ export const enum EXTENSION_LISTENER_TYPES { 'acceptCallError', 'sendCurrentCallStatus', 'sendCurrentCallStatusAndRecalibrate', - 'focusChromeExtensionsPage' + 'focusChromeExtensionsPage', + 'acceptCallClickFailure', + 'rejectCallClickFailure', + 'disconnectCallClickFailure', + 'disposeCallClickFailure' } export const ExtensionHelper = { @@ -127,6 +131,22 @@ export const ExtensionHelper = { naviExtension.registerCallBack({ sendCurrentCallStatusAndRecalibrate: cb }); return; } + case EXTENSION_LISTENER_TYPES.acceptCallClickFailure: { + naviExtension.registerCallBack({ acceptCallClickFailure: cb }); + return; + } + case EXTENSION_LISTENER_TYPES.rejectCallClickFailure: { + naviExtension.registerCallBack({ rejectCallClickFailure: cb }); + return; + } + case EXTENSION_LISTENER_TYPES.disconnectCallClickFailure: { + naviExtension.registerCallBack({ disconnectCallClickFailure: cb }); + return; + } + case EXTENSION_LISTENER_TYPES.disposeCallClickFailure: { + naviExtension.registerCallBack({ disposeCallClickFailure: cb }); + return; + } default: { return; }