Skip to content

Commit db2d6dc

Browse files
authored
Merge pull request #15 from DevExpress-Examples/Vue-changes
Fixed imports, types, added the disabled class
2 parents 3c9bf30 + 8971877 commit db2d6dc

File tree

4 files changed

+31
-174
lines changed

4 files changed

+31
-174
lines changed

Vue/src/App.vue

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,4 +31,9 @@ import 'devextreme/dist/css/dx.fluent.blue.light.css';
3131
box-shadow: 0 2px 10px rgba(0, 0, 0, 0.1);
3232
overflow: hidden;
3333
}
34+
35+
:deep(.chat-disabled .dx-chat-messagebox) {
36+
opacity: 0.5;
37+
pointer-events: none;
38+
}
3439
</style>

Vue/src/chatService.ts

Lines changed: 0 additions & 149 deletions
This file was deleted.

Vue/src/components/ChatInterface.vue

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,14 @@
11
<template>
2-
<div class="demo-container">
2+
<div :class="['demo-container', { 'chat-disabled': isDisabled }]">
33
<DxChat
44
:data-source="dataSource"
55
:reload-on-change="false"
66
:show-avatar="false"
77
:show-day-headers="false"
88
:user="user"
99
height="710"
10-
:typing-users="typingUsers"
11-
:alerts="alerts"
10+
v-model:typing-users="typingUsers"
11+
v-model:alerts="alerts"
1212
@message-entered="onMessageEntered"
1313
message-template="messageTemplate"
1414
>
@@ -59,7 +59,8 @@ const {
5959
convertToHtml,
6060
onMessageEntered,
6161
onCopyButtonClick,
62-
onRegenerateButtonClick
62+
onRegenerateButtonClick,
63+
isDisabled
6364
} = useChatLogic();
6465
6566
// Initialize component

Vue/src/helpers/chat.helpers.ts

Lines changed: 21 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,12 @@
11
import { ref } from 'vue';
22
import { OpenAI } from 'openai';
3-
import DataSource from 'devextreme/data/data_source';
4-
import CustomStore from 'devextreme/data/custom_store';
3+
import { CustomStore, DataSource } from 'devextreme-vue/common/data';
54
import { unified } from 'unified';
65
import remarkParse from 'remark-parse';
76
import remarkRehype from 'remark-rehype';
87
import rehypeStringify from 'rehype-stringify';
98
import { loadMessages } from 'devextreme/localization';
10-
import TextArea from 'devextreme/ui/text_area';
11-
import type { MessageEnteredEvent } from "devextreme/ui/chat";
9+
import type { DxChatTypes } from 'devextreme-vue/chat';
1210

1311
const ALERT_TIMEOUT = 10000;
1412
const OpenAIConfig = {
@@ -17,13 +15,13 @@ const OpenAIConfig = {
1715
deployment: 'gpt-4o-mini'
1816
};
1917

20-
const assistant = { id: 'assistant', name: 'Virtual Assistant' };
18+
const assistant: DxChatTypes.User = { id: 'assistant', name: 'Virtual Assistant' };
2119

2220
export function useChatLogic() {
2321
const dataSource = ref<DataSource | null>(null);
2422
const user = ref({ id: 'user' });
25-
const typingUsers = ref<Array<{id: string, name: string}>>([]);
26-
const alerts = ref<Array<{message: string}>>([]);
23+
const typingUsers = ref<Array<DxChatTypes.User>>([]);
24+
const alerts = ref<Array<DxChatTypes.Alert>>([]);
2725
const regenerationText = ref('Regeneration...');
2826
const copyButtonIcon = ref('copy');
2927
const isDisabled = ref(false);
@@ -67,8 +65,8 @@ export function useChatLogic() {
6765
return response.choices[0].message?.content;
6866
};
6967

70-
const processMessageSending = async() => {
71-
toggleDisabledState(true);
68+
const processMessageSending = async(e: DxChatTypes.MessageEnteredEvent) => {
69+
toggleDisabledState(true, e.event);
7270
typingUsers.value = [assistant];
7371

7472
try {
@@ -82,7 +80,7 @@ export function useChatLogic() {
8280
typingUsers.value = [];
8381
alertLimitReached();
8482
} finally {
85-
toggleDisabledState(false);
83+
toggleDisabledState(false, e.event);
8684
}
8785
};
8886

@@ -145,26 +143,28 @@ export function useChatLogic() {
145143
.toString();
146144
};
147145

148-
const toggleDisabledState = (disabled: boolean) => {
149-
let element = document.querySelector('.dx-chat-messagebox-textarea');
150-
let textAreaInstance = element ? TextArea.getInstance(element) as TextArea : null;
146+
const toggleDisabledState = (disabled: boolean, event?: { target?: EventTarget } | undefined) => {
147+
const element = event?.target as HTMLElement;
148+
isDisabled.value = disabled;
151149

152-
textAreaInstance?.option('disabled', disabled);
153-
154-
if (!disabled) {
155-
textAreaInstance?.focus();
150+
if (element) {
151+
if (disabled) {
152+
element.blur();
153+
} else {
154+
element.focus();
155+
}
156156
}
157157
};
158158

159-
const onMessageEntered = async(e: MessageEnteredEvent) => {
159+
const onMessageEntered = async(e: DxChatTypes.MessageEnteredEvent) => {
160160
let { message } = e;
161161
dataSource.value?.store().push([{
162162
type: 'insert',
163163
data: { id: Date.now(), ...message }
164164
}]);
165165

166166
messages.value.push({ role: 'user', content: message?.text ?? '' });
167-
await processMessageSending();
167+
await processMessageSending(e);
168168
};
169169

170170
const onCopyButtonClick = (message: {text: string}) => {
@@ -190,12 +190,12 @@ export function useChatLogic() {
190190
alerts,
191191
regenerationText,
192192
copyButtonIcon,
193-
isDisabled,
194193
loadMessage,
195194
initDataSource,
196195
convertToHtml,
197196
onMessageEntered,
198197
onCopyButtonClick,
199-
onRegenerateButtonClick
198+
onRegenerateButtonClick,
199+
isDisabled
200200
};
201201
}

0 commit comments

Comments
 (0)