Skip to content

Commit f7b1773

Browse files
authored
feat(cc-widgets): Transfer to dial number feature added (#531)
1 parent 930eb72 commit f7b1773

18 files changed

Lines changed: 675 additions & 149 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
.consult-transfer-dial-number-container {
2+
display: flex;
3+
align-items: center;
4+
gap: 8px;
5+
width: 100%;
6+
height: 40px;
7+
}
8+
9+
.consult-transfer-dial-number-input {
10+
flex: 1;
11+
align-self: center;
12+
display: flex;
13+
align-items: center;
14+
height: 100%;
15+
}
16+
17+
.consult-transfer-dial-number-btn {
18+
align-self: flex-start;
19+
}
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
import React, {useState} from 'react';
2+
import './consult-transfer-dial-number.scss';
3+
import {ButtonCircle} from '@momentum-ui/react-collaboration';
4+
import {Icon, Input} from '@momentum-design/components/dist/react';
5+
import {ConsultTransferDialNumberComponentProps} from '../../task.types';
6+
import {handleButtonPress, onInputDialNumber} from '../call-control.utils';
7+
8+
const DialNumberUI: React.FC<ConsultTransferDialNumberComponentProps> = (props) => {
9+
const {buttonIcon, onButtonPress, logger} = props;
10+
11+
const [value, setValue] = useState('');
12+
return (
13+
<div className="consult-transfer-dial-number-container">
14+
<Input
15+
id="dial-number-input"
16+
data-testid="dial-number-input"
17+
value={value}
18+
onInput={(e) => onInputDialNumber(e, setValue)}
19+
placeholder="Enter Dial Number"
20+
className="consult-transfer-dial-number-input"
21+
/>
22+
<ButtonCircle
23+
onPress={() => handleButtonPress(logger, onButtonPress, value)}
24+
size={28}
25+
color="join"
26+
className="consult-transfer-dial-number-btn"
27+
data-testid="dial-number-btn"
28+
>
29+
<Icon name={buttonIcon} />
30+
</ButtonCircle>
31+
</div>
32+
);
33+
};
34+
35+
export default DialNumberUI;

packages/contact-center/cc-components/src/components/task/CallControl/CallControlCustom/consult-transfer-popover.tsx

Lines changed: 25 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -4,14 +4,15 @@ import ConsultTransferListComponent from './consult-transfer-list-item';
44
import {ConsultTransferPopoverComponentProps} from '../../task.types';
55
import ConsultTransferEmptyState from './consult-transfer-empty-state';
66
import {
7-
shouldShowTabs,
87
isAgentsEmpty,
98
isQueuesEmpty,
109
handleTabSelection,
1110
handleAgentSelection,
1211
handleQueueSelection,
1312
getEmptyStateMessage,
1413
} from './call-control-custom.utils';
14+
import DialNumberUI from './consult-transfer-dial-number';
15+
import {AGENTS, DIAL_NUMBER, QUEUES} from '../../constants';
1516

1617
const ConsultTransferPopoverComponent: React.FC<ConsultTransferPopoverComponentProps> = ({
1718
heading,
@@ -20,16 +21,17 @@ const ConsultTransferPopoverComponent: React.FC<ConsultTransferPopoverComponentP
2021
queues,
2122
onAgentSelect,
2223
onQueueSelect,
24+
onDialNumberSelect,
2325
allowConsultToQueue,
2426
logger,
2527
}) => {
26-
const [selectedTab, setSelectedTab] = useState('Agents');
28+
const [selectedTab, setSelectedTab] = useState(AGENTS);
2729
const filteredAgents = buddyAgents;
2830
const filteredQueues = queues;
2931

3032
const noAgents = isAgentsEmpty(filteredAgents);
3133
const noQueues = isQueuesEmpty(filteredQueues);
32-
const showTabs = shouldShowTabs(filteredAgents, filteredQueues);
34+
const showTabs = true; // Always show tabs to allow dial number option
3335

3436
const renderList = (items, getKey, getTitle, handleSelect) => (
3537
<ListNext listSize={items.length} className="agent-list">
@@ -72,37 +74,40 @@ const ConsultTransferPopoverComponent: React.FC<ConsultTransferPopoverComponentP
7274
handleTabSelection(key as string, setSelectedTab, logger);
7375
}}
7476
>
75-
<TabNext key="Agents" className="agent-tab" active={selectedTab === 'Agents'}>
77+
<TabNext key={AGENTS} className="agent-tab" active={selectedTab === AGENTS}>
7678
Agents
7779
</TabNext>
7880
<TabNext
79-
key="Queues"
81+
key={QUEUES}
8082
className="queue-tab"
81-
active={selectedTab === 'Queues'}
83+
active={selectedTab === QUEUES}
8284
disabled={!allowConsultToQueue}
8385
style={!allowConsultToQueue ? {display: 'none'} : undefined}
8486
>
8587
Queues
8688
</TabNext>
89+
<TabNext key={DIAL_NUMBER} className="dial-number-tab" active={selectedTab === DIAL_NUMBER}>
90+
Dial Number
91+
</TabNext>
8792
</TabListNext>
8893
)}
8994

