1
1
import * as React from 'react'
2
2
import { useState , useEffect , useLayoutEffect } from 'react'
3
- import {
4
- MessageItem ,
5
- Message as MessageItemMessage ,
6
- stringToColor ,
7
- } from '../components/MessageItem'
3
+ import { MessageItem , stringToColor } from '../components/MessageItem'
8
4
import { StatusItem , Status } from '../components/StatusItem'
9
5
import { Channel } from 'twilio-chat/lib/channel'
10
6
import { Client , User } from 'twilio-chat'
@@ -67,15 +63,11 @@ export const ChannelView = ({
67
63
}
68
64
const [ message , setMessage ] = useState < string > ( '' )
69
65
const [ messages , updateMessages ] = useState < {
70
- messages : (
71
- | { sid : string ; message : MessageItemMessage }
72
- | { sid : string ; status : Status }
73
- ) [ ]
66
+ messages : ( { message : Message } | { status : Status } ) [ ]
74
67
lastIndex ?: number
75
68
} > ( {
76
69
messages : [
77
70
{
78
- sid : v4 ( ) ,
79
71
status : {
80
72
message : `Hint: type /help to list available commands.` ,
81
73
timestamp : new Date ( ) ,
@@ -133,16 +125,6 @@ export const ChannelView = ({
133
125
setMessage ( '' )
134
126
}
135
127
136
- const toMessage = ( message : Message ) => ( {
137
- sid : message . sid ,
138
- message : {
139
- timestamp : message . timestamp ,
140
- from : message . author ,
141
- message : message . body ,
142
- fromUser : message . author === identity ,
143
- } ,
144
- } )
145
-
146
128
const userChangedNickHandler = ( {
147
129
updateReasons,
148
130
user,
@@ -176,7 +158,7 @@ export const ChannelView = ({
176
158
const newMessageHandler = ( message : Message ) => {
177
159
updateMessages ( prevMessages => ( {
178
160
...prevMessages ,
179
- messages : [ ...prevMessages . messages , toMessage ( message ) ] ,
161
+ messages : [ ...prevMessages . messages , { message } ] ,
180
162
lastIndex : prevMessages . lastIndex
181
163
? prevMessages . lastIndex
182
164
: message . index ,
@@ -202,6 +184,15 @@ export const ChannelView = ({
202
184
}
203
185
}
204
186
187
+ const messageRemovedHandler = ( message : Message ) => {
188
+ updateMessages ( prevMessages => ( {
189
+ ...prevMessages ,
190
+ messages : prevMessages . messages . filter (
191
+ m => 'status' in m || m . message . sid !== message . sid ,
192
+ ) ,
193
+ } ) )
194
+ }
195
+
205
196
const memberJoinedHandler = ( member : Member ) => {
206
197
updateMessages ( prevMessages => ( {
207
198
...prevMessages ,
@@ -237,13 +228,18 @@ export const ChannelView = ({
237
228
useEffect ( ( ) => {
238
229
if ( channelConnection ) {
239
230
channelConnection . channel . on ( 'messageAdded' , newMessageHandler )
231
+ channelConnection . channel . on ( 'messageRemoved' , messageRemovedHandler )
240
232
channelConnection . channel . on ( 'memberJoined' , memberJoinedHandler )
241
233
channelConnection . channel . on ( 'memberLeft' , memberLeftHandler )
242
234
return ( ) => {
243
235
channelConnection . channel . removeListener (
244
236
'messageAdded' ,
245
237
newMessageHandler ,
246
238
)
239
+ channelConnection . channel . removeListener (
240
+ 'messageRemoved' ,
241
+ messageRemovedHandler ,
242
+ )
247
243
channelConnection . channel . removeListener (
248
244
'memberJoined' ,
249
245
memberJoinedHandler ,
@@ -295,7 +291,7 @@ export const ChannelView = ({
295
291
updateMessages ( prevMessages => ( {
296
292
...prevMessages ,
297
293
messages : [
298
- ...messages . items . map ( toMessage ) ,
294
+ ...messages . items . map ( message => ( { message } ) ) ,
299
295
...prevMessages . messages ,
300
296
] ,
301
297
lastIndex : messages . items [ 0 ] ?. index ?? undefined ,
@@ -432,17 +428,19 @@ export const ChannelView = ({
432
428
} }
433
429
/>
434
430
) }
435
- { messages . messages . map ( m =>
431
+ { messages . messages . map ( ( m , i ) =>
436
432
'status' in m ? (
437
- < StatusItem key = { m . sid } status = { m . status } />
433
+ < StatusItem key = { i } status = { m . status } />
438
434
) : (
439
435
< MessageItem
440
- key = { m . sid }
436
+ key = { m . message . sid }
441
437
message = { {
442
- ...m . message ,
443
- from : m . message . from ,
438
+ timestamp : m . message . timestamp ,
439
+ from : m . message . author ,
440
+ message : m . message . body ,
441
+ fromUser : m . message . author === identity ,
444
442
} }
445
- nick = { authorNicks [ m . message . from ] }
443
+ nick = { authorNicks [ m . message . author ] }
446
444
onRendered = { ( ) => {
447
445
// Scroll to the last item in the list
448
446
// if not at beginning
@@ -457,6 +455,17 @@ export const ChannelView = ({
457
455
}
458
456
} , 250 )
459
457
} }
458
+ onDelete = { ( ) => {
459
+ if ( confirm ( 'Really delete this message?' ) ) {
460
+ console . log ( `Deleting message ${ m . message . sid } ` )
461
+ m . message
462
+ . remove ( )
463
+ . then ( ( ) => {
464
+ console . log ( 'Removed' )
465
+ } )
466
+ . catch ( console . error )
467
+ }
468
+ } }
460
469
/>
461
470
) ,
462
471
) }
0 commit comments