Skip to content

Commit 1a86086

Browse files
authored
Merge pull request #8 from oslabs-beta/nam
Collaboration-Room-Improved
2 parents 8d96cbc + 42b9603 commit 1a86086

File tree

6 files changed

+87
-24
lines changed

6 files changed

+87
-24
lines changed

app/src/components/left/RoomsContainer.tsx

Lines changed: 43 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -22,9 +22,12 @@ let socket;
2222
const { API_BASE_URL } = config;
2323
const RoomsContainer = () => {
2424
const [roomCode, setRoomCode] = useState('');
25-
const [confirmRoom, setConfirmRoom] = useState('');
25+
const [userName, setUserName] = useState('');
26+
const [userList, setUserList] = useState(new Map());
27+
// const [confirmRoom, setConfirmRoom] = useState('');
2628
const [userJoined, setUserJoined] = useState(false); //setting up state for joinning a room
2729
const [emptyInput, setEmptyInput] = useState(false);
30+
2831
const dispatch = useDispatch();
2932
const { state, joinedRoom } = useSelector((store: RootState) => ({
3033
state: store.appState,
@@ -45,27 +48,28 @@ const RoomsContainer = () => {
4548
});
4649

4750
socket.on('connect', () => {
48-
console.log(`You connected with id: ${socket.id}`);
51+
console.log(`You Connected With Id: ${socket.id}`);
4952
socket.emit('join-room', roomCode); // Join the room when connected
53+
//passing current client nickname to server
54+
console.log(`Your Nickname Is: ${userName}`);
55+
socket.emit('user', userName);
5056
});
5157

52-
// Receiving the room state from the backend
53-
socket.on('room-state-update', (stateFromServer) => {
54-
const newState = JSON.parse(stateFromServer);
55-
// Dispatch actions to update your Redux store with the received state
56-
store.dispatch(allCooperativeState(newState.appState));
57-
store.dispatch(codePreviewCooperative(newState.codePreviewCooperative));
58-
store.dispatch(cooperativeStyle(newState.styleSlice));
59-
});
58+
// // Receiving the room state from the backend
59+
// socket.on('room-state-update', (stateFromServer) => {
60+
// const newState = JSON.parse(stateFromServer);
61+
// // Dispatch actions to update your Redux store with the received state
62+
// store.dispatch(allCooperativeState(newState.appState));
63+
// store.dispatch(codePreviewCooperative(newState.codePreviewCooperative));
64+
// store.dispatch(cooperativeStyle(newState.styleSlice));
65+
// });
6066

6167
// receiving the message from the back end
6268
socket.on('receive message', (event) => {
63-
// console.log('message from server: ', event);
6469
let currentStore: any = JSON.stringify(store.getState());
6570
if (currentStore !== event) {
6671
currentStore = JSON.parse(currentStore);
6772
event = JSON.parse(event);
68-
6973
if (currentStore.appState !== event.appState) {
7074
store.dispatch(allCooperativeState(event.appState));
7175
} else if (
@@ -86,15 +90,16 @@ const RoomsContainer = () => {
8690
let previousState = store.getState();
8791
// console.log('Store States: ', store.getState);
8892
// sending info to backend whenever the redux store changes
93+
//working!
8994
const handleStoreChange = debounce(() => {
9095
const newState = store.getState();
9196
const roomCode = newState.roomCodeSlice.roomCode;
9297

9398
if (roomCode !== '') {
99+
//why emitting room code every 100 milisecond
94100
// Emit the current room code
95101
socket.emit('room-code', roomCode);
96102
}
97-
98103
if (newState !== previousState) {
99104
// Send the current state to the server
100105
socket.emit(
@@ -114,20 +119,32 @@ const RoomsContainer = () => {
114119
});
115120

116121
function joinRoom() {
117-
dispatch(changeRoom(roomCode));
118-
setConfirmRoom((confirmRoom) => roomCode);
119122
// Call handleUserEnteredRoom when joining a room
120123
handleUserEnteredRoom(roomCode);
124+
dispatch(changeRoom(roomCode));
125+
// setConfirmRoom((confirmRoom) => roomCode);
121126
setUserJoined(true); //setting joined room to true for rendering leave room button
122127
}
123128

124129
function leaveRoom() {
125130
if (socket) socket.disconnect(); //disconnecting socket
126131
dispatch(changeRoom(''));
127132
setRoomCode('');
133+
setUserName('');
128134
setUserJoined(false); //setting joined to false so join button appear
129135
}
130136

137+
//checking if both text field have any input (not including spaces)
138+
function checkInputField(...inputs: any) {
139+
let userName: String = inputs[0].trim();
140+
let roomCode: String = inputs[1].trim();
141+
if (userName.length !== 0 && roomCode.length !== 0) {
142+
return false;
143+
} else {
144+
return true;
145+
}
146+
}
147+
131148
return (
132149
<div>
133150
<Stack //stack styling for container
@@ -163,6 +180,15 @@ const RoomsContainer = () => {
163180
</Button>
164181
) : (
165182
<>
183+
<TextField
184+
hiddenLabel={true}
185+
id="filled-hidden-label-small"
186+
variant="filled"
187+
size="small"
188+
value={userName}
189+
placeholder="Input nickname"
190+
onChange={(e) => setUserName(e.target.value)}
191+
/>
166192
<TextField
167193
hiddenLabel={true}
168194
id="filled-hidden-label-small"
@@ -172,9 +198,10 @@ const RoomsContainer = () => {
172198
placeholder="Input Room Number"
173199
onChange={(e) => setRoomCode(e.target.value)}
174200
/>
201+
175202
<Button
176203
variant="contained"
177-
disabled={roomCode.trim() === ''}
204+
disabled={checkInputField(userName, roomCode)}
178205
onClick={() => joinRoom()}
179206
sx={{
180207
backgroundColor: '#ffffff',

app/src/components/top/NavBarButtons.tsx

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -184,13 +184,13 @@ function navbarDropDown(props) {
184184

185185
const [modal, setModal] = React.useState(null);
186186
const [anchorEl, setAnchorEl] = React.useState(null);
187-
const [roomCode, setRoomCode] = React.useState('');
188-
const [confirmRoom, setConfirmRoom] = React.useState('');
187+
// const [roomCode, setRoomCode] = React.useState('');
188+
// const [confirmRoom, setConfirmRoom] = React.useState('');
189189
const classes = useStyles();
190190

191-
const { state, joinedRoom } = useSelector((store: RootState) => ({
191+
const { state } = useSelector((store: RootState) => ({
192192
state: store.appState,
193-
joinedRoom: store.roomCodeSlice.roomCode
193+
// joinedRoom: store.roomCodeSlice.roomCode
194194
}));
195195
const closeModal = () => setModal('');
196196
const handleClick = (event) => {

server/controllers/userController.ts

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,20 @@ const randomPassword = () => {
2525
};
2626

2727
const userController: UserController = {
28+
getUser: async (req, res, next) => {
29+
try{
30+
const { username } = req.body;
31+
const user = await Users.findOne({username});
32+
res.locals.user = user;
33+
return next();
34+
} catch(err) {
35+
return next({
36+
log: 'error caught in getUsername middleware',
37+
status: 400,
38+
message: {err: 'cannot get username'}
39+
})
40+
}
41+
},
2842
createUser: (req, res, next) => {
2943
let email, username, password;
3044
// use this condition for Oauth login

server/interfaces.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@ export interface newUserError extends NativeError {
4646
}
4747

4848
export interface UserController {
49+
getUser: RequestHandler;
4950
createUser: RequestHandler;
5051
verifyUser: RequestHandler;
5152
}

server/server.ts

Lines changed: 20 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -87,28 +87,44 @@ app.use('/auth', authRoutes);
8787
import { createServer } from 'http';
8888
import { Server } from 'socket.io';
8989

90+
9091
const httpServer = createServer(app);
9192
const io = new Server(httpServer, {
9293
transports: ['websocket'],
9394
cors: {
9495
origin: ['http://localhost:5656', 'http://localhost:8080', API_BASE_URL]
9596
}
9697
});
97-
98+
//creating map for user list
99+
const userList = new Map();
98100
io.on('connection', (socket) => {
99101
console.log('Socket ID: -----', socket.id);
100102
socket.on('custom-event', (string, redux_store, room) => {
101-
console.log('Room Code', room);
103+
console.log(string);
102104
if (room) {
105+
//sending to sender client, only if they are in room
103106
socket.to(room).emit('receive message', redux_store);
104107
} else {
108+
//send to all connected clients except the one that sent the message
105109
socket.broadcast.emit('receive message', redux_store);
106110
}
107111
});
108112
socket.on('room-code', (roomCode) => {
109-
console.log('joined room: ', roomCode);
113+
//working
110114
socket.join(roomCode);
111115
});
116+
socket.on('user', (userName) => {
117+
//working
118+
userList.set(socket.id, userName);
119+
io.emit('updateUserList', userList);
120+
});
121+
socket.on('disconnect', () => {
122+
const userName = userList.get(socket.id);
123+
console.log('User list before remove user', userList);
124+
userList.delete(socket.id); //remove the user from the obj
125+
console.log('User list after remove user', userList);
126+
io.emit('disconnected', userName);
127+
});
112128
});
113129

114130
/*
@@ -167,6 +183,7 @@ app.post(
167183
app.post(
168184
'/login',
169185
userController.verifyUser,
186+
userController.getUser,
170187
cookieController.setSSIDCookie,
171188
sessionController.startSession,
172189
(req, res) => res.status(200).json({ sessionId: res.locals.ssid })

tsconfig.json

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,11 @@
1313
"allowSyntheticDefaultImports": true,
1414
"strictFunctionTypes": false,
1515
"esModuleInterop": true,
16-
"typeRoots": ["node_modules/@types", "node_modules/@types/node", "@aws-amplify/core"],
16+
"typeRoots": [
17+
"node_modules/@types",
18+
"node_modules/@types/node",
19+
"@aws-amplify/core"
20+
],
1721
"noEmitOnError": false
1822
},
1923
// only compile ts files in this directory

0 commit comments

Comments
 (0)