9095
{/* If both are empty, show the big empty state */}
9196
{!showTabs && <ConsultTransferEmptyState message={getEmptyStateMessage(selectedTab, showTabs)} />}
9297

9398
{/* If agents tab is selected and empty */}
94-
{showTabs && selectedTab === 'Agents' && noAgents && (
99+
{showTabs && selectedTab === AGENTS && noAgents && (
95100
<ConsultTransferEmptyState message={getEmptyStateMessage(selectedTab, showTabs)} />
96101
)}
97102

98103
{/* If queues tab is selected and empty */}
99-
{showTabs && selectedTab === 'Queues' && noQueues && (
104+
{showTabs && selectedTab === QUEUES && noQueues && (
100105
<ConsultTransferEmptyState message={getEmptyStateMessage(selectedTab, showTabs)} />
101106
)}
102107

103108
{/* Render lists if not empty */}
104109
{showTabs &&
105-
selectedTab === 'Agents' &&
110+
selectedTab === AGENTS &&
106111
!noAgents &&
107112
renderList(
108113
filteredAgents,
@@ -114,7 +119,7 @@ const ConsultTransferPopoverComponent: React.FC<ConsultTransferPopoverComponentP
114119
)}
115120

116121
{showTabs &&
117-
selectedTab === 'Queues' &&
122+
selectedTab === QUEUES &&
118123
!noQueues &&
119124
renderList(
120125
filteredQueues,
@@ -124,6 +129,16 @@ const ConsultTransferPopoverComponent: React.FC<ConsultTransferPopoverComponentP
124129
handleQueueSelection(id, name, onQueueSelect, logger);
125130
}
126131
)}
132+
{showTabs && selectedTab === DIAL_NUMBER && (
133+
<DialNumberUI
134+
title="Dial Number"
135+
buttonIcon={buttonIcon}
136+
onButtonPress={(dialNumber) => {
137+
onDialNumberSelect(dialNumber);
138+
}}
139+
logger={logger}
140+
/>
141+
)}
127142
</div>
128143
);
129144
};

packages/contact-center/cc-components/src/components/task/CallControl/call-control.tsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -212,6 +212,7 @@ function CallControlComponent(props: CallControlComponentProps) {
212212
queues={queues}
213213
onAgentSelect={(agentId, agentName) => handleTargetSelect(agentId, agentName, 'agent')}
214214
onQueueSelect={(queueId, queueName) => handleTargetSelect(queueId, queueName, 'queue')}
215+
onDialNumberSelect={(dialNumber) => handleTargetSelect(dialNumber, dialNumber, 'dialNumber')}
215216
allowConsultToQueue={allowConsultToQueue}
216217
logger={logger}
217218
/>

packages/contact-center/cc-components/src/components/task/CallControl/call-control.utils.ts

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -401,3 +401,16 @@ export const handleAudioRef = (
401401
});
402402
}
403403
};
404+
405+
// Utility for consult-transfer-dial-number
406+
export const onInputDialNumber = (e, setValue) => {
407+
setValue(e.currentTarget.value);
408+
};
409+
410+
export const handleButtonPress = (logger, onButtonPress, value) => {
411+
logger.info('Dial Number button pressed', {
412+
module: 'consult-transfer-dial-number.tsx',
413+
method: 'handleButtonPress',
414+
});
415+
onButtonPress(value);
416+
};

