@@ -47,11 +47,15 @@ export class ChatBoxMessage extends Component {
47
47
@query ( '#edit-tooltip' )
48
48
accessor editTooltip : SlTooltip ;
49
49
50
+ @query ( '#message-editor' )
51
+ accessor messageEditor : HTMLElement ;
52
+
53
+ @query ( '#message-submit' )
54
+ accessor messageSubmit : HTMLButtonElement ;
55
+
50
56
@query ( ".chat-message-boxed" )
51
57
accessor chatMessageBoxed : HTMLElement ;
52
58
53
- editedText : string = "" ;
54
-
55
59
timestamp : string ;
56
60
57
61
content : string ;
@@ -88,14 +92,7 @@ export class ChatBoxMessage extends Component {
88
92
< div class ="chat-message-boxed ">
89
93
${ when ( this . editing , ( ) => html `
90
94
< div class ="chat-message-edit ">
91
- < textarea
92
- @input ="${ ( e : InputEvent ) => this . editedText = ( e . target as HTMLTextAreaElement ) . value } "
93
- .value ="${ this . editedText } " id ="edit-message-textarea ">
94
- </ textarea >
95
- < sl-button id ="message-submit " slot ="right-pane " @click ="${ this . postEditedMessage } "
96
- type ="submit " form ="course-message-form " size ="medium " circle >
97
- < sl-icon name ="send "> </ sl-icon >
98
- </ sl-button >
95
+ < div id ="message-editor " contenteditable ="true "> ${ this . message . text } </ div >
99
96
</ div >
100
97
` ) }
101
98
${ when ( ! this . editing , ( ) => html `
@@ -112,6 +109,14 @@ export class ChatBoxMessage extends Component {
112
109
113
110
return html `
114
111
< div class ="modify-buttons ">
112
+ ${ when ( this . editing , ( ) => html `
113
+ < sl-button id ="message-submit " slot ="right-pane " @click ="${ this . postEditedMessage } "
114
+ type ="submit " form ="course-message-form " size ="medium ">
115
+ < sl-icon slot ="prefix " name ="send "> </ sl-icon >
116
+ ${ t ( "course.feature.message.send" ) }
117
+ </ sl-button >
118
+ ` ) }
119
+
115
120
< sl-tooltip id ="reply-tooltip " .content ="${ t ( "course.feature.message.reply.button" ) } " trigger ="hover ">
116
121
< sl-icon-button name ="chat-reply " @click ="${ this . replyToMessage } " form ="course-message-form " size ="small " ?disabled ="${ ! this . canReply ( ) } "> </ sl-icon-button >
117
122
</ sl-tooltip >
@@ -175,7 +180,7 @@ export class ChatBoxMessage extends Component {
175
180
176
181
}
177
182
178
- private replyToMessage ( event : Event ) : void {
183
+ private replyToMessage ( _event : Event ) : void {
179
184
if ( ! this . chatForm ) {
180
185
throw new Error ( "Form is null" ) ;
181
186
}
@@ -189,23 +194,36 @@ export class ChatBoxMessage extends Component {
189
194
this . hideTooltips ( ) ;
190
195
191
196
this . editing = true ;
192
- this . editedText = this . message . text ;
193
197
194
198
const clickListener = ( e : MouseEvent ) => this . cancelEditing ( e ) ;
195
199
document . addEventListener ( 'mousedown' , clickListener ) ;
196
200
197
- this . globalClickListener = clickListener ;
201
+ this . globalClickListener = clickListener ;
202
+
203
+ setTimeout ( ( ) => {
204
+ this . messageEditor . focus ( ) ;
205
+ } , 0 ) ;
198
206
}
199
207
200
- private postEditedMessage ( event : Event ) : void {
208
+ private postEditedMessage ( event : Event ) : void {
209
+ const editedText = this . messageEditor . innerText ;
210
+
211
+ if ( editedText == this . message . text ) {
212
+ this . editing = false ;
213
+ return ;
214
+ }
215
+
201
216
document . removeEventListener ( 'mousedown' , this . globalClickListener ) ;
202
217
const editButton = < HTMLButtonElement > event . target ;
203
218
editButton . disabled = true ;
204
219
205
- this . chatService . editMessage ( this . editedText , this . message . messageId )
220
+ this . chatService . editMessage ( editedText , this . message . messageId )
206
221
. then ( ( ) => {
222
+ this . message . text = editedText ;
207
223
this . editing = false ;
208
- if ( this . editedText != this . message . text ) Toaster . showSuccess ( `${ t ( "course.feature.message.edited" ) } ` ) ;
224
+
225
+ Toaster . showSuccess ( `${ t ( "course.feature.message.edited" ) } ` ) ;
226
+
209
227
editButton . disabled = false ;
210
228
} )
211
229
. catch ( error => {
@@ -232,29 +250,39 @@ export class ChatBoxMessage extends Component {
232
250
}
233
251
234
252
private canReply ( ) : boolean {
235
- if ( this . editing || this . message . deleted ) return false ;
236
-
237
- if ( ! privilegeStore . canWriteMessages ( ) ) return false ;
238
- if ( ChatService . isPrivateMessage ( this . message ) && ! privilegeStore . canWritePrivateMessages ( ) ) return false ;
239
- if ( ChatService . isMessageToOrganisers ( this . message ) && ! privilegeStore . canWriteMessagesToOrganisators ( ) ) return false ;
253
+ if ( this . editing || this . message . deleted ) {
254
+ return false ;
255
+ }
256
+ if ( ! privilegeStore . canWriteMessages ( ) ) {
257
+ return false ;
258
+ }
259
+ if ( ChatService . isPrivateMessage ( this . message ) && ! privilegeStore . canWritePrivateMessages ( ) ) {
260
+ return false ;
261
+ }
262
+ if ( ChatService . isMessageToOrganisers ( this . message ) && ! privilegeStore . canWriteMessagesToOrganisators ( ) ) {
263
+ return false ;
264
+ }
240
265
241
266
return privilegeStore . canWriteMessagesToAll ( ) ;
242
267
}
243
268
244
- private cancelEditing ( event : MouseEvent ) : void {
245
- if ( ! this . chatMessageBoxed ) return ;
269
+ private cancelEditing ( event : MouseEvent ) : void {
270
+ if ( ! this . chatMessageBoxed ) {
271
+ return ;
272
+ }
246
273
247
- const clickWithinMessageBox : boolean = ChatBoxMessage . isWithinRect (
248
- event . clientX , event . clientY ,
249
- this . chatMessageBoxed . getBoundingClientRect ( ) )
274
+ const clickWithinMessageSubmit = ChatBoxMessage . isWithinRect ( event . clientX , event . clientY ,
275
+ this . messageSubmit ?. getBoundingClientRect ( ) ?? new DOMRect ( ) ) ;
276
+ const clickWithinMessageBox = ChatBoxMessage . isWithinRect ( event . clientX , event . clientY ,
277
+ this . chatMessageBoxed . getBoundingClientRect ( ) ) ;
250
278
251
- if ( clickWithinMessageBox ) {
279
+ if ( clickWithinMessageBox || clickWithinMessageSubmit ) {
252
280
return ;
253
281
}
254
282
255
- this . editing = false ;
283
+ this . editing = false ;
256
284
257
- document . removeEventListener ( 'mousedown' , this . globalClickListener ) ;
285
+ document . removeEventListener ( 'mousedown' , this . globalClickListener ) ;
258
286
}
259
287
260
288
private static getMessageDate ( message : ChatMessage ) {
0 commit comments