import { trackEvents } from '@ringcentral-integration/commons/enums/trackEvents';
import { isOnHold } from '@ringcentral-integration/commons/lib/callLogHelpers';
import { Module } from '@ringcentral-integration/commons/lib/di';
import { formatNumber } from '@ringcentral-integration/commons/lib/formatNumber';
import { callingOptions } from '@ringcentral-integration/commons/modules/CallingSettings';
import type { RcModuleOptions } from '@ringcentral-integration/core';
import { RcUIModuleV2, track } from '@ringcentral-integration/core';
import React from 'react';
import { CallLogCallCtrlContainer } from '../../containers/CallLogCallCtrlContainer';
import type {
CallLogUIFunctions,
CallLogUIInterface,
CallLogUIProps,
Deps,
} from './CallLogUI.interface';
import i18n from './i18n';
const CallLogCallControlRenderer = (
currentLocale: string,
telephonySessionId: string,
isWide: boolean,
enableReply: boolean,
isCurrentDeviceCall: boolean,
warmTransferActiveTelephonySessionId: string,
) => (
);
@Module({
name: 'CallLogUI',
deps: [
'Locale',
'CallLogger',
'RateLimiter',
'RegionSettings',
'DateTimeFormat',
'CallLogSection',
'RouterInteraction',
'ActiveCallControl',
'AppFeatures',
'ConnectivityMonitor',
'CallingSettings',
'ForwardingNumber',
'AccountInfo',
{ dep: 'CallLogUIOptions', optional: true },
],
})
export abstract class CallLogUIBase
extends RcUIModuleV2
implements CallLogUIInterface
{
constructor({ deps, ...options }: RcModuleOptions) {
super({
deps,
...options,
});
}
getUIProps(): CallLogUIProps {
const {
currentNotificationIdentify,
currentIdentify,
warmTransferActiveTelephonySessionId,
} = this._deps.callLogSection;
const isInTransferPage =
this._deps.routerInteraction.currentPath.match('^/transfer/') !== null;
return {
currentLocale: this._deps.locale.currentLocale,
header: true,
showSpinner: !(
this._deps.locale.ready &&
this._deps.regionSettings.ready &&
this._deps.dateTimeFormat.ready &&
this._deps.appFeatures.ready &&
(!this._deps.callLogger || this._deps.callLogger.ready)
),
isInTransferPage,
disableLinks:
!this._deps.connectivityMonitor.connectivity ||
this._deps.rateLimiter.throttling,
currentIdentify,
// notification props
currentNotificationIdentify,
// @ts-expect-error TS(2322): Type 'Partial | null' is not assign... Remove this comment to see the full error message
currentSession: this._deps.activeCallControl.getActiveSession(
this._deps.activeCallControl.sessionIdToTelephonySessionIdMapping[
currentNotificationIdentify
],
),
// @ts-expect-error TS(2322): Type 'Partial | null' is not assign... Remove this comment to see the full error message
activeSession: this._deps.activeCallControl.activeSession,
isWebRTC: this._deps.callingSettings.callWith === callingOptions.browser,
forwardingNumbers: this._deps.forwardingNumber.forwardingNumbers,
warmTransferActiveTelephonySessionId,
};
}
getUIFunctions(): CallLogUIFunctions {
return {
formatPhone: (phoneNumber: string) =>
formatNumber({
phoneNumber,
areaCode: this._deps.regionSettings.areaCode,
countryCode: this._deps.regionSettings.countryCode,
maxExtensionLength: this._deps.accountInfo.maxExtensionNumberLength,
}) || i18n.getString('unknown', this._deps.locale.currentLocale),
goBack: () => {
this._deps.callLogSection.closeLogSection();
this._deps.callLogSection.closeLogNotification();
},
renderCallLogCallControl: (
telephonySessionId,
isWide,
enableReply,
isCurrentDeviceCall,
warmTransferActiveTelephonySessionId,
) =>
CallLogCallControlRenderer(
this._deps.locale.currentLocale,
telephonySessionId,
isWide,
enableReply,
isCurrentDeviceCall,
warmTransferActiveTelephonySessionId,
),
// notification props
onSaveNotification: () =>
this._deps.callLogSection.saveAndHandleNotification(),
onDiscardNotification: () =>
this._deps.callLogSection.discardAndHandleNotification(),
onCloseNotification: () =>
this._deps.callLogSection.closeLogNotification(),
onExpandNotification: () =>
this._deps.callLogSection.expandLogNotification(),
onSwitchWarmTransferSession: () => {
const {
currentCall,
currentWarmTransferCall,
warmTransferActiveTelephonySessionId,
} = this._deps.callLogSection;
if (!currentCall || !currentWarmTransferCall) return;
const isTransferCallActive =
currentWarmTransferCall?.telephonySessionId ===
warmTransferActiveTelephonySessionId;
const activeCall = isTransferCallActive
? currentWarmTransferCall
: currentCall;
const subCall = isTransferCallActive
? currentCall
: currentWarmTransferCall;
const isActiveCallOnHold = isOnHold(activeCall);
if (isActiveCallOnHold) {
this._deps.callLogSection.setWarmTransferCallActiveId(
subCall.telephonySessionId,
);
} else {
return this._deps.activeCallControl.unhold(
// @ts-expect-error TS(2345): Argument of type 'string | undefined' is not assig... Remove this comment to see the full error message
subCall.telephonySessionId,
);
}
},
onReject: (sessionId) => {
const telephonySessionId =
this._deps.activeCallControl.sessionIdToTelephonySessionIdMapping[
sessionId
];
return this._deps.activeCallControl.reject(telephonySessionId);
},
onHangup: (sessionId) => {
const telephonySessionId =
this._deps.activeCallControl.sessionIdToTelephonySessionIdMapping[
sessionId
];
return this._deps.activeCallControl.hangUp(telephonySessionId);
},
onIgnore: (telephonySessionId) => {
this._deps.activeCallControl.ignore?.(telephonySessionId);
this._deps.callLogSection.closeLogNotification();
},
onForward: (phoneNumber, telephonySessionId) => {
if (phoneNumber === 'custom') {
this._deps.routerInteraction.push(`/forward/${telephonySessionId}`);
} else {
this._deps.activeCallControl.forward?.(
phoneNumber,
telephonySessionId,
);
this._deps.callLogSection.closeLogNotification();
}
},
reply: (telephonySessionId) => {
this._deps.routerInteraction.push(
`/replyWithMessage/${telephonySessionId}/active`,
);
},
endAndAnswer: (telephonySessionId) => {
this._deps.activeCallControl.answerAndEnd?.(telephonySessionId);
this._deps.callLogSection.discardAndHandleNotification();
},
holdAndAnswer: (telephonySessionId) => {
this._deps.activeCallControl.answerAndHold?.(telephonySessionId);
this._deps.callLogSection.discardAndHandleNotification();
},
toVoicemail: (telephonySessionId) => {
this._deps.activeCallControl.reject(telephonySessionId);
this._deps.callLogSection.closeLogNotification();
},
answer: (telephonySessionId) => {
this._deps.activeCallControl.answer?.(telephonySessionId);
this._deps.callLogSection.discardAndHandleNotification();
},
clickForwardTrack: () =>
this._deps.activeCallControl.clickForwardTrack?.(),
openEntityDetailLinkTrack: (path) =>
this._deps.activeCallControl.openEntityDetailLinkTrack?.(path),
};
}
}
// @ts-expect-error TS(2554): Expected 1 arguments, but got 0.
@Module()
export class CallLogUI extends CallLogUIBase {
constructor(deps: Deps) {
super({
deps,
});
}
}