@@ -162,104 +162,76 @@ export const SessionProvider: React.FC<SessionProviderProps> = ({
162
162
163
163
setMessages ( ( prev ) => [ ...prev , newMessage ] ) ;
164
164
165
- socket . emit (
166
- "chatSendMessage" ,
167
- newMessage ,
168
- ( ack : {
169
- success : boolean ;
170
- data : { id : string ; timestamp : string } ;
171
- error : string | undefined ;
172
- } ) => {
173
- setMessages ( ( prev ) =>
174
- prev . map ( ( message ) => {
175
- if ( message . id !== ack . data . id ) return message ;
176
- if ( ack . success ) {
177
- return {
178
- ...message ,
179
- status : ChatMessageStatusEnum . enum . sent ,
180
- } ;
181
- } else {
182
- return {
183
- ...message ,
184
- status : ChatMessageStatusEnum . enum . failed ,
185
- } ;
186
- }
187
- } )
188
- ) ;
189
-
190
- if ( ack . success ) {
191
- newMessage . status = ChatMessageStatusEnum . enum . sent ;
192
- newMessage . timestamp = ack . data . timestamp ;
193
- } else {
194
- newMessage . status = ChatMessageStatusEnum . enum . failed ;
195
- }
196
- }
197
- ) ;
165
+ socket . emit ( "chatSendMessage" , newMessage ) ;
198
166
} ,
199
167
[ sessionId , socket , userProfile . id ]
200
168
) ;
201
169
202
170
const handleJoinSession = useCallback (
203
171
( payload : SessionJoinRequest ) => {
204
172
if ( ! socket . connected ) return ;
205
-
206
- socket . emit (
207
- "sessionJoin" ,
208
- payload ,
209
- ( ack : {
210
- success : boolean ;
211
- data : { messages : ChatMessages } ;
212
- error : string | undefined ;
213
- } ) => {
214
- try {
215
- if ( ! ack . success ) throw new Error ( ack . error ) ;
216
- setConnectionStatus ( "connected" ) ;
217
- const currentMessages = ChatMessagesSchema . parse (
218
- ack . data . messages . map ( ( message : ChatMessage ) => ( {
219
- ...message ,
220
- status : ChatMessageStatusEnum . enum . sent ,
221
- } ) )
222
- ) ;
223
- setMessages ( [ ...currentMessages ] ) ;
224
- } catch ( e ) {
225
- setConnectionStatus ( "failed" ) ;
226
- }
227
- }
228
- ) ;
173
+ socket . emit ( "sessionJoin" , payload ) ;
229
174
} ,
230
175
[ socket ]
231
176
) ;
232
177
233
178
const onSessionJoined = useCallback (
234
179
( {
180
+ userId,
235
181
language,
182
+ sessionMessages,
236
183
sessionUserProfiles,
237
184
} : {
185
+ userId : string ;
238
186
language : string ;
187
+ sessionMessages : ChatMessages ;
239
188
sessionUserProfiles : SessionUserProfiles ;
240
189
} ) => {
241
190
console . log ( "sessionJoined occured" ) ;
242
191
try {
243
- _setLanguage ( language ) ;
192
+ if ( userProfile . id === userId ) {
193
+ setConnectionStatus ( "connected" ) ;
194
+ const currentMessages = ChatMessagesSchema . parse (
195
+ sessionMessages . map ( ( message : ChatMessage ) => ( {
196
+ ...message ,
197
+ status : ChatMessageStatusEnum . enum . sent ,
198
+ } ) )
199
+ ) ;
200
+
201
+ setMessages ( [ ...currentMessages ] ) ;
202
+ }
244
203
204
+ _setLanguage ( language ) ;
245
205
const currentSessionUserProfiles =
246
206
SessionUserProfilesSchema . parse ( sessionUserProfiles ) ;
247
207
setSessionUserProfiles ( [ ...currentSessionUserProfiles ] ) ;
248
208
} catch ( e ) {
249
- // TODO toast here
250
209
console . log ( e ) ;
251
210
}
252
211
} ,
253
- [ ]
212
+ [ userProfile . id ]
254
213
) ;
255
214
256
215
const onChatReceiveMessage = useCallback (
257
216
( newMessage : ChatMessage ) => {
217
+ console . log ( "chatReceiveMessage occured" ) ;
258
218
try {
259
219
newMessage [ "status" ] = ChatMessageStatusEnum . enum . sent ;
260
220
const messageParsed = ChatMessageSchema . parse ( newMessage ) ;
261
221
262
- if ( messageParsed . userId === userProfile . id ) return ;
222
+ if ( messageParsed . userId === userProfile . id ) {
223
+ // set the loclly sent message
224
+ setMessages ( ( prev ) =>
225
+ prev . map ( ( message ) => {
226
+ if ( message . id !== messageParsed . id ) return message ;
227
+ return {
228
+ ...message ,
229
+ status : ChatMessageStatusEnum . enum . sent ,
230
+ } ;
231
+ } )
232
+ ) ;
233
+ return ;
234
+ }
263
235
264
236
setMessages ( ( prev ) => [ ...prev , messageParsed ] ) ;
265
237
} catch ( e ) {
@@ -370,7 +342,7 @@ export const SessionProvider: React.FC<SessionProviderProps> = ({
370
342
userId : userProfile . id ,
371
343
sessionId,
372
344
} ) ;
373
- } , [ socket ] ) ;
345
+ } , [ sessionId , socket , userProfile . id ] ) ;
374
346
375
347
const onSessionEnded = useCallback (
376
348
( { endedBy } : { endedBy : string ; message : string } ) => {
@@ -386,7 +358,39 @@ export const SessionProvider: React.FC<SessionProviderProps> = ({
386
358
router . push ( "/dashboard" ) ;
387
359
} , 4000 ) ;
388
360
} ,
389
- [ toast , router ]
361
+ [ toast , userProfile . id , router ]
362
+ ) ;
363
+
364
+ const onSessionError = useCallback (
365
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
366
+ ( {
367
+ event,
368
+ data,
369
+ error,
370
+ } : {
371
+ event : string ;
372
+ data : undefined | { id : string ; timestamp : string } ;
373
+ error : string ;
374
+ } ) => {
375
+ console . log ( `Session Error received ${ error } ` ) ;
376
+
377
+ if ( event === "sessionJoin" ) {
378
+ setConnectionStatus ( "failed" ) ;
379
+ }
380
+
381
+ if ( event === "chatSendMessage" ) {
382
+ setMessages ( ( prev ) =>
383
+ prev . map ( ( message ) => {
384
+ if ( message . id !== data ?. id ) return message ;
385
+ return {
386
+ ...message ,
387
+ status : ChatMessageStatusEnum . enum . failed ,
388
+ } ;
389
+ } )
390
+ ) ;
391
+ }
392
+ } ,
393
+ [ ]
390
394
) ;
391
395
392
396
// connect to the session socket on mount
@@ -412,6 +416,7 @@ export const SessionProvider: React.FC<SessionProviderProps> = ({
412
416
socket . on ( "submitted" , onSubmitted ) ;
413
417
414
418
socket . on ( "sessionEnded" , onSessionEnded ) ;
419
+ socket . on ( "sessionError" , onSessionError ) ;
415
420
416
421
return ( ) => {
417
422
socket . emit ( "sessionLeave" , {
@@ -432,6 +437,8 @@ export const SessionProvider: React.FC<SessionProviderProps> = ({
432
437
onSessionJoined ,
433
438
onSessionLeft ,
434
439
onLanguageChanged ,
440
+ onSessionEnded ,
441
+ onSessionError ,
435
442
] ) ;
436
443
437
444
const contextValue : SessionContextType = useMemo (
@@ -463,7 +470,6 @@ export const SessionProvider: React.FC<SessionProviderProps> = ({
463
470
} ) ,
464
471
[
465
472
connectionStatus ,
466
- codeReview ,
467
473
sessionId ,
468
474
sessionUserProfiles ,
469
475
getUserProfileDetailByUserId ,
@@ -476,7 +482,8 @@ export const SessionProvider: React.FC<SessionProviderProps> = ({
476
482
submitting ,
477
483
submissionResult ,
478
484
testResultPanel ,
479
- setTestResultPanel ,
485
+ endSession ,
486
+ codeReview ,
480
487
setCurrentClientCode ,
481
488
generateCodeReview ,
482
489
]
0 commit comments