Skip to content

Commit d8acb81

Browse files
authored
Merge pull request #14 from DevExpress-Examples/Angular-changes
Angular - Fix TS
2 parents b6d66c5 + 941b0a2 commit d8acb81

File tree

5 files changed

+53
-37
lines changed

5 files changed

+53
-37
lines changed

Angular/src/app/app.component.html

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
<div class="demo-container">
22
<dx-chat
3+
[class.chat-disabled]="isDisabled"
34
[dataSource]="dataSource"
45
[reloadOnChange]="false"
56
[showAvatar]="false"

Angular/src/app/app.component.scss

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,11 @@
33
justify-content: center;
44
}
55

6+
::ng-deep .chat-disabled .dx-chat-messagebox {
7+
opacity: 0.5;
8+
pointer-events: none !important;
9+
}
10+
611
::ng-deep .dx-chat {
712
max-width: 900px;
813
}

Angular/src/app/app.component.ts

Lines changed: 19 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
import { Component } from '@angular/core';
2-
import { User, Alert, Message, MessageEnteredEvent } from "devextreme/ui/chat";
2+
import { type DxChatTypes } from 'devextreme-angular/ui/chat';
33
import { Observable } from "rxjs";
44
import { AppService } from "./app.service";
55
import { loadMessages } from "devextreme/localization";
6-
import DataSource from "devextreme/data/data_source";
6+
import { DataSource } from 'devextreme-angular/common/data';
77

