@@ -30,53 +30,74 @@ let socket;
30
30
const { API_BASE_URL } = config ;
31
31
const RoomsContainer = ( ) => {
32
32
const dispatch = useDispatch ( ) ;
33
- const { state , roomCode, userName, userList, userJoined } = useSelector (
33
+ const { roomCode, userName, userList, userJoined } = useSelector (
34
34
( store : RootState ) => ( {
35
- state : store . appState ,
36
35
roomCode : store . roomSlice . roomCode ,
37
36
userName : store . roomSlice . userName ,
38
37
userList : store . roomSlice . userList ,
39
38
userJoined : store . roomSlice . userJoined
40
39
} )
41
40
) ;
42
- React . useEffect ( ( ) => {
43
- console . log ( 'You Joined Room---front end:' , roomCode ) ;
44
- } , [ roomCode ] ) ;
45
41
46
- function initSocketConnection ( roomCode ) {
42
+ function initSocketConnection ( roomCode : string ) {
47
43
if ( socket ) socket . disconnect ( ) ; //edge case check if socket connection existed
48
44
49
45
socket = io ( API_BASE_URL , {
46
+ //establishing client and server connection
50
47
transports : [ 'websocket' ]
51
48
} ) ;
52
49
50
+ //connecting user to server
53
51
socket . on ( 'connect' , ( ) => {
54
- console . log ( `You Connected With Id: ${ socket . id } ` ) ;
55
- socket . emit ( 'join-room' , roomCode ) ; // Join the room when connected
56
- console . log ( `Your Nickname Is: ${ 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
- } ) ;
52
+ socket . emit ( 'joining' , userName , roomCode ) ;
53
+ console . log ( `${ userName } Joined room ${ roomCode } ` ) ;
54
+ } ) ;
55
+
56
+ //send state from host to room when new user joins
57
+ socket . on ( 'requesting state from host' , ( callback ) => {
58
+ //getting state request from user from back end
59
+ const newState = store . getState ( ) ;
60
+ callback ( newState ) ; //pull new state from host and send it to back end
61
+ } ) ;
62
+
63
+ socket . on ( 'server emitting state from host' , ( state , callback ) => {
64
+ //getting state from host once joined a room
65
+ //dispatching new state to change user current state
66
+ store . dispatch ( allCooperativeState ( state . appState ) ) ;
67
+ store . dispatch ( codePreviewCooperative ( state . codePreviewCooperative ) ) ;
68
+ store . dispatch ( cooperativeStyle ( state . styleSlice ) ) ;
69
+ callback ( { status : 'confirmed' } ) ;
70
+ } ) ;
71
+
72
+ //listening to back end for updating user list
73
+ socket . on ( 'updateUserList' , ( newUserList : object ) => {
74
+ dispatch ( setUserList ( Object . values ( newUserList ) ) ) ;
63
75
} ) ;
64
76
65
77
// receiving the message from the back end
66
- socket . on ( 'receive message' , ( event ) => {
67
- let currentStore : any = JSON . stringify ( store . getState ( ) ) ;
68
- // console.log('event ', event);
69
- if ( currentStore !== event ) {
70
- currentStore = JSON . parse ( currentStore ) ;
71
- event = JSON . parse ( event ) ;
72
- if ( currentStore . appState !== event . appState ) {
73
- store . dispatch ( allCooperativeState ( event . appState ) ) ;
78
+ socket . on ( 'new state from back' , ( event ) => {
79
+ const currentStore = JSON . parse ( JSON . stringify ( store . getState ( ) ) ) ;
80
+ const parsedEvent = JSON . parse ( event ) ;
81
+
82
+ const areStatesEqual = ( stateA , stateB ) =>
83
+ JSON . stringify ( stateA ) === JSON . stringify ( stateB ) ;
84
+
85
+ if ( ! areStatesEqual ( currentStore , parsedEvent ) ) {
86
+ if ( ! areStatesEqual ( currentStore . appState , parsedEvent . appState ) ) {
87
+ store . dispatch ( allCooperativeState ( parsedEvent . appState ) ) ;
88
+ } else if (
89
+ ! areStatesEqual (
90
+ currentStore . codePreviewSlice ,
91
+ parsedEvent . codePreviewCooperative
92
+ )
93
+ ) {
94
+ store . dispatch (
95
+ codePreviewCooperative ( parsedEvent . codePreviewCooperative )
96
+ ) ;
74
97
} else if (
75
- currentStore . codePreviewSlice !== event . codePreviewCooperative
98
+ ! areStatesEqual ( currentStore . styleSlice , parsedEvent . styleSlice )
76
99
) {
77
- store . dispatch ( codePreviewCooperative ( event . codePreviewCooperative ) ) ;
78
- } else if ( currentStore . styleSlice !== event . styleSlice ) {
79
- store . dispatch ( cooperativeStyle ( event . styleSlice ) ) ;
100
+ store . dispatch ( cooperativeStyle ( parsedEvent . styleSlice ) ) ;
80
101
}
81
102
}
82
103
} ) ;
@@ -88,50 +109,49 @@ const RoomsContainer = () => {
88
109
89
110
let previousState = store . getState ( ) ;
90
111
// sending info to backend whenever the redux store changes
112
+ //handling state changes and send to server
91
113
const handleStoreChange = debounce ( ( ) => {
92
114
const newState = store . getState ( ) ;
93
115
const roomCode = newState . roomSlice . roomCode ;
94
116
95
- if ( newState !== previousState ) {
117
+ if ( JSON . stringify ( newState ) !== JSON . stringify ( previousState ) ) {
96
118
// Send the current state to the server
97
- socket . emit ( 'custom-event ' , JSON . stringify ( newState ) , roomCode ) ;
119
+ socket . emit ( 'new state from front ' , JSON . stringify ( newState ) , roomCode ) ;
98
120
previousState = newState ;
99
121
}
100
122
} , 100 ) ;
101
123
124
+ //listening to changes from store from user, invoke handle store change.
102
125
store . subscribe ( ( ) => {
103
126
if ( socket ) {
104
127
handleStoreChange ( ) ;
105
128
}
106
129
} ) ;
107
130
131
+ //joining room function
108
132
function joinRoom ( ) {
109
- if ( userList . length !== 0 ) setUserList ( [ ] ) ; //edge case check if userList not empty.
133
+ if ( userList . length !== 0 ) dispatch ( setUserList ( [ ] ) ) ; //edge case check if userList not empty.
110
134
handleUserEnteredRoom ( roomCode ) ; // Call handleUserEnteredRoom when joining a room
111
135
dispatch ( setRoomCode ( roomCode ) ) ;
112
136
dispatch ( setUserJoined ( true ) ) ; //setting joined room to true for rendering leave room button
113
137
}
114
138
115
139
function leaveRoom ( ) {
116
140
if ( socket ) {
117
- socket . emit ( 'updateUserDisconnect' , roomCode ) ;
118
- socket . disconnect ( ) ;
119
- } //disconnecting socket functionality
141
+ socket . disconnect ( ) ; //disconnecting socket from server
142
+ }
143
+ //reset all state values
120
144
dispatch ( setRoomCode ( '' ) ) ;
121
145
dispatch ( setUserName ( '' ) ) ;
122
146
dispatch ( setUserList ( [ ] ) ) ;
123
147
dispatch ( setUserJoined ( false ) ) ; //setting joined to false so join button appear
124
148
}
125
149
126
- //checking if both text field have any input (not including spaces)
127
- function checkInputField ( ...inputs : any ) {
128
- let userName : String = inputs [ 0 ] . trim ( ) ;
129
- let roomCode : String = inputs [ 1 ] . trim ( ) ;
130
- if ( userName . length !== 0 && roomCode . length !== 0 ) {
131
- return false ;
132
- } else {
133
- return true ;
134
- }
150
+ //checking empty input field (not including spaces)
151
+ function checkInputField ( ...inputs ) {
152
+ let userName : string = inputs [ 0 ] . trim ( ) ;
153
+ let roomCode : string = inputs [ 1 ] . trim ( ) ;
154
+ return userName . length === 0 || roomCode . length === 0 ;
135
155
}
136
156
137
157
return (
@@ -171,8 +191,7 @@ const RoomsContainer = () => {
171
191
< Typography
172
192
variant = "body1"
173
193
sx = { {
174
- color : 'white' , // Text color for the count
175
- borderRadius : 4 // Optional: Add rounded corners
194
+ color : 'white' // Text color for the count
176
195
} }
177
196
>
178
197
Users: { userList . length }
@@ -206,14 +225,13 @@ const RoomsContainer = () => {
206
225
) : (
207
226
//after joinning room
208
227
< >
209
- < > </ >
210
228
< TextField
211
229
hiddenLabel = { true }
212
230
id = "filled-hidden-label-small"
213
231
variant = "filled"
214
232
size = "small"
215
233
value = { userName }
216
- placeholder = "Input nickname "
234
+ placeholder = "Input Nickname "
217
235
onChange = { ( e ) => dispatch ( setUserName ( e . target . value ) ) }
218
236
/>
219
237
< TextField
0 commit comments