@@ -10,6 +10,7 @@ import {
10
10
BaseMessage ,
11
11
MultipleFilesMessage ,
12
12
ReactionEvent ,
13
+ SendingStatus ,
13
14
UserMessage ,
14
15
} from '@sendbird/chat/message' ;
15
16
import { NEXT_THREADS_FETCH_SIZE , PREV_THREADS_FETCH_SIZE } from '../consts' ;
@@ -26,6 +27,8 @@ import useUpdateMessageCallback from './hooks/useUpdateMessageCallback';
26
27
import useDeleteMessageCallback from './hooks/useDeleteMessageCallback' ;
27
28
import { useThreadFetchers } from './hooks/useThreadFetchers' ;
28
29
30
+ import { cloneDeep } from 'lodash' ;
31
+
29
32
function hasReqId < T extends object > (
30
33
message : T ,
31
34
) : message is T & { reqId : string } {
@@ -56,6 +59,10 @@ const useThread = () => {
56
59
57
60
const sendMessageStatusActions = {
58
61
sendMessageStart : useCallback ( ( message : SendableMessageType ) => store . setState ( state => {
62
+ if ( 'sendingStatus' in message ) {
63
+ ( message as SendableMessageType ) . sendingStatus = SendingStatus . PENDING ;
64
+ }
65
+
59
66
return {
60
67
...state ,
61
68
localThreadMessages : [
@@ -66,6 +73,10 @@ const useThread = () => {
66
73
} ) , [ store ] ) ,
67
74
68
75
sendMessageSuccess : useCallback ( ( message : SendableMessageType ) => store . setState ( state => {
76
+ if ( 'sendingStatus' in message ) {
77
+ ( message as SendableMessageType ) . sendingStatus = SendingStatus . SUCCEEDED ;
78
+ }
79
+
69
80
return {
70
81
...state ,
71
82
allThreadMessages : [
@@ -81,6 +92,10 @@ const useThread = () => {
81
92
} ) , [ store ] ) ,
82
93
83
94
sendMessageFailure : useCallback ( ( message : SendableMessageType ) => store . setState ( state => {
95
+ if ( 'sendingStatus' in message ) {
96
+ ( message as SendableMessageType ) . sendingStatus = SendingStatus . FAILED ;
97
+ }
98
+
84
99
return {
85
100
...state ,
86
101
localThreadMessages : state . localThreadMessages . map ( ( m ) => (
@@ -92,6 +107,10 @@ const useThread = () => {
92
107
} ) , [ store ] ) ,
93
108
94
109
resendMessageStart : useCallback ( ( message : SendableMessageType ) => store . setState ( state => {
110
+ if ( 'sendingStatus' in message ) {
111
+ ( message as SendableMessageType ) . sendingStatus = SendingStatus . PENDING ;
112
+ }
113
+
95
114
return {
96
115
...state ,
97
116
localThreadMessages : state . localThreadMessages . map ( ( m ) => (
@@ -235,16 +254,16 @@ const useThread = () => {
235
254
236
255
initializeThreadListSuccess : useCallback ( ( parentMessage : BaseMessage , anchorMessage : SendableMessageType , threadedMessages : BaseMessage [ ] ) => store . setState ( state => {
237
256
const anchorMessageCreatedAt = ( ! anchorMessage ?. messageId ) ? parentMessage ?. createdAt : anchorMessage ?. createdAt ;
238
- const anchorIndex = threadedMessages . findIndex ( ( message ) => message ?. createdAt > anchorMessageCreatedAt ) ;
257
+ const anchorIndex = threadedMessages . findIndex ( ( message ) => message ?. createdAt === anchorMessageCreatedAt ) ;
239
258
const prevThreadMessages = anchorIndex > - 1 ? threadedMessages . slice ( 0 , anchorIndex ) : threadedMessages ;
240
- const anchorThreadMessage = anchorMessage ?. messageId ? [ anchorMessage ] : [ ] ;
241
259
const nextThreadMessages = anchorIndex > - 1 ? threadedMessages . slice ( anchorIndex ) : [ ] ;
260
+
242
261
return {
243
262
...state ,
244
263
threadListState : ThreadListStateTypes . INITIALIZED ,
245
264
hasMorePrev : anchorIndex === - 1 || anchorIndex === PREV_THREADS_FETCH_SIZE ,
246
265
hasMoreNext : threadedMessages . length - anchorIndex === NEXT_THREADS_FETCH_SIZE ,
247
- allThreadMessages : [ prevThreadMessages , anchorThreadMessage , nextThreadMessages ] . flat ( ) as CoreMessageType [ ] ,
266
+ allThreadMessages : [ ... prevThreadMessages , ... nextThreadMessages ] as CoreMessageType [ ] ,
248
267
} ;
249
268
} ) , [ store ] ) ,
250
269
@@ -397,18 +416,25 @@ const useThread = () => {
397
416
} ) , [ store ] ) ,
398
417
399
418
onReactionUpdated : useCallback ( ( reactionEvent : ReactionEvent ) => store . setState ( state => {
400
- if ( state ?. parentMessage ?. messageId === reactionEvent ?. messageId ) {
401
- state . parentMessage ?. applyReactionEvent ?.( reactionEvent ) ;
419
+ let updatedParentMessage = state . parentMessage ;
420
+ if ( state . parentMessage ?. messageId === reactionEvent ?. messageId ) {
421
+ updatedParentMessage = cloneDeep ( state . parentMessage as SendableMessageType ) ;
422
+ updatedParentMessage . applyReactionEvent ( reactionEvent ) ;
402
423
}
424
+
425
+ const updatedMessages = state . allThreadMessages . map ( ( m ) => {
426
+ if ( reactionEvent ?. messageId === m ?. messageId ) {
427
+ const updatedMessage = cloneDeep ( m as CoreMessageType ) ;
428
+ updatedMessage . applyReactionEvent ( reactionEvent ) ;
429
+ return updatedMessage ;
430
+ }
431
+ return m ;
432
+ } ) ;
433
+
403
434
return {
404
435
...state ,
405
- allThreadMessages : state . allThreadMessages . map ( ( m ) => {
406
- if ( reactionEvent ?. messageId === m ?. messageId ) {
407
- m ?. applyReactionEvent ?.( reactionEvent ) ;
408
- return m ;
409
- }
410
- return m ;
411
- } ) ,
436
+ parentMessage : updatedParentMessage ,
437
+ allThreadMessages : [ ...updatedMessages ] , // Create new array reference to trigger re-render
412
438
} ;
413
439
} ) , [ store ] ) ,
414
440
0 commit comments