@@ -53,8 +53,15 @@ import {
53
53
DeleteContextPayload ,
54
54
addComponentToContext
55
55
} from '../../../src/redux/reducers/slice/contextReducer' ;
56
+ import { useState } from 'react' ;
56
57
57
58
const RoomsContainer = ( ) => {
59
+ const [ isJoinCallabRoom , setIsJoinCollabRoom ] = useState ( false ) ;
60
+ const [ joinedPasswordAttempt , setJoinedPasswordAttempt ] = useState ( '' ) ;
61
+ const [ isPasswordAttemptIncorrect , setIsPasswordAttemptIncorrect ] =
62
+ useState ( true ) ;
63
+ const [ isCollabRoomTaken , setIsCollabRoomTaken ] = useState ( false ) ;
64
+
58
65
const dispatch = useDispatch ( ) ;
59
66
const roomCode = useSelector ( ( store : RootState ) => store . roomSlice . roomCode ) ;
60
67
const userName = useSelector ( ( store : RootState ) => store . roomSlice . userName ) ;
@@ -68,7 +75,11 @@ const RoomsContainer = () => {
68
75
) ;
69
76
const messages = useSelector ( ( store : RootState ) => store . roomSlice . messages ) ;
70
77
71
- const initSocketConnection = ( roomCode : string ) => {
78
+ const initSocketConnection = (
79
+ roomCode : string ,
80
+ roomPassword : string ,
81
+ method : string
82
+ ) => {
72
83
// helper function to create socket connection
73
84
initializeSocket ( ) ;
74
85
// assign socket to result of helper function to return socket created
@@ -77,10 +88,45 @@ const RoomsContainer = () => {
77
88
if ( socket ) {
78
89
//run everytime when a client connects to server
79
90
socket . on ( 'connect' , ( ) => {
80
- socket . emit ( 'joining' , userName , roomCode ) ;
81
- // console.log(`${userName} Joined room ${roomCode} from RoomsContainer`);
91
+ if ( method === 'CREATE' ) {
92
+ socket . emit (
93
+ 'creating a room' ,
94
+ userName ,
95
+ roomCode ,
96
+ roomPassword ,
97
+ method
98
+ ) ;
99
+ // socket.emit('creating', userName, roomCode, roomPassword);
100
+ } else if ( method === 'JOIN' ) {
101
+ socket . emit (
102
+ 'creating a room' ,
103
+ userName ,
104
+ roomCode ,
105
+ roomPassword ,
106
+ method
107
+ ) ;
108
+ }
82
109
} ) ;
83
110
111
+ socket . on ( 'wrong password' , ( ) => {
112
+ setIsPasswordAttemptIncorrect ( false ) ;
113
+ console . log ( 'WRONG PASSWORD in client' ) ;
114
+ } ) ;
115
+
116
+ socket . on ( 'correct password' , ( ) => {
117
+ setIsPasswordAttemptIncorrect ( true ) ;
118
+ addNewUserToCollabRoom ( ) ;
119
+ console . log ( 'correct in client' ) ;
120
+ } ) ;
121
+
122
+ socket . on ( 'user created a new room' , ( ) => {
123
+ addNewUserToCollabRoom ( ) ;
124
+ } ) ;
125
+
126
+ socket . on ( 'room is already taken' , ( ) => {
127
+ setIsCollabRoomTaken ( true ) ;
128
+ console . log ( 'room is already taken' ) ;
129
+ } ) ;
84
130
//If you are the host: send current state to server when a new user joins
85
131
socket . on ( 'requesting state from host' , ( callback ) => {
86
132
const newState = store . getState ( ) ; //pull the current state
@@ -275,23 +321,35 @@ const RoomsContainer = () => {
275
321
}
276
322
} ;
277
323
278
- const handleUserEnteredRoom = ( roomCode ) => {
279
- initSocketConnection ( roomCode ) ;
324
+ const createNewCollabRoom = ( ) => {
325
+ if ( userList . length !== 0 ) {
326
+ dispatch ( setUserList ( [ ] ) ) ;
327
+ }
328
+
329
+ initSocketConnection ( roomCode , roomPassword , 'CREATE' ) ;
280
330
} ;
281
331
282
- const joinRoom = ( ) => {
283
- if ( userList . length !== 0 ) dispatch ( setUserList ( [ ] ) ) ;
284
- handleUserEnteredRoom ( roomCode ) ;
332
+ const addNewUserToCollabRoom = ( ) => {
285
333
dispatch ( setRoomCode ( roomCode ) ) ;
286
334
dispatch ( setPassword ( roomPassword ) ) ;
287
335
dispatch ( setUserJoined ( true ) ) ;
288
336
} ;
289
337
338
+ const joinExistingCollabRoom = async ( ) => {
339
+ if ( userList . length !== 0 ) {
340
+ dispatch ( setUserList ( [ ] ) ) ;
341
+ }
342
+
343
+ initSocketConnection ( roomCode , joinedPasswordAttempt , 'JOIN' ) ;
344
+ } ;
345
+
290
346
const leaveRoom = ( ) => {
291
347
let socket = getSocket ( ) ;
348
+
292
349
if ( socket ) {
293
350
socket . disconnect ( ) ;
294
351
}
352
+
295
353
dispatch ( setRoomCode ( '' ) ) ;
296
354
dispatch ( setUserName ( '' ) ) ;
297
355
dispatch ( setUserList ( [ ] ) ) ;
@@ -303,16 +361,18 @@ const RoomsContainer = () => {
303
361
const checkInputField = ( ...inputs ) => {
304
362
let userName : string = inputs [ 0 ] . trim ( ) ;
305
363
let roomCode : string = inputs [ 1 ] . trim ( ) ;
306
- return userName . length === 0 || roomCode . length === 0 ;
364
+ let password : string = inputs [ 2 ] . trim ( ) ;
365
+ return (
366
+ userName . length === 0 || roomCode . length === 0 || password . length === 0
367
+ ) ;
307
368
} ;
308
369
309
370
const handleKeyDown = ( e ) => {
310
371
if ( e . key === 'Enter' && e . target . id === 'filled-hidden-label-small' ) {
311
372
e . preventDefault ( ) ;
312
- joinRoom ( ) ;
373
+ createNewCollabRoom ( ) ;
313
374
}
314
375
} ;
315
-
316
376
const userColors = [
317
377
'#FC00BD' ,
318
378
'#D0FC00' ,
@@ -333,7 +393,6 @@ const RoomsContainer = () => {
333
393
margin : '0 auto 0 auto'
334
394
} }
335
395
>
336
- { ' ' }
337
396
< Typography variant = "h5" color = { '#f2fbf8' } >
338
397
Live Room: { roomCode }
339
398
</ Typography >
@@ -387,7 +446,7 @@ const RoomsContainer = () => {
387
446
>
388
447
< ListItemText
389
448
primary = { `${ index + 1 } . ${
390
- index === 0 ? `${ user } (host)` : user
449
+ index === 0 ? `${ user . userName } (host)` : user . userName
391
450
} `}
392
451
style = { { color : userColors [ userList . indexOf ( user ) ] } }
393
452
/>
@@ -402,13 +461,12 @@ const RoomsContainer = () => {
402
461
backgroundColor : '#f2fbf8' ,
403
462
color : '#092a26' ,
404
463
'&:hover' : {
405
- backgroundColor : '#354e9c ' ,
464
+ backgroundColor : '#a5ead6 ' ,
406
465
borderColor : '#0062cc'
407
466
}
408
467
} }
409
468
>
410
- { ' ' }
411
- Leave Room{ ' ' }
469
+ Leave Room
412
470
</ Button >
413
471
</ >
414
472
) : (
@@ -424,6 +482,7 @@ const RoomsContainer = () => {
424
482
onChange = { ( e ) => dispatch ( setUserName ( e . target . value ) ) }
425
483
/>
426
484
< TextField
485
+ error = { isCollabRoomTaken }
427
486
fullWidth
428
487
hiddenLabel = { true }
429
488
id = "filled-hidden-label-small"
@@ -434,33 +493,68 @@ const RoomsContainer = () => {
434
493
onChange = { ( e ) => dispatch ( setRoomCode ( e . target . value ) ) }
435
494
className = "enterRoomInput"
436
495
onKeyDown = { handleKeyDown }
496
+ helperText = { isCollabRoomTaken ? 'Room name already taken' : '' }
437
497
/>
438
- < TextField
439
- fullWidth
440
- hiddenLabel = { true }
441
- id = "filled-hidden-label-small"
442
- variant = "standard"
443
- size = "small"
444
- value = { roomCode }
445
- placeholder = "Password"
446
- onChange = { ( e ) => dispatch ( setPassword ( e . target . value ) ) }
447
- // className="enterRoomInput"
448
- />
498
+ { isJoinCallabRoom ? (
499
+ < TextField
500
+ error = { isPasswordAttemptIncorrect === false }
501
+ fullWidth
502
+ hiddenLabel = { true }
503
+ id = "filled-hidden-label-small"
504
+ variant = "standard"
505
+ size = "small"
506
+ value = { joinedPasswordAttempt }
507
+ placeholder = "Password"
508
+ helperText = {
509
+ isPasswordAttemptIncorrect === false
510
+ ? 'Incorrect password.'
511
+ : ''
512
+ }
513
+ onChange = { ( e ) => setJoinedPasswordAttempt ( e . target . value ) }
514
+ />
515
+ ) : (
516
+ < TextField
517
+ fullWidth
518
+ hiddenLabel = { true }
519
+ id = "filled-hidden-label-small"
520
+ variant = "standard"
521
+ size = "small"
522
+ value = { roomPassword }
523
+ placeholder = "Password"
524
+ onChange = { ( e ) => dispatch ( setPassword ( e . target . value ) ) }
525
+ />
526
+ ) }
527
+
449
528
< Button
450
529
variant = "contained"
451
- disabled = { checkInputField ( userName , roomCode ) }
530
+ disabled = { checkInputField ( userName , roomCode , roomCode ) }
452
531
fullWidth
453
- onClick = { ( ) => joinRoom ( ) }
532
+ onClick = { ( e ) =>
533
+ isJoinCallabRoom
534
+ ? joinExistingCollabRoom ( )
535
+ : createNewCollabRoom ( )
536
+ }
454
537
sx = { {
455
538
backgroundColor : '#e9e9e9' ,
456
- color : '#354e9c ' ,
539
+ color : '#253b80 ' ,
457
540
'&:hover' : {
458
- backgroundColor : '#354e9c '
541
+ backgroundColor : '#99d7f2 '
459
542
}
460
543
} }
461
544
>
462
- Join Room
545
+ { isJoinCallabRoom ? ' Join' : 'Start' }
463
546
</ Button >
547
+ < Typography
548
+ onClick = { ( ) => setIsJoinCollabRoom ( ! isJoinCallabRoom ) }
549
+ sx = { {
550
+ color : 'grey' ,
551
+ '&:hover' : {
552
+ textDecoration : 'underline'
553
+ }
554
+ } }
555
+ >
556
+ { isJoinCallabRoom ? 'Start a new room' : 'Join a room' }
557
+ </ Typography >
464
558
</ >
465
559
) }
466
560
</ Stack >
0 commit comments