@webex/contact-center 3.12.0-task-refactor.5 → 3.12.0-task-refactor.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (30) hide show
  1. package/dist/services/task/TaskUtils.js +8 -6
  2. package/dist/services/task/TaskUtils.js.map +1 -1
  3. package/dist/services/task/state-machine/TaskStateMachine.js +72 -14
  4. package/dist/services/task/state-machine/TaskStateMachine.js.map +1 -1
  5. package/dist/services/task/state-machine/actions.js +85 -13
  6. package/dist/services/task/state-machine/actions.js.map +1 -1
  7. package/dist/services/task/state-machine/guards.js +35 -0
  8. package/dist/services/task/state-machine/guards.js.map +1 -1
  9. package/dist/services/task/state-machine/uiControlsComputer.js +72 -7
  10. package/dist/services/task/state-machine/uiControlsComputer.js.map +1 -1
  11. package/dist/services/task/voice/Voice.js +1 -1
  12. package/dist/services/task/voice/Voice.js.map +1 -1
  13. package/dist/types/services/task/state-machine/TaskStateMachine.d.ts +60 -8
  14. package/dist/types/services/task/state-machine/guards.d.ts +5 -0
  15. package/dist/webex.js +1 -1
  16. package/package.json +1 -1
  17. package/src/services/task/TaskUtils.ts +8 -6
  18. package/src/services/task/state-machine/TaskStateMachine.ts +95 -16
  19. package/src/services/task/state-machine/actions.ts +148 -24
  20. package/src/services/task/state-machine/guards.ts +46 -0
  21. package/src/services/task/state-machine/uiControlsComputer.ts +163 -9
  22. package/src/services/task/voice/Voice.ts +4 -1
  23. package/test/unit/spec/services/WebCallingService.ts +7 -1
  24. package/test/unit/spec/services/task/TaskUtils.ts +16 -0
  25. package/test/unit/spec/services/task/state-machine/TaskStateMachine.ts +512 -0
  26. package/test/unit/spec/services/task/state-machine/guards.ts +88 -0
  27. package/test/unit/spec/services/task/state-machine/uiControlsComputer.ts +1000 -7
  28. package/test/unit/spec/services/task/voice/Voice.ts +20 -0
  29. package/umd/contact-center.min.js +2 -2
  30. package/umd/contact-center.min.js.map +1 -1
