1
1
import { Stack , Typography } from '@mui/material' ;
2
2
import { useDispatch , useSelector } from 'react-redux' ;
3
-
3
+ import Box from '@mui/material/Box' ;
4
+ import List from '@mui/material/List' ;
5
+ import ListItem from '@mui/material/ListItem' ;
6
+ import ListItemText from '@mui/material/ListItemText' ;
4
7
import Button from '@mui/material/Button' ;
5
8
import React , { useState } from 'react' ;
6
9
import { RootState } from '../../redux/store' ;
7
10
import TextField from '@mui/material/TextField' ;
8
11
import { allCooperativeState } from '../../redux/reducers/slice/appStateSlice' ;
9
- import { setRoomCode , setUserName , setUserJoined , setUserList } from '../../redux/reducers/slice/roomSlice' ;
12
+ import {
13
+ setRoomCode ,
14
+ setUserName ,
15
+ setUserJoined ,
16
+ setUserList
17
+ } from '../../redux/reducers/slice/roomSlice' ;
10
18
import { codePreviewCooperative } from '../../redux/reducers/slice/codePreviewSlice' ;
11
19
import config from '../../../../config' ;
12
20
import { cooperativeStyle } from '../../redux/reducers/slice/styleSlice' ;
@@ -21,24 +29,22 @@ import debounce from '../../../../node_modules/lodash/debounce.js';
21
29
let socket ;
22
30
const { API_BASE_URL } = config ;
23
31
const RoomsContainer = ( ) => {
24
-
25
32
const dispatch = useDispatch ( ) ;
26
- const { state, roomCode, userName, userList, userJoined } = useSelector ( ( store : RootState ) => ( {
27
- state : store . appState ,
28
- roomCode : store . roomSlice . roomCode ,
29
- userName : store . roomSlice . userName ,
30
- userList : store . roomSlice . userList ,
31
- userJoined : store . roomSlice . userJoined ,
32
- } ) ) ;
33
+ const { state, roomCode, userName, userList, userJoined } = useSelector (
34
+ ( store : RootState ) => ( {
35
+ state : store . appState ,
36
+ roomCode : store . roomSlice . roomCode ,
37
+ userName : store . roomSlice . userName ,
38
+ userList : store . roomSlice . userList ,
39
+ userJoined : store . roomSlice . userJoined
40
+ } )
41
+ ) ;
33
42
React . useEffect ( ( ) => {
34
43
console . log ( 'You Joined Room---front end:' , roomCode ) ;
35
44
} , [ roomCode ] ) ;
36
45
37
46
function initSocketConnection ( roomCode ) {
38
- if ( socket ) {
39
- //edge case check if socket connection existed
40
- socket . disconnect ( ) ;
41
- }
47
+ if ( socket ) socket . disconnect ( ) ; //edge case check if socket connection existed
42
48
43
49
socket = io ( API_BASE_URL , {
44
50
transports : [ 'websocket' ]
@@ -47,21 +53,22 @@ const RoomsContainer = () => {
47
53
socket . on ( 'connect' , ( ) => {
48
54
console . log ( `You Connected With Id: ${ socket . id } ` ) ;
49
55
socket . emit ( 'join-room' , roomCode ) ; // Join the room when connected
50
- //passing current client nickname to server
51
56
console . log ( `Your Nickname Is: ${ userName } ` ) ;
52
- socket . emit ( 'userJoined' , userName ) ;
57
+ //passing current client nickname to server
58
+ socket . emit ( 'userJoined' , userName , roomCode ) ;
59
+ //listening to back end for updating user list
60
+ socket . on ( 'updateUserList' , ( newUserList ) => {
61
+ dispatch ( setUserList ( Object . values ( newUserList ) ) ) ;
62
+ } ) ;
53
63
} ) ;
54
-
55
64
56
65
// receiving the message from the back end
57
66
socket . on ( 'receive message' , ( event ) => {
58
67
let currentStore : any = JSON . stringify ( store . getState ( ) ) ;
59
- console . log ( 'event ' , event ) ;
68
+ // console.log('event ', event);
60
69
if ( currentStore !== event ) {
61
70
currentStore = JSON . parse ( currentStore ) ;
62
71
event = JSON . parse ( event ) ;
63
- console . log ( 'current store' , currentStore ) ;
64
- console . log ( 'event ' , event ) ;
65
72
if ( currentStore . appState !== event . appState ) {
66
73
store . dispatch ( allCooperativeState ( event . appState ) ) ;
67
74
} else if (
@@ -85,21 +92,11 @@ const RoomsContainer = () => {
85
92
const newState = store . getState ( ) ;
86
93
const roomCode = newState . roomSlice . roomCode ;
87
94
88
- //why emitting room code every 100 milisecond?
89
- // if (roomCode !== '') {
90
- // // Emit the current room code
91
- // socket.emit('room-code', roomCode);
92
- // }
93
95
if ( newState !== previousState ) {
94
96
// Send the current state to the server
95
- socket . emit (
96
- 'custom-event' ,
97
- JSON . stringify ( newState ) ,
98
- roomCode
99
- ) ;
97
+ socket . emit ( 'custom-event' , JSON . stringify ( newState ) , roomCode ) ;
100
98
previousState = newState ;
101
99
}
102
-
103
100
} , 100 ) ;
104
101
105
102
store . subscribe ( ( ) => {
@@ -109,16 +106,20 @@ const RoomsContainer = () => {
109
106
} ) ;
110
107
111
108
function joinRoom ( ) {
112
- // Call handleUserEnteredRoom when joining a room
113
- handleUserEnteredRoom ( roomCode ) ;
109
+ if ( userList . length !== 0 ) setUserList ( [ ] ) ; //edge case check if userList not empty.
110
+ handleUserEnteredRoom ( roomCode ) ; // Call handleUserEnteredRoom when joining a room
114
111
dispatch ( setRoomCode ( roomCode ) ) ;
115
112
dispatch ( setUserJoined ( true ) ) ; //setting joined room to true for rendering leave room button
116
113
}
117
114
118
115
function leaveRoom ( ) {
119
- if ( socket ) socket . disconnect ( ) ; //disconnecting socket
116
+ if ( socket ) {
117
+ socket . emit ( 'updateUserDisconnect' , roomCode ) ;
118
+ socket . disconnect ( ) ;
119
+ } //disconnecting socket functionality
120
120
dispatch ( setRoomCode ( '' ) ) ;
121
121
dispatch ( setUserName ( '' ) ) ;
122
+ dispatch ( setUserList ( [ ] ) ) ;
122
123
dispatch ( setUserJoined ( false ) ) ; //setting joined to false so join button appear
123
124
}
124
125
@@ -146,28 +147,66 @@ const RoomsContainer = () => {
146
147
>
147
148
{ ' ' }
148
149
{ /* live room display */ }
149
- < Typography variant = "h6 " color = { 'white' } >
150
+ < Typography variant = "h5 " color = { 'white' } >
150
151
Live Room: { roomCode }
151
152
</ Typography >
152
153
{ /* Set up condition rendering depends on if user joined a room then render leave button if not render join button */ }
153
154
{ userJoined ? (
154
- < Button
155
- variant = "contained"
156
- onClick = { ( ) => leaveRoom ( ) }
157
- sx = { {
158
- backgroundColor : '#ffffff' ,
159
- color : '#000000' ,
160
- '&:hover' : {
161
- backgroundColor : '#C6C6C6' ,
162
- borderColor : '#0062cc'
163
- }
164
- } }
165
- >
166
- { ' ' }
167
- Leave Room{ ' ' }
168
- </ Button >
155
+ < >
156
+ < Button
157
+ variant = "contained"
158
+ onClick = { ( ) => leaveRoom ( ) }
159
+ sx = { {
160
+ backgroundColor : '#ffffff' ,
161
+ color : '#000000' ,
162
+ '&:hover' : {
163
+ backgroundColor : '#C6C6C6' ,
164
+ borderColor : '#0062cc'
165
+ }
166
+ } }
167
+ >
168
+ { ' ' }
169
+ Leave Room{ ' ' }
170
+ </ Button >
171
+ < Typography
172
+ variant = "body1"
173
+ sx = { {
174
+ color : 'white' , // Text color for the count
175
+ borderRadius : 4 // Optional: Add rounded corners
176
+ } }
177
+ >
178
+ Users: { userList . length }
179
+ </ Typography >
180
+ < Box
181
+ sx = { {
182
+ width : '100%' ,
183
+ height : 300 ,
184
+ maxWidth : 200 ,
185
+ bgcolor : '#333333' ,
186
+ border : '3px solid white' ,
187
+ borderRadius : '5%' ,
188
+ display : 'flex' ,
189
+ flexDirection : 'column' ,
190
+ justifyContent : 'center' , // Center vertically
191
+ alignItems : 'center' ,
192
+ overflow : 'auto' ,
193
+ color : 'white'
194
+ } }
195
+ >
196
+ { /* User count inside the box */ }
197
+ < List sx = { { justifyContent : 'center' , alignItems : 'flex-start' } } >
198
+ { userList . map ( ( user , index ) => (
199
+ < ListItem key = { index } sx = { { color : 'white' } } >
200
+ < ListItemText primary = { user } />
201
+ </ ListItem >
202
+ ) ) }
203
+ </ List >
204
+ </ Box >
205
+ </ >
169
206
) : (
207
+ //after joinning room
170
208
< >
209
+ < > </ >
171
210
< TextField
172
211
hiddenLabel = { true }
173
212
id = "filled-hidden-label-small"
@@ -186,7 +225,6 @@ const RoomsContainer = () => {
186
225
placeholder = "Input Room Number"
187
226
onChange = { ( e ) => dispatch ( setRoomCode ( e . target . value ) ) }
188
227
/>
189
-
190
228
< Button
191
229
variant = "contained"
192
230
disabled = { checkInputField ( userName , roomCode ) }
0 commit comments