packages/contact-center/cc-components/src/components/task/CallControlCAD/call-control-cad.tsx

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -32,14 +32,12 @@ const CallControlCADComponent: React.FC<CallControlComponentProps> = (props) =>
3232
consultAgentName,
3333
consultStartTimeStamp,
3434
endConsultCall,
35-
consultAgentId,
3635
consultCompleted,
3736
consultTransfer,
3837
callControlClassName,
3938
callControlConsultClassName,
4039
startTimestamp,
4140
isEndConsultEnabled,
42-
lastTargetType,
4341
controlVisibility,
4442
logger,
4543
isMuted,
@@ -221,7 +219,7 @@ const CallControlCADComponent: React.FC<CallControlComponentProps> = (props) =>
221219
agentName={consultAgentName}
222220
startTimeStamp={consultStartTimeStamp}
223221
endConsultCall={endConsultCall}
224-
onTransfer={() => consultTransfer(consultAgentId || currentTask.data.destAgentId, lastTargetType)}
222+
onTransfer={consultTransfer}
225223
consultCompleted={consultCompleted}
226224
isAgentBeingConsulted={!consultAccepted}
227225
isEndConsultEnabled={isEndConsultEnabled}

packages/contact-center/cc-components/src/components/task/constants.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,9 @@ export const SELECT = 'Select';
1515
export const SUBMIT_WRAP_UP = 'Submit & Wrap up';
1616
export const MUTE_CALL = 'Mute';
1717
export const UNMUTE_CALL = 'Unmute';
18-
18+
export const DIAL_NUMBER = 'DialNumber';
19+
export const AGENTS = 'Agents';
20+
export const QUEUES = 'Queues';
1921
// CallControlCAD constants
2022
export const NO_CUSTOMER_NAME = 'No Customer Name';
2123
export const NO_CALLER_ID = 'No Caller ID';

packages/contact-center/cc-components/src/components/task/task.types.ts

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -281,11 +281,9 @@ export interface ControlProps {
281281
endConsultCall: () => void;
282282

283283
/**
284-
* Function to transfer the consult call to a destination.
285-
* @param destination - The destination to transfer the consult call to.
286-
* @param destinationType - The type of destination.
284+
* Function to transfer the consult call to a already established consult.
287285
*/
288-
consultTransfer: (destination: string, destinationType: DestinationType) => void;
286+
consultTransfer: () => void;
289287

290288
/**
291289
* Flag to determine if the consult call is connecting.
@@ -492,6 +490,18 @@ export interface ConsultTransferListComponentProps {
492490
logger: ILogger;
493491
}
494492

493+
/**
494+
* Interface representing the properties for CallControlDialNumber component.
495+
*/
496+
export interface ConsultTransferDialNumberComponentProps {
497+
title: string;
498+
subtitle?: string;
499+
buttonIcon: string;
500+
onButtonPress: (dialNumber: string) => void;
501+
className?: string;
502+
logger: ILogger;
503+
}
504+
495505
/**
496506
* Interface representing the properties for ConsultTransferPopover component.
497507
*/
@@ -502,6 +512,7 @@ export interface ConsultTransferPopoverComponentProps {
502512
queues?: ContactServiceQueue[];
503513
onAgentSelect?: (agentId: string, agentName: string) => void;
504514
onQueueSelect?: (queueId: string, queueName: string) => void;
515+
onDialNumberSelect?: (dialNumber: string) => void;
505516
allowConsultToQueue: boolean;
506517
logger: ILogger;
507518
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
// Jest Snapshot v1, https://goo.gl/fbAQLP
2+
3+
exports[`DialNumberUI snapshot matches snapshot 1`] = `
4+
<div>
5+
<div
6+
class="consult-transfer-dial-number-container"
7+
>
8+
<mdc-input
9+
class="consult-transfer-dial-number-input"
10+
data-testid="dial-number-input"
11+
/>
12+
<button
13+
class="md-button-circle-wrapper consult-transfer-dial-number-btn md-button-simple-wrapper"
14+
data-color="join"
15+
data-disabled="false"
16+
data-ghost="false"
17+
data-inverted="false"
18+
data-multiple-children="false"
19+
data-outline="false"
20+
data-shallow-disabled="false"
21+
data-size="28"
22+
data-testid="dial-number-btn"
23+
type="button"
24+
>
25+
<mdc-icon />
26+
</button>
27+
</div>
28+
</div>
29+
`;

0 commit comments

Comments
 (0)