@@ -106,13 +106,16 @@ function computeVoiceInteractionUIControls(state, context, config, fallbackTaskD
106
106
  const isConferencing = state === _constants.TaskState.CONFERENCING;
107
107
  const isWrappingUp = state === _constants.TaskState.WRAPPING_UP;
108
108
  const selfInMainCall = Boolean(selfAgentId) && Boolean(mainCallId) && Boolean(interaction?.media?.[mainCallId]?.participants?.includes(selfAgentId));
109
+ const consultMedia = Object.values(interaction?.media ?? {}).find(media => media?.mediaResourceId === taskData?.consultMediaResourceId || media?.mType === 'consult');
110
+ const selfParticipant = selfAgentId ? interaction?.participants?.[selfAgentId] : null;
111
+ const selfInConsultCall = Boolean(selfAgentId) && Boolean(consultMedia?.participants?.includes(selfAgentId));
109
112
  const conferenceActive = isConferencing || conferenceFromBackend || consultFromConference;
110
113
  // Treat consult initiator as "in conference" even if mainCall participant list lags while consulting.
111
114
  const inConference = conferenceActive && (isConferencing || selfInMainCall || consultInitiator);
112
115
 
113
116
  // Check if this is a consulted agent (must be after isConsulting is computed).
114
- const isSoleAgentOnCall = participantCount <= 1 && !isConsulting && !inConference;
115
- const isConsulted = inConference || isSoleAgentOnCall ? false : (0, _TaskUtils.getIsConsultedAgentForControls)(taskData, context, isConsulting);
117
+ const isSoleAgentOnCall = participantCount <= 1 && selfInMainCall && !isConsulting && !inConference;
118
+ const isConsulted = inConference || isSoleAgentOnCall ? false : (0, _TaskUtils.getIsConsultedAgentForControls)(taskData, context, isConsulting) || !consultInitiator && (selfParticipant?.isConsulted === true || selfParticipant?.consultState === 'consulting');
116
119
 
117
120
  // Active call = can perform call operations
118
121
  const isActive = state === _constants.TaskState.CONNECTED || state === _constants.TaskState.HELD || state === _constants.TaskState.HOLD_INITIATING || state === _constants.TaskState.RESUME_INITIATING || isConsulting || isConferencing;
@@ -122,8 +125,33 @@ function computeVoiceInteractionUIControls(state, context, config, fallbackTaskD
122
125
  const hasFullControls = !isConsulted || consultInitiator || inConference || isWrappingUp;
123
126
  const consultOwnedBySelf = consultInitiator || Boolean(selfAgentId) && taskData?.consultingAgentId === selfAgentId;
124
127
  const hasConsultMedia = Boolean(taskData?.consultMediaResourceId || Object.values(interaction?.media ?? {}).some(media => media?.mType === 'consult'));
128
+ const selfConsultPendingOnConsultMedia = selfParticipant?.consultState === 'consultInitiated' && !taskData?.isConsulted && hasConsultMedia;
129
+ const ownerParticipant = interaction?.owner ? interaction.participants?.[interaction.owner] : undefined;
130
+ const otherAgentConsultInProgress = Boolean(interaction?.participants && Object.values(interaction.participants).some(participant => {
131
+ if (!participant || participant.hasLeft) return false;
132
+ if (participant.id === selfAgentId) return false;
133
+ if (participant.pType !== 'AGENT') return false;
134
+ return participant.consultState === 'consultInitiated' || participant.consultState === 'consultReserved' || participant.consultState === 'consulting' || participant.currentState === 'consulting';
135
+ }));
136
+ const isHydratedConferenceConsultPending = inConference && selfConsultPendingOnConsultMedia && !consultDestinationAgentJoined;
125
137
  const hasParallelConsultLeg = consultOwnedBySelf && !isConsulting && !isConsulted && (consultInProgress || consultCallHeld || hasConsultMedia);
138
+ const activeLegForConferenceConsult = consultCallHeld ? 'main' : 'consult';
139
+ const isCurrentLegActive = currentLeg === activeLegForConferenceConsult;
140
+ const isConferenceConsultTransferContext = inConference && consultInitiator && hasConsultMedia && isConsultDestinationReady;
126
141
  const consultLegOnHold = isConsulting && consultCallHeld;
142
+ const callProcessingDetails = interaction?.callProcessingDetails;
143
+ const conferenceHoldParticipant = callProcessingDetails?.conferenceHoldParticipant === true || callProcessingDetails?.conferenceHoldParticipant === 'true';
144
+ const postDeclineHeldMainLeg = consultInitiator && !consultDestinationAgentJoined && isHeld && inConference && conferenceHoldParticipant;
145
+ const postConsultCompletedHeldMainLeg = selfParticipant?.consultState === 'consultCompleted' && isHeld && inConference && !isConsulting;
146
+ const nonOwnerPostConsultCompletedHeldMainLeg = isHeld && inConference && !isConsulting && !consultInitiator && Boolean(selfAgentId) && Boolean(interaction?.owner) && selfAgentId !== interaction?.owner && ownerParticipant?.consultState === 'consultCompleted';
147
+ const isConsultPendingBeforeJoin = selfParticipant?.consultState === 'consultInitiated' && !consultDestinationAgentJoined;
148
+ const hideExitConferenceWhileConsultPending = currentLeg === 'main' && inConference && isConsultPendingBeforeJoin && (consultFromConference || consultInitiator || taskData?.type === 'AgentConsultCreated' || consultInProgress || isConsulting);
149
+ const hideExitConferenceDuringActiveConsultFromConference = inConference && consultInitiator && consultDestinationAgentJoined && (isConsulting || taskData?.type === 'AgentConsulting' || selfParticipant?.consultState === 'consulting');
150
+ const hideExitConferenceOnMainLegForEpDnConsultFromConference = currentLeg === 'main' && inConference && consultFromConference && consultInitiator && (isConsulting || consultInProgress || taskData?.type === 'AgentConsultCreated' || taskData?.type === 'AgentConsulting' || selfParticipant?.consultState === 'consultInitiated' || selfParticipant?.consultState === 'consulting');
151
+ const forceHeldPostConsultControls = !hideExitConferenceWhileConsultPending && (postDeclineHeldMainLeg || postConsultCompletedHeldMainLeg);
152
+ const selfOnConsultLeg = selfParticipant?.consultState === 'consulting' || selfParticipant?.currentState === 'consulting';
153
+ const showMainLegConferenceControlsDuringConsult = currentLeg === 'main' && inConference && consultInProgress && !selfOnConsultLeg;
154
+ const allowHeldMainLegControlsForNonInitiator = showMainLegConferenceControlsDuringConsult && !isHydratedConferenceConsultPending;
127
155
  return {
128
156
  // Accept/Decline: Voice tasks in offered state
129
157
  // Desktop/WebRTC + inbound: accept enabled (agent manually accepts)
@@ -140,6 +168,7 @@ function computeVoiceInteractionUIControls(state, context, config, fallbackTaskD
140
168
  // Hold: visible in connected/held/conference, disabled in conference/consulting
141
169
  hold: (() => {
142
170
  if (!hasFullControls) return DISABLED;
171
+ if (forceHeldPostConsultControls) return VISIBLE_ENABLED;
143
172
  if (consultOwnedBySelf && (isConsulting || hasParallelConsultLeg || consultCallHeld)) {
144
173
  return DISABLED;
145
174
  }
@@ -156,6 +185,8 @@ function computeVoiceInteractionUIControls(state, context, config, fallbackTaskD
156
185
  mute: (() => {
157
186
  if (!isWebrtc) return DISABLED;
158
187
  if (isWrappingUp) return DISABLED;
188
+ if (currentLeg === 'consult' && !selfInConsultCall) return DISABLED;
189
+ if ((isConsulting || hasParallelConsultLeg) && !isCurrentLegActive) return VISIBLE_DISABLED;
159
190
  if (isConsulting) return VISIBLE_ENABLED;
160
191
  if (isConnected || isHeld || isConferencing) {
161
192
  if (inConference) return VISIBLE_ENABLED;
@@ -165,6 +196,9 @@ function computeVoiceInteractionUIControls(state, context, config, fallbackTaskD
165
196
  })(),
166
197
  // End: varies by state; during consulting only on main leg (consult held)
167
198
  end: (() => {
199
+ if (allowHeldMainLegControlsForNonInitiator) return VISIBLE_ENABLED;
200
+ if (showMainLegConferenceControlsDuringConsult) return VISIBLE_DISABLED;
201
+ if (isHydratedConferenceConsultPending && currentLeg === 'main') return VISIBLE_DISABLED;
168
202
  if (!config.isEndTaskEnabled) return DISABLED;
169
203
  if (hasParallelConsultLeg) {
170
204
  return isConnected && isEpDnConsult ? VISIBLE_ENABLED : VISIBLE_DISABLED;
@@ -175,6 +209,7 @@ function computeVoiceInteractionUIControls(state, context, config, fallbackTaskD
175
209
  }
176
210
  if (inConference) {
177
211
  if (isConsulted) return DISABLED;
212
+ if (forceHeldPostConsultControls) return VISIBLE_DISABLED;
178
213
  if (consultInProgress) return VISIBLE_DISABLED;
179
214
  return isWrappingUp ? VISIBLE_DISABLED : VISIBLE_ENABLED;
180
215
  }
@@ -184,6 +219,11 @@ function computeVoiceInteractionUIControls(state, context, config, fallbackTaskD
184
219
  })(),
185
220
  // Transfer: connected/held/conference
186
221
  transfer: (() => {
222
+ if (isHydratedConferenceConsultPending) return VISIBLE_DISABLED;
223
+ if (isConferenceConsultTransferContext && currentLeg === 'main' && isCurrentLegActive) {
224
+ return DISABLED;
225
+ }
226
+ if (inConference && isConsulting && consultInitiator) return DISABLED;
187
227
  if (hasParallelConsultLeg) {
188
228
  if (!customerPresent) return DISABLED;
189
229
  if (state === _constants.TaskState.CONNECTED) return VISIBLE_ENABLED;
@@ -207,6 +247,7 @@ function computeVoiceInteractionUIControls(state, context, config, fallbackTaskD
207
247
  // Consult: connected/held/conference when conditions met
208
248
  consult: (() => {
209
249
  const isConnectedOrHeld = state === _constants.TaskState.CONNECTED || state === _constants.TaskState.HELD;
250
+ if (inConference && nonOwnerPostConsultCompletedHeldMainLeg) return VISIBLE_DISABLED;
210
251
  if (hasParallelConsultLeg) return DISABLED;
211
252
  if (!hasFullControls || !(isConnectedOrHeld || inConference)) {
212
253
  return DISABLED;
@@ -217,7 +258,7 @@ function computeVoiceInteractionUIControls(state, context, config, fallbackTaskD
217
258
  // Pending conference (only self agent): consult disabled
218
259
  if (participantCount <= 1) return VISIBLE_DISABLED;
219
260
  // Real conference: consult enabled if conditions met
220
- const canFromConference = !maxParticipants && customerPresent && !consultInProgress && !isConsulting;
261
+ const canFromConference = !maxParticipants && customerPresent && !consultInProgress && !otherAgentConsultInProgress && !isConsulting;
221
262
  return {
222
263
  isVisible: true,
223
264
  isEnabled: canFromConference
@@ -263,6 +304,7 @@ function computeVoiceInteractionUIControls(state, context, config, fallbackTaskD
263
304
  // Conference: during consulting, enabled on both legs when agent joined
264
305
  // Label changes based on leg: "Conference" on main leg, "Merge" on consult leg
265
306
  conference: (() => {
307
+ if (isHydratedConferenceConsultPending && currentLeg === 'main') return VISIBLE_DISABLED;
266
308
  if (hasParallelConsultLeg) {
267
309
  if (!customerPresent) return DISABLED;
268
310
  if (state === _constants.TaskState.CONNECTED) {
@@ -281,21 +323,34 @@ function computeVoiceInteractionUIControls(state, context, config, fallbackTaskD
281
323
  wrapup: isWrappingUp ? VISIBLE_ENABLED : DISABLED,
282
324
  // ExitConference: in conference with multiple agents in main call
283
325
  exitConference: (() => {
326
+ if (hideExitConferenceWhileConsultPending) return DISABLED;
327
+ if (hideExitConferenceOnMainLegForEpDnConsultFromConference) return DISABLED;
328
+ if (allowHeldMainLegControlsForNonInitiator) return VISIBLE_ENABLED;
329
+ if (showMainLegConferenceControlsDuringConsult) return VISIBLE_DISABLED;
330
+ if (hideExitConferenceDuringActiveConsultFromConference) return DISABLED;
331
+ if (forceHeldPostConsultControls) return VISIBLE_DISABLED;
284
332
  if (isConsulted && !isConferencing) return DISABLED;
285
333
  if (!inConference) return DISABLED;
286
334
  if (participantCount <= 1) return DISABLED;
335
+ if (consultInProgress) return VISIBLE_DISABLED;
287
336
  const consultingFromConference = consultInitiator && isConsulting && conferenceFromBackend;
288
337
  return consultingFromConference ? VISIBLE_DISABLED : VISIBLE_ENABLED;
289
338
  })(),
290
339
  // TransferConference: in conference with active consult, owner consulting from conference
291
340
  transferConference: (() => {
292
- if (hasParallelConsultLeg || consultLegOnHold) return DISABLED;
293
- if (!inConference || !isConsulting) return DISABLED;
341
+ if (isConferenceConsultTransferContext && !isCurrentLegActive) return VISIBLE_DISABLED;
342
+ const consultLegTransferAvailable = currentLeg === 'consult' && inConference && consultInitiator && hasConsultMedia;
343
+ const selfConsultingOnParticipantState = selfParticipant?.consultState === 'consulting';
344
+ const conferenceTransferAvailable = consultLegTransferAvailable || inConference && consultInitiator && hasConsultMedia && (isConsulting || consultInProgress || selfConsultingOnParticipantState);
345
+ if (consultLegOnHold) return DISABLED;
346
+ if (hasParallelConsultLeg && !conferenceTransferAvailable) return DISABLED;
347
+ if (!conferenceTransferAvailable && (!inConference || !isConsulting)) return DISABLED;
294
348
  if (!consultInitiator || isConsulted) return DISABLED;
295
349
  return isConsultDestinationReady ? VISIBLE_ENABLED : VISIBLE_DISABLED;
296
350
  })(),
297
351
  // MergeToConference: mirrors conference control, enabled on both legs
298
352
  mergeToConference: (() => {
353
+ if (isHydratedConferenceConsultPending && currentLeg === 'consult') return VISIBLE_DISABLED;
299
354
  if (!isConsulting || !consultInitiator) return DISABLED;
300
355
  if (!customerPresent) return VISIBLE_DISABLED;
301
356
  if (consultLegOnHold) return VISIBLE_DISABLED;
@@ -303,6 +358,7 @@ function computeVoiceInteractionUIControls(state, context, config, fallbackTaskD
303
358
  })(),
304
359
  // Switch: visible only on the currently active leg
305
360
  switch: (() => {
361
+ if (isHydratedConferenceConsultPending && currentLeg === 'consult') return VISIBLE_DISABLED;
306
362
  if (!customerPresent && hasParallelConsultLeg) return DISABLED;
307
363
  if (currentLeg === 'consult') {
308
364
  if (!isConsulting || !consultInitiator || consultCallHeld) return DISABLED;
@@ -357,7 +413,10 @@ function getVoiceLegState(currentState, context, config, fallbackTaskData) {
357
413
  const isConsultingState = currentState === _constants.TaskState.CONSULTING || currentState === _constants.TaskState.CONSULT_INITIATING || currentState === _constants.TaskState.CONF_INITIATING;
358
414
  const consultOwnedBySelf = context.consultInitiator || Boolean(selfAgentId) && taskData?.consultingAgentId === selfAgentId;
359
415
  const hasConsultMedia = Boolean(taskData?.consultMediaResourceId || Object.values(interaction?.media ?? {}).some(media => media?.mType === 'consult'));
360
- const hasConsultLeg = Boolean(consultOwnedBySelf && !taskData?.isConsulted && !interaction?.isTerminated && (consultInProgress || isConsultingState || context.consultCallHeld || hasConsultMedia));
416
+ const selfParticipant = selfAgentId ? interaction?.participants?.[selfAgentId] : null;
417
+ const selfConsultPendingOnConsultMedia = selfParticipant?.consultState === 'consultInitiated' && !taskData?.isConsulted && hasConsultMedia;
418
+ const selfConsultingOnConsultMedia = selfParticipant?.consultState === 'consulting' && hasConsultMedia;
419
+ const hasConsultLeg = Boolean(!interaction?.isTerminated && (consultOwnedBySelf && !taskData?.isConsulted || selfConsultingOnConsultMedia || selfConsultPendingOnConsultMedia) && (consultInProgress || isConsultingState || context.consultCallHeld || hasConsultMedia));
361
420
  if (!hasConsultLeg) {
362
421
  return {
363
422
  hasConsultLeg: false,
@@ -366,10 +425,16 @@ function getVoiceLegState(currentState, context, config, fallbackTaskData) {
366
425
  consultState: _constants.TaskState.CONSULTING
367
426
  };
368
427
  }
428
+ let mainState = _constants.TaskState.HELD;
429
+ if (currentState === _constants.TaskState.CONFERENCING) {
430
+ mainState = _constants.TaskState.CONFERENCING;
431
+ } else if (context.consultCallHeld) {
432
+ mainState = _constants.TaskState.CONNECTED;
433
+ }
369
434
  return {
370
435
  hasConsultLeg: true,
371
436
  activeLeg: context.consultCallHeld ? 'main' : 'consult',
372
- mainState: context.consultCallHeld ? _constants.TaskState.CONNECTED : _constants.TaskState.HELD,
437
+ mainState,
373
438
  consultState: isConsultingState ? currentState : _constants.TaskState.CONSULTING
374
439
  };
375
440
  }
@@ -1 +1 @@
1
- {"version":3,"names":["_types","require","_constants","_TaskUtils","DISABLED","isVisible","isEnabled","VISIBLE_ENABLED","VISIBLE_DISABLED","getDefaultInteractionUIControls","accept","decline","hold","mute","end","transfer","consult","consultTransfer","endConsult","recording","conference","wrapup","exitConference","transferConference","mergeToConference","switch","createTaskUIControls","main","activeLeg","getDefaultUIControls","computeVoiceInteractionUIControls","state","context","config","fallbackTaskData","currentLeg","TaskState","IDLE","taskData","interaction","mainCallId","mainInteractionId","interactionId","isWebrtc","voiceVariant","VOICE_VARIANT","WEBRTC","isOutdial","outboundType","serverHold","getServerHoldStateForControls","customerInCall","getIsCustomerInCall","customerPresent","Boolean","participants","Object","values","some","p","pType","hasLeft","participantCount","getConferenceParticipantsCount","maxParticipants","MAX_PARTICIPANTS_IN_MULTIPARTY_CONFERENCE","selfAgentId","agentId","consultInProgress","getIsConsultInProgressForConferenceControls","conferenceFromBackend","getIsConferenceInProgress","consultInitiator","consultDestinationAgentJoined","consultDestinationType","consultCallHeld","consultFromConference","recordingControlsAvailable","isEpDnConsult","isConsultDestinationReady","stateImpliesHeld","HELD","RESUME_INITIATING","stateImpliesConnected","CONNECTED","HOLD_INITIATING","isHeld","isConnected","isConsulting","CONSULTING","CONSULT_INITIATING","CONF_INITIATING","isConferencing","CONFERENCING","isWrappingUp","WRAPPING_UP","selfInMainCall","media","includes","conferenceActive","inConference","isSoleAgentOnCall","isConsulted","getIsConsultedAgentForControls","isActive","hasFullControls","consultOwnedBySelf","consultingAgentId","hasConsultMedia","consultMediaResourceId","mType","hasParallelConsultLeg","consultLegOnHold","OFFERED","isTerminated","canHold","isEndTaskEnabled","isConnectedOrHeld","canFromConference","canFromConnected","isEndConsultEnabled","isRecordingEnabled","consultingFromConference","computeDigitalInteractionUIControls","getVoiceLegState","currentState","hasConsultLeg","mainState","consultState","isConsultingState","computeUIControls","TERMINATED","COMPLETED","uiControlConfig","channelType","TASK_CHANNEL_TYPE","VOICE","mainControls","consultControls","DIGITAL","haveInteractionUIControlsChanged","previous","next","keys","key","prev","curr","haveUIControlsChanged"],"sources":["uiControlsComputer.ts"],"sourcesContent":["/**\n * UI Controls Computer - Centralized logic for computing UI control states\n */\n\nimport {\n InteractionUIControls,\n TASK_CHANNEL_TYPE,\n TaskData,\n TaskUILeg,\n TaskUIControls,\n VOICE_VARIANT,\n} from '../types';\nimport {TaskContext, UIControlConfig} from './types';\nimport {TaskState, MAX_PARTICIPANTS_IN_MULTIPARTY_CONFERENCE} from './constants';\nimport {\n getIsCustomerInCall,\n getConferenceParticipantsCount,\n getIsConferenceInProgress,\n getIsConsultInProgressForConferenceControls,\n getIsConsultedAgentForControls,\n getServerHoldStateForControls,\n} from '../TaskUtils';\n\nconst DISABLED = {isVisible: false, isEnabled: false} as const;\nconst VISIBLE_ENABLED = {isVisible: true, isEnabled: true} as const;\nconst VISIBLE_DISABLED = {isVisible: true, isEnabled: false} as const;\n\nfunction getDefaultInteractionUIControls(): InteractionUIControls {\n return {\n accept: DISABLED,\n decline: DISABLED,\n hold: DISABLED,\n mute: DISABLED,\n end: DISABLED,\n transfer: DISABLED,\n consult: DISABLED,\n consultTransfer: DISABLED,\n endConsult: DISABLED,\n recording: DISABLED,\n conference: DISABLED,\n wrapup: DISABLED,\n exitConference: DISABLED,\n transferConference: DISABLED,\n mergeToConference: DISABLED,\n switch: DISABLED,\n };\n}\n\nfunction createTaskUIControls(\n main: InteractionUIControls,\n consult: InteractionUIControls,\n activeLeg: TaskUILeg\n): TaskUIControls {\n return {\n main,\n consult,\n activeLeg,\n };\n}\n\nexport function getDefaultUIControls(): TaskUIControls {\n return createTaskUIControls(\n getDefaultInteractionUIControls(),\n getDefaultInteractionUIControls(),\n 'main'\n );\n}\n\nfunction computeVoiceInteractionUIControls(\n state: TaskState,\n context: TaskContext,\n config: UIControlConfig,\n fallbackTaskData?: TaskData,\n currentLeg: TaskUILeg = 'main'\n): InteractionUIControls {\n // Early exit for idle\n if (state === TaskState.IDLE) {\n return getDefaultInteractionUIControls();\n }\n\n // Essential data\n const taskData = context.taskData ?? fallbackTaskData ?? null;\n const interaction = taskData?.interaction;\n const mainCallId = interaction?.mainInteractionId || taskData?.interactionId;\n const isWebrtc = config.voiceVariant === VOICE_VARIANT.WEBRTC;\n const isOutdial = interaction?.outboundType === 'OUTDIAL';\n const serverHold = getServerHoldStateForControls(context, mainCallId, fallbackTaskData);\n\n // Backend-derived checks\n const customerInCall =\n interaction && mainCallId ? getIsCustomerInCall(interaction, mainCallId) : false;\n // EP-DN/secondary legs can have incomplete media participant lists; fall back to participants map.\n const customerPresent =\n customerInCall ||\n Boolean(\n interaction &&\n interaction.participants &&\n Object.values(interaction.participants).some(\n (p: any) => p?.pType === 'Customer' && !p?.hasLeft\n )\n );\n const participantCount =\n interaction && mainCallId ? getConferenceParticipantsCount(interaction, mainCallId) : 0;\n const maxParticipants = participantCount >= MAX_PARTICIPANTS_IN_MULTIPARTY_CONFERENCE;\n const selfAgentId = config.agentId ?? taskData?.agentId;\n const consultInProgress = getIsConsultInProgressForConferenceControls(\n interaction,\n mainCallId,\n selfAgentId\n );\n const conferenceFromBackend = taskData ? getIsConferenceInProgress(taskData) : false;\n // Note: ownership is used by some controls; keep computations local to those controls\n\n // Context flags (set by state machine actions)\n const {\n consultInitiator,\n consultDestinationAgentJoined,\n consultDestinationType,\n consultCallHeld,\n consultFromConference,\n } = context;\n const {recordingControlsAvailable} = context;\n\n // EP_DN consults are \"ready\" as soon as the consult is created (EP accepts routing immediately).\n // Backend sends destinationType as 'EP-DN'; SDK method uses 'entryPoint' — check both.\n const isEpDnConsult =\n consultDestinationType === 'entryPoint' || consultDestinationType === ('EP-DN' as any);\n const isConsultDestinationReady = consultDestinationAgentJoined || isEpDnConsult;\n\n const stateImpliesHeld = state === TaskState.HELD || state === TaskState.RESUME_INITIATING;\n const stateImpliesConnected =\n state === TaskState.CONNECTED || state === TaskState.HOLD_INITIATING;\n const isHeld = stateImpliesHeld || serverHold === true;\n const isConnected = stateImpliesConnected || (!stateImpliesHeld && serverHold === false);\n\n // State categories for cleaner logic\n const isConsulting =\n state === TaskState.CONSULTING ||\n state === TaskState.CONSULT_INITIATING ||\n state === TaskState.CONF_INITIATING;\n const isConferencing = state === TaskState.CONFERENCING;\n const isWrappingUp = state === TaskState.WRAPPING_UP;\n const selfInMainCall =\n Boolean(selfAgentId) &&\n Boolean(mainCallId) &&\n Boolean(interaction?.media?.[mainCallId]?.participants?.includes(selfAgentId as string));\n const conferenceActive = isConferencing || conferenceFromBackend || consultFromConference;\n // Treat consult initiator as \"in conference\" even if mainCall participant list lags while consulting.\n const inConference = conferenceActive && (isConferencing || selfInMainCall || consultInitiator);\n\n // Check if this is a consulted agent (must be after isConsulting is computed).\n const isSoleAgentOnCall = participantCount <= 1 && !isConsulting && !inConference;\n const isConsulted =\n inConference || isSoleAgentOnCall\n ? false\n : getIsConsultedAgentForControls(taskData, context, isConsulting);\n\n // Active call = can perform call operations\n const isActive =\n state === TaskState.CONNECTED ||\n state === TaskState.HELD ||\n state === TaskState.HOLD_INITIATING ||\n state === TaskState.RESUME_INITIATING ||\n isConsulting ||\n isConferencing;\n\n // Consulted agents have limited controls until they're in conference or wrapup\n // Use inConference (not isConferencing) so controls remain enabled after state downgrade\n const hasFullControls = !isConsulted || consultInitiator || inConference || isWrappingUp;\n const consultOwnedBySelf =\n consultInitiator || (Boolean(selfAgentId) && taskData?.consultingAgentId === selfAgentId);\n const hasConsultMedia = Boolean(\n taskData?.consultMediaResourceId ||\n Object.values(interaction?.media ?? {}).some((media: any) => media?.mType === 'consult')\n );\n const hasParallelConsultLeg =\n consultOwnedBySelf &&\n !isConsulting &&\n !isConsulted &&\n (consultInProgress || consultCallHeld || hasConsultMedia);\n const consultLegOnHold = isConsulting && consultCallHeld;\n\n return {\n // Accept/Decline: Voice tasks in offered state\n // Desktop/WebRTC + inbound: accept enabled (agent manually accepts)\n // Desktop/WebRTC + outdial: accept disabled (auto-answer handles it; Widgets show \"Accept\" disabled)\n // Extension mode (non-WebRTC): accept disabled (Widgets show \"Ringing...\")\n accept:\n state === TaskState.OFFERED && !interaction?.isTerminated\n ? {isVisible: true, isEnabled: isWebrtc && !isOutdial}\n : DISABLED,\n decline: (() => {\n if (!isWebrtc || state !== TaskState.OFFERED || interaction?.isTerminated) return DISABLED;\n\n return isOutdial ? VISIBLE_DISABLED : VISIBLE_ENABLED;\n })(),\n\n // Hold: visible in connected/held/conference, disabled in conference/consulting\n hold: (() => {\n if (!hasFullControls) return DISABLED;\n if (consultOwnedBySelf && (isConsulting || hasParallelConsultLeg || consultCallHeld)) {\n return DISABLED;\n }\n if (hasParallelConsultLeg) return DISABLED;\n if (state === TaskState.OFFERED) return DISABLED;\n if (isWrappingUp) return DISABLED;\n // Visibility: connected || held || inConference\n if (!(isConnected || isHeld || inConference)) return DISABLED;\n // Enabled: (connected || held) && !inConference && !isConsulting\n const canHold = (isConnected || isHeld) && !inConference && !isConsulting;\n\n return canHold ? VISIBLE_ENABLED : VISIBLE_DISABLED;\n })(),\n\n // Mute: WebRTC only, active calls; hidden entirely during wrapup\n mute: (() => {\n if (!isWebrtc) return DISABLED;\n if (isWrappingUp) return DISABLED;\n if (isConsulting) return VISIBLE_ENABLED;\n\n if (isConnected || isHeld || isConferencing) {\n if (inConference) return VISIBLE_ENABLED;\n\n return isHeld ? VISIBLE_DISABLED : VISIBLE_ENABLED;\n }\n\n return DISABLED;\n })(),\n\n // End: varies by state; during consulting only on main leg (consult held)\n end: (() => {\n if (!config.isEndTaskEnabled) return DISABLED;\n if (hasParallelConsultLeg) {\n return isConnected && isEpDnConsult ? VISIBLE_ENABLED : VISIBLE_DISABLED;\n }\n\n if (isConsulting) {\n if (currentLeg === 'consult' && consultCallHeld) return DISABLED;\n\n return consultInitiator && consultCallHeld ? VISIBLE_ENABLED : DISABLED;\n }\n\n if (inConference) {\n if (isConsulted) return DISABLED;\n\n if (consultInProgress) return VISIBLE_DISABLED;\n\n return isWrappingUp ? VISIBLE_DISABLED : VISIBLE_ENABLED;\n }\n if (!hasFullControls) return DISABLED;\n if (isActive) return isHeld || isWrappingUp ? VISIBLE_DISABLED : VISIBLE_ENABLED;\n\n return DISABLED;\n })(),\n\n // Transfer: connected/held/conference\n transfer: (() => {\n if (hasParallelConsultLeg) {\n if (!customerPresent) return DISABLED;\n if (state === TaskState.CONNECTED) return VISIBLE_ENABLED;\n if (state === TaskState.HELD) return VISIBLE_DISABLED;\n }\n if (isConsulting) {\n if (!consultInitiator) return DISABLED;\n if (!customerPresent) return VISIBLE_DISABLED;\n if (consultLegOnHold) return VISIBLE_DISABLED;\n\n return isConsultDestinationReady ? VISIBLE_ENABLED : VISIBLE_DISABLED;\n }\n if (!hasFullControls) return DISABLED;\n if (inConference) {\n // Real conference (multiple agents): transfer is hidden\n // Pending conference (only self agent): transfer remains available\n return participantCount > 1 ? DISABLED : VISIBLE_ENABLED;\n }\n if (state === TaskState.CONNECTED || state === TaskState.HELD) return VISIBLE_ENABLED;\n\n return DISABLED;\n })(),\n\n // Consult: connected/held/conference when conditions met\n consult: (() => {\n const isConnectedOrHeld = state === TaskState.CONNECTED || state === TaskState.HELD;\n\n if (hasParallelConsultLeg) return DISABLED;\n if (!hasFullControls || !(isConnectedOrHeld || inConference)) {\n return DISABLED;\n }\n\n // In conference: behavior depends on whether it's a real multi-agent conference\n if (inConference) {\n // Pending conference (only self agent): consult disabled\n if (participantCount <= 1) return VISIBLE_DISABLED;\n // Real conference: consult enabled if conditions met\n const canFromConference =\n !maxParticipants && customerPresent && !consultInProgress && !isConsulting;\n\n return {isVisible: true, isEnabled: canFromConference};\n }\n\n // Enabled conditions for connected/held\n const canFromConnected =\n !maxParticipants && customerPresent && !consultInProgress && !isConsulted;\n\n return {isVisible: true, isEnabled: canFromConnected};\n })(),\n\n // ConsultTransfer: always hidden (use transfer button)\n consultTransfer: DISABLED,\n\n // EndConsult: during consulting\n endConsult: (() => {\n if (!isConsulting) return DISABLED;\n if (isConsulted && isConferencing) return DISABLED;\n if (!isConsulted && isConferencing && !(consultInitiator && conferenceFromBackend)) {\n return DISABLED;\n }\n\n return {isVisible: true, isEnabled: consultInitiator || config.isEndConsultEnabled};\n })(),\n\n // Recording: connected/held, hidden in real conference, visible in pending conference\n recording: (() => {\n if (!recordingControlsAvailable || !config.isRecordingEnabled) return DISABLED;\n if (!hasFullControls || isConsulting) return DISABLED;\n if (inConference) {\n // Real conference (multiple agents): recording hidden\n // Pending conference (only self agent): recording available\n return participantCount > 1 ? DISABLED : VISIBLE_ENABLED;\n }\n if (hasParallelConsultLeg && !customerPresent) return DISABLED;\n if (state === TaskState.CONNECTED || state === TaskState.HELD) {\n return VISIBLE_ENABLED;\n }\n\n return DISABLED;\n })(),\n\n // Conference: during consulting, enabled on both legs when agent joined\n // Label changes based on leg: \"Conference\" on main leg, \"Merge\" on consult leg\n conference: (() => {\n if (hasParallelConsultLeg) {\n if (!customerPresent) return DISABLED;\n if (state === TaskState.CONNECTED) {\n return maxParticipants ? VISIBLE_DISABLED : VISIBLE_ENABLED;\n }\n if (state === TaskState.HELD) return VISIBLE_DISABLED;\n\n return DISABLED;\n }\n if (!hasFullControls || !isConsulting) return DISABLED;\n if (!consultInitiator) return DISABLED;\n if (!customerPresent) return VISIBLE_DISABLED;\n if (consultLegOnHold) return VISIBLE_DISABLED;\n\n return isConsultDestinationReady && !maxParticipants ? VISIBLE_ENABLED : VISIBLE_DISABLED;\n })(),\n\n // Wrapup: wrapping up state\n wrapup: isWrappingUp ? VISIBLE_ENABLED : DISABLED,\n\n // ExitConference: in conference with multiple agents in main call\n exitConference: (() => {\n if (isConsulted && !isConferencing) return DISABLED;\n if (!inConference) return DISABLED;\n if (participantCount <= 1) return DISABLED;\n const consultingFromConference = consultInitiator && isConsulting && conferenceFromBackend;\n\n return consultingFromConference ? VISIBLE_DISABLED : VISIBLE_ENABLED;\n })(),\n\n // TransferConference: in conference with active consult, owner consulting from conference\n transferConference: (() => {\n if (hasParallelConsultLeg || consultLegOnHold) return DISABLED;\n if (!inConference || !isConsulting) return DISABLED;\n if (!consultInitiator || isConsulted) return DISABLED;\n\n return isConsultDestinationReady ? VISIBLE_ENABLED : VISIBLE_DISABLED;\n })(),\n\n // MergeToConference: mirrors conference control, enabled on both legs\n mergeToConference: (() => {\n if (!isConsulting || !consultInitiator) return DISABLED;\n if (!customerPresent) return VISIBLE_DISABLED;\n if (consultLegOnHold) return VISIBLE_DISABLED;\n\n return isConsultDestinationReady && !maxParticipants ? VISIBLE_ENABLED : VISIBLE_DISABLED;\n })(),\n\n // Switch: visible only on the currently active leg\n switch: (() => {\n if (!customerPresent && hasParallelConsultLeg) return DISABLED;\n if (currentLeg === 'consult') {\n if (!isConsulting || !consultInitiator || consultCallHeld) return DISABLED;\n if (!customerPresent) return VISIBLE_DISABLED;\n\n return isConsultDestinationReady ? VISIBLE_ENABLED : VISIBLE_DISABLED;\n }\n\n if (hasParallelConsultLeg && state === TaskState.CONNECTED) {\n return isConsultDestinationReady ? VISIBLE_ENABLED : VISIBLE_DISABLED;\n }\n\n return DISABLED;\n })(),\n };\n}\n\nfunction computeDigitalInteractionUIControls(\n state: TaskState,\n context: TaskContext,\n fallbackTaskData?: TaskData\n): InteractionUIControls {\n const taskData = context.taskData ?? fallbackTaskData ?? null;\n const isTerminated = taskData?.interaction?.isTerminated ?? false;\n\n const isConnected = state === TaskState.CONNECTED;\n const isWrappingUp = state === TaskState.WRAPPING_UP;\n\n return {\n accept: state === TaskState.OFFERED ? VISIBLE_ENABLED : DISABLED,\n decline: DISABLED,\n hold: DISABLED,\n mute: DISABLED,\n end: isConnected && !isWrappingUp ? VISIBLE_ENABLED : DISABLED,\n transfer: isConnected && !isWrappingUp ? VISIBLE_ENABLED : DISABLED,\n consult: DISABLED,\n consultTransfer: DISABLED,\n endConsult: DISABLED,\n recording: DISABLED,\n conference: DISABLED,\n wrapup: isTerminated || isWrappingUp ? VISIBLE_ENABLED : DISABLED,\n exitConference: DISABLED,\n transferConference: DISABLED,\n mergeToConference: DISABLED,\n switch: DISABLED,\n };\n}\n\nfunction getVoiceLegState(\n currentState: TaskState,\n context: TaskContext,\n config: UIControlConfig,\n fallbackTaskData?: TaskData\n): {hasConsultLeg: boolean; activeLeg: TaskUILeg; mainState: TaskState; consultState: TaskState} {\n if (currentState === TaskState.WRAPPING_UP) {\n return {\n hasConsultLeg: false,\n activeLeg: 'main',\n mainState: currentState,\n consultState: TaskState.CONSULTING,\n };\n }\n\n const taskData = context.taskData ?? fallbackTaskData ?? null;\n const interaction = taskData?.interaction;\n const mainCallId = interaction?.mainInteractionId || taskData?.interactionId;\n const selfAgentId = config.agentId ?? taskData?.agentId;\n const consultInProgress = getIsConsultInProgressForConferenceControls(\n interaction,\n mainCallId,\n selfAgentId\n );\n const isConsultingState =\n currentState === TaskState.CONSULTING ||\n currentState === TaskState.CONSULT_INITIATING ||\n currentState === TaskState.CONF_INITIATING;\n const consultOwnedBySelf =\n context.consultInitiator ||\n (Boolean(selfAgentId) && taskData?.consultingAgentId === selfAgentId);\n const hasConsultMedia = Boolean(\n taskData?.consultMediaResourceId ||\n Object.values(interaction?.media ?? {}).some((media: any) => media?.mType === 'consult')\n );\n const hasConsultLeg = Boolean(\n consultOwnedBySelf &&\n !taskData?.isConsulted &&\n !interaction?.isTerminated &&\n (consultInProgress || isConsultingState || context.consultCallHeld || hasConsultMedia)\n );\n\n if (!hasConsultLeg) {\n return {\n hasConsultLeg: false,\n activeLeg: 'main',\n mainState: currentState,\n consultState: TaskState.CONSULTING,\n };\n }\n\n return {\n hasConsultLeg: true,\n activeLeg: context.consultCallHeld ? 'main' : 'consult',\n mainState: context.consultCallHeld ? TaskState.CONNECTED : TaskState.HELD,\n consultState: isConsultingState ? currentState : TaskState.CONSULTING,\n };\n}\n\nexport function computeUIControls(\n currentState: TaskState,\n context: TaskContext,\n fallbackTaskData?: TaskData\n): TaskUIControls {\n if (currentState === TaskState.TERMINATED || currentState === TaskState.COMPLETED) {\n return getDefaultUIControls();\n }\n\n switch (context.uiControlConfig.channelType) {\n case TASK_CHANNEL_TYPE.VOICE: {\n const {hasConsultLeg, activeLeg, mainState, consultState} = getVoiceLegState(\n currentState,\n context,\n context.uiControlConfig,\n fallbackTaskData\n );\n\n const mainControls = computeVoiceInteractionUIControls(\n mainState,\n context,\n context.uiControlConfig,\n fallbackTaskData,\n 'main'\n );\n const consultControls = hasConsultLeg\n ? computeVoiceInteractionUIControls(\n consultState,\n context,\n context.uiControlConfig,\n fallbackTaskData,\n 'consult'\n )\n : getDefaultInteractionUIControls();\n\n return createTaskUIControls(mainControls, consultControls, activeLeg);\n }\n case TASK_CHANNEL_TYPE.DIGITAL:\n return createTaskUIControls(\n computeDigitalInteractionUIControls(currentState, context, fallbackTaskData),\n getDefaultInteractionUIControls(),\n 'main'\n );\n default:\n return getDefaultUIControls();\n }\n}\n\nfunction haveInteractionUIControlsChanged(\n previous: InteractionUIControls,\n next: InteractionUIControls\n): boolean {\n return (Object.keys(next) as (keyof InteractionUIControls)[]).some((key) => {\n const prev = previous[key];\n const curr = next[key];\n\n return prev.isVisible !== curr.isVisible || prev.isEnabled !== curr.isEnabled;\n });\n}\n\nexport function haveUIControlsChanged(\n previous: TaskUIControls | undefined,\n next: TaskUIControls\n): boolean {\n if (!previous) return true;\n\n return (\n previous.activeLeg !== next.activeLeg ||\n haveInteractionUIControlsChanged(previous.main, next.main) ||\n haveInteractionUIControlsChanged(previous.consult, next.consult)\n );\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["_types","require","_constants","_TaskUtils","DISABLED","isVisible","isEnabled","VISIBLE_ENABLED","VISIBLE_DISABLED","getDefaultInteractionUIControls","accept","decline","hold","mute","end","transfer","consult","consultTransfer","endConsult","recording","conference","wrapup","exitConference","transferConference","mergeToConference","switch","createTaskUIControls","main","activeLeg","getDefaultUIControls","computeVoiceInteractionUIControls","state","context","config","fallbackTaskData","currentLeg","TaskState","IDLE","taskData","interaction","mainCallId","mainInteractionId","interactionId","isWebrtc","voiceVariant","VOICE_VARIANT","WEBRTC","isOutdial","outboundType","serverHold","getServerHoldStateForControls","customerInCall","getIsCustomerInCall","customerPresent","Boolean","participants","Object","values","some","p","pType","hasLeft","participantCount","getConferenceParticipantsCount","maxParticipants","MAX_PARTICIPANTS_IN_MULTIPARTY_CONFERENCE","selfAgentId","agentId","consultInProgress","getIsConsultInProgressForConferenceControls","conferenceFromBackend","getIsConferenceInProgress","consultInitiator","consultDestinationAgentJoined","consultDestinationType","consultCallHeld","consultFromConference","recordingControlsAvailable","isEpDnConsult","isConsultDestinationReady","stateImpliesHeld","HELD","RESUME_INITIATING","stateImpliesConnected","CONNECTED","HOLD_INITIATING","isHeld","isConnected","isConsulting","CONSULTING","CONSULT_INITIATING","CONF_INITIATING","isConferencing","CONFERENCING","isWrappingUp","WRAPPING_UP","selfInMainCall","media","includes","consultMedia","find","mediaResourceId","consultMediaResourceId","mType","selfParticipant","selfInConsultCall","conferenceActive","inConference","isSoleAgentOnCall","isConsulted","getIsConsultedAgentForControls","consultState","isActive","hasFullControls","consultOwnedBySelf","consultingAgentId","hasConsultMedia","selfConsultPendingOnConsultMedia","ownerParticipant","owner","undefined","otherAgentConsultInProgress","participant","id","currentState","isHydratedConferenceConsultPending","hasParallelConsultLeg","activeLegForConferenceConsult","isCurrentLegActive","isConferenceConsultTransferContext","consultLegOnHold","callProcessingDetails","conferenceHoldParticipant","postDeclineHeldMainLeg","postConsultCompletedHeldMainLeg","nonOwnerPostConsultCompletedHeldMainLeg","isConsultPendingBeforeJoin","hideExitConferenceWhileConsultPending","type","hideExitConferenceDuringActiveConsultFromConference","hideExitConferenceOnMainLegForEpDnConsultFromConference","forceHeldPostConsultControls","selfOnConsultLeg","showMainLegConferenceControlsDuringConsult","allowHeldMainLegControlsForNonInitiator","OFFERED","isTerminated","canHold","isEndTaskEnabled","isConnectedOrHeld","canFromConference","canFromConnected","isEndConsultEnabled","isRecordingEnabled","consultingFromConference","consultLegTransferAvailable","selfConsultingOnParticipantState","conferenceTransferAvailable","computeDigitalInteractionUIControls","getVoiceLegState","hasConsultLeg","mainState","isConsultingState","selfConsultingOnConsultMedia","computeUIControls","TERMINATED","COMPLETED","uiControlConfig","channelType","TASK_CHANNEL_TYPE","VOICE","mainControls","consultControls","DIGITAL","haveInteractionUIControlsChanged","previous","next","keys","key","prev","curr","haveUIControlsChanged"],"sources":["uiControlsComputer.ts"],"sourcesContent":["/**\n * UI Controls Computer - Centralized logic for computing UI control states\n */\n\nimport {\n InteractionUIControls,\n TASK_CHANNEL_TYPE,\n TaskData,\n TaskUILeg,\n TaskUIControls,\n VOICE_VARIANT,\n} from '../types';\nimport {TaskContext, UIControlConfig} from './types';\nimport {TaskState, MAX_PARTICIPANTS_IN_MULTIPARTY_CONFERENCE} from './constants';\nimport {\n getIsCustomerInCall,\n getConferenceParticipantsCount,\n getIsConferenceInProgress,\n getIsConsultInProgressForConferenceControls,\n getIsConsultedAgentForControls,\n getServerHoldStateForControls,\n} from '../TaskUtils';\n\nconst DISABLED = {isVisible: false, isEnabled: false} as const;\nconst VISIBLE_ENABLED = {isVisible: true, isEnabled: true} as const;\nconst VISIBLE_DISABLED = {isVisible: true, isEnabled: false} as const;\n\nfunction getDefaultInteractionUIControls(): InteractionUIControls {\n return {\n accept: DISABLED,\n decline: DISABLED,\n hold: DISABLED,\n mute: DISABLED,\n end: DISABLED,\n transfer: DISABLED,\n consult: DISABLED,\n consultTransfer: DISABLED,\n endConsult: DISABLED,\n recording: DISABLED,\n conference: DISABLED,\n wrapup: DISABLED,\n exitConference: DISABLED,\n transferConference: DISABLED,\n mergeToConference: DISABLED,\n switch: DISABLED,\n };\n}\n\nfunction createTaskUIControls(\n main: InteractionUIControls,\n consult: InteractionUIControls,\n activeLeg: TaskUILeg\n): TaskUIControls {\n return {\n main,\n consult,\n activeLeg,\n };\n}\n\nexport function getDefaultUIControls(): TaskUIControls {\n return createTaskUIControls(\n getDefaultInteractionUIControls(),\n getDefaultInteractionUIControls(),\n 'main'\n );\n}\n\nfunction computeVoiceInteractionUIControls(\n state: TaskState,\n context: TaskContext,\n config: UIControlConfig,\n fallbackTaskData?: TaskData,\n currentLeg: TaskUILeg = 'main'\n): InteractionUIControls {\n // Early exit for idle\n if (state === TaskState.IDLE) {\n return getDefaultInteractionUIControls();\n }\n\n // Essential data\n const taskData = context.taskData ?? fallbackTaskData ?? null;\n const interaction = taskData?.interaction;\n const mainCallId = interaction?.mainInteractionId || taskData?.interactionId;\n const isWebrtc = config.voiceVariant === VOICE_VARIANT.WEBRTC;\n const isOutdial = interaction?.outboundType === 'OUTDIAL';\n const serverHold = getServerHoldStateForControls(context, mainCallId, fallbackTaskData);\n\n // Backend-derived checks\n const customerInCall =\n interaction && mainCallId ? getIsCustomerInCall(interaction, mainCallId) : false;\n // EP-DN/secondary legs can have incomplete media participant lists; fall back to participants map.\n const customerPresent =\n customerInCall ||\n Boolean(\n interaction &&\n interaction.participants &&\n Object.values(interaction.participants).some(\n (p: any) => p?.pType === 'Customer' && !p?.hasLeft\n )\n );\n const participantCount =\n interaction && mainCallId ? getConferenceParticipantsCount(interaction, mainCallId) : 0;\n const maxParticipants = participantCount >= MAX_PARTICIPANTS_IN_MULTIPARTY_CONFERENCE;\n const selfAgentId = config.agentId ?? taskData?.agentId;\n const consultInProgress = getIsConsultInProgressForConferenceControls(\n interaction,\n mainCallId,\n selfAgentId\n );\n const conferenceFromBackend = taskData ? getIsConferenceInProgress(taskData) : false;\n // Note: ownership is used by some controls; keep computations local to those controls\n\n // Context flags (set by state machine actions)\n const {\n consultInitiator,\n consultDestinationAgentJoined,\n consultDestinationType,\n consultCallHeld,\n consultFromConference,\n } = context;\n const {recordingControlsAvailable} = context;\n\n // EP_DN consults are \"ready\" as soon as the consult is created (EP accepts routing immediately).\n // Backend sends destinationType as 'EP-DN'; SDK method uses 'entryPoint' — check both.\n const isEpDnConsult =\n consultDestinationType === 'entryPoint' || consultDestinationType === ('EP-DN' as any);\n const isConsultDestinationReady = consultDestinationAgentJoined || isEpDnConsult;\n\n const stateImpliesHeld = state === TaskState.HELD || state === TaskState.RESUME_INITIATING;\n const stateImpliesConnected =\n state === TaskState.CONNECTED || state === TaskState.HOLD_INITIATING;\n const isHeld = stateImpliesHeld || serverHold === true;\n const isConnected = stateImpliesConnected || (!stateImpliesHeld && serverHold === false);\n\n // State categories for cleaner logic\n const isConsulting =\n state === TaskState.CONSULTING ||\n state === TaskState.CONSULT_INITIATING ||\n state === TaskState.CONF_INITIATING;\n const isConferencing = state === TaskState.CONFERENCING;\n const isWrappingUp = state === TaskState.WRAPPING_UP;\n const selfInMainCall =\n Boolean(selfAgentId) &&\n Boolean(mainCallId) &&\n Boolean(interaction?.media?.[mainCallId]?.participants?.includes(selfAgentId as string));\n const consultMedia = Object.values(interaction?.media ?? {}).find(\n (media: any) =>\n media?.mediaResourceId === taskData?.consultMediaResourceId || media?.mType === 'consult'\n ) as {participants?: string[]} | undefined;\n const selfParticipant = selfAgentId ? interaction?.participants?.[selfAgentId] : null;\n const selfInConsultCall =\n Boolean(selfAgentId) && Boolean(consultMedia?.participants?.includes(selfAgentId as string));\n const conferenceActive = isConferencing || conferenceFromBackend || consultFromConference;\n // Treat consult initiator as \"in conference\" even if mainCall participant list lags while consulting.\n const inConference = conferenceActive && (isConferencing || selfInMainCall || consultInitiator);\n\n // Check if this is a consulted agent (must be after isConsulting is computed).\n const isSoleAgentOnCall =\n participantCount <= 1 && selfInMainCall && !isConsulting && !inConference;\n const isConsulted =\n inConference || isSoleAgentOnCall\n ? false\n : getIsConsultedAgentForControls(taskData, context, isConsulting) ||\n (!consultInitiator &&\n (selfParticipant?.isConsulted === true ||\n selfParticipant?.consultState === 'consulting'));\n\n // Active call = can perform call operations\n const isActive =\n state === TaskState.CONNECTED ||\n state === TaskState.HELD ||\n state === TaskState.HOLD_INITIATING ||\n state === TaskState.RESUME_INITIATING ||\n isConsulting ||\n isConferencing;\n\n // Consulted agents have limited controls until they're in conference or wrapup\n // Use inConference (not isConferencing) so controls remain enabled after state downgrade\n const hasFullControls = !isConsulted || consultInitiator || inConference || isWrappingUp;\n const consultOwnedBySelf =\n consultInitiator || (Boolean(selfAgentId) && taskData?.consultingAgentId === selfAgentId);\n const hasConsultMedia = Boolean(\n taskData?.consultMediaResourceId ||\n Object.values(interaction?.media ?? {}).some((media: any) => media?.mType === 'consult')\n );\n const selfConsultPendingOnConsultMedia =\n selfParticipant?.consultState === 'consultInitiated' &&\n !taskData?.isConsulted &&\n hasConsultMedia;\n const ownerParticipant = interaction?.owner\n ? interaction.participants?.[interaction.owner]\n : undefined;\n const otherAgentConsultInProgress = Boolean(\n interaction?.participants &&\n Object.values(interaction.participants).some((participant: any) => {\n if (!participant || participant.hasLeft) return false;\n if (participant.id === selfAgentId) return false;\n if (participant.pType !== 'AGENT') return false;\n\n return (\n participant.consultState === 'consultInitiated' ||\n participant.consultState === 'consultReserved' ||\n participant.consultState === 'consulting' ||\n participant.currentState === 'consulting'\n );\n })\n );\n const isHydratedConferenceConsultPending =\n inConference && selfConsultPendingOnConsultMedia && !consultDestinationAgentJoined;\n const hasParallelConsultLeg =\n consultOwnedBySelf &&\n !isConsulting &&\n !isConsulted &&\n (consultInProgress || consultCallHeld || hasConsultMedia);\n const activeLegForConferenceConsult = consultCallHeld ? 'main' : 'consult';\n const isCurrentLegActive = currentLeg === activeLegForConferenceConsult;\n const isConferenceConsultTransferContext =\n inConference && consultInitiator && hasConsultMedia && isConsultDestinationReady;\n const consultLegOnHold = isConsulting && consultCallHeld;\n const callProcessingDetails = interaction?.callProcessingDetails as\n | {conferenceHoldParticipant?: boolean | string}\n | undefined;\n const conferenceHoldParticipant =\n callProcessingDetails?.conferenceHoldParticipant === true ||\n callProcessingDetails?.conferenceHoldParticipant === 'true';\n const postDeclineHeldMainLeg =\n consultInitiator &&\n !consultDestinationAgentJoined &&\n isHeld &&\n inConference &&\n conferenceHoldParticipant;\n const postConsultCompletedHeldMainLeg =\n selfParticipant?.consultState === 'consultCompleted' && isHeld && inConference && !isConsulting;\n const nonOwnerPostConsultCompletedHeldMainLeg =\n isHeld &&\n inConference &&\n !isConsulting &&\n !consultInitiator &&\n Boolean(selfAgentId) &&\n Boolean(interaction?.owner) &&\n selfAgentId !== interaction?.owner &&\n ownerParticipant?.consultState === 'consultCompleted';\n const isConsultPendingBeforeJoin =\n selfParticipant?.consultState === 'consultInitiated' && !consultDestinationAgentJoined;\n const hideExitConferenceWhileConsultPending =\n currentLeg === 'main' &&\n inConference &&\n isConsultPendingBeforeJoin &&\n (consultFromConference ||\n consultInitiator ||\n taskData?.type === 'AgentConsultCreated' ||\n consultInProgress ||\n isConsulting);\n const hideExitConferenceDuringActiveConsultFromConference =\n inConference &&\n consultInitiator &&\n consultDestinationAgentJoined &&\n (isConsulting ||\n taskData?.type === 'AgentConsulting' ||\n selfParticipant?.consultState === 'consulting');\n const hideExitConferenceOnMainLegForEpDnConsultFromConference =\n currentLeg === 'main' &&\n inConference &&\n consultFromConference &&\n consultInitiator &&\n (isConsulting ||\n consultInProgress ||\n taskData?.type === 'AgentConsultCreated' ||\n taskData?.type === 'AgentConsulting' ||\n selfParticipant?.consultState === 'consultInitiated' ||\n selfParticipant?.consultState === 'consulting');\n const forceHeldPostConsultControls =\n !hideExitConferenceWhileConsultPending &&\n (postDeclineHeldMainLeg || postConsultCompletedHeldMainLeg);\n const selfOnConsultLeg =\n selfParticipant?.consultState === 'consulting' ||\n selfParticipant?.currentState === 'consulting';\n const showMainLegConferenceControlsDuringConsult =\n currentLeg === 'main' && inConference && consultInProgress && !selfOnConsultLeg;\n const allowHeldMainLegControlsForNonInitiator =\n showMainLegConferenceControlsDuringConsult && !isHydratedConferenceConsultPending;\n\n return {\n // Accept/Decline: Voice tasks in offered state\n // Desktop/WebRTC + inbound: accept enabled (agent manually accepts)\n // Desktop/WebRTC + outdial: accept disabled (auto-answer handles it; Widgets show \"Accept\" disabled)\n // Extension mode (non-WebRTC): accept disabled (Widgets show \"Ringing...\")\n accept:\n state === TaskState.OFFERED && !interaction?.isTerminated\n ? {isVisible: true, isEnabled: isWebrtc && !isOutdial}\n : DISABLED,\n decline: (() => {\n if (!isWebrtc || state !== TaskState.OFFERED || interaction?.isTerminated) return DISABLED;\n\n return isOutdial ? VISIBLE_DISABLED : VISIBLE_ENABLED;\n })(),\n\n // Hold: visible in connected/held/conference, disabled in conference/consulting\n hold: (() => {\n if (!hasFullControls) return DISABLED;\n if (forceHeldPostConsultControls) return VISIBLE_ENABLED;\n if (consultOwnedBySelf && (isConsulting || hasParallelConsultLeg || consultCallHeld)) {\n return DISABLED;\n }\n if (hasParallelConsultLeg) return DISABLED;\n if (state === TaskState.OFFERED) return DISABLED;\n if (isWrappingUp) return DISABLED;\n // Visibility: connected || held || inConference\n if (!(isConnected || isHeld || inConference)) return DISABLED;\n // Enabled: (connected || held) && !inConference && !isConsulting\n const canHold = (isConnected || isHeld) && !inConference && !isConsulting;\n\n return canHold ? VISIBLE_ENABLED : VISIBLE_DISABLED;\n })(),\n\n // Mute: WebRTC only, active calls; hidden entirely during wrapup\n mute: (() => {\n if (!isWebrtc) return DISABLED;\n if (isWrappingUp) return DISABLED;\n if (currentLeg === 'consult' && !selfInConsultCall) return DISABLED;\n if ((isConsulting || hasParallelConsultLeg) && !isCurrentLegActive) return VISIBLE_DISABLED;\n if (isConsulting) return VISIBLE_ENABLED;\n\n if (isConnected || isHeld || isConferencing) {\n if (inConference) return VISIBLE_ENABLED;\n\n return isHeld ? VISIBLE_DISABLED : VISIBLE_ENABLED;\n }\n\n return DISABLED;\n })(),\n\n // End: varies by state; during consulting only on main leg (consult held)\n end: (() => {\n if (allowHeldMainLegControlsForNonInitiator) return VISIBLE_ENABLED;\n if (showMainLegConferenceControlsDuringConsult) return VISIBLE_DISABLED;\n if (isHydratedConferenceConsultPending && currentLeg === 'main') return VISIBLE_DISABLED;\n if (!config.isEndTaskEnabled) return DISABLED;\n if (hasParallelConsultLeg) {\n return isConnected && isEpDnConsult ? VISIBLE_ENABLED : VISIBLE_DISABLED;\n }\n\n if (isConsulting) {\n if (currentLeg === 'consult' && consultCallHeld) return DISABLED;\n\n return consultInitiator && consultCallHeld ? VISIBLE_ENABLED : DISABLED;\n }\n\n if (inConference) {\n if (isConsulted) return DISABLED;\n if (forceHeldPostConsultControls) return VISIBLE_DISABLED;\n\n if (consultInProgress) return VISIBLE_DISABLED;\n\n return isWrappingUp ? VISIBLE_DISABLED : VISIBLE_ENABLED;\n }\n if (!hasFullControls) return DISABLED;\n if (isActive) return isHeld || isWrappingUp ? VISIBLE_DISABLED : VISIBLE_ENABLED;\n\n return DISABLED;\n })(),\n\n // Transfer: connected/held/conference\n transfer: (() => {\n if (isHydratedConferenceConsultPending) return VISIBLE_DISABLED;\n if (isConferenceConsultTransferContext && currentLeg === 'main' && isCurrentLegActive) {\n return DISABLED;\n }\n if (inConference && isConsulting && consultInitiator) return DISABLED;\n if (hasParallelConsultLeg) {\n if (!customerPresent) return DISABLED;\n if (state === TaskState.CONNECTED) return VISIBLE_ENABLED;\n if (state === TaskState.HELD) return VISIBLE_DISABLED;\n }\n if (isConsulting) {\n if (!consultInitiator) return DISABLED;\n if (!customerPresent) return VISIBLE_DISABLED;\n if (consultLegOnHold) return VISIBLE_DISABLED;\n\n return isConsultDestinationReady ? VISIBLE_ENABLED : VISIBLE_DISABLED;\n }\n if (!hasFullControls) return DISABLED;\n if (inConference) {\n // Real conference (multiple agents): transfer is hidden\n // Pending conference (only self agent): transfer remains available\n return participantCount > 1 ? DISABLED : VISIBLE_ENABLED;\n }\n if (state === TaskState.CONNECTED || state === TaskState.HELD) return VISIBLE_ENABLED;\n\n return DISABLED;\n })(),\n\n // Consult: connected/held/conference when conditions met\n consult: (() => {\n const isConnectedOrHeld = state === TaskState.CONNECTED || state === TaskState.HELD;\n\n if (inConference && nonOwnerPostConsultCompletedHeldMainLeg) return VISIBLE_DISABLED;\n if (hasParallelConsultLeg) return DISABLED;\n if (!hasFullControls || !(isConnectedOrHeld || inConference)) {\n return DISABLED;\n }\n\n // In conference: behavior depends on whether it's a real multi-agent conference\n if (inConference) {\n // Pending conference (only self agent): consult disabled\n if (participantCount <= 1) return VISIBLE_DISABLED;\n // Real conference: consult enabled if conditions met\n const canFromConference =\n !maxParticipants &&\n customerPresent &&\n !consultInProgress &&\n !otherAgentConsultInProgress &&\n !isConsulting;\n\n return {isVisible: true, isEnabled: canFromConference};\n }\n\n // Enabled conditions for connected/held\n const canFromConnected =\n !maxParticipants && customerPresent && !consultInProgress && !isConsulted;\n\n return {isVisible: true, isEnabled: canFromConnected};\n })(),\n\n // ConsultTransfer: always hidden (use transfer button)\n consultTransfer: DISABLED,\n\n // EndConsult: during consulting\n endConsult: (() => {\n if (!isConsulting) return DISABLED;\n if (isConsulted && isConferencing) return DISABLED;\n if (!isConsulted && isConferencing && !(consultInitiator && conferenceFromBackend)) {\n return DISABLED;\n }\n\n return {isVisible: true, isEnabled: consultInitiator || config.isEndConsultEnabled};\n })(),\n\n // Recording: connected/held, hidden in real conference, visible in pending conference\n recording: (() => {\n if (!recordingControlsAvailable || !config.isRecordingEnabled) return DISABLED;\n if (!hasFullControls || isConsulting) return DISABLED;\n if (inConference) {\n // Real conference (multiple agents): recording hidden\n // Pending conference (only self agent): recording available\n return participantCount > 1 ? DISABLED : VISIBLE_ENABLED;\n }\n if (hasParallelConsultLeg && !customerPresent) return DISABLED;\n if (state === TaskState.CONNECTED || state === TaskState.HELD) {\n return VISIBLE_ENABLED;\n }\n\n return DISABLED;\n })(),\n\n // Conference: during consulting, enabled on both legs when agent joined\n // Label changes based on leg: \"Conference\" on main leg, \"Merge\" on consult leg\n conference: (() => {\n if (isHydratedConferenceConsultPending && currentLeg === 'main') return VISIBLE_DISABLED;\n if (hasParallelConsultLeg) {\n if (!customerPresent) return DISABLED;\n if (state === TaskState.CONNECTED) {\n return maxParticipants ? VISIBLE_DISABLED : VISIBLE_ENABLED;\n }\n if (state === TaskState.HELD) return VISIBLE_DISABLED;\n\n return DISABLED;\n }\n if (!hasFullControls || !isConsulting) return DISABLED;\n if (!consultInitiator) return DISABLED;\n if (!customerPresent) return VISIBLE_DISABLED;\n if (consultLegOnHold) return VISIBLE_DISABLED;\n\n return isConsultDestinationReady && !maxParticipants ? VISIBLE_ENABLED : VISIBLE_DISABLED;\n })(),\n\n // Wrapup: wrapping up state\n wrapup: isWrappingUp ? VISIBLE_ENABLED : DISABLED,\n\n // ExitConference: in conference with multiple agents in main call\n exitConference: (() => {\n if (hideExitConferenceWhileConsultPending) return DISABLED;\n if (hideExitConferenceOnMainLegForEpDnConsultFromConference) return DISABLED;\n if (allowHeldMainLegControlsForNonInitiator) return VISIBLE_ENABLED;\n if (showMainLegConferenceControlsDuringConsult) return VISIBLE_DISABLED;\n if (hideExitConferenceDuringActiveConsultFromConference) return DISABLED;\n if (forceHeldPostConsultControls) return VISIBLE_DISABLED;\n if (isConsulted && !isConferencing) return DISABLED;\n if (!inConference) return DISABLED;\n if (participantCount <= 1) return DISABLED;\n if (consultInProgress) return VISIBLE_DISABLED;\n const consultingFromConference = consultInitiator && isConsulting && conferenceFromBackend;\n\n return consultingFromConference ? VISIBLE_DISABLED : VISIBLE_ENABLED;\n })(),\n\n // TransferConference: in conference with active consult, owner consulting from conference\n transferConference: (() => {\n if (isConferenceConsultTransferContext && !isCurrentLegActive) return VISIBLE_DISABLED;\n const consultLegTransferAvailable =\n currentLeg === 'consult' && inConference && consultInitiator && hasConsultMedia;\n const selfConsultingOnParticipantState = selfParticipant?.consultState === 'consulting';\n const conferenceTransferAvailable =\n consultLegTransferAvailable ||\n (inConference &&\n consultInitiator &&\n hasConsultMedia &&\n (isConsulting || consultInProgress || selfConsultingOnParticipantState));\n if (consultLegOnHold) return DISABLED;\n if (hasParallelConsultLeg && !conferenceTransferAvailable) return DISABLED;\n if (!conferenceTransferAvailable && (!inConference || !isConsulting)) return DISABLED;\n if (!consultInitiator || isConsulted) return DISABLED;\n\n return isConsultDestinationReady ? VISIBLE_ENABLED : VISIBLE_DISABLED;\n })(),\n\n // MergeToConference: mirrors conference control, enabled on both legs\n mergeToConference: (() => {\n if (isHydratedConferenceConsultPending && currentLeg === 'consult') return VISIBLE_DISABLED;\n if (!isConsulting || !consultInitiator) return DISABLED;\n if (!customerPresent) return VISIBLE_DISABLED;\n if (consultLegOnHold) return VISIBLE_DISABLED;\n\n return isConsultDestinationReady && !maxParticipants ? VISIBLE_ENABLED : VISIBLE_DISABLED;\n })(),\n\n // Switch: visible only on the currently active leg\n switch: (() => {\n if (isHydratedConferenceConsultPending && currentLeg === 'consult') return VISIBLE_DISABLED;\n if (!customerPresent && hasParallelConsultLeg) return DISABLED;\n if (currentLeg === 'consult') {\n if (!isConsulting || !consultInitiator || consultCallHeld) return DISABLED;\n if (!customerPresent) return VISIBLE_DISABLED;\n\n return isConsultDestinationReady ? VISIBLE_ENABLED : VISIBLE_DISABLED;\n }\n\n if (hasParallelConsultLeg && state === TaskState.CONNECTED) {\n return isConsultDestinationReady ? VISIBLE_ENABLED : VISIBLE_DISABLED;\n }\n\n return DISABLED;\n })(),\n };\n}\n\nfunction computeDigitalInteractionUIControls(\n state: TaskState,\n context: TaskContext,\n fallbackTaskData?: TaskData\n): InteractionUIControls {\n const taskData = context.taskData ?? fallbackTaskData ?? null;\n const isTerminated = taskData?.interaction?.isTerminated ?? false;\n\n const isConnected = state === TaskState.CONNECTED;\n const isWrappingUp = state === TaskState.WRAPPING_UP;\n\n return {\n accept: state === TaskState.OFFERED ? VISIBLE_ENABLED : DISABLED,\n decline: DISABLED,\n hold: DISABLED,\n mute: DISABLED,\n end: isConnected && !isWrappingUp ? VISIBLE_ENABLED : DISABLED,\n transfer: isConnected && !isWrappingUp ? VISIBLE_ENABLED : DISABLED,\n consult: DISABLED,\n consultTransfer: DISABLED,\n endConsult: DISABLED,\n recording: DISABLED,\n conference: DISABLED,\n wrapup: isTerminated || isWrappingUp ? VISIBLE_ENABLED : DISABLED,\n exitConference: DISABLED,\n transferConference: DISABLED,\n mergeToConference: DISABLED,\n switch: DISABLED,\n };\n}\n\nfunction getVoiceLegState(\n currentState: TaskState,\n context: TaskContext,\n config: UIControlConfig,\n fallbackTaskData?: TaskData\n): {hasConsultLeg: boolean; activeLeg: TaskUILeg; mainState: TaskState; consultState: TaskState} {\n if (currentState === TaskState.WRAPPING_UP) {\n return {\n hasConsultLeg: false,\n activeLeg: 'main',\n mainState: currentState,\n consultState: TaskState.CONSULTING,\n };\n }\n\n const taskData = context.taskData ?? fallbackTaskData ?? null;\n const interaction = taskData?.interaction;\n const mainCallId = interaction?.mainInteractionId || taskData?.interactionId;\n const selfAgentId = config.agentId ?? taskData?.agentId;\n const consultInProgress = getIsConsultInProgressForConferenceControls(\n interaction,\n mainCallId,\n selfAgentId\n );\n const isConsultingState =\n currentState === TaskState.CONSULTING ||\n currentState === TaskState.CONSULT_INITIATING ||\n currentState === TaskState.CONF_INITIATING;\n const consultOwnedBySelf =\n context.consultInitiator ||\n (Boolean(selfAgentId) && taskData?.consultingAgentId === selfAgentId);\n const hasConsultMedia = Boolean(\n taskData?.consultMediaResourceId ||\n Object.values(interaction?.media ?? {}).some((media: any) => media?.mType === 'consult')\n );\n const selfParticipant = selfAgentId ? interaction?.participants?.[selfAgentId] : null;\n const selfConsultPendingOnConsultMedia =\n selfParticipant?.consultState === 'consultInitiated' &&\n !taskData?.isConsulted &&\n hasConsultMedia;\n const selfConsultingOnConsultMedia =\n selfParticipant?.consultState === 'consulting' && hasConsultMedia;\n const hasConsultLeg = Boolean(\n !interaction?.isTerminated &&\n ((consultOwnedBySelf && !taskData?.isConsulted) ||\n selfConsultingOnConsultMedia ||\n selfConsultPendingOnConsultMedia) &&\n (consultInProgress || isConsultingState || context.consultCallHeld || hasConsultMedia)\n );\n\n if (!hasConsultLeg) {\n return {\n hasConsultLeg: false,\n activeLeg: 'main',\n mainState: currentState,\n consultState: TaskState.CONSULTING,\n };\n }\n\n let mainState = TaskState.HELD;\n if (currentState === TaskState.CONFERENCING) {\n mainState = TaskState.CONFERENCING;\n } else if (context.consultCallHeld) {\n mainState = TaskState.CONNECTED;\n }\n\n return {\n hasConsultLeg: true,\n activeLeg: context.consultCallHeld ? 'main' : 'consult',\n mainState,\n consultState: isConsultingState ? currentState : TaskState.CONSULTING,\n };\n}\n\nexport function computeUIControls(\n currentState: TaskState,\n context: TaskContext,\n fallbackTaskData?: TaskData\n): TaskUIControls {\n if (currentState === TaskState.TERMINATED || currentState === TaskState.COMPLETED) {\n return getDefaultUIControls();\n }\n\n switch (context.uiControlConfig.channelType) {\n case TASK_CHANNEL_TYPE.VOICE: {\n const {hasConsultLeg, activeLeg, mainState, consultState} = getVoiceLegState(\n currentState,\n context,\n context.uiControlConfig,\n fallbackTaskData\n );\n\n const mainControls = computeVoiceInteractionUIControls(\n mainState,\n context,\n context.uiControlConfig,\n fallbackTaskData,\n 'main'\n );\n const consultControls = hasConsultLeg\n ? computeVoiceInteractionUIControls(\n consultState,\n context,\n context.uiControlConfig,\n fallbackTaskData,\n 'consult'\n )\n : getDefaultInteractionUIControls();\n\n return createTaskUIControls(mainControls, consultControls, activeLeg);\n }\n case TASK_CHANNEL_TYPE.DIGITAL:\n return createTaskUIControls(\n computeDigitalInteractionUIControls(currentState, context, fallbackTaskData),\n getDefaultInteractionUIControls(),\n 'main'\n );\n default:\n return getDefaultUIControls();\n }\n}\n\nfunction haveInteractionUIControlsChanged(\n previous: InteractionUIControls,\n next: InteractionUIControls\n): boolean {\n return (Object.keys(next) as (keyof InteractionUIControls)[]).some((key) => {\n const prev = previous[key];\n const curr = next[key];\n\n return prev.isVisible !== curr.isVisible || prev.isEnabled !== curr.isEnabled;\n });\n}\n\nexport function haveUIControlsChanged(\n previous: TaskUIControls | undefined,\n next: TaskUIControls\n): boolean {\n if (!previous) return true;\n\n return (\n previous.activeLeg !== next.activeLeg ||\n haveInteractionUIControlsChanged(previous.main, next.main) ||\n haveInteractionUIControlsChanged(previous.consult, next.consult)\n );\n}\n"],"mappings":"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","ignoreList":[]}
@@ -117,7 +117,7 @@ class Voice extends _Task.default {
117
117
  });
118
118
  throw error;
119
119
  }
120
- } else if (!state.matches(_stateMachine.TaskState.HELD)) {
120
+ } else if (!state.matches(_stateMachine.TaskState.HELD) && !(state.matches(_stateMachine.TaskState.CONFERENCING) && mediaHoldState === true)) {
121
121
  const error = new Error(`Cannot resume call in current state: ${currentState}`);
122
122
  _loggerProxy.default.error('Resume operation not allowed', {
123
123
  module: _constants.CC_FILE,