import callDirections from '@ringcentral-integration/commons/enums/callDirections';
import callResults from '@ringcentral-integration/commons/enums/callResults';
import telephonyStatuses from '@ringcentral-integration/commons/enums/telephonyStatus';
import { isMissed } from '@ringcentral-integration/commons/lib/callLogHelpers';
import clsx from 'clsx';
import PropTypes from 'prop-types';
import { includes } from 'ramda';
import React from 'react';
import dynamicsFont from '../../assets/DynamicsFont/DynamicsFont.scss';
import i18n from './i18n';
import styles from './styles.scss';
const CallIcon = ({ title, iconClassName }: any) => (
);
CallIcon.propTypes = {
title: PropTypes.string,
iconClassName: PropTypes.string.isRequired,
};
CallIcon.defaultProps = {
title: '',
};
const callIconMap = {
[callResults.missed]: dynamicsFont.missed,
[callDirections.inbound]: dynamicsFont.inbound,
[callDirections.outbound]: dynamicsFont.outbound,
[telephonyStatuses.ringing]: dynamicsFont.callHover,
};
const colorStatusMap = {
green: [
telephonyStatuses.callConnected,
telephonyStatuses.ringing,
callResults.callAccepted,
callResults.accepted,
],
red: [
callResults.missed,
callResults.voicemail,
callResults.rejected,
callResults.blocked,
callResults.noAnswer,
callResults.busy,
callResults.hangUp,
callResults.HangUp,
callResults.declined,
],
orange: [telephonyStatuses.onHold, telephonyStatuses.parkedCall],
};
const LogBasicInfo = (props: any) => {
const {
currentLog: { call, logName },
formatPhone,
currentLocale,
clickable,
onClick,
dataSign,
} = props;
if (!call) return null;
const { direction, to, from, duration, result, telephonyStatus } = call;
const number =
direction === callDirections.outbound
? to && (to.phoneNumber || to.extensionNumber)
: from && (from.phoneNumber || from.extensionNumber);
const formatNumber = formatPhone(number);
const status = result || telephonyStatus;
const active = !duration && duration !== 0;
const missed = isMissed(call);
const green = includes(status, colorStatusMap.green);
const red = includes(status, colorStatusMap.red);
const orange = includes(status, colorStatusMap.orange);
const isRinging = status === telephonyStatuses.ringing;
const title = missed
? i18n.getString(callResults.missed, currentLocale)
: i18n.getString(direction, currentLocale);
const statusI18n = i18n.getString(status, currentLocale);
const iconClassName = clsx(
styles.icon,
isRinging && styles.ringing,
isRinging && dynamicsFont.callHover,
// @ts-expect-error TS(7053): Element implicitly has an 'any' type because expre... Remove this comment to see the full error message
!isRinging && !missed && callIconMap[direction],
missed && styles.missed,
missed && callIconMap[callResults.missed],
!isRinging && active && styles.active,
);
const statusClassName = clsx(
styles.status,
green && styles.green,
red && styles.red,
orange && styles.orange,
);
return (
{}}
>
-
{logName}
-
{formatNumber}
{formatNumber ? (
) : null}
{statusI18n}
{props.extraButton}
);
};
LogBasicInfo.propTypes = {
currentLocale: PropTypes.string.isRequired,
formatPhone: PropTypes.func,
currentLog: PropTypes.object,
extraButton: PropTypes.object,
clickable: PropTypes.bool,
onClick: PropTypes.func,
dataSign: PropTypes.string,
};
LogBasicInfo.defaultProps = {
formatPhone: (value: any) => value,
currentLog: {},
extraButton: undefined,
clickable: false,
onClick() {},
dataSign: undefined,
};
export default LogBasicInfo;