Skip to content

Commit 716f26c

Browse files
committed
Fix collaboration service and session context bug
1 parent 2dad575 commit 716f26c

File tree

2 files changed

+92
-90
lines changed

2 files changed

+92
-90
lines changed

backend/gateway-service/src/modules/collaboration/collaborationws.controller.ts

Lines changed: 23 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -109,19 +109,12 @@ export class CollaborationGateway implements OnGatewayDisconnect {
109109
language: existingLanguage || 'python3', // default language
110110
sessionUserProfiles, // returns the all session member profiles
111111
});
112-
113-
return {
114-
success: true,
115-
data: {
116-
messages, // chat messages
117-
},
118-
};
119112
} catch (e) {
120113
console.log(e);
121-
return {
122-
success: false,
114+
client.emit(SESSION_ERROR, {
115+
event: SESSION_JOIN,
123116
error: `Failed to join session: ${e.message}`,
124-
};
117+
});
125118
}
126119
}
127120

@@ -158,10 +151,11 @@ export class CollaborationGateway implements OnGatewayDisconnect {
158151
sessionUserProfiles,
159152
});
160153
} catch (e) {
161-
return {
162-
success: false,
154+
console.log(e);
155+
client.emit(SESSION_ERROR, {
156+
event: SESSION_JOIN,
163157
error: `Failed to leave session: ${e.message}`,
164-
};
158+
});
165159
}
166160
}
167161

@@ -191,18 +185,13 @@ export class CollaborationGateway implements OnGatewayDisconnect {
191185
message,
192186
timestamp,
193187
});
194-
195-
return {
196-
success: true,
197-
data: { id },
198-
};
199188
} catch (e) {
200189
console.log(e);
201-
return {
202-
success: false,
203-
data: { id },
190+
client.emit(SESSION_ERROR, {
191+
event: CHAT_SEND_MESSAGE,
192+
data: { id, timestamp },
204193
error: `Failed to send message: ${e.message}`,
205-
};
194+
});
206195
}
207196
}
208197

@@ -222,7 +211,10 @@ export class CollaborationGateway implements OnGatewayDisconnect {
222211
const { userId, sessionId, questionId, code, language } = payload;
223212

224213
if (!userId || !sessionId || !code) {
225-
client.emit(SESSION_ERROR, 'Invalid submit request payload.');
214+
client.emit(SESSION_ERROR, {
215+
event: SUBMIT,
216+
error: 'Invalid submit request payload.',
217+
});
226218
return;
227219
}
228220

@@ -316,7 +308,10 @@ export class CollaborationGateway implements OnGatewayDisconnect {
316308
const { userId, sessionId, language } = payload;
317309

318310
if (!userId || !sessionId || !language) {
319-
client.emit(SESSION_ERROR, 'Invalid change language request payload.');
311+
client.emit(SESSION_ERROR, {
312+
event: CHANGE_LANGUAGE,
313+
error: 'Invalid change language request payload.',
314+
});
320315
return;
321316
}
322317

@@ -345,7 +340,10 @@ export class CollaborationGateway implements OnGatewayDisconnect {
345340
const { userId, sessionId } = payload;
346341

347342
if (!userId || !sessionId) {
348-
client.emit(SESSION_ERROR, 'Invalid change language request payload.');
343+
client.emit(SESSION_ERROR, {
344+
event: SESSION_END,
345+
error: 'Invalid session end request payload.',
346+
});
349347
return;
350348
}
351349

frontend/src/contexts/SessionContext.tsx

Lines changed: 69 additions & 65 deletions
Original file line numberDiff line numberDiff line change
@@ -162,95 +162,52 @@ export const SessionProvider: React.FC<SessionProviderProps> = ({
162162

163163
setMessages((prev) => [...prev, newMessage]);
164164

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);
198166
},
199167
[sessionId, socket, userProfile.id]
200168
);
201169

202170
const handleJoinSession = useCallback(
203171
(payload: SessionJoinRequest) => {
204172
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);
229174
},
230175
[socket]
231176
);
232177

233178
const onSessionJoined = useCallback(
234179
({
180+
userId,
235181
language,
236182
sessionUserProfiles,
237183
}: {
184+
userId: string;
238185
language: string;
186+
messages: ChatMessages;
239187
sessionUserProfiles: SessionUserProfiles;
240188
}) => {
241189
console.log("sessionJoined occured");
242190
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+
}
244201

202+
_setLanguage(language);
245203
const currentSessionUserProfiles =
246204
SessionUserProfilesSchema.parse(sessionUserProfiles);
247205
setSessionUserProfiles([...currentSessionUserProfiles]);
248206
} catch (e) {
249-
// TODO toast here
250207
console.log(e);
251208
}
252209
},
253-
[]
210+
[messages, userProfile.id]
254211
);
255212

256213
const onChatReceiveMessage = useCallback(
@@ -259,7 +216,19 @@ export const SessionProvider: React.FC<SessionProviderProps> = ({
259216
newMessage["status"] = ChatMessageStatusEnum.enum.sent;
260217
const messageParsed = ChatMessageSchema.parse(newMessage);
261218

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+
}
263232

264233
setMessages((prev) => [...prev, messageParsed]);
265234
} catch (e) {
@@ -370,7 +339,7 @@ export const SessionProvider: React.FC<SessionProviderProps> = ({
370339
userId: userProfile.id,
371340
sessionId,
372341
});
373-
}, [socket]);
342+
}, [sessionId, socket, userProfile.id]);
374343

375344
const onSessionEnded = useCallback(
376345
({ endedBy }: { endedBy: string; message: string }) => {
@@ -386,7 +355,39 @@ export const SessionProvider: React.FC<SessionProviderProps> = ({
386355
router.push("/dashboard");
387356
}, 4000);
388357
},
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+
[]
390391
);
391392

392393
// connect to the session socket on mount
@@ -412,6 +413,7 @@ export const SessionProvider: React.FC<SessionProviderProps> = ({
412413
socket.on("submitted", onSubmitted);
413414

414415
socket.on("sessionEnded", onSessionEnded);
416+
socket.on("sessionError", onSessionError);
415417

416418
return () => {
417419
socket.emit("sessionLeave", {
@@ -432,6 +434,8 @@ export const SessionProvider: React.FC<SessionProviderProps> = ({
432434
onSessionJoined,
433435
onSessionLeft,
434436
onLanguageChanged,
437+
onSessionEnded,
438+
onSessionError,
435439
]);
436440

437441
const contextValue: SessionContextType = useMemo(
@@ -463,7 +467,6 @@ export const SessionProvider: React.FC<SessionProviderProps> = ({
463467
}),
464468
[
465469
connectionStatus,
466-
codeReview,
467470
sessionId,
468471
sessionUserProfiles,
469472
getUserProfileDetailByUserId,
@@ -476,7 +479,8 @@ export const SessionProvider: React.FC<SessionProviderProps> = ({
476479
submitting,
477480
submissionResult,
478481
testResultPanel,
479-
setTestResultPanel,
482+
endSession,
483+
codeReview,
480484
setCurrentClientCode,
481485
generateCodeReview,
482486
]

0 commit comments

Comments
 (0)