Skip to content

Commit 16480dd

Browse files
committed
Merge branch 'dev' into sean
2 parents 9bce243 + 4ec06ce commit 16480dd

File tree

9 files changed

+103
-21
lines changed

9 files changed

+103
-21
lines changed

app/src/components/bottom/CodePreview.tsx

Lines changed: 10 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,6 @@ import 'ace-builds/src-noconflict/mode-javascript';
44
import 'ace-builds/src-noconflict/theme-dracula';
55
import 'ace-builds/src-noconflict/theme-terminal';
66

7-
import * as esbuild from 'esbuild-wasm';
8-
97
import React, { useContext, useEffect, useRef, useState } from 'react';
108
import {
119
codePreviewInput,
@@ -19,22 +17,14 @@ import { RootState } from '../../redux/store';
1917
import { fetchPlugin } from '../../plugins/fetch-plugin';
2018
import { unpkgPathPlugin } from '../../plugins/unpkg-path-plugin';
2119
import useResizeObserver from '../../tree/useResizeObserver';
20+
import { initializeEsbuild } from '../../helperFunctions/esbuildService';
2221

2322
const CodePreview: React.FC<{
2423
theme: string | null;
2524
setTheme: any | null;
2625
}> = ({ theme, setTheme }) => {
2726
const ref = useRef<any>();
2827

29-
/**
30-
* Starts the Web Assembly service.
31-
*/
32-
const startService = async () => {
33-
ref.current = await esbuild.initialize({
34-
worker: true,
35-
wasmURL: 'https://unpkg.com/[email protected]/esbuild.wasm'
36-
});
37-
};
3828
const dispatch = useDispatch();
3929

4030
const wrapper = useRef();
@@ -49,7 +39,8 @@ const CodePreview: React.FC<{
4939
const [input, setInput] = useState('');
5040

5141
useEffect(() => {
52-
startService();
42+
//Starts the Web Assembly service
43+
initializeEsbuild();
5344
}, []);
5445

5546
useEffect(() => {
@@ -61,6 +52,13 @@ const CodePreview: React.FC<{
6152
dispatch(codePreviewInput(currentComponent.code));
6253
}, [currentComponent, state.components]);
6354

55+
useEffect(() => {
56+
console.log('CodePreview Mounted');
57+
return () => {
58+
console.log('CodePreview Unmounted');
59+
};
60+
}, []);
61+
6462
/**
6563
* Handler thats listens to changes in code editor
6664
* @param {string} data - Code entered by the user

app/src/components/left/HTMLItem.tsx

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -129,7 +129,6 @@ const HTMLItem: React.FC<{
129129
className={`${classes.HTMLPanelItem} ${classes.darkThemeFontColor}`}
130130
id="HTMLItem"
131131
>
132-
{/* <Icon fontSize="small" align-items="center" /> */}
133132
{typeof IconComponent !== 'undefined' && (
134133
<IconComponent fontSize="small" align-items="center" />
135134
)}
@@ -146,7 +145,7 @@ const HTMLItem: React.FC<{
146145
className={`${classes.HTMLPanelItem} ${classes.darkThemeFontColor}`}
147146
id="HTMLItem"
148147
>
149-
<h3>{name}</h3>
148+
<div>{name}</div>
150149
</div>
151150
<button
152151
id="newElement"

app/src/components/left/RoomsContainer.tsx

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,12 +8,19 @@ import Button from '@mui/material/Button';
88
import React, { useState } from 'react';
99
import { RootState } from '../../redux/store';
1010
import TextField from '@mui/material/TextField';
11+
import { BottomPanelObj } from '../../interfaces/Interfaces';
1112
import {
1213
allCooperativeState,
1314
addChild,
1415
changeFocus,
1516
deleteChild,
16-
changePosition
17+
changePosition,
18+
resetState,
19+
updateStateUsed,
20+
updateUseContext,
21+
updateCss,
22+
updateAttributes,
23+
updateEvents
1724
} from '../../redux/reducers/slice/appStateSlice';
1825
import {
1926
setRoomCode,
@@ -115,6 +122,16 @@ const RoomsContainer = () => {
115122
store.dispatch(deleteChild(deleteData));
116123
});
117124

125+
//write out emitters for reach function inside of CusomizationPanel HandleSave//no need to pull the function into RoomsContainer
126+
socket.on('update data from server', (updateData: BottomPanelObj) => {
127+
console.log('update data received from server', updateData);
128+
store.dispatch(updateStateUsed({stateUsedObj: updateData.stateUsedObj, contextParam: updateData.contextParam}));
129+
store.dispatch(updateUseContext({useContextObj: updateData.useContextObj, contextParam: updateData.contextParam}));
130+
store.dispatch(updateCss({style: updateData.style, contextParam: updateData.contextParam}));
131+
store.dispatch(updateAttributes({attributes: updateData.attributes, contextParam: updateData.contextParam}));
132+
store.dispatch(updateEvents({events: updateData.events, contextParam: updateData.contextParam}));
133+
});
134+
118135
socket.on(
119136
'item position data from server',
120137
(itemPositionData: object) => {
@@ -137,7 +154,6 @@ const RoomsContainer = () => {
137154
//edge case: if userList is not empty, reset it to empty array
138155
if (userList.length !== 0) dispatch(setUserList([]));
139156
handleUserEnteredRoom(roomCode);
140-
141157
dispatch(setRoomCode(roomCode)); //?
142158
dispatch(setUserJoined(true)); //setting joined room to true for rendering leave room button
143159
}
@@ -146,6 +162,7 @@ const RoomsContainer = () => {
146162
let socket = getSocket();
147163
if (socket) {
148164
socket.disconnect(); //disconnecting socket from server
165+
console.log(socket);
149166
socket = null;
150167
console.log('user leaves the room');
151168
}
@@ -154,6 +171,7 @@ const RoomsContainer = () => {
154171
dispatch(setUserName(''));
155172
dispatch(setUserList([]));
156173
dispatch(setUserJoined(false)); //setting joined to false so join room UI appear
174+
dispatch(resetState(''));
157175
}
158176

159177
//checking empty input field (not including spaces)

app/src/containers/CustomizationPanel.tsx

Lines changed: 30 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,8 @@ import createModal from '../components/right/createModal';
3838
import makeStyles from '@mui/styles/makeStyles';
3939
import { ColumnTab } from '../interfaces/Interfaces';
4040
import { RootState } from '../redux/store';
41+
import { emitEvent } from '../helperFunctions/socket';
42+
import { Number } from 'mongoose';
4143

4244
// Previously named rightContainer, Renamed to Customizationpanel this now hangs on BottomTabs
4345
// need to pass in props to use the useHistory feature of react router
@@ -46,6 +48,7 @@ const CustomizationPanel = ({ isThemeLight }): JSX.Element => {
4648
const dispatch = useDispatch();
4749
const state = useSelector((store: RootState) => store.appState);
4850
const contextParam = useSelector((store: RootState) => store.contextSlice);
51+
const roomCode = useSelector((store: RootState) => store.roomSlice.roomCode);
4952
const style = useSelector((store: RootState) => store.styleSlice);
5053

5154
const [displayMode, setDisplayMode] = useState('');
@@ -370,25 +373,42 @@ const CustomizationPanel = ({ isThemeLight }): JSX.Element => {
370373
if (compText !== '') attributesObj.compText = compText;
371374
if (compLink !== '') attributesObj.compLink = compLink;
372375
if (cssClasses !== '') attributesObj.cssClasses = cssClasses;
373-
374376
dispatch(
375377
updateAttributes({
376378
attributes: attributesObj,
377379
contextParam: contextParam
378380
})
379381
);
380-
382+
381383
const eventsObj: any = {};
382384
if (eventAll[0] !== '') eventsObj[eventAll[0]] = eventAll[1];
383385
dispatch(updateEvents({ events: eventsObj, contextParam: contextParam }));
384386

387+
if (roomCode) {
388+
emitEvent('updateChildAction', roomCode, {
389+
stateUsedObj: stateUsedObj,
390+
contextParam: contextParam,
391+
useContextObj: useContextObj,
392+
attributes: attributesObj,
393+
style: styleObj,
394+
events: eventsObj
395+
});
396+
console.log('emit updateChildAction event is triggered in CustomizationPanel.tsx');
397+
}
398+
385399
return styleObj;
400+
386401
};
387402
const handleTailwind = (): void => {
388403
dispatch(changeTailwind(true));
389404
handleSave();
390405
};
391406

407+
// const clickToUpdate = () => {
408+
// handleSave();
409+
// saveEmitter();
410+
// }
411+
392412
// UNDO/REDO functionality--onClick these functions will be invoked.
393413
const handleUndo = () => {
394414
dispatch(undo({ contextParam }));
@@ -399,7 +419,15 @@ const CustomizationPanel = ({ isThemeLight }): JSX.Element => {
399419
// placeholder for handling deleting instance
400420
const handleDelete = () => {
401421
dispatch(deleteChild({ id: {}, contextParam: contextParam }));
422+
if (roomCode) {
423+
emitEvent('deleteChildAction', roomCode, {
424+
id: {},
425+
contextParam: contextParam
426+
});
427+
console.log('emit deleteChildAction event is triggered in CustomizationPanel.tsx');
428+
}
402429
};
430+
403431
const handlePageDelete = (id) => () => {
404432
// TODO: return modal
405433
if (isLinkedTo()) return setDeleteLinkedPageError(true);
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
import * as esbuild from 'esbuild-wasm';
2+
3+
/* Singleton pattern for initializing esbuild */
4+
/* This ensures that esbuild is only initialized once, regardless of how many times CodePreview is mounted and unmounted */
5+
let isEsbuildInitialized = false;
6+
7+
export const initializeEsbuild = async () => {
8+
if (!isEsbuildInitialized) {
9+
await esbuild.initialize({
10+
worker: true,
11+
wasmURL: 'https://unpkg.com/[email protected]/esbuild.wasm'
12+
});
13+
isEsbuildInitialized = true;
14+
}
15+
};

app/src/helperFunctions/socket.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,10 +16,11 @@ import config from '../../../config';
1616
let socket = null;
1717

1818
export const initializeSocket = () => {
19-
if (socket) socket.disconnect();
19+
if (socket) socket.connect();
2020
if (!socket) {
2121
socket = io(config.API_BASE_URL, { transports: ['websocket'] });
2222
console.log('A user connected');
23+
console.log('socket:', socket);
2324
}
2425
};
2526

app/src/interfaces/Interfaces.ts

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -191,3 +191,12 @@ export interface MouseState {
191191
clientX: number;
192192
clientY: number;
193193
}
194+
195+
export interface BottomPanelObj {
196+
stateUsedObj: object;
197+
contextParam: object;
198+
useContextObj: object;
199+
attributes: object;
200+
style: object;
201+
events: object;
202+
}

app/src/redux/reducers/slice/userSlice.ts

Whitespace-only changes.

server/server.ts

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -163,15 +163,24 @@ io.on('connection', (client) => {
163163

164164
//disconnecting functionality
165165
client.on('disconnecting', () => {
166-
// the client.rooms Set contains at least the socket ID
167166
const roomCode = Array.from(client.rooms)[1]; //grabbing current room client was in when disconnecting
167+
const userList = Object.keys(roomLists[roomCode]); //[ bHhFDmzPGam, mqri45c94E3 ] order is not perserved?
168+
const hostID = userList[0];
169+
// the client.rooms Set contains at least the socket ID
170+
console.log(`${client.id} will be leaving the room`);
171+
console.log(client.id === hostID);
172+
console.log(roomLists[roomCode]);
168173
delete roomLists[roomCode][client.id];
174+
console.log(roomLists[roomCode]);
169175
//if room empty, delete room from room list
170176
if (!Object.keys(roomLists[roomCode]).length) {
171177
delete roomLists[roomCode];
172178
} else {
173179
//else emit updated user list
174-
io.to(roomCode).emit('updateUserList', roomLists[roomCode]);
180+
io.to(roomCode).emit(
181+
'updateUserList',
182+
Object.values(roomLists[roomCode])
183+
);
175184
}
176185
});
177186

@@ -196,6 +205,11 @@ io.on('connection', (client) => {
196205
client.to(roomCode).emit('delete data from server', deleteData);
197206
});
198207

208+
client.on('updateChildAction', (roomCode: string, updateData: object) => {
209+
client.to(roomCode).emit('update data from server', updateData);
210+
console.log('client received update from server!')
211+
});
212+
199213
client.on(
200214
'changePositionAction',
201215
(roomCode: string, itemPositionData: object) => {

0 commit comments

Comments
 (0)