88
@Component({
99
selector: 'app-root',
@@ -13,14 +13,16 @@ import DataSource from "devextreme/data/data_source";
1313
export class AppComponent {
1414
dataSource: DataSource;
1515

16-
user: User;
16+
user: DxChatTypes.User;
1717

18-
typingUsers$: Observable<User[]> ;
18+
typingUsers$: Observable<DxChatTypes.User[]> ;
1919

20-
alerts$: Observable<Alert[]>;
20+
alerts$: Observable<DxChatTypes.Alert[]>;
2121

2222
copyButtonIcon: string;
2323

24+
isDisabled = false;
25+
2426
regenerationText: string;
2527

2628
constructor(private readonly appService: AppService) {
@@ -33,16 +35,21 @@ export class AppComponent {
3335
this.regenerationText = this.appService.REGENERATION_TEXT;
3436
this.copyButtonIcon = "copy";
3537
}
36-
convertToHtml(message: Message): string {
38+
convertToHtml(message: DxChatTypes.Message): string {
3739
return this.appService.convertToHtml(message.text || "");
3840
}
3941

4042

41-
async onMessageEntered(e: MessageEnteredEvent) {
43+
async onMessageEntered(e: DxChatTypes.MessageEnteredEvent) {
44+
this.isDisabled = true;
45+
try {
4246
await this.appService.onMessageEntered(e);
47+
} finally {
48+
this.isDisabled = false;
49+
}
4350
}
4451

45-
onCopyButtonClick(message: Message) {
52+
onCopyButtonClick(message: DxChatTypes.Message) {
4653
navigator.clipboard?.writeText(message.text ?? "");
4754

4855
this.copyButtonIcon = "check";
@@ -54,12 +61,14 @@ export class AppComponent {
5461

5562
async onRegenerateButtonClick() {
5663
this.appService.updateLastMessage();
57-
this.appService.toggleDisabledState(true);
64+
this.appService.toggleDisabledState(true, undefined);
65+
this.isDisabled = true;
5866

5967
try {
6068
await this.appService.regenerate();
6169
} finally {
62-
this.appService.toggleDisabledState(false);
70+
this.appService.toggleDisabledState(false, undefined);
71+
this.isDisabled = false;
6372
}
6473
}
6574
}

Angular/src/app/app.service.ts

Lines changed: 28 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,10 @@ import { unified } from "unified";
55
import remarkParse from "remark-parse";
66
import remarkRehype from "remark-rehype";
77
import rehypeStringify from "rehype-stringify";
8-
import { User, Alert, MessageEnteredEvent } from "devextreme/ui/chat";
9-
import DataSource from "devextreme/data/data_source";
10-
import CustomStore from "devextreme/data/custom_store";
11-
import TextArea from 'devextreme/ui/text_area';
8+
import { type DxChatTypes } from 'devextreme-angular/ui/chat';
9+
import { DataSource } from 'devextreme-angular/common/data';
10+
import { CustomStore } from 'devextreme-angular/common/data';
11+
1212
@Injectable({
1313
providedIn: "root",
1414
})
@@ -24,26 +24,26 @@ export class AppService {
2424
REGENERATION_TEXT = "Regeneration...";
2525
ALERT_TIMEOUT = 10000;
2626

27-
user: User = {
27+
user: DxChatTypes.User = {
2828
id: "user",
2929
};
3030

31-
assistant: User = {
31+
assistant: DxChatTypes.User = {
3232
id: "assistant",
3333
name: "Virtual Assistant",
3434
};
3535

36-
store: Array<{ id: number; timestamp: Date; author: User; text: string }> = [];
36+
store: Array<{ id: number; timestamp: Date; author: DxChatTypes.User; text: string }> = [];
3737
messages: Array<{ role: "user" | "assistant" | "system"; content: string }> = [];
38-
alerts: Alert[] = [];
38+
alerts: DxChatTypes.Alert[] = [];
3939

4040
customStore: CustomStore | undefined;
4141

4242
dataSource: DataSource | undefined;
4343

44-
typingUsersSubject: BehaviorSubject<User[]> = new BehaviorSubject<User[]>([]);
44+
typingUsersSubject: BehaviorSubject<DxChatTypes.User[]> = new BehaviorSubject<DxChatTypes.User[]>([]);
4545

46-
alertsSubject: BehaviorSubject<Alert[]> = new BehaviorSubject<Alert[]>([]);
46+
alertsSubject: BehaviorSubject<DxChatTypes.Alert[]> = new BehaviorSubject<DxChatTypes.Alert[]>([]);
4747

4848
constructor() {
4949
this.chatService = new OpenAI(this.OpenAIConfig);
@@ -52,11 +52,11 @@ export class AppService {
5252
this.alertsSubject.next([]);
5353
}
5454

55-
get typingUsers$(): Observable<User[]> {
55+
get typingUsers$(): Observable<DxChatTypes.User[]> {
5656
return this.typingUsersSubject.asObservable();
5757
}
5858

59-
get alerts$(): Observable<Alert[]> {
59+
get alerts$(): Observable<DxChatTypes.Alert[]> {
6060
return this.alertsSubject.asObservable();
6161
}
6262

@@ -70,14 +70,15 @@ export class AppService {
7070
},
7171
};
7272
}
73-
toggleDisabledState(disabled: boolean, event?: Event) {
74-
let element = document.querySelector(`.dx-chat-messagebox-textarea`);
75-
let textAreaInstance = element ? TextArea.getInstance(element) as TextArea : null;
76-
77-
textAreaInstance?.option({ disabled });
78-
79-
if (!disabled) {
80-
textAreaInstance?.focus();
73+
toggleDisabledState(disabled: boolean, event?: { target?: EventTarget } | undefined) {
74+
const element = event?.target as HTMLElement;
75+
76+
if (element) {
77+
if (disabled) {
78+
element.blur();
79+
} else {
80+
element.focus();
81+
}
8182
}
8283
}
8384
initDataSource() {
@@ -122,8 +123,8 @@ export class AppService {
122123
return data.choices[0].message?.content;
123124
}
124125

125-
async processMessageSending() {
126-
this.toggleDisabledState(true);
126+
async processMessageSending(e: DxChatTypes.MessageEnteredEvent) {
127+
this.toggleDisabledState(true, e.event);
127128

128129
this.typingUsersSubject.next([this.assistant]);
129130
try {
@@ -137,7 +138,7 @@ export class AppService {
137138
this.typingUsersSubject.next([]);
138139
this.alertLimitReached();
139140
} finally {
140-
this.toggleDisabledState(false);
141+
this.toggleDisabledState(false, e.event);
141142
}
142143
}
143144

@@ -179,7 +180,7 @@ export class AppService {
179180
}, this.ALERT_TIMEOUT);
180181
}
181182

182-
setAlerts(alerts: Alert[]) {
183+
setAlerts(alerts: DxChatTypes.Alert[]) {
183184
this.alerts = alerts;
184185
this.alertsSubject.next(alerts);
185186
}
@@ -214,12 +215,13 @@ export class AppService {
214215
return result;
215216
}
216217

217-
async onMessageEntered({ message, event }: MessageEnteredEvent) {
218+
async onMessageEntered(event: DxChatTypes.MessageEnteredEvent) {
219+
let { message } = event;
218220
this.dataSource
219221
?.store()
220222
.push([{ type: "insert", data: { id: Date.now(), ...message } }]);
221223

222224
this.messages.push({ role: "user", content: message?.text ?? "" });
223-
this.processMessageSending();
225+
await this.processMessageSending(event);
224226
}
225227
}

README.md

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
<!-- default badges list -->
2-
![](https://img.shields.io/endpoint?url=https://codecentral.devexpress.com/api/v1/VersionRange/1018060321/24.2.3%2B)
32
[![](https://img.shields.io/badge/Open_in_DevExpress_Support_Center-FF7200?style=flat-square&logo=DevExpress&logoColor=white)](https://supportcenter.devexpress.com/ticket/details/T1299498)
43
[![](https://img.shields.io/badge/📖_How_to_use_DevExpress_Examples-e9f6fc?style=flat-square)](https://docs.devexpress.com/GeneralInformation/403183)
54
[![](https://img.shields.io/badge/💬_Leave_Feedback-feecdd?style=flat-square)](#does-this-example-address-your-development-requirementsobjectives)

0 commit comments

Comments
 (0)