Skip to content

Commit a295d58

Browse files
akulakumShreyas281299
authored andcommitted
fix(task-refactor): fix outdial flow
1 parent 2b92edb commit a295d58

9 files changed

Lines changed: 43 additions & 22 deletions

File tree

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

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,11 @@ const CallControlCADComponent: React.FC<CallControlComponentProps> = (props) =>
6767
const customerName = currentTask?.data?.interaction?.callAssociatedDetails?.customerName;
6868

6969
const ani = currentTask?.data?.interaction?.callAssociatedDetails?.ani;
70+
const isOutdial = currentTask?.data?.interaction?.outboundType === 'OUTDIAL';
71+
const dnis =
72+
currentTask?.data?.interaction?.callAssociatedDetails?.dnis ||
73+
currentTask?.data?.interaction?.callProcessingDetails?.dnis;
74+
const displayNumber = isOutdial ? dnis || ani : ani;
7075
const dn = currentTask?.data?.interaction?.callAssociatedDetails?.dn;
7176

7277
// eslint-disable-next-line @typescript-eslint/no-explicit-any
@@ -80,7 +85,7 @@ const CallControlCADComponent: React.FC<CallControlComponentProps> = (props) =>
8085
const phoneNumberTooltipId = `phone-number-tooltip-${currentTask.data.interaction.interactionId}`;
8186

