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