This page includes the release notes related directly to Flex UI for versions 1.x.x. You can find release notes for v 2.x.x. here and for updates on other components of Flex Platform visit the Twilio Changelog and select the Flex product.
For detailed description of Flex UI public interfaces with code examples for each Flex UI version, visit our Flex UI API docs.
@twilio/flex-ui@1.34.6
release date January 18, 2024
@twilio/flex-ui@1.34.5
release date November 1, 2023
@twilio/flex-ui@1.34.4
release date September 27, 2023
@twilio/flex-ui@1.34.3
release date August 21, 2023
@twilio/flex-ui@1.34.2
release date July 14, 2023
@twilio/flex-ui@1.34.1
release date June 28, 2023
@twilio/flex-ui@1.34.0
release date Apr 20, 2023
@twilio/flex-ui@1.33.3
release date Feb 21, 2023
@twilio/flex-ui@1.31.3
release date Dec 15, 2022
@twilio/flex-ui@1.33.2
release date Dec 14, 2022
@twilio/flex-ui@1.32.3
release date Dec 14, 2022
@twilio/flex-ui@1.33.1
release date Dec 9, 2022
@twilio/flex-ui@1.32.2
release date Dec 8, 2022
@twilio/flex-ui@1.33.0
release date Nov 21, 2022
@twilio/flex-ui@1.32.1
release date Nov 10, 2022
@twilio/flex-ui@1.32.0
release date Sep 29, 2022
@twilio/flex-ui@1.31.2
release date Jun 28, 2022
@twilio/flex-ui@1.31.1
release date Jun 6, 2022
@twilio/flex-ui@1.31.0
release date May 18, 2022
Degraded mode - now Flex UI will initialize with limited capabilities, even if some of the components like SDK's (TaskRouter, Conversations, Voice or Sync) are down. This allows users to login to Flex even during a partial disruption of services and use the unaffected functionality. Learn more about degraded mode in our docs.
@twilio/flex-ui@1.28.2
release date Feb 07, 2022
@twilio/flex-ui@1.29.3
release date Feb 07, 2022
@twilio/flex-ui@1.30.2
release date Feb 03, 2022
@twilio/flex-ui@1.30.1
release date Jan 17, 2022
@twilio/flex-ui.1.30.0
@twilio/flex-ui@1.29.2
release date Jan 19, 2022
This release contains fixes to our pilot or private beta features.
@twilio/flex-ui@1.29.1
release date Dec 01, 2021
isCallTask
handlebar helper function@twilio/flex-ui@1.29.0
release date Nov 10, 2021
@twilio/flex-ui@1.28.1
release date Oct 19, 2021
@twilio/flex-ui@1.28.0
release date Sep 30, 2021
@twilio/flex-ui@1.27.0
release date Jun 21, 2021
@twilio/flex-ui@1.26.3
release date June 7, 2021
@twilio/flex-ui@1.26.2
release date June 3, 2021
@twilio/flex-ui@1.26.1
release date May 13, 2021
WorkerDirectoryTabs
accepts 2 new default props hiddenWorkerFilter
and hiddenQueryFilter
which are filters that are applied to the list together with the filter applied due to user typing in the search string. For example, you can choose to display and search only agents with available status. To learn more about Transfer directory hidden filters, go to Flex docs.ApplyListFilters
and ResetListFilters
actions are now emitted when the apply or reset button is clicked in TeamsView filters. To learn more about Actions Framework go to our Flex UI Programmability docs.Flex.ErrorManager.processError
and Flex.ErrorManager.createAndProcessError
WorkerDirectoryTabs
can now be accessed directly and not just through WorkerDirectory.Tabs
allow="clipboard-write”
)@twilio/flex-ui@1.26.0
release date May 11, 2021
WorkerDirectoryTabs
accepts 2 new default props hiddenWorkerFilter
and hiddenQueryFilter
which are filters that are applied to the list together with the filter applied due to user typing in the search string. For example, you can choose to display and search only agents with available status. To learn more about Transfer directory hidden filters, go to Flex docs.ApplyListFilters
and ResetListFilters
actions are now emitted when the apply or reset button is clicked in TeamsView filters. To learn more about Actions Framework go to our Flex UI Programmability docs.Flex.ErrorManager.processError
and Flex.ErrorManager.createAndProcessError
WorkerDirectoryTabs
can now be accessed directly and not just through WorkerDirectory.Tabs
allow="clipboard-write”
)@twilio/flex-ui@1.25.4
release date APR 19, 2021
@twilio/flex-ui@1.25.3
release date MAR 31, 2021
@twilio/flex-ui@1.25.2
release date MAR 16, 2021
MaxListenersExceededWarning
in console@twilio/flex-ui@1.25.1
release date FEB 26, 2021
@twilio/flex-ui@1.25.0
release date FEB 24, 2021
Debugger UI allowing users of Flex UI to get error notifications and download report with full error descriptions and logs. Debugger UI can be enabled for your account via a Pre-release Feature Flag
Flex UI programmable interfaces that provide ability to retrieve errors and logs programmatically and implement customized error monitoring and reporting
1import { Monitor } from "@twilio/flex-ui";23Monitor.getErrors(); // returns { errors: [Monitor.FlexErrorJSON] }4Monitor.getLogs(); // returns { logs: 'string' }5
To learn more about Flex UI troubleshooting, Debugger UI and programmatic access to errors and logs, visit our Flex docs and Flex UI API Reference.
WorkersDataTable.defaultProps.filters
API. Learn more about advanced filters in Flex documentation and programmability guide. We encourage you to migrate to the advanced filters that provide greater flexibility for the end users.@twilio/flex-ui@1.24.3
release date FEB 15, 2021
react-select
and emotion
) where importing flex-ui in Jest unit tests could sometimes break@twilio/flex-ui@1.24.2
release date JAN 25, 2021
@twilio/flex-ui@1.23.4
release date JAN 25, 2021
@twilio/flex-ui@1.24.1
release date JAN 14, 2021
@twilio/flex-ui@1.24.0
release date DEC 9, 2020
@twilio/flex-ui@1.23.3
release date DEC 2 2020
@twilio/flex-ui@1.23.2
release date NOV 23 2020
@twilio/flex-ui@1.23.1
release date NOV 16 2020
@twilio/flex-ui@1.23.0
release date NOV 09 2020
enableReduxLogging
flag in AppConfig that will help developers to fine-tune their preferred logging level of redux actionNew versions of dependencies can contain changes in internal APIs that we do not document in release notes. If you're using any undocumented apis of upgraded dependencies, please review your code and update your customizations as needed. Any changes in undocumented api's are not considered breaking changes, however, if you are using them, this might break your customizations.
Example: This version of chat-sdk contains changes in internal API. To access channel attributes, channel.attributes
is supported as per https://media.twiliocdn.com/sdk/js/chat/releases/3.4.0/docs/Channel.html and not channel.state.attributes
.
@twilio/flex-ui@1.22.2
release date OCT 27 2020
@twilio/flex-ui@1.22.1
release date OCT 21 2020
@twilio/flex-ui@1.22.0
release date SEP 16, 2020
TaskCanvas
minimum size reduced to allow splitter interaction on small screens. Now, if window height is less than 600px, there will be 20% of space left for TaskList
http://flex.twilio.com?test=true
.@twilio/flex-ui@1.21.1
release date SEP 15 2020
@twilio/flex-ui@1.21.0
release date AUG 10, 2020
getState()
from within Redux reducer methods to support custom Redux stores.@twilio/flex-ui@1.20.1
release date JUL 1, 2020
errorPage
context-independent@twilio/flex-ui@1.20.0
release date JUN 23, 2020
This version Flex UI API Reference is available here
Image and file sharing for Web Chat channel in Pilot
Hold music
holdMusicUrl
and holdMusicMethod
for HoldCall/HoldParticipant actions to configure a custom hold musicparticipantCallSid
property in their payload, which indicates the voice connection sid in the conference for the participant. Flex does not take that payload into account, but customers overriding these actions can use that property to filter out custom participants. For more details on specific actions, go to Flex UI API referenceError handling improvement
Flex.errorPage
API to render a user-friendly error message screen for errors during Flex initialization. Users will now see details of the error and they can download a report which will provide technical details for troubleshooting.FlexError
- a universal error class that provides unified API to work with Flex exceptions. For more details on FlexError class, go to Flex UI API referenceNotification for signal connectivity issues
FlexEvent.connectionStateChanged
event for both disconnect and reconnect.@twilio/flex-ui@1.19.0
release date APR 27, 2020
Handlebars Dependency Upgrade: Handlebars provides templating for the strings exposed by Flex UI and Flex WebChat UI. In this release we are upgrading Handlebars to 4.7.3 to fix critical security vulnerabilities exposed in previous versions of Handlebars. This may be a breaking change if you use certain undocumented Handlebars features. You can find more information about this change atthe following link.
defaultSortColumn
prop to DataTable
to allow for initial sorting of the table.sortDirection
prop to DataTable.ColumnDefinition
to specify how the data should be sorted first. The value is either "asc" or "desc".theme.DataTable.Header
to customize DataTable
headers. You can specify the root
and clickable
properties.For more information on programmable sorting in Queue Stats View visit Queues View programmability guide
insightsClient
can no longer be broken by incorrect sdkOptions.insights
configuration.QueuesStats.QueuesDataTable.sortable
property. The table can be sorted by any of the default columns. Find out more about Queue Stats View customizations here.TeamsView.defaultProps.filtersEnabled
was removed. Custom code still attempting to use it will not work. To toggle Advance Team View Filters on/off, please use the pilot flag on the feature page https://flex.twilio.com/admin/features. For more info on Advanced Team View Filters, go here.@twilio/flex-ui@1.18.1
release date APR 16, 2020
@twilio/flex-ui@1.17.3
release date APR 14, 2020
@twilio/flex-ui@1.18.0
release date MAR 24, 2020
Release notes updated on April 16th. Added mention of Outbound Dialing and Native Dialpad Public Beta release and Browser notifications bugfix
@twilio/flex-ui@1.18.0
release date MAR 24, 2020
@twilio/flex-ui@1.17.2
release date MAR 23, 2020
@twilio/flex-ui@1.17.1
release date FEB 24, 2020
initialDeviceCheck
from feature flag config. initialDeviceCheck
in Flex UI will respect the feature flag value.@twilio/flex-ui@1.17.0
release date FEB 20, 2020
viewResized
event. This event gets triggered once the window resizes, debounced by 100ms. This will replace selectedViewChanged
for resize events in the next major release. If you rely on selectedViewChanged
for detecting resize events, consider adopting viewResized
.initialDeviceCheck
can be set to false
to prevent this issue.selectedViewChanged
event now gets correctly triggered only once when view changesselectedViewChanged
event now receives a second argument: isSameViewResized
. This Boolean describes whether the view has actually changed or the same view has been resized. isSameViewResized
will be always set to false
once selectedViewChanged
is deprecated for resize events.@twilio/flex-ui@1.16.2
release date JAN 27, 2020
@twilio/flex-ui@1.16.1
release date JAN 14, 2020
Issue with WebChat messages being marked as read
Minor UI bugs with pilot dialpad feature
Removed unwanted CSS parse errors when running unit tests
@twilio/flex-ui@1.15.3
release date JAN 14, 2020
@twilio/flex-ui@1.16.0
release date DEC 17, 2019
Actions Framework
1Actions.invokeAction("SendDTMFDigits", {23sid: "WRXXXXXXXXXXXXXXXXX",45digits: "567"67});
1Actions.replaceAction("HistoricalReporting:view", async (url, original) => {23// implement your own handling of URL or call original(url) to use the original handler45})
Actions.invokeAction("ReloadWindow")
Flex Insights
SendDTMFDigits`` action
instead of calling Voice SDK directly.QueuesDataTable
headers are now localizable with: QueuesStatsHeaderQueueName, QueuesStatsHeaderActiveTasks, QueuesStatsHeaderWaitingTasks, QueuesStatsHeaderLongestWait, QueuesStatsHeaderAgentsActivity.
@twilio/flex-ui@1.15.2
release date DEC 05, 2019
@twilio/flex-ui@1.15.1
release date DEC 01, 2019
@twilio/flex-ui@1.15.0
release date NOV 22, 2019
SetWorkerActivity
, which is invoked when supervisors update a worker's status. Read more about actions here.Actions.invokeAction("SetWorkerActivity", { workerSid: "WKXXXXXXXXXXXXXXXXX", activitySid: "WAXXXXXXXXXXXXXXXXX" })
channel.templates.TaskCanvasTabs.contentTabHeader
for channel specific labels in TaskCanvasTabs
. Now labels of TaskCanvasTabs
can be changed like any other labels. Note, that TaskTabAgentCallLabel
and TaskTabAgentChatLabel
strings are no longer used. Find out more about Task Channel Definition API here and strings templating here.@twilio/flex-ui@1.13.2
release date OCT 31, 2019
@twilio/flex-ui@1.14.1
release date OCT 30, 2019
@twilio/flex-ui@1.13.1
release date OCT 08, 2019
@twilio/flex-ui@1.14.0
release date OCT 07, 2019
Notifications
We introduced browser notification capabilities:
Improvements to Notifications Framework:
Browser notifications can be enabled via a feature flag. Go toversioning page in Flex Admin UI to turn browser notifications on or off.
Find out more about these and other capabilities of Flex Notifications Framework here
Customer presence
TaskHeaderWebChatStatusAccepted
and/or TaskLineWebChatAssigned
. For these templates, you can access the reachability status via helper.chat.isCustomerOnline
.Typing indicator improvements
Unread message count and badges
TaskListItem
and SideNav
now has supports for showing Badges.
TaskListItem will show a badge with count if there are unread messages in the task
SideNav will show a badge without a count if there are new unaccepted tasks or unread messages in any of the active messaging tasks in Agent Desktop View
componentProps.TaskListItem.Badge.children
property. If the content equal to zero or undefined, no badge is going to be shown.1myTaskChannelDefinition.componentProps.TaskListItem.Badge.children = (2appState: AppState,3context: TaskListItemProps & TaskContextProps4) => {5const badgeContent: number = applyCustomLogic(appState, context); // just an example6return badgeContent;7};
SideNav
has 2 new static properties (AgentDesktop &
Teams
) which represents link components for each view. It can be accessed to change the default Badge
property.1Flex.SideNav.AgentDesktop.defaultProps.Badge = {2children: 23};
Markdown
As of version 1.14.1 of Flex UI, numbered list support for Markdown has been temporarily suspended
Markdown
Options | Syntax |
---|---|
Bold | **Bold** |
Italic | *Italic* |
Strikethrough | ~Strikethrough~ |
Bullet list | * List * List * List |
Numbered list | 1. One 2. Two 3. Three |
Other
Introduced ChatChannelHelper
class to wrap all Chat Channel specific helper methods. An instance of a task can be obtained from TaskHelper.chat
property. TaskHelper.lastChatMessage
method was deprecated, use ChatChannelHelper.lastMessage
instead. Now a developer can get access to Task last message, customer presence and typers (array of members who are typing in the channel). Available properties for this class:
isCustomerOnline
- Returns true if customer is online, false if not
lastMessage
- Gets helper for last chat message
typers
- Gets all channel members which are currently typing (except you)
Function withTaskContext
now returns a correctly typed component instead of any. Therefore it may not be used as a class decorator anymore, but it must be called. This change may also result in new TypeScript errors surfacing incorrect prop types or similar issues.
Content of localization strings changed:
TaskHeaderStatusAccepted
- this string is no longer used for WebChat tasks. A new string has been introduced for that TaskHeaderWebChatStatusAccepted
TaskLineChatAssigned
- this string is no longer used for WebChat tasks. A new string has been introduced for that TaskLineWebChatAssigned
"Login with Twilio" link on the Login View will open a Twilio login in a new window if Flex is rendered in an iframe element.
Improvements to Action Framework error handling:
invokeAction
now returns an Error when the Promise is rejectedToggleMute
, HoldCall
, UnholdCall
and HangupCall
to throw an Error instance instead of just an error string in case of a failure. This will allow to provide more detailed error description in the future and improves error tracing down the stack and identify which SDK the error came from.The useLocalState
prop of MessageInput
is enabled by default for performance improvement
@twilio/flex-ui@1.13.0
release date AUG 29, 2019
UI performance improvements
@twilio/flex-ui@1.12.1
release date AUG 15, 2019
@types/uuid
package causing issues with npm install
command on Windows platform@twilio/flex-ui@1.12.0
release date AUG 14, 2019
AudioPlayerManager API,
which makes it easier to add sound playback to your custom code when extending Flex UI. Read about it here.ChatOrchestrator
object now supports setting orchestrations based on a task. This will allow you to decide how to handle chat based tasks on per task basis.1const orchestrationsCallback = (task: ITask) => {2if (task.sid === "WT12345") {3return [];4}5};6Flex.ChatOrchestrator.setOrchestrations("accepted", orchestrationsCallback);7
We have added ability to send DTMF tones during a voice call to all parties on the call. This includes:
1export type DialpadButtonClickCallback = (value: string) => void;2export interface DialpadProps {3onClick: DialpadButtonClickCallback;4}5
2 new actions are introduced:
ToggleDTMFDialpad
to open and closed Dialpad in the CallCanvas.SetDTMFDialpadDigits
to set digits in the DTMFGo to Actions Framework page for more details on actions and their payload.
IncomingTaskCanvas
action buttons are now a programmable component IncomingTaskCanvasActions.
You can now add, replace or remove these using programmable components content property or Task Channel Definitions API.Example: Add an eye-iconed button to the end of the list of incoming task canvas actions using content property
Flex.IncomingTaskCanvasActions.Content.add(<IconButton key="hi" icon="Eye" />);
Example: Add an eye-iconed button to the end of the list of incoming task canvas actions using Task Channel Definitions API
1Flex.DefaultTaskChannels.Call.addedComponents = [{2target: "IncomingTaskCanvasActions",3component: <IconButton key="hi" icon="Eye" />,4}];5
Add new exports to refer to workers instead of agents: WorkersDataTable, WorkerListFilterSelect, WorkersDataTable, WorkersDataTableProps and WorkerListFilter
.
Aria props properties to the following components to support accessibility:
MessageInput:
sendButtonAriaProps
• AriaProps • Send button aria props ({ ariaLabel: "Send Message" }
by default).textAreaAriaProps
• AriaProps • Text area aria props ({ ariaLabel: "Enter your message here to get help" }
by default)MessageList:
listContainerAriaProps
• AriaProps • List container aria props ({ ariaLive: AriaLive.Off }
by default).EntryPoint:
collapsedIconAriaProps
• AriaProps • Collapsed icon aria props ({ariaLabel: "Click here to open Web Chat and get help."}
by default).openedIconAriaProps
• AriaProps • Opened icon aria props ({ariaLabel: "Hide Chat"}
by default).Example on how to set aria attributes:
1FlexWebChat.MessageInput.defaultProps.sendButtonAriaProps = {2ariaLabel: "Send Message",3ariaLive: FlexWebChat.AriaLive.Polite4};56FlexWebChat.MessageInput.defaultProps.textAreaAriaProps = {7ariaLabel: "Enter your message here to get help",8ariaLive: FlexWebChat.AriaLive.Assertive9};
theme.Chat.MessageInput.Button
and allows adding textExample on how to change the icon for a text:
1appConfig = {2<...>3colorTheme: {4overrides: {5Chat: {6MessageInput: {7Button: {8borderRadius: "5px",9width: "100px",10fontSize: "10px",11svg: {12display: "none"13},14":after": {15content: '"Send"'16}17}18}19}20}21<...>
Facebook channel definition now expects channel type to be Facebook
Workers in Team View WorkersDataTable
will now be correctly sorted and will maintain its proper position
Team View performance improvements
Fixed exception thrown when rendering table rows
IconButton
now has default hover tone dependent on whether theme is dark or light.
Fixed chat crashing when media message is received. MessageBubble
now displays MediaMessageError
string on such message.
Notifications.dismissNotificationById
will now dismiss ALL notifications by that ID
release date AUG 6, 2019
The Flex Plugin Builder v3 is now in Beta. This release enables you to build and deploy your plugins directly from the CLI by leveraging the Functions & Assets API. You can integrate the release of your hosted Flex plugins within a CI/CD pipeline.
To opt into the newest version, check our upgrade guide for using the Plugin Builder.
@twilio/flex-ui@1.11.2
release date JULY 4, 2019
@twilio/flex-ui@1.11.1
release date JULY 1, 2019
Twilio.Flex.runDefault()
removing search string from query path.@twilio/flex-ui@1.11.0
release date JUNE 25, 2019
legacy
property to ContextProvider
component. This resolves conflicts between multiple react-redux
versions for self-hosted applications. We suggest not to use multiple react-redux
versions, but if you need to use multiple versions, pass legacy={true}, then Flex ContextProvider
instance will be rendered even with custom Redux store.theme.FormComponents.Select
to Theme
to customize the Select input item
useSeparateInputStore
introduced in the payload for action SetInputText
. Setting it totrue
, will store the message text in separate state and improves performance of typing in Chat/Messaging/SMS dialog when handling a task. From the next major release of Flex, this prop will be defaulted to true
. This can be changed by setting the new default property useSeparateInputStore
of MessageInput.
Flex.MessageInput.defaultProps.useSeparateInputStore = true;
tasksA
and tasksB
arguments to AgentsDataTable.defaultProps.initialCompareFunction
. This will allow to sort the list of agents based on task attributes rather than worker attributes. For example, you can do initial sort of the agents based on longest duration of the task.Example:
1Flex.AgentsDataTable.defaultProps.initialCompareFunction = (a: Flex.IWorker, b: Flex.IWorker, tasksA: Array<Flex.ITask>, tasksB: Array<Flex.ITask>) => {2return tasksA.length - tasksB.length;3}
In order to change ParticipantCanvas
when it is in list mode, developer will need to use ParticipantCanvas.ListItem
.
Example: Adding a button to the bottom of the normal participant
Flex.ParticipantCanvas.Content.add(<button key="key">Hi</button>);
Example: Adding a button to the end of participant that is shown in a list
Flex.ParticipantCanvas.ListItem.Content.add(<button key="key">Hi</button>);
theme.FormComponents.TextArea
now applies to the textarea
container, not directly to the element itself. This is to enforce consistency between form item.RootContainer
, thus allowing to change font consistently in whole application:Example: How to set custom font for the whole Flex application
1appConfig = {2<...>3colorTheme: {4baseName: "FlexLight",5overrides: {6RootContainer: {7"font-family": "MyCustomFont"8}9}10}11
Removed cols
support for text area.
Removed export of connect
function which did not connect to correct Redux store.
Removed optional configuration URLs from TypeScript Config interface.
@twilio/flex-ui@1.10.0
release date JUNE 05, 2019
CallCanvasActions
component that is a set of buttons in the call canvas is now programmable. Now you can add, replace or remove buttons from the Call Canvas. This will allow you to add custom actions to live calls or remove actions you don't want users to take on a live call.You can add and remove buttons using Content object
add and remove methods or using Task Channel Definition API
Example: Add an eye-iconed button using Content object
Flex.CallCanvasActions.Content.add(<IconButton key="hi" icon="Eye" />)
Example: Add an eye-iconed button using Task Channel Definition API
1Flex.DefaultTaskChannels.Call.addedComponents = [{2target: "CallCanvasActions",3component: <IconButton key="hi" icon="Eye" />,4}];5
Supervisor.TaskCanvas.Header
and Supervisor.WorkerCanvas.SectionCaption
components were missing keys to override their themes. Now you can style TaskCanvas header and sub section header in WorkerCanvas respectively using Theme objectSupervisor.WorkerCanvas.SectionCaption
Supervisor.TaskCanvas.Header
@twilio/flex-ui@1.9.2
release date JUNE 03, 2019
@twilio/flex-ui@1.9.1
release date MAY 28, 2019
initialFirstPanelSize
can be set within Configuration
for the AgentDesktopView.Panel1
component@twilio/flex-ui@1.9.0
release date MAY 20, 2019
Setting component state
A new action SetComponentState
has been added. This action alters the current state of the component. Component states is a componentName => key/value pairs
dictionary in Redux store that this action manipulates. Read more about this action in Actions Framework.
Additional reducers
We have added 2 new methods to support adding additional reducers:
flexStoreEnhancer
to support adding additional reducers.Example:
1const myReduxStore = createStore(2reducers,3compose(4applyFlexMiddleware(),5flexStoreEnhancer // <-- Add enhancer part of compose6)7);
addReducer
api tomanager.store
to add additional reducer.Example:
manager.store.addReducer("new", newReducer);
Chat Orchestration
ChatOrchestrator
object can now be used to disable default chat orchestration.
There are three chat orchestrations that are supported and enabled by default:
AddToChatChannel
- Request agent to be added to the chat channel (by default runs on the accepted
event from Reservation
)DeactivateChatChannel
- Mark chat channel status as INACTIVE
(by default runs on WrapupTask
and CompleteTask
actions and on the wrapup
and completed
event from Reservation
object if it was not done already)LeaveChatChannel
- Remove agent from the chat channel (by default runs on CompleteTask
action and on the completed
event from Reservation
object if it was not done already)Orchestrations can be disabled completely by invoking ChatOrchestrator.clearAllOrchestrations()
.
Orchestrations can be enabled or disabled by Reservation events (accepted
, wrapup
, completed
) which affects corresponding actions as well. For example:
accepted
event: Flex.ChatOrchestrator.setOrchestrations("accepted", []);
Flex.ChatOrchestrator.setOrchestrations("wrapup", []);
completed
event: Flex.ChatOrchestrator.setOrchestrations("completed", ["LeaveChatChannel"]);
Setting activity state
Agents can move to an unavailable activity state even if they have pending reservations, and supervisors can set agents with pending reservations to an unavailable state. This capability can be disabled by setting the configuration option rejectPendingReservations
to false or overriding it in the SetActivity
action payload:
1Actions.addListener("beforeSetActivity", (payload) => {2payload.options.rejectPendingReservations = true;3});
AgentDesktopView.Panel1
got a new default property splitterOrientation
that determines whether orientation of the content will be vertical, horizontal or automatic ("auto"
) based on content size.
New localization strings added
TaskTabSupervisorCallLabel
- Call task tab label in Supervisor task canvas.TaskTabSupervisorChatLabel
- Chat task tab label in Supervisor task canvas.TaskHeaderStatusPending
- Describes task that is in pending state. It's used in TaskCanvasHeader.TaskHeaderGroupCallAccepted
- Describes conference call task that is in accepted state. It's used in TaskCanvasHeader.TaskHeaderStatusAccepted
- Describes task that is in accepted state. It's used in TaskCanvasHeader.TaskHeaderStatusWrapup
- Describes task that is in wrapup state. It's used in TaskCanvasHeader.TaskHeaderStatusCompleted
- Describes task that is in completed state. It's used in TaskCanvasHeader.TaskCanvasHeader
now accepts a new prop secondLineTemplateCode
. By default it describes the status of the task.
Added callSid
to Participant object in Conferences
state.
Chat orchestration failure now can prevent action invocations:
WrapupTask
action will fail.CompleteTask
action will fail.Chat orchestration will update chat channels as inactive on the Reservation wrapup
event (if it did not happen in WrapupTask
action already)
Custom components are encouraged to use withTheme
decorators to inject theme
prop
Following type definitions are changed for consistency:
CallCanvasProps
renamed to CallCanvasChildrenProps
TaskCanvasProps
renamed to TaskCanvasChildrenProps
NoTaskCanvasProps
renamed to NoTaskCanvasChildrenProps
ParticipantsCanvasProps
split in a ParticipantsCanvasProps
subset and ParticipantsCanvasChildrenProps
TaskCanvasHeaderProps
split in a TaskCanvasHeaderProps
subset and TaskCanvasHeaderChildrenProps
TaskCanvasTabsProps
split in a TaskCanvasTabsProps
subset and TaskCanvasTabsChildrenProps
TaskInfoPanelProps
split in a TaskInfoPanelProps
subset and TaskInfoPanelChildrenProps
MainHeaderProps
split in a MainHeaderProps
subset and MainHeaderChildrenProps
AgentDesktopViewProps
split in a AgentDesktopViewProps
subset and AgentDesktopViewChildrenProps
LoginViewProps
split in a LoginViewProps
subset and LoginViewChildrenProps
TeamsViewProps
split in a TeamsViewProps
subset and TeamsViewChildrenProps
CRMContainerProps
split in a CRMContainerProps
subset and CRMContainerChildrenProps
LiveCommsBarProps
renamed in LiveCommsBarChildrenProps
MainContainerProps
split in a MainContainerProps
subset and MainContainerChildrenProps
MuteButtonProps
split in a MuteButtonProps
subset and MuteButtonImplProps
RootContainerProps
renamed in RootContainerChildrenProps
SideNavProps
split in a SideNavProps
subset and SideNavImplProps
TaskListButtonsProps
renamed in TaskListButtonsChildrenProps
ViewCollectionProps
split in a ViewCollectionProps
subset and ViewCollectionImplProps
SupervisorTaskCanvas
tabs title changed from "Overview" to "Call" or "Chat" based on the type of task.
@twilio/flex-ui@1.8.2
release date MAY 8, 2019
@twilio/flex-ui@1.8.1
release date MAY 6, 2019
HoldCall
/UnholdCall
Actions@twilio/flex-ui@1.8.0
release date APR 26, 2019
TaskListButtons
component that is the set of buttons in a tasklist item is now programmable (buttons can be added/removed). Example that shows a button as the last button for call tasks that have status as "accepted":1const shouldShow = (props) => {2return props.task.status == "accepted";3};45Flex.DefaultTaskChannels.Call.addedComponents = [{6target: "TaskListButtons",7component: <IconButton key="eye_button" icon="Eye" />,8options: {if: shouldShow}}];
ToggleSidebar
are introduced with following payload:1{2open?: boolean; // used to explicitly open or close the sidebar.3}
Twilio
or their direct descendants without any class. The CSS attributes that are meant to be inherited are now under the Twilio-CommonStyles
class.@twilio/flex-ui@1.7.4
release date MAY 8, 2019
@twilio/flex-ui@1.7.3
release date MAY 6, 2019
HoldCall
/UnholdCall
Actions@twilio/flex-ui@1.7.2
release date APR 26, 2019
@twilio/flex-ui@1.7.1
release date APR 5, 2019
TaskLineTitle
used for default task channel in IncomingTaskCanvas
@twilio/flex-ui@1.7.0
release date MAR 29, 2019
This release contains several minor fixes, some internal refactoring and foundational work for Warm Transfers
@twilio/flex-ui@1.6.2
release date APR 26, 2019
@twilio/flex-ui@1.6.1
release date MAR 28, 2019
history
package imports (affected the self-hosted builds)@twilio/flex-ui@1.6.0
release date MAR 12, 2019
@twilio/flex-ui@1.5.0
release date FEB 18, 2019
Twilio.Flex.Wfo.Identity
<meta name="referrer" content="no-referrer">
element to be present in <head>
section of HTML. If such element does not exists then Flex will issue additional browser redirect in login flow after returning from IdP (and token is present in the URL).Reserved
and Assigned
keys in TaskStatusBasedTypeBase
for task channel definitions. Use new Accepted
key for reservation accepted state.serviceConfiguration.attributes.taskrouter_offline_activity_sid
and, if that's not provided, fallback to the name. You can now change the name of the 'Offline' activity and users will still be set that activity on logout, or choose a completely different activity that users should be set to on logout, by changing serviceConfiguration.attributes.taskrouter_offline_activity_sid
in the Configuration ServicePending
task based status key from task channel definition if both Pending
and Reserved
were defined for TaskStatusBasedTypeBase
@twilio/flex-ui@1.4.1
release date FEB 6, 2019
available
@twilio/flex-ui@1.4.0
release date JAN 11, 2019
endConferenceOnExit
set to true
, so when agent ends the call the call will be ended for the customer as well. There is no reason anymore to override the acceptTask
action to achieve this.disabledTransfers
config option as it is obsolete due to the fixed know issue with Transfers call disconnect@twilio/flex-ui@1.3.3
release date JAN 10, 2019
@twilio/flex-ui@1.3.2
release date JAN 9, 2019
@twilio/flex-ui@1.3.1
release date DEC 20, 2018
@twilio/flex-ui@1.3.0
release date DEC 19, 2018
Voice
Messaging
Plugins
FlexEvents.pluginsLoaded
that fires after all plugins have finished loading.React
, ReactDOM
, Redux
and ReactRedux
to window object for plugins to depend on.Actions
MonitorCall
action payload got a new param extraParams
that is the equally named TR SDK param for Reservation.monitor
call. It is optional and UI does not set it, but developer can alter it via programmability if need be.isolate
for router
configuration section: whenever set to true, Flex will ignore any navigation action (including URL change) except for internal.beforeSendMessage
action to check if the message exceeds the limit and handle it accordingly.SendMessage
action got optional messageAttributes
property to its payload that, if specified, will be used as the equally named property of the Chat SDK sendMessage
call.Views and routing
componentProps
by setting defaultLocation
property for ViewCollection
.FLEX_LOCATION_CHANGE
constant. It can be used to listen to Flex navigation actions or do dispatch Flex-specific navigation actions.Voice
disableBrowserVoice
option for configuration. When specified Twilio Client SDK (for Browser voice capability) will not be initialized. Attempting to accept a task that is voice and with worker's contact_uri
not pointing to a phone number, the attempt is blocked and warning is shown.Messaging
Character limit added to messages sent by agent. Character count indicator will be shown below text input when agent exceeds the limit. Character limits per channel:
Character limit information added to Task Channel Definition API as a new prop charLimit
SSO login
config.sso.loginPopup = true
can be set to enable it. To gracefully handle blocked popups, new LoginFormView
React component or provideLoginInfo
or tryLogin
Twilio.Flex API function can be used to launch it. Additionally pop-up window features for window.open()
function can be set in config.sso.loginPopupFeatures
configuration variable as string.Twilio.Flex
interface:1/**2* Runs Flex with default setup.3* It will show loader and prompts for login information4* if it is not provided in configuration object.5*6* @param [config] configuration object7* @param [nodeOrSelector] DOM node or selector string where to render Flex8* @returns {Promise<void>}9*/10export function runDefault(config: Config = {}, nodeOrSelector: string | Element = "body"): Promise<void>;1112/**13* Tries to log user in to Flex.14* Can redirect the current browser window to the IdP URL or15* open a new window to navigate to IdP URL if config.loginPopup is set.16*17* @param [config] SSO configuration object18* @return {Promise<boolean>} true if there is valid token and user can be logged in.19*/20function tryLogin(config: SSOConfig = {}): Promise<boolean>;2122/**23* Helper function to provide additional account and user info if it is not set.24* Updates the provided config object.25*26* Renders a LoginFormView component if accountSid is not provided or there are problems with signing user in.27*28* @param [config] configuration object29* @param [nodeOrSelector] DOM node or selector string where to render the component30* @returns {Promise<void>} if resolved, then Flex instance can be created with31* provided config object.32*/33function provideLoginInfo(config: Config = {}, nodeOrSelector: string | Element = "body"): Promise<void>;
LoginFormView
React component to be used to provide account / user info with the following props:1interface LoginFormViewProps {2onSuccess: (determinedConfig: Config) => any;3userConfig: Config;4}
LoginFormView
component:1LoginContinue: "Continue anyway",2LoginLaunch: "Launch",3LoginTitle: "Twilio Flex",4LoginErrorDomain: "Oops! Your runtime domain is incorrect.",5LoginErrorDomainDetails: "Find your runtime domain " +6"<a href='https://www.twilio.com/console/runtime/overview'>here</a>",7LoginErrorSso: "Hmm, Single Sign-On has not been configured.",8LoginErrorSsoDetails: "Find out how to configure Single Sign-On " +9"<a href='https://www.twilio.com/console/flex/users/single-sign-on'>here</a>",10LoginErrorPopupBlocked: "Sorry, pop-ups are blocked.",11LoginErrorPopupBlockedDetails: "Find out how to enable pop-ups in your browser",12LoginErrorGeneric: "Oops! Well, that didn't work :( Please double check your configuration.",13LoginIsAdmin: "Flex Admin?",14LoginWithTwilio: "Login with Twilio.",
Views and routing
View
now has multiple route path support. By default name
prop is taken as string to be added to the path of the specified View
. One can add alternative routes with route
prop.Example:
1<View key="teams" name="teams" route={{ path: "/supervisor" }}> // both http:/domain/teams and http://domain/supervisor will work23<View key="teams" name="teams" route={{ path: ["/supervisor", "something"] }}> // both http:/domain/teams and http://domain/supervisor and http://domain/something will work
ViewCollection
was not using DynamicComponent properly so all manipulations of it other than add
via programmability did not work.Voice
@twilio/flex-ui@1.2.0
release date NOV 22, 2018
baseNames
theme names changedDeprecated name | New Theme name |
---|---|
DarkTheme | GreyDark |
MediumTheme | GreyLight |
BlueMediumTheme | FlexLight |
BlueDarkTheme | FlexDark |
icon
to label
in Tab
label components in agent TaskCanvasTabs
and supervisor TaskCanvas
1export interface Strings<T = string> extends FrameStrings<T> {2...3TaskTabAgentIncomingLabel?: T;4TaskTabAgentCallLabel?: T;5TaskTabAgentChatLabel?: T;6TaskTabAgentInfoLabel?: T;7TaskTabSupervisorInfoLabel?: T;8TaskTabSupervisorOverviewLabel?: T;9}
Views
of ViewCollection
got a new prop mountRule
. If specified, keepMounted
prop value is ignored. Definition of the prop is as follows:1export enum ViewMountRule {2Always = "Always", // View is mounted from the start of the application and never unmounted3WhenActive = "WhenActive", // Views is mounted when activated and unmounted when deactivated4WhenHasBeenActive = "WhenHasBeenActive" // View is mounted when first activated and never umounted5}
@twilio/flex-ui@1.1.0
release date NOV 6, 2018
TransferTask
was introduced. As with all other Task specific actions, if calling it, either task
or sid
must be specified, the other is autofilled then accordingly. When tapping into the action either with events or task replacement, both will be filled at execution time. Payload of the action:1{2sid?: string; // sid of the ITask to transfer3task?: ITask; // ITask object representing the Reservation being transferred4targetSid: string; // sid of the Worker or Queue where the task should be transferred to5options?: Object // options passed over to TaskRouter SDK transfer call. Refer to TaskRouter SDK documentation on Task.transfer option values.6}
Add optional label
property to the Tab
component. When provided, it will display a label into the Tab
element. If the value matches a code in language strings array, the contents of the language string is used as template. Otherwise the value is used as just string. If label
is not provided, icon
property is considered and used.
Add optional alignment
property to Tabs
. When provided, it will change the tabs alignment. Possible values are left
or center
. Default is center
.
New GA version of Flex UI has been released and are now available on NPM
endConferenceOnExit
set to false
, meaning that the call will not stop for customer when agent stops the call.disableTransfers
config options was created. By default false
, if set to true, the endConferenceOnExit
will be enabled but transfers to other agents will not be available.WorkerCanvas
component prop showSkills
to false
.public_identity
from worker attributes gets set to agent's chat user friendly name. If that is not set, then full_name
attribute is used.All actions that had taskSid
in payload will now expect sid
instead. Potential breaking change!
Task object in Actions framework got new field sourceObject
which will be pointing to the actual SDK object. Reservation in case of TaskRouter, InsightsObject in case of Insights (Supervisor views). source
is still there but is deprecated.
Some actions got changed payload
SetActivity
can now be called with just activityName
in the payload.SelectTaskInSupervisor
now expects/provides object as payload in form of {task?: ITask, taskSid?: string}
. Providing either will autofill the other also so both will be available for whoever taps into the action via Actions framework.SelectWorkerInSupervisor
now expects/provides object as payload in form of {worker?: ITask, workerSid?: string}
. Providing either will autofill the other also so both will be available for whoever taps into the action via Actions framework.MonitorCall
now expects/provides object as payload in form of {task?: ITask, taskSid?: string}
. Providing either will autofill the other also so both will be available for whoever taps into the action via Actions framework.Chat channels need to be created by channel orchestration service for agent to be able to join them.
Templates and channel definitions use channelType
attribute from task to detect chat channel type.
Changed
Changed
SetActivity
action now has payload in the form of {activitySid: string; activityName?: string; activityAvailable?: boolean}
. Only activitySid
is used in default implementation and are required when invoking the action by user, but other two are filled for better context for users who override the action and need more information on what the new activity will be.task
type changed to ITask
for task based components. Previously TaskState interface was used which had only source
and reservation
properties. Properties source
and reservation
stay the same as they used to, but now attributes and other task properties can be accessed from task
object itself. For example this.props.task.attributes
can be used where applicable and there should be no need to use source
sub property anymore which is referring to Task Router SDK object.Added
1export type TaskChannelComponentRemoveRequest = {2target: keyof FlexComponents;3key: React.Key;4options?: RemoveComponentCallOptions;5};6TaskChannelDefinition.removedComponents?: Array<TaskChannelComponentRemoveRequest>;78// For example:9myOwnChatChannel.removedComponents = [10{ target: "TaskCanvasTabs", key: "info" }11];
withTaskContext
helper function has been added that creates a HOC which adds the properties to the wrapped component.1export interface TaskContextProps {2task?: ITask; // Task we are referring to, undefined if there is no task in context3call?: PhoneCallState; // Call state that current task if related to, undefined if there is no task in context or there is no call for a task4chatChannel?: ChatChannelState.ChannelState; // Chat channel state that current task if related to, undefined if there is no task in context or there is no chat for a task5channelDefinition?: TaskChannelDefinition; // Matched task channel definition for a task, undefined if there is no task in context6}
TaskContext.Consumer
:1import { withTaskContext } from "@twilio/flex-ui";23const MyComponent: (props) => {4return (5<div>{props.task.attributes.someAttribute}</div>6);7}89const MyComponentWithTask = withTaskContext(MyComponent);10// Register MyComponentWithTask component to Flex instead of MyComponent11
withTaskContext
:1import { withTaskContext } from "@twilio/flex-ui";23const MyComponent: (props) => {4return (5<div>{props.task.attributes.someAttribute}</div>6);7}89const MyComponentWithTask = withTaskContext(MyComponent);10// Register MyComponentWithTask component to Flex instead of MyComponent
Added
Component.Content.remove
to allow removing components from dynamic component children (both native and programmatically added ones).
Syntax:
Component.Content.remove(key: string, options: {if?: (props: any) => boolean})
where
key
- key of the component to be removedif
- Boolean expression that decides at any given moment whether the removal should be active. props
parameter is the object of all properties passed by the main component to children.Example: removes avatar from the canvas that shows "you have no tasks", but only if the user's name is not Bob.
Flex.NoTasksCanvas.Content.remove("avatar", {if: props => props.worker.attributes.full_name !== "Bob"});
Changed
Removed
main
field in package.json.TaskListChatItem
and TaskListCallItem
- can be customized not using Task Channels API. Or use TaskListItem
to use them all.AltContainer
and IconArea
; and component property alternateColors
removed from TaskListItem
component.colors.channelColors
removed. Channel colors are defined in Task Channel now.Changed
Added
All task channels that Flex handles are defined and registered by Task Channels API. Flex registers its default Task Channel definitions (see below), but users and plugins can register their own. When Flex task based components are rendered, the first matching channel definition for a given task will be used. If there is more than one channel definition match for a task, then most recently registered definition will be used (so that you can register more specific channel definition).
See below interface TaskChannelDefinition
for what can be set up. All parameters are optional meaning that ones from Default
task channel definition will be used if not specified. The most important property of a task channel definition is isApplicable
callback function. The callback receives a task as argument and must return Boolean true if this definition can be used to handle given task.
In a task channel definition you can specify:
Predefined Task Channels definitions are available via Twilio.Flex.DefaultTaskChannels
objects for reference. Channels that are defined by default:
Twilio.Flex.DefaultTaskChannels.Call
Twilio.Flex.DefaultTaskChannels.Chat
Twilio.Flex.DefaultTaskChannels.ChatSMS
Twilio.Flex.DefaultTaskChannels.ChatLine
Twilio.Flex.DefaultTaskChannels.ChatMessenger
Twilio.Flex.DefaultTaskChannels.ChatWhatsApp
Twilio.Flex.DefaultTaskChannels.Default
It is not recommended to change Twilio.Flex.DefaultTaskChannels
them at runtime. You should create your own definition and register it instead.
Flex has the following helper functions to create channel definitions with default values for chat, call and generic: Chat channel creation with default chat templates:
1Flex.DefaultTaskChannels.createChatTaskChannel(name: string, isApplicable: TaskChannelApplicableCb,2icon: string | React.ReactNode = "Message", iconActive: string | React.ReactNode = "MessageBold", color: string = defaultChannelColors.chat): TaskChannelDefinition
Call channel creation with default templates. Call channel definition uses callbacks to determine the icon and colors (based on call state and destination to render):
Flex.DefaultTaskChannels.createCallTaskChannel(name: string, isApplicable: TaskChannelApplicableCb):: TaskChannelDefinition
Default channel creation with default templates.
Flex.DefaultTaskChannels.createDefaultTaskChannel(name: string, isApplicable: TaskChannelApplicableCb, icon: string | React.ReactNode = "GenericTask", iconActive: string | React.ReactNode = "GenericTaskBold", color: string = defaultChannelColors.custom): TaskChannelDefinition
To register a task channel definition use Flex.TaskChannels.register(definition: TaskChannelDefinition, mergeWithDefaultChannel = true)
. You must register your channel definitions before Flex starts up.
Example:
1const myOwnChatChannel = Flex.DefaultTaskChannels.createChatTaskChannel("myChat",2(task) => task.taskChannelUniqueName === "chat" && task.attributes.somethingSpecial === "mycCustom");3// can modify myOwnChatChannel here45Flex.TaskChannels.register(myOwnChatChannel);
Also new the following API exists: Flex.TaskChannels.unregister(myOwnChatChannel);
- to unregister previously registered channel Flex.TaskChannels.getRegistered();
- to get all registered task channelsFlex.TaskChannels.getForTask(task: ITask);
- to get a matching task channel definition for a task
Interface of TaskChannelDefinition
:
1export enum TaskChannelCapability {2Info = "Info", // whether channel has info panel3Call = "Call", // whether channel has call canvas capabilities4Chat = "Chat", // whether channel has chat canvas capabilities5Video = "Video", // whether channel has video calling capabilities6Wrapup = "Wrapup" // whether channel needs to go to Wrapup state before can be completed7}89export type TaskCallbackType<T> = (task: ITask, componentType: React.ComponentType, ...args) => T;10export type TaskStatusBasedTypeBase<T> = {11Reserved: T;12Assigned: T;13Wrapping: T;14Completed: T;15Canceled: T;16Pending: T;17};18export type TaskStatusBasedType<T = string> = T | TaskCallbackType<T> | TaskStatusBasedTypeBase<T>;19export type TaskChannelApplicableCb = (task: ITask) => boolean;2021export type TaskChannelComponentRegistration = {22target: keyof FlexComponents;23component: React.ReactChild;24options?: ContentFragmentProps;25};2627/**28* Defines a task channel29*30* @export31* @interface TaskChannelDefinition32*/33export interface TaskChannelDefinition {3435name: string;3637/**38* Used in TaskList, TaskCard, Canvases39*/40colors?: {41main?: TaskStatusBasedType<string>;42};4344/**45* Returns whether this task channel is applicable for a given task.46* @param task task instance to evaluate the channel for47*/48isApplicable: TaskChannelApplicableCb;4950/**51* Icons to render to the task channel52*/53icons?: {54/**55* List icon to be used in TaskList and TaskCardList56*/57list?: TaskStatusBasedType<string | React.ReactNode>;58/**59* Icon to be used in Tab headers if tab is not selected60*/61main?: TaskStatusBasedType<string | React.ReactNode>;62/**63* Icon to be used in Tab headers if tab is selected and in Task Canvases as the main icon64*/65active?: TaskStatusBasedType<string | React.ReactNode>;66};6768/**69* Templates for components70*/71templates?: {72IncomingTaskCanvas?: {73firstLine?: TaskStatusBasedType<string>;74secondLine?: TaskStatusBasedType<string>;75};76CallCanvas?: {77firstLine?: TaskStatusBasedType<string>;78secondLine?: TaskStatusBasedType<string>;79};80TaskListItem?: {81firstLine?: TaskStatusBasedType<string>;82secondLine?: TaskStatusBasedType<string>;83extraInfo?: TaskStatusBasedType<string>;84};85TaskCanvasHeader?: {86title?: TaskStatusBasedType<string>;87endButton?: TaskStatusBasedType<string>;88};89TaskCard?: {90firstLine?: TaskStatusBasedType<string>;91secondLine?: TaskStatusBasedType<string>;92};93TaskInfoPanel?: {94content: TaskStatusBasedType<string>;95};96Supervisor?: {97TaskCanvasHeader?: {98title?: TaskStatusBasedType<string>;99endButton?: TaskStatusBasedType<string>;100};101TaskInfoPanel?: {102content: TaskStatusBasedType<string>;103};104TaskOverviewCanvas: {105firstLine?: TaskStatusBasedType<string>;106secondLine?: TaskStatusBasedType<string>;107}108}109};110111/**112* Set of capabilities, used to render Tabs113*/114capabilities: Set<TaskChannelCapability>;115116/**117* Custom components to be added for this task channel. E.g. custom Tabs. Supports only components that have a static "Content" property118*/119addedComponents?: Array<TaskChannelComponentRegistration>;120121/**122* Custom components to be replaced for this task channel. Supports only components that have a static "Content" property123*/124replacedComponents?: Array<TaskChannelComponentRegistration>;125126}
Changed
Component.Content.register/add
. E.g. <div key="custom-key"/>
.Removed
main
field in package.json.Added
Changed
Changed
sso.tokenRefreshIntervalMs
changed to sso.tokenRefreshThresholdMs
to specify a threshold in milliseconds when token will be updated before it is expiredSupervisorDesktopView
component renamed to TeamsView
SideNavSupervisorView
renamed to SideNavTeamsView
Added
Showing a notification bar when session token expires.
Added staticFilter
prop added to TaskList for stand-alone use.
Show a call bar to indicate an ongoing call when not viewing Agent Desktop
Added a few containers to Theme to accommodate more theming
Added "UnholdCall" action to unhold calls. Payload same as HoldCall, including task. - Added support for views routes, which includes
New actions to navigate the browser to different locations in the way similar to HTML5 History API:
HistoryPush
HistoryReplace
HistoryGo
HistoryGoBack
HistoryGoForward
New property route
for View
component to mount a view to a route different from its name
Support for browser and memory history that is configurable through configuration file
Flex store enhancer for creating a custom store:
1import { applyMiddleware, combineReducers, createStore, compose } from "redux";2import { createLogger } from "redux-logger";3import { FlexReducer, applyFlexMiddleware } from "@twilio/flex-ui";4import { myAppReducer } from ".MyRootReducer";56const reducers = combineReducers<MyStoreState>({7flex: FlexReducer,8myApp: myAppReducer9});1011const middleware = applyMiddleware(createLogger());1213export const myReduxStore = createStore(14reducers,15compose(16middleware,17applyFlexMiddleware()18)19);
Changed
.Twilio
class name for standard HTML tags a
, p
, h1
, h2
, h6
, hr
, iframe
and p
are set now.Added
1componentProps: {2CRMContainer: {3uri: "http://twilio.com"4},5Supervisor: {6TaskCanvas: {7Header: {8titleTemplateCode: "MyOwnHeaderTemplate"9}10}11}12}
Changed
Removed
Open Sans
font since flex-ui
will handle itFixed
Twilio.Flex
variable not overwritten anymoreRemoved
Removed support for insecure login:
insecureLogin
action is removedworkerDefaultId
and workerDefaultPassword
configuration options are now obsoleteAdded
PluginManager - as a part of Flex initialization plugin loading can be enabled.
configuration.pluginService.enabled
to true
.Twilio.Flex.Plugins.init(MyPlugin)
.A new method for Manager's instances fetchConfiguration
asynchronously retrieves a configuration from Flex Configuration service
A new method for Manager's instance updateConfig
merges provided configurations on top of existing configuration
Changed
Manager's instance configuration behavior:
configuration
setter is deprecatedTheming was reworked and config parameters changed. User now has 4 distinct levels available to theme their application.
Not specifying a predefined theme, in that case BlueMediumTheme
is chosen automatically.
Specifying predefined theme - either colorTheme:"DarkTheme"
or colorTheme: {name: "DarkTheme"}
. Available themes are MediumTheme
, DarkTheme
, BlueMediumTheme
and BlueDarkTheme
. A predefined theme specifies base colors used and also whether the theme is considered light or dark, which influences text and hover colors unless they are specifically changed.
Overriding all or a selection of colors and/or the lightness of the theme that was set by the predefined theme (note, specifying predefined theme was not compulsory, but in BllueMediumTheme
was then used as default).
colors - variables base1..base11 are colors provided by the predefined theme that set the tone of the theme. User can override all (preferred) or some of those colors. User can also override any of the theme independent hardcoded colors like for example the red color of hangup button.
Available colors to override are:
base1, base2, base3, base4, base5, base6, base7, base8, base9, base10, base11, defaultButtonColor, lightTextColor, darkTextColor, buttonHoverColor, tabSelectedColor, connectingColor, disconnectedColor, notificationBackgroundColorInformation, notificationBackgroundColorSuccess, notificationBackgroundColorError, notificationBackgroundColorWarning, notificationIconColorError, notificationIconColorWarning, userAvailableColor, userUnavailableColor, errorColor, callColor, holdColor, declineColor, acceptColor, declineTextColor, acceptTextColor, completeTaskColor, liveCommsBackgroundColor, liveCommsContentColor, channelColors.inactive, channelColors.call, channelColors.video, channelColors.sms, channelColors.chat, channelColors.facebook, channelColors.line, channelColors.whatsapp, channelColors.custom
light - Default text color, hover colors and rule of which base color is chosen for SideNav and MainHeader depend on this Boolean.
The above mentioned parameters together with the built in color -> component css props
mapping result in final theme where each component has a set of color specific css props. Should this not suffice there is a final step of providing overrides
property that allows for overriding any parts of this result. Documenting that object is beyond the scope of this changelog, it is easiest to just monitor that object in debugger and decide on what parameters to change.
Examples:
1// Picks the default blue dark theme2config.colorTheme = "BlueDarkTheme";3// Picks dark theme, changes all of its base colors to new ones and tells the system that we still expect it to take the theme as dark (light parameter)4config.colorTheme = {5name: "DarkTheme",6colors: {7base1: "blue",8base2: "orange",9base3: "yellow",10base4: "black",11base5: "white",12base6: "pink",13base7: "red",14base8: "blue",15base9: "brown",16base10: "black",17base11: "white"18},19light: false;20}
Changed
Tab
component property named visible
changed to hidden
. Tabs component looks only the new property of a tab.Fixed
Changed
Fixed
Changed
Manager.create
method signature (first accountSid parameter dropped). Old signature will work until next release though.Fixed
Removed
supervisor
role of the user.Added
VERSION
constant to indicate the version of the package