11import { ref } from 'vue' ;
22import { 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' ;
54import { unified } from 'unified' ;
65import remarkParse from 'remark-parse' ;
76import remarkRehype from 'remark-rehype' ;
87import rehypeStringify from 'rehype-stringify' ;
98import { 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
1311const ALERT_TIMEOUT = 10000 ;
1412const 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
2220export 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