React Chat - Configure Suggestions
DevExtreme Chat can display suggestion buttons (a DevExtreme ButtonGroup component) above the message input field. To enable this feature, use the suggestions object.
To display suggestion buttons, specify the suggestions.items[] array. Use ButtonGroup item fields to configure the appearance and visual elements of individual buttons. You can also specify custom fields to implement additional functionality. For instance, you can store predefined messages in a custom field and use short labels (items[].text values).
Fill the Chat Input Field with Predefined Messages
To configure suggestion items for the Chat's input field, update the inputFieldText property in the suggestions.onItemClick handler:
jQuery
$('#chat').dxChat({
suggestions: {
items: [
{ text: 'Summarize text' },
{ text: 'Write an email' },
{ text: 'Fix my writing' },
],
onItemClick(e) {
$('#chat').dxChat('instance').option('inputFieldText', e.itemData.text);
},
},
});Angular
<dx-chat ...
[inputFieldText]="inputFieldText"
[suggestions]="chatSuggestions"
>
</dx-chat>
import { DxChatModule, type DxChatTypes } from "devextreme-angular/ui/chat";
// ...
export class AppComponent {
inputFieldText: string = '';
chatSuggestions: DxChatTypes.Properties['suggestions'] = {
items: [
{ text: 'Summarize text' },
{ text: 'Write an email' },
{ text: 'Fix my writing' },
],
onItemClick: (e) => {
this.inputFieldText = e.itemData.text;
},
};
}Vue
<template>
<DxChat
:input-field-text="inputFieldText"
:suggestions="chatSuggestions"
/>
</template>
<script setup lang="ts">
import { ref } from 'vue';
import { DxChat, type DxChatTypes } from 'devextreme-vue/chat';
const inputFieldText = ref<string>('');
const chatSuggestions: DxChatTypes.Properties['suggestions'] = {
items: [
{ text: 'Summarize text' },
{ text: 'Write an email' },
{ text: 'Fix my writing' },
],
onItemClick(e) {
inputFieldText.value = e.itemData.text;
},
};
</script>React
import React, { useCallback, useState } from 'react';
import { Chat, type ChatTypes } from 'devextreme-react/chat';
import { type ButtonGroupTypes } from 'devextreme-react/button-group';
function App(): JSX.Element {
const [inputFieldText, setInputFieldText] = useState<string>('');
const handleSuggestionClick = useCallback((e: ButtonGroupTypes.ItemClickEvent) => {
setInputFieldText(e.itemData.text);
}, []);
const chatSuggestions: ChatTypes.Properties['suggestions'] = {
items: [
{ text: 'Summarize text' },
{ text: 'Write an email' },
{ text: 'Fix my writing' },
],
onItemClick: handleSuggestionClick,
}
return (
<Chat
inputFieldText={inputFieldText}
suggestions={chatSuggestions}
/>
);
}Send Predefined Messages on Suggestion Click
jQuery
To send predefined messages when a suggestions button is clicked, call renderMessage() in suggestions.onItemClick:
$('#chat').dxChat({
suggestions: {
items: [
{ text: 'Summarize text' },
{ text: 'Write an email' },
{ text: 'Fix my writing' },
],
onItemClick(e) {
const newMessage = {
id: Date.now(),
timestamp: new Date(),
text: e.itemData.text,
};
$('#chat').dxChat('instance').renderMessage(newMessage);
}
}
});Angular
To send predefined messages when a suggestions button is clicked, update the Chat's items array or dataSource in suggestions.onItemClick. The following code snippet uses the items array:
<dx-chat ...
[items]="messages"
[suggestions]="chatSuggestions"
>
</dx-chat>
import { DxChatModule, type DxChatTypes } from "devextreme-angular/ui/chat";
// ...
export class AppComponent {
messages: DxChatTypes.Message[] = [];
suggestions: DxChatTypes.Properties['suggestions'] = {
items: [
{ text: 'Summarize text' },
{ text: 'Write an email' },
{ text: 'Fix my writing' },
],
onItemClick(e) {
const newMessage: DxChatTypes.Message = {
id: Date.now(),
timestamp: new Date(),
text: e.itemData.text,
};
this.messages = [...messages, newMessage]
}
};
}Vue
To send predefined messages when a suggestions button is clicked, update the Chat's items array or dataSource in suggestions.onItemClick. The following code snippet uses the items array:
<template>
<DxChat
:items="messages"
:suggestions="chatSuggestions"
/>
</template>
<script setup lang="ts">
import { ref } from 'vue';
import { DxChat, type DxChatTypes } from 'devextreme-vue/chat';
const messages = ref<DxChatTypes.Message[]>([]);
const chatSuggestions: DxChatTypes.Properties['suggestions'] = {
items: [
{ text: 'Summarize text' },
{ text: 'Write an email' },
{ text: 'Fix my writing' },
],
onItemClick(e) {
const newMessage: DxChatTypes.Message = {
id: Date.now(),
timestamp: new Date(),
text: e.itemData.text,
};
messages.value = [...messages.value, newMessage]
},
};
</script>React
To send predefined messages when a suggestions button is clicked, update the Chat's items array or dataSource in suggestions.onItemClick. The following code snippet uses the items array:
import React, { useCallback, useState } from 'react';
import { Chat, type ChatTypes } from 'devextreme-react/chat';
import { type ButtonGroupTypes } from 'devextreme-react/button-group';
function App(): JSX.Element {
const [messages, setMessages] = useState<ChatTypes.Message[]>([]);
const handleSuggestionClick = useCallback((e: ButtonGroupTypes.ItemClickEvent) => {
const newMessage: ChatTypes.Message = {
id: Date.now(),
timestamp: new Date(),
text: e.itemData.text,
};
setMessages((prevMessages) => [...prevMessages, newMessage]);
}, []);
const chatSuggestions: ChatTypes.Properties['suggestions'] = {
items: [
{ text: 'Summarize text' },
{ text: 'Write an email' },
{ text: 'Fix my writing' },
],
onItemClick: handleSuggestionClick,
}
return (
<Chat
items={messages}
suggestions={chatSuggestions}
/>
);
}Configure Disappearing Suggestions
To hide a suggestion item after a user clicks the button, update the suggestions.items[] array:
jQuery
$('#chat').dxChat({
suggestions: {
items: [
{ text: 'Summarize text' },
{ text: 'Write an email' },
{ text: 'Fix my writing' },
],
onItemClick(e) {
const chatInstance = $('#chat').dxChat('instance');
const currentSuggestions = chatInstance.option('suggestions');
chatInstance.option('suggestions', {
items: currentSuggestions.items.filter((item) => item.text !== e.itemData.text),
});
// ...
chatInstance.renderMessage(newMessage);
},
},
});Angular
<dx-chat ...
[suggestions]="chatSuggestions"
>
</dx-chat>
import { DxChatModule, type DxChatTypes } from "devextreme-angular/ui/chat";
import { type DxButtonGroupTypes } from "devextreme-angular/ui/button-group";
// ...
export class AppComponent {
suggestionItems = [
{ text: 'Summarize text' },
{ text: 'Write an email' },
{ text: 'Fix my writing' },
];
chatSuggestions: DxChatTypes.Properties['suggestions'] = {
items: this.suggestionItems,
onItemClick: this.handleSuggestionClick.bind(this),
};
handleSuggestionClick(e: DxButtonGroupTypes.ItemClickEvent): void {
this.chatSuggestions = {
items: this.chatSuggestions.items.filter((item) => item.text !== e.itemData.text),
onItemClick: this.handleSuggestionClick.bind(this),
};
// ...
this.messages = [...messages, newMessage];
};
}Vue
<template>
<DxChat
:input-field-text="inputFieldText"
:suggestions="chatSuggestions"
/>
</template>
<script setup lang="ts">
import { ref } from 'vue';
import { DxChat, type DxChatTypes } from 'devextreme-vue/chat';
import { type DxButtonGroupTypes } from 'devextreme-vue/button-group';
const suggestionItems = [
{ text: 'Summarize text' },
{ text: 'Write an email' },
{ text: 'Fix my writing' },
];
const chatSuggestions = ref<DxChatTypes.Properties['suggestions']>({
items: suggestionItems,
onItemClick: handleSuggestionClick,
});
function handleSuggestionClick(e: DxButtonGroupTypes.ItemClickEvent): void {
chatSuggestions.value = {
items: chatSuggestions.value.items.filter((item) => item.text !== e.itemData.text),
onItemClick: handleSuggestionClick,
};
// ...
messages.value = [...messages.value, newMessage];
};
</script>React
import React, { useCallback, useState } from 'react';
import { Chat, type ChatTypes } from 'devextreme-react/chat';
import { type ButtonGroupTypes } from 'devextreme-react/button-group';
function App(): JSX.Element {
const [suggestionItems, setSuggestionItems] = useState([
{ text: 'Summarize text' },
{ text: 'Write an email' },
{ text: 'Fix my writing' },
]);
const handleSuggestionClick = useCallback((e: ButtonGroupTypes.ItemClickEvent) => {
setSuggestionItems((items) => items.filter((item) => item.text !== e.itemData.text));
// ...
setMessages((prevMessages) => [...prevMessages, newMessage]);
}, []);
const chatSuggestions: ChatTypes.Properties['suggestions'] = {
items: suggestionItems,
onItemClick: handleSuggestionClick,
};
return (
<Chat
suggestions={chatSuggestions}
/>
);
}Alternatively, you can disable clicked items:
jQuery
$('#chat').dxChat({
suggestions: {
// ...
onItemClick(e) {
const chatInstance = $('#chat').dxChat('instance');
const currentSuggestions = chatInstance.option('suggestions');
currentSuggestions.find((item) => item.text === e.itemData.text).disabled = true;
chatInstance.option('suggestions', { items: currentSuggestions });
// ...
chatInstance.renderMessage(newMessage);
},
},
});Angular
<dx-chat ...
[suggestions]="chatSuggestions"
>
</dx-chat>
import { DxChatModule, type DxChatTypes } from "devextreme-angular/ui/chat";
import { type DxButtonGroupTypes } from "devextreme-angular/ui/button-group";
// ...
export class AppComponent {
// ...
handleSuggestionClick(e: DxButtonGroupTypes.ItemClickEvent): void {
this.chatSuggestions = {
items: this.chatSuggestions.items.map((item) => (
item.text === e.itemData.text
? { ...item, disabled: true }
: item
)),
onItemClick: this.handleSuggestionClick.bind(this),
};
// ...
this.messages = [...messages, newMessage];
};
}Vue
<template>
<DxChat
:input-field-text="inputFieldText"
:suggestions="chatSuggestions"
/>
</template>
<script setup lang="ts">
import { ref } from 'vue';
import { DxChat, type DxChatTypes } from 'devextreme-vue/chat';
import { type DxButtonGroupTypes } from 'devextreme-vue/button-group';
// ...
function handleSuggestionClick(e: DxButtonGroupTypes.ItemClickEvent): void {
chatSuggestions.value = {
items: chatSuggestions.value.items.map((item) => (
item.text === e.itemData.text
? { ...item, disabled: true }
: item
)),
onItemClick: handleSuggestionClick,
};
// ...
messages.value = [...messages.value, newMessage];
};
</script>React
import React, { useCallback, useState } from 'react';
import { Chat, type ChatTypes } from 'devextreme-react/chat';
import { type ButtonGroupTypes } from 'devextreme-react/button-group';
function App(): JSX.Element {
// ...
const handleSuggestionClick = useCallback((e: ButtonGroupTypes.ItemClickEvent) => {
setSuggestionItems((items) => {
return items.map((item) => (
item.text === e.itemData.text
? { ...item, disabled: true }
: item
));
});
// ...
setMessages((prevMessages) => [...prevMessages, newMessage]);
}, []);
return (
<Chat
suggestions={chatSuggestions}
/>
);
}