8287
const renderCustomerName = () => {
83-
const customerText = isSocial ? customerName || NO_CUSTOMER_NAME : ani || NO_CALLER_ID;
88+
const customerText = isSocial ? customerName || NO_CUSTOMER_NAME : displayNumber || NO_CALLER_ID;
8489

8590
const textComponent = (
8691
<Text

packages/contact-center/cc-components/src/components/task/IncomingTask/incoming-task.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,13 +5,13 @@ import {withMetrics} from '@webex/cc-ui-logging';
55
import {extractIncomingTaskData} from './incoming-task.utils';
66

77
const IncomingTaskComponent: React.FunctionComponent<IncomingTaskComponentProps> = (props) => {
8-
const {incomingTask, accept, reject, logger, acceptControl, declineControl, isDeclineButtonEnabled} = props;
8+
const {incomingTask, accept, reject, logger, acceptControl, declineControl, isDeclineButtonEnabled, isBrowser} = props;
99
if (!incomingTask) {
1010
return <></>; // hidden component
1111
}
1212

1313
// Extract all task data using the utility function
14-
const taskData = extractIncomingTaskData(incomingTask, logger, acceptControl, declineControl, isDeclineButtonEnabled);
14+
const taskData = extractIncomingTaskData(incomingTask, logger, acceptControl, declineControl, isDeclineButtonEnabled, isBrowser);
1515

1616
return (
1717
<Task

packages/contact-center/cc-components/src/components/task/IncomingTask/incoming-task.utils.tsx

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,8 @@ export const extractIncomingTaskData = (
2929
logger?,
3030
acceptControl?: {isVisible: boolean; isEnabled: boolean},
3131
declineControl?: {isVisible: boolean; isEnabled: boolean},
32-
isDeclineButtonEnabled?: boolean
32+
isDeclineButtonEnabled?: boolean,
33+
isBrowser?: boolean
3334
): IncomingTaskData => {
3435
try {
3536
const accept = acceptControl ?? incomingTask?.uiControls?.main?.accept ?? {isVisible: false, isEnabled: false};
@@ -41,7 +42,9 @@ export const extractIncomingTaskData = (
4142

4243
// Extract basic data from task
4344
const callAssociationDetails = incomingTask?.data?.interaction?.callAssociatedDetails;
44-
const ani = callAssociationDetails?.ani;
45+
const isOutdial = incomingTask?.data?.interaction?.outboundType === 'OUTDIAL';
46+
const dnis = callAssociationDetails?.dnis || incomingTask?.data?.interaction?.callProcessingDetails?.dnis;
47+
const ani = isOutdial ? dnis || callAssociationDetails?.ani : callAssociationDetails?.ani;
4548
const customerName = callAssociationDetails?.customerName;
4649
const virtualTeamName = callAssociationDetails?.virtualTeamName;
4750
const ronaTimeout = callAssociationDetails?.ronaTimeout ? Number(callAssociationDetails?.ronaTimeout) : null;
@@ -54,13 +57,11 @@ export const extractIncomingTaskData = (
5457
const isSocial = mediaType === MEDIA_CHANNEL.SOCIAL;
5558

5659
// Compute button text based on conditions
57-
// Extension mode (EPDN): accept button is visible but disabled → show "Ringing..."
58-
// WebRTC mode (Desktop): accept button is visible and enabled → show "Accept"
59-
const acceptText = accept.isVisible
60-
? isTelephony && !accept.isEnabled
61-
? 'Ringing...'
62-
: 'Accept'
63-
: undefined;
60+
// Extension mode (any call): accept visible but disabled → show "Ringing..."
61+
// Desktop/WebRTC outdial: accept visible but disabled → show "Accept" (auto-answer handles it)
62+
// Desktop/WebRTC inbound: accept visible and enabled → show "Accept"
63+
const showRinging = isTelephony && !accept.isEnabled && !(isBrowser && isOutdial);
64+
const acceptText = accept.isVisible ? (showRinging ? 'Ringing...' : 'Accept') : undefined;
6465

6566
const declineText = decline.isVisible ? 'Decline' : undefined;
6667

packages/contact-center/cc-components/src/components/task/TaskList/task-list.tsx

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,8 @@ import './styles.scss';
1212
import {withMetrics} from '@webex/cc-ui-logging';
1313

1414
const TaskListComponent: React.FunctionComponent<TaskListComponentProps> = (props) => {
15-
const {currentTask, taskList, acceptTask, declineTask, onTaskSelect, logger, agentId, isDeclineButtonEnabled} = props;
15+
const {currentTask, taskList, acceptTask, declineTask, onTaskSelect, logger, agentId, isDeclineButtonEnabled, isBrowser} =
16+
props;
1617

1718
// Early return for empty task list
1819
if (isTaskListEmpty(taskList)) {
@@ -25,7 +26,7 @@ const TaskListComponent: React.FunctionComponent<TaskListComponentProps> = (prop
2526
<ul className="task-list" data-testid="task-list">
2627
{tasks.map((task, index) => {
2728
// Extract all task data using the utility function
28-
const taskData = extractTaskListItemData(task, agentId, logger, isDeclineButtonEnabled);
29+
const taskData = extractTaskListItemData(task, agentId, logger, isDeclineButtonEnabled, isBrowser);
2930

3031
// Log task rendering
3132
logger.info('CC-Widgets: TaskList: rendering task list', {

packages/contact-center/cc-components/src/components/task/TaskList/task-list.utils.ts

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,8 @@ export const extractTaskListItemData = (
1010
task: ITask,
1111
agentId: string,
1212
logger?: ILogger,
13-
isDeclineButtonEnabled?: boolean
13+
isDeclineButtonEnabled?: boolean,
14+
isBrowser?: boolean
1415
): TaskListItemData => {
1516
try {
1617
const accept = task.uiControls?.main?.accept ?? {isVisible: false, isEnabled: false};
@@ -22,7 +23,9 @@ export const extractTaskListItemData = (
2223

2324
// Extract basic data from task
2425
const callAssociationDetails = task?.data?.interaction?.callAssociatedDetails;
25-
const ani = callAssociationDetails?.ani;
26+
const isOutdial = task?.data?.interaction?.outboundType === 'OUTDIAL';
27+
const dnis = callAssociationDetails?.dnis || task?.data?.interaction?.callProcessingDetails?.dnis;
28+
const ani = isOutdial ? dnis || callAssociationDetails?.ani : callAssociationDetails?.ani;
2629
const customerName = callAssociationDetails?.customerName;
2730
const virtualTeamName = callAssociationDetails?.virtualTeamName;
2831

@@ -40,10 +43,11 @@ export const extractTaskListItemData = (
4043
const isSocial = mediaType === MEDIA_CHANNEL.SOCIAL;
4144

4245
// Compute button text based on conditions
43-
// Extension mode (EPDN): accept button is visible but disabled → show "Ringing..."
44-
// WebRTC mode (Desktop): accept button is visible and enabled → show "Accept"
45-
const acceptText =
46-
accept.isVisible && isTaskIncoming ? (isTelephony && !accept.isEnabled ? 'Ringing...' : 'Accept') : undefined;
46+
// Extension mode (any call): accept visible but disabled → show "Ringing..."
47+
// Desktop/WebRTC outdial: accept visible but disabled → show "Accept" (auto-answer handles it)
48+
// Desktop/WebRTC inbound: accept visible and enabled → show "Accept"
49+
const showRinging = isTelephony && !accept.isEnabled && !(isBrowser && isOutdial);
50+
const acceptText = accept.isVisible && isTaskIncoming ? (showRinging ? 'Ringing...' : 'Accept') : undefined;
4751

4852
const declineText = decline.isVisible && isTaskIncoming ? 'Decline' : undefined;
4953

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -159,6 +159,7 @@ export type IncomingTaskComponentProps = Pick<TaskProps, 'accept' | 'reject' | '
159159
acceptControl?: {isVisible: boolean; isEnabled: boolean};
160160
declineControl?: {isVisible: boolean; isEnabled: boolean};
161161
isDeclineButtonEnabled?: boolean;
162+
isBrowser?: boolean;
162163
};
163164

164165
export type TaskListComponentProps = Pick<
@@ -167,6 +168,7 @@ export type TaskListComponentProps = Pick<
167168
> &
168169
Partial<Pick<TaskProps, 'currentTask' | 'taskList'>> & {
169170
isDeclineButtonEnabled?: boolean;
171+
isBrowser?: boolean;
170172
};
171173

172174
/**

packages/contact-center/task/src/IncomingTask/index.tsx

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,13 +9,14 @@ import {IncomingTaskProps} from '../task.types';
99

1010
const IncomingTaskInternal: React.FunctionComponent<IncomingTaskProps> = observer(
1111
({incomingTask, onAccepted, onRejected}) => {
12-
const {logger, isDeclineButtonEnabled} = store;
12+
const {logger, isDeclineButtonEnabled, deviceType} = store;
1313
const result = useIncomingTask({incomingTask, onAccepted, onRejected, logger});
1414

1515
const props = {
1616
...result,
1717
logger,
1818
isDeclineButtonEnabled,
19+
isBrowser: deviceType === 'BROWSER',
1920
};
2021

2122
return <IncomingTaskComponent {...props} />;

packages/contact-center/task/src/TaskList/index.tsx

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ import {TaskListProps} from '../task.types';
99

1010
const TaskListInternal: React.FunctionComponent<TaskListProps> = observer(
1111
({onTaskAccepted, onTaskDeclined, onTaskSelected}) => {
12-
const {cc, taskList, currentTask, logger, agentId, isDeclineButtonEnabled} = store;
12+
const {cc, taskList, currentTask, logger, agentId, isDeclineButtonEnabled, deviceType} = store;
1313

1414
const result = useTaskList({cc, logger, taskList, onTaskAccepted, onTaskDeclined, onTaskSelected});
1515
const props = {
@@ -18,6 +18,7 @@ const TaskListInternal: React.FunctionComponent<TaskListProps> = observer(
1818
logger,
1919
agentId,
2020
isDeclineButtonEnabled,
21+
isBrowser: deviceType === 'BROWSER',
2122
};
2223

2324
return <TaskListComponent {...props} />;

packages/contact-center/task/src/helper.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -196,6 +196,7 @@ export const useIncomingTask = (props: UseTaskProps) => {
196196
store.setTaskCallback(TASK_EVENTS.TASK_END, taskRejectCallback, incomingTask?.data.interactionId);
197197
store.setTaskCallback(TASK_EVENTS.TASK_REJECT, taskRejectCallback, incomingTask?.data.interactionId);
198198
store.setTaskCallback(TASK_EVENTS.TASK_CONSULT_END, taskRejectCallback, incomingTask?.data.interactionId);
199+
store.setTaskCallback(TASK_EVENTS.TASK_OUTDIAL_FAILED, taskRejectCallback, incomingTask?.data.interactionId);
199200

200201
return () => {
201202
try {
@@ -208,6 +209,11 @@ export const useIncomingTask = (props: UseTaskProps) => {
208209
store.removeTaskCallback(TASK_EVENTS.TASK_END, taskRejectCallback, incomingTask?.data.interactionId);
209210
store.removeTaskCallback(TASK_EVENTS.TASK_REJECT, taskRejectCallback, incomingTask?.data.interactionId);
210211
store.removeTaskCallback(TASK_EVENTS.TASK_CONSULT_END, taskRejectCallback, incomingTask?.data.interactionId);
212+
store.removeTaskCallback(
213+
TASK_EVENTS.TASK_OUTDIAL_FAILED,
214+
taskRejectCallback,
215+
incomingTask?.data.interactionId
216+
);
211217
} catch (error) {
212218
logger?.error(`CC-Widgets: Task: Error in useIncomingTask cleanup - ${error.message}`, {
213219
module: 'useIncomingTask',

0 commit comments

Comments
 (0)