Skip to content

Commit 8af0af8

Browse files
Chat MessageEditing demo: handle editing as a nested component (DevExpress#29847)
1 parent cc4efe3 commit 8af0af8

File tree

5 files changed

+85
-60
lines changed

5 files changed

+85
-60
lines changed

apps/demos/Demos/Chat/MessageEditing/Angular/app/app.component.html

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,17 @@
44
#chat
55
[height]="600"
66
[dataSource]="dataSource"
7-
[editing]="editingOptions"
87
[reloadOnChange]="false"
98
[user]="currentUser"
109
(onMessageEntered)="onMessageEntered($event)"
1110
(onMessageDeleted)="onMessageDeleted($event)"
1211
(onMessageUpdated)="onMessageUpdated($event)"
13-
></dx-chat>
12+
>
13+
<dxo-chat-editing
14+
[allowUpdating]="allowUpdating"
15+
[allowDeleting]="allowDeleting"
16+
></dxo-chat-editing>
17+
</dx-chat>
1418
</div>
1519

1620
<div class="options">
@@ -24,7 +28,7 @@
2428
valueExpr="key"
2529
[value]="selectedEditingStrategy"
2630
[inputAttr]="alloUpdatingLabel"
27-
(onValueChanged)="onEditingStrategyChange($event, 'allowUpdating')"
31+
(onValueChanged)="onAllowUpdatingChange($event)"
2832
></dx-select-box>
2933
</div>
3034

@@ -36,7 +40,7 @@
3640
valueExpr="key"
3741
[value]="selectedDeletingStrategy"
3842
[inputAttr]="allowDeletingLabel"
39-
(onValueChanged)="onEditingStrategyChange($event, 'allowDeleting')"
43+
(onValueChanged)="onAllowDeletingChange($event)"
4044
></dx-select-box>
4145
</div>
4246
</div>

apps/demos/Demos/Chat/MessageEditing/Angular/app/app.component.ts

Lines changed: 14 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@ import {
77
MessageEnteredEvent,
88
MessageDeletedEvent,
99
MessageUpdatedEvent,
10-
Editing,
1110
} from 'devextreme/ui/chat';
1211
import DataSource from 'devextreme/data/data_source';
1312
import { AppService } from './app.service';
@@ -30,10 +29,9 @@ if (window && window.config?.packageConfigPaths) {
3029
export class AppComponent {
3130
currentUser: User;
3231

33-
editingOptions: Editing = {
34-
allowUpdating: true,
35-
allowDeleting: true,
36-
};
32+
allowUpdating = true;
33+
34+
allowDeleting = true;
3735

3836
editingStrategies = [
3937
{ key: 'enabled', text: 'Enabled' },
@@ -58,7 +56,9 @@ export class AppComponent {
5856
const { items, user } = component.option();
5957
const userId = user.id;
6058

61-
const lastNotDeletedMessage = items.findLast((item: any) => item.author?.id === userId && !item.isDeleted);
59+
const lastNotDeletedMessage = items.findLast(
60+
(item: any) => item.author?.id === userId && !item.isDeleted
61+
);
6262

6363
return message.id === lastNotDeletedMessage?.id;
6464
},
@@ -81,10 +81,14 @@ export class AppComponent {
8181
this.appService.onMessageUpdated(e);
8282
}
8383

84-
onEditingStrategyChange(event: any, type: string): void {
85-
this.editingOptions = {
86-
[type]: this.editingStrategy[event.value],
87-
};
84+
onAllowUpdatingChange(event: any): void {
85+
this.allowUpdating = this.editingStrategy[event.value];
86+
this.selectedEditingStrategy = event.value;
87+
}
88+
89+
onAllowDeletingChange(event: any): void {
90+
this.allowDeleting = this.editingStrategy[event.value];
91+
this.selectedDeletingStrategy = event.value;
8892
}
8993
}
9094

apps/demos/Demos/Chat/MessageEditing/React/App.tsx

Lines changed: 19 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import React, { useState, useCallback } from 'react';
2-
import Chat, { type ChatTypes } from 'devextreme-react/chat';
2+
import Chat, { type ChatTypes, Editing } from 'devextreme-react/chat';
33
import SelectBox from 'devextreme-react/select-box';
44
import CustomStore from 'devextreme/data/custom_store';
55
import DataSource from 'devextreme/data/data_source';
@@ -43,10 +43,8 @@ const dataSource = new DataSource({
4343
});
4444

4545
export default function App() {
46-
const [chatEditing, setChatEditing] = useState<ChatTypes.Editing>({
47-
allowUpdating: true,
48-
allowDeleting: true,
49-
});
46+
const [allowUpdating, setAllowUpdating] = useState(true);
47+
const [allowDeleting, setAllowDeleting] = useState(true);
5048

5149
const onMessageEntered = useCallback((
5250
{ message }: ChatTypes.MessageEnteredEvent,
@@ -83,11 +81,14 @@ export default function App() {
8381
}]);
8482
}, []);
8583

86-
const handleEditingChange = useCallback((type) => (e) => {
87-
setChatEditing((prev) => ({
88-
...prev,
89-
[type]: editingStrategy[e.value],
90-
}));
84+
const handleAllowUpdatingChange = useCallback((e) => {
85+
const strategy = editingStrategy[e.value];
86+
setAllowUpdating(() => strategy);
87+
}, []);
88+
89+
const handleAllowDeletingChange = useCallback((e) => {
90+
const strategy = editingStrategy[e.value];
91+
setAllowDeleting(() => strategy);
9192
}, []);
9293

9394
return (
@@ -98,11 +99,15 @@ export default function App() {
9899
dataSource={dataSource}
99100
user={currentUser}
100101
reloadOnChange={false}
101-
editing={chatEditing}
102102
onMessageEntered={onMessageEntered}
103103
onMessageDeleted={onMessageDeleted}
104104
onMessageUpdated={onMessageUpdated}
105-
/>
105+
>
106+
<Editing
107+
allowDeleting={allowDeleting}
108+
allowUpdating={allowUpdating}
109+
/>
110+
</Chat>
106111
</div>
107112

108113
<div className="options">
@@ -115,7 +120,7 @@ export default function App() {
115120
displayExpr="text"
116121
inputAttr= {allowEditingLabel}
117122
defaultValue={editingOptions[0].key}
118-
onValueChanged={handleEditingChange('allowUpdating')}
123+
onValueChanged={handleAllowUpdatingChange}
119124
/>
120125
</div>
121126
<div className="option">
@@ -126,7 +131,7 @@ export default function App() {
126131
displayExpr="text"
127132
inputAttr= {allowDeletingLabel}
128133
defaultValue={editingOptions[0].key}
129-
onValueChanged={handleEditingChange('allowDeleting')}
134+
onValueChanged={handleAllowDeletingChange}
130135
/>
131136
</div>
132137
</div>

apps/demos/Demos/Chat/MessageEditing/ReactJs/App.js

Lines changed: 19 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import React, { useState, useCallback } from 'react';
2-
import Chat from 'devextreme-react/chat';
2+
import Chat, { Editing } from 'devextreme-react/chat';
33
import SelectBox from 'devextreme-react/select-box';
44
import CustomStore from 'devextreme/data/custom_store';
55
import DataSource from 'devextreme/data/data_source';
@@ -38,10 +38,8 @@ const dataSource = new DataSource({
3838
paginate: false,
3939
});
4040
export default function App() {
41-
const [chatEditing, setChatEditing] = useState({
42-
allowUpdating: true,
43-
allowDeleting: true,
44-
});
41+
const [allowUpdating, setAllowUpdating] = useState(true);
42+
const [allowDeleting, setAllowDeleting] = useState(true);
4543
const onMessageEntered = useCallback(({ message }) => {
4644
const newMessage = {
4745
id: new Guid().toString(),
@@ -73,15 +71,14 @@ export default function App() {
7371
},
7472
]);
7573
}, []);
76-
const handleEditingChange = useCallback(
77-
(type) => (e) => {
78-
setChatEditing((prev) => ({
79-
...prev,
80-
[type]: editingStrategy[e.value],
81-
}));
82-
},
83-
[],
84-
);
74+
const handleAllowUpdatingChange = useCallback((e) => {
75+
const strategy = editingStrategy[e.value];
76+
setAllowUpdating(() => strategy);
77+
}, []);
78+
const handleAllowDeletingChange = useCallback((e) => {
79+
const strategy = editingStrategy[e.value];
80+
setAllowDeleting(() => strategy);
81+
}, []);
8582
return (
8683
<React.Fragment>
8784
<div className="chat-container">
@@ -90,11 +87,15 @@ export default function App() {
9087
dataSource={dataSource}
9188
user={currentUser}
9289
reloadOnChange={false}
93-
editing={chatEditing}
9490
onMessageEntered={onMessageEntered}
9591
onMessageDeleted={onMessageDeleted}
9692
onMessageUpdated={onMessageUpdated}
97-
/>
93+
>
94+
<Editing
95+
allowDeleting={allowDeleting}
96+
allowUpdating={allowUpdating}
97+
/>
98+
</Chat>
9899
</div>
99100

100101
<div className="options">
@@ -107,7 +108,7 @@ export default function App() {
107108
displayExpr="text"
108109
inputAttr={allowEditingLabel}
109110
defaultValue={editingOptions[0].key}
110-
onValueChanged={handleEditingChange('allowUpdating')}
111+
onValueChanged={handleAllowUpdatingChange}
111112
/>
112113
</div>
113114
<div className="option">
@@ -118,7 +119,7 @@ export default function App() {
118119
displayExpr="text"
119120
inputAttr={allowDeletingLabel}
120121
defaultValue={editingOptions[0].key}
121-
onValueChanged={handleEditingChange('allowDeleting')}
122+
onValueChanged={handleAllowDeletingChange}
122123
/>
123124
</div>
124125
</div>

apps/demos/Demos/Chat/MessageEditing/Vue/App.vue

Lines changed: 25 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,15 @@
55
:data-source="dataSource"
66
:user="currentUser"
77
:reload-on-change="false"
8-
v-model:editing="chatEditing"
98
@messageEntered="onMessageEntered"
109
@messageDeleted="onMessageDeleted"
1110
@messageUpdated="onMessageUpdated"
12-
/>
11+
>
12+
<DxEditing
13+
:allow-deleting="allowDeleting"
14+
:allow-updating="allowUpdating"
15+
/>
16+
</DxChat>
1317
</div>
1418
<div class="options">
1519
<div class="caption">Options</div>
@@ -20,8 +24,8 @@
2024
value-expr="key"
2125
display-expr="text"
2226
:input-attr="allowEditingLabel"
23-
:value="editingOptions[0].key"
24-
@valueChanged="(e) => handleEditingChange(e, 'allowUpdating')"
27+
:value="selectedEditingStrategy"
28+
@valueChanged="onAllowEditingChange"
2529
/>
2630
</div>
2731
<div class="option">
@@ -31,16 +35,16 @@
3135
value-expr="key"
3236
display-expr="text"
3337
:input-attr="allowDeletingLabel"
34-
:value="editingOptions[0].key"
35-
@valueChanged="(e) => handleEditingChange(e, 'allowDeleting')"
38+
:value="selectedDeletingStrategy"
39+
@valueChanged="onAllowDeletingChange"
3640
/>
3741
</div>
3842
</div>
3943
</template>
4044

4145
<script setup lang="ts">
4246
import { ref, computed } from 'vue';
43-
import DxChat from 'devextreme-vue/chat';
47+
import DxChat, { DxEditing } from 'devextreme-vue/chat';
4448
import DxSelectBox from 'devextreme-vue/select-box';
4549
import CustomStore from 'devextreme/data/custom_store';
4650
import DataSource from 'devextreme/data/data_source';
@@ -53,11 +57,6 @@ import {
5357
allowDeletingLabel,
5458
} from './data.ts';
5559
56-
const chatEditing = ref<{ allowUpdating?: boolean, allowDeleting?: boolean }>({
57-
allowUpdating: true,
58-
allowDeleting: true,
59-
});
60-
6160
const store = [...initialMessages];
6261
6362
const customStore = new CustomStore({
@@ -124,8 +123,20 @@ const editingStrategy = {
124123
},
125124
};
126125
127-
const handleEditingChange = (e, type: 'allowUpdating' | 'allowDeleting') => {
128-
chatEditing.value = { [type]: editingStrategy[e.value] };
126+
const selectedEditingStrategy = ref('enabled');
127+
const selectedDeletingStrategy = ref('enabled');
128+
129+
const allowUpdating = ref(editingStrategy[selectedEditingStrategy.value]);
130+
const allowDeleting = ref(editingStrategy[selectedDeletingStrategy.value]);
131+
132+
const onAllowEditingChange = (event) => {
133+
selectedEditingStrategy.value = event.value;
134+
allowUpdating.value = editingStrategy[event.value];
135+
};
136+
137+
const onAllowDeletingChange = (event) => {
138+
selectedDeletingStrategy.value = event.value;
139+
allowDeleting.value = editingStrategy[event.value];
129140
};
130141
</script>
131142

0 commit comments

Comments
 (0)