4949
5050<script setup lang="ts">
5151import { ref , onBeforeMount } from ' vue' ;
52+ import { AzureOpenAI } from ' openai' ;
5253import DxChat , { type DxChatTypes } from ' devextreme-vue/chat' ;
5354import DxButton from ' devextreme-vue/button' ;
5455import { loadMessages } from ' devextreme-vue/common/core/localization' ;
55- import { AzureOpenAI } from ' openai' ;
56+ import { type Events } from ' devextreme-vue/common/core' ;
57+
5658import {
5759 dictionary ,
5860 messages ,
@@ -67,40 +69,40 @@ import {
6769
6870const chatService = new AzureOpenAI (AzureOpenAIConfig );
6971
70- const typingUsers = ref ([]);
71- const alerts = ref ([]);
72+ const typingUsers = ref <{ id : string , name : string }[]> ([]);
73+ const alerts = ref <{ message : string }[]> ([]);
7274const isDisabled = ref (false );
7375const copyButtonIcon = ref (' copy' );
7476
7577onBeforeMount (() => {
7678 loadMessages (dictionary );
7779});
7880
79- async function getAIResponse(messages ) {
80- const params = {
81- messages ,
81+ async function getAIResponse(messages : DxChatTypes . Message []) : Promise < string > {
82+ const params: Record < string , any > = {
83+ messages: messages ,
8284 model: AzureOpenAIConfig .deployment ,
8385 max_tokens: 1000 ,
8486 temperature: 0.7 ,
8587 };
8688
87- const response = await chatService .chat .completions .create (params );
89+ const response = await chatService .chat .completions .create (params as any );
8890 const data = { choices: response .choices };
8991
90- return data .choices [0 ].message ?.content ;
92+ return data .choices [0 ].message ?.content || ' ' ;
9193}
9294
93- function toggleDisabledState(disabled , event = undefined ) {
95+ function toggleDisabledState(disabled : boolean , event ? : Events . EventObject ) : void {
9496 isDisabled .value = disabled ;
9597
9698 if (disabled ) {
97- event ?.target .blur ();
99+ ( event ?.target as HTMLElement )? .blur ();
98100 } else {
99- event ?.target .focus ();
101+ ( event ?.target as HTMLElement )? .focus ();
100102 }
101103}
102104
103- function updateLastMessage(text = REGENERATION_TEXT ) {
105+ function updateLastMessage(text : string = REGENERATION_TEXT ): void {
104106 const items = dataSource .items ();
105107 const lastMessage = items .at (- 1 );
106108
@@ -111,7 +113,7 @@ function updateLastMessage(text = REGENERATION_TEXT) {
111113 }]);
112114}
113115
114- function renderAssistantMessage(text ) {
116+ function renderAssistantMessage(text : string ) : void {
115117 const message = {
116118 id: Date .now (),
117119 timestamp: new Date (),
@@ -122,7 +124,7 @@ function renderAssistantMessage(text) {
122124 dataSource .store ().push ([{ type: ' insert' , data: message }]);
123125}
124126
125- async function processMessageSending(message , event ) {
127+ async function processMessageSending(message : DxChatTypes . TextMessage , event : Events . EventObject | undefined ) : Promise < void > {
126128 toggleDisabledState (true , event );
127129
128130 messages .push ({ role: ' user' , content: message .text });
@@ -145,7 +147,7 @@ async function processMessageSending(message, event) {
145147 }
146148}
147149
148- function alertLimitReached() {
150+ function alertLimitReached(): void {
149151 alerts .value = [{
150152 message: ' Request limit reached, try again in a minute.' ,
151153 }];
@@ -155,7 +157,7 @@ function alertLimitReached() {
155157 }, ALERT_TIMEOUT );
156158}
157159
158- async function regenerate() {
160+ async function regenerate(): Promise < void > {
159161 toggleDisabledState (true );
160162
161163 try {
@@ -171,15 +173,15 @@ async function regenerate() {
171173 }
172174}
173175
174- function onMessageEntered({ message , event }: DxChatTypes .MessageEnteredEvent ) {
176+ function onMessageEntered({ message , event }: DxChatTypes .MessageEnteredEvent ): void {
175177 dataSource .store ().push ([{ type: ' insert' , data: { id: Date .now (), ... message } }]);
176178
177179 if (! alerts .value .length ) {
178180 processMessageSending (message , event );
179181 }
180182}
181183
182- function onCopyButtonClick(message ) {
184+ function onCopyButtonClick(message : { text : string }) : void {
183185 navigator .clipboard ?.writeText (message .text );
184186 copyButtonIcon .value = ' check' ;
185187
@@ -188,7 +190,7 @@ function onCopyButtonClick(message) {
188190 }, 2500 );
189191}
190192
191- function onRegenerateButtonClick() {
193+ function onRegenerateButtonClick(): void {
192194 updateLastMessage ();
193195 regenerate ();
194196}
0 commit comments