Skip to content

Commit 3f3e3d5

Browse files
authored
Merge pull request #17 from oslabs-beta/rose
move socket event listener into useeffect to avoid adding multiple li…
2 parents 0e8675e + 3fe99a4 commit 3f3e3d5

File tree

2 files changed

+107
-45
lines changed

2 files changed

+107
-45
lines changed

app/src/components/left/RoomsContainer.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -94,9 +94,9 @@ const RoomsContainer = () => {
9494

9595
// update user list when there's a change: new join or leave the room
9696
socket.on('updateUserList', (newUserList) => {
97-
console.log('user list received from server');
97+
//console.log('user list received from server');
9898
dispatch(setUserList(newUserList));
99-
console.log('userList:', userList);
99+
// console.log('userList:', userList);
100100
});
101101

102102
socket.on('child data from server', (childData: object) => {

app/src/components/main/Canvas.tsx

Lines changed: 105 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -28,9 +28,10 @@ function Canvas(props: {}): JSX.Element {
2828
console.log('canvas is rendered');
2929

3030
const [remoteCursors, setRemoteCursors] = useState([]);
31+
const [toggleSwitch, setToggleSwitch] = useState(true);
3132

3233
const debounceSetPosition = debounce((newX, newY) => {
33-
//emit socket event every 500ms when cursor moves
34+
//emit socket event every 300ms when cursor moves
3435
if (userList.length > 1)
3536
emitEvent('cursorData', roomCode, { x: newX, y: newY, userName });
3637
}, 300);
@@ -39,52 +40,99 @@ function Canvas(props: {}): JSX.Element {
3940
debounceSetPosition(e.clientX, e.clientY);
4041
};
4142

42-
const socket = getSocket();
43-
if (socket) {
44-
socket.on('remote cursor data from server', (remoteData) => {
45-
setRemoteCursors((prevState) => {
46-
//check if received cursor data is from an existing user in the room
47-
const cursorIdx = prevState.findIndex(
48-
(cursor) => cursor.remoteUserName === remoteData.userName
49-
);
50-
51-
//[{x,y,remoteUserName, isVisible}, {...}, {...}]
52-
//existing user
53-
if (cursorIdx >= 0) {
54-
//check if cursor position has changed
55-
if (
56-
prevState[cursorIdx].x !== remoteData.x ||
57-
prevState[cursorIdx].y !== remoteData.y
58-
) {
59-
//update existing user's cursor position
60-
const updatedCursors = [...prevState];
61-
updatedCursors[cursorIdx] = {
62-
...prevState[cursorIdx],
63-
x: remoteData.x,
64-
y: remoteData.y
65-
};
66-
return updatedCursors;
67-
} else {
68-
//return previous state if no change
69-
return prevState;
70-
}
43+
const handleCursorDataFromServer = (remoteData) => {
44+
setRemoteCursors((prevState) => {
45+
//check if received cursor data is from an existing user in the room
46+
const cursorIdx = prevState.findIndex(
47+
(cursor) => cursor.remoteUserName === remoteData.userName
48+
);
49+
//[{x,y,remoteUserName, isVisible}, {...}, {...}]
50+
//existing user
51+
if (cursorIdx >= 0) {
52+
//check if cursor position has changed
53+
if (
54+
prevState[cursorIdx].x !== remoteData.x ||
55+
prevState[cursorIdx].y !== remoteData.y
56+
) {
57+
//update existing user's cursor position
58+
const updatedCursors = [...prevState];
59+
updatedCursors[cursorIdx] = {
60+
...prevState[cursorIdx],
61+
x: remoteData.x,
62+
y: remoteData.y
63+
};
64+
return updatedCursors;
7165
} else {
72-
//new user: add new user's cursor
73-
return [
74-
...prevState,
75-
{
76-
x: remoteData.x,
77-
y: remoteData.y,
78-
remoteUserName: remoteData.userName,
79-
isVisible: true
80-
}
81-
];
66+
//return previous state if no change
67+
return prevState;
8268
}
83-
});
69+
} else {
70+
//new user: add new user's cursor
71+
return [
72+
...prevState,
73+
{
74+
x: remoteData.x,
75+
y: remoteData.y,
76+
remoteUserName: remoteData.userName,
77+
isVisible: true
78+
}
79+
];
80+
}
8481
});
85-
}
82+
};
83+
const handleToggleSwitch = () => {
84+
setToggleSwitch(!toggleSwitch);
85+
//checks the state before it's updated so need to check the opposite condition
86+
if (toggleSwitch) {
87+
//turn off
88+
socket.off('remote cursor data from server');
89+
//make remote cursor invisible
90+
setRemoteCursors((prevState) => {
91+
const newState = prevState.map((cursor) => ({
92+
...cursor,
93+
isVisible: false
94+
}));
95+
return newState;
96+
});
97+
} else {
98+
//turn on
99+
socket.on('remote cursor data from server', (remoteData) =>
100+
handleCursorDataFromServer(remoteData)
101+
);
102+
//make remote cursor visible
103+
setRemoteCursors((prevState) =>
104+
prevState.map((cursor) => ({
105+
...cursor,
106+
isVisible: true
107+
}))
108+
);
109+
}
110+
};
86111

87-
//--------------------------------
112+
console.log('Toggle Switch:', toggleSwitch);
113+
114+
const socket = getSocket();
115+
//wrap the socket event listener in useEffect with dependency array as [socket], so the the effect will run only when: 1. After the initial rendering of the component 2. Every time the socket instance changes(connect, disconnect)
116+
useEffect(() => {
117+
console.log(
118+
'socket inside useEffect:',
119+
socket ? 'connected' : 'not connected'
120+
);
121+
122+
if (socket) {
123+
console.log('------setting up socket.on event listener-------');
124+
socket.on('remote cursor data from server', (remoteData) =>
125+
handleCursorDataFromServer(remoteData)
126+
);
127+
}
128+
129+
return () => {
130+
console.log('clean up cursor event listener after canvas unmount');
131+
if (socket) socket.off('remote cursor data from server');
132+
};
133+
}, [socket]);
134+
135+
//-----------------
88136

89137
// find the current component based on the canvasFocus component ID in the state
90138
const currentComponent: Component = state.components.find(
@@ -280,6 +328,20 @@ function Canvas(props: {}): JSX.Element {
280328
</div>
281329
)
282330
)}
331+
332+
<label
333+
className="switch"
334+
style={{
335+
position: 'relative',
336+
display: 'inline-block',
337+
width: '60px',
338+
height: '34px'
339+
}}
340+
>
341+
<button className="btn-toggle" onClick={handleToggleSwitch}>
342+
On/Off
343+
</button>
344+
</label>
283345
</div>
284346
);
285347
}

0 commit comments

Comments
 (0)