@@ -16,6 +16,7 @@ import {
16
16
COLLAB_SUBMIT_ERROR ,
17
17
COLLAB_DOCUMENT_ERROR ,
18
18
COLLAB_DOCUMENT_RESTORED ,
19
+ COLLAB_RECONNECTION_ERROR ,
19
20
} from "../utils/constants" ;
20
21
import { toast } from "react-toastify" ;
21
22
@@ -173,6 +174,7 @@ const CollabProvider: React.FC<{ children?: React.ReactNode }> = (props) => {
173
174
const roomId = getMatchId ( ) ;
174
175
if ( ! matchUser || ! roomId || ! qnHistoryIdRef . current ) {
175
176
toast . error ( COLLAB_END_ERROR ) ;
177
+ appNavigate ( "/home" ) ;
176
178
return ;
177
179
}
178
180
@@ -213,8 +215,6 @@ const CollabProvider: React.FC<{ children?: React.ReactNode }> = (props) => {
213
215
} ;
214
216
215
217
const handleExitSession = ( ) => {
216
- setIsExitSessionModalOpen ( false ) ;
217
-
218
218
// Delete match data
219
219
stopMatch ( ) ;
220
220
appNavigate ( "/home" ) ;
@@ -228,31 +228,80 @@ const CollabProvider: React.FC<{ children?: React.ReactNode }> = (props) => {
228
228
doc : Doc ,
229
229
setIsDocumentLoaded : React . Dispatch < React . SetStateAction < boolean > >
230
230
) => {
231
- collabSocket . on ( CollabEvents . DOCUMENT_READY , ( qnHistoryId : string ) => {
232
- setQnHistoryId ( qnHistoryId ) ;
233
- } ) ;
234
-
235
- collabSocket . on ( CollabEvents . DOCUMENT_NOT_FOUND , ( ) => {
236
- toast . error ( COLLAB_DOCUMENT_ERROR ) ;
237
- setIsDocumentLoaded ( false ) ;
238
-
239
- const text = doc . getText ( ) ;
240
- doc . transact ( ( ) => {
241
- text . delete ( 0 , text . length ) ;
242
- } , matchUser ?. id ) ;
243
-
244
- collabSocket . once ( CollabEvents . UPDATE , ( update ) => {
245
- applyUpdateV2 ( doc , new Uint8Array ( update ) , matchUser ?. id ) ;
246
- toast . success ( COLLAB_DOCUMENT_RESTORED ) ;
247
- setIsDocumentLoaded ( true ) ;
231
+ if ( ! collabSocket . hasListeners ( CollabEvents . DOCUMENT_READY ) ) {
232
+ collabSocket . on ( CollabEvents . DOCUMENT_READY , ( qnHistoryId : string ) => {
233
+ setQnHistoryId ( qnHistoryId ) ;
248
234
} ) ;
235
+ }
236
+
237
+ if ( ! collabSocket . hasListeners ( CollabEvents . DOCUMENT_NOT_FOUND ) ) {
238
+ collabSocket . on ( CollabEvents . DOCUMENT_NOT_FOUND , ( ) => {
239
+ toast . error ( COLLAB_DOCUMENT_ERROR ) ;
240
+ setIsDocumentLoaded ( false ) ;
241
+
242
+ const text = doc . getText ( ) ;
243
+ doc . transact ( ( ) => {
244
+ text . delete ( 0 , text . length ) ;
245
+ } , matchUser ?. id ) ;
246
+
247
+ collabSocket . once ( CollabEvents . UPDATE , ( update ) => {
248
+ applyUpdateV2 ( doc , new Uint8Array ( update ) , matchUser ?. id ) ;
249
+ toast . success ( COLLAB_DOCUMENT_RESTORED ) ;
250
+ setIsDocumentLoaded ( true ) ;
251
+ } ) ;
252
+
253
+ collabSocket . emit ( CollabEvents . RECONNECT_REQUEST , roomId ) ;
254
+ } ) ;
255
+ }
256
+
257
+ if ( ! collabSocket . hasListeners ( CollabEvents . SOCKET_DISCONNECT ) ) {
258
+ collabSocket . on ( CollabEvents . SOCKET_DISCONNECT , ( reason ) => {
259
+ console . log ( reason ) ;
260
+ if (
261
+ reason !== CollabEvents . SOCKET_CLIENT_DISCONNECT &&
262
+ reason !== CollabEvents . SOCKET_SERVER_DISCONNECT
263
+ ) {
264
+ toast . error ( COLLAB_DOCUMENT_ERROR ) ;
265
+ setIsDocumentLoaded ( false ) ;
266
+ }
267
+ } ) ;
268
+ }
249
269
250
- collabSocket . emit ( CollabEvents . RECONNECT_REQUEST , roomId ) ;
251
- } ) ;
270
+ if ( ! collabSocket . io . hasListeners ( CollabEvents . SOCKET_RECONNECT_SUCCESS ) ) {
271
+ collabSocket . io . on ( CollabEvents . SOCKET_RECONNECT_SUCCESS , ( ) => {
272
+ const text = doc . getText ( ) ;
273
+ doc . transact ( ( ) => {
274
+ text . delete ( 0 , text . length ) ;
275
+ } , matchUser ?. id ) ;
276
+
277
+ collabSocket . once ( CollabEvents . UPDATE , ( update ) => {
278
+ applyUpdateV2 ( doc , new Uint8Array ( update ) , matchUser ?. id ) ;
279
+ toast . success ( COLLAB_DOCUMENT_RESTORED ) ;
280
+ setIsDocumentLoaded ( true ) ;
281
+ } ) ;
282
+
283
+ collabSocket . emit ( CollabEvents . RECONNECT_REQUEST , roomId ) ;
284
+ } ) ;
285
+ }
286
+
287
+ if ( ! collabSocket . io . hasListeners ( CollabEvents . SOCKET_RECONNECT_FAILED ) ) {
288
+ collabSocket . io . on ( CollabEvents . SOCKET_RECONNECT_FAILED , ( ) => {
289
+ toast . error ( COLLAB_RECONNECTION_ERROR ) ;
290
+
291
+ if ( matchUser ) {
292
+ leave ( matchUser . id , roomId , true ) ;
293
+ }
294
+ communicationSocket . emit ( CommunicationEvents . USER_DISCONNECT ) ;
295
+
296
+ handleExitSession ( ) ;
297
+ } ) ;
298
+ }
252
299
} ;
253
300
254
301
const resetCollab = ( ) => {
255
302
setCompilerResult ( [ ] ) ;
303
+ setIsEndSessionModalOpen ( false ) ;
304
+ setIsExitSessionModalOpen ( false ) ;
256
305
setQnHistoryId ( null ) ;
257
306
} ;
258
307
0 commit comments