From 435e193c93822ca3d8c050b0a43829cc48e85e38 Mon Sep 17 00:00:00 2001 From: Alan Friedman Date: Mon, 27 May 2019 16:06:01 -0400 Subject: [PATCH 01/12] Rename actions and functions --- client/src/actions/room.js | 16 ++++------- client/src/components/Chat/Chat.test.js | 4 +-- client/src/components/Chat/index.js | 12 ++++---- client/src/components/FileTransfer/index.js | 4 +-- client/src/components/Home/index.js | 18 +++++------- client/src/containers/Chat/index.js | 4 +-- client/src/containers/Home/index.js | 10 +++---- client/src/reducers/activities.js | 28 +++++++++---------- client/src/reducers/app.js | 2 +- client/src/reducers/room.js | 31 +++++++-------------- client/src/reducers/user.js | 2 +- client/src/stylesheets/app.sass | 2 +- server/src/socket.js | 12 ++++---- 13 files changed, 61 insertions(+), 84 deletions(-) diff --git a/client/src/actions/room.js b/client/src/actions/room.js index 83b0d96..48e076c 100644 --- a/client/src/actions/room.js +++ b/client/src/actions/room.js @@ -6,11 +6,11 @@ import { } from 'utils/message' import { getSocket } from 'utils/socket' -export const receiveSocketMessage = payload => async (dispatch, getState) => { +export const receiveEncryptedMessage = payload => async (dispatch, getState) => { const state = getState() const message = await processMessage(payload, state) - // Pass current state to all HANDLE_SOCKET_MESSAGE reducers for convenience, since each may have different needs - dispatch({ type: `HANDLE_SOCKET_MESSAGE_${message.type}`, payload: { payload: message.payload, state } }) + // Pass current state to all RECEIVE_ENCRYPTED_MESSAGE reducers for convenience, since each may have different needs + dispatch({ type: `RECEIVE_ENCRYPTED_MESSAGE_${message.type}`, payload: { payload: message.payload, state } }) } export const createUser = payload => async (dispatch) => { @@ -52,11 +52,11 @@ export const onFileTransfer = payload => async (dispatch) => { dispatch({ type: 'PREFLIGHT_FILE_TRANSFER', payload }) } -export const sendSocketMessage = payload => async (dispatch, getState) => { +export const sendEncryptedMessage = payload => async (dispatch, getState) => { const state = getState() const msg = await prepareMessage(payload, state) - dispatch({ type: `SEND_SOCKET_MESSAGE_${msg.original.type}`, payload: msg.original.payload }) - getSocket().emit('PAYLOAD', msg.toSend) + dispatch({ type: `SEND_ENCRYPTED_MESSAGE_${msg.original.type}`, payload: msg.original.payload }) + getSocket().emit('ENCRYPTED_MESSAGE', msg.toSend) } export const toggleLockRoom = () => async (dispatch, getState) => { @@ -94,10 +94,6 @@ export const clearActivities = () => async (dispatch) => { dispatch({ type: 'CLEAR_ACTIVITIES' }) } -export const onConnected = payload => async (dispatch) => { - dispatch({ type: 'CONNECTED', payload }) -} - export const sendUserDisconnect = () => async () => { getSocket().emit('USER_DISCONNECT') } diff --git a/client/src/components/Chat/Chat.test.js b/client/src/components/Chat/Chat.test.js index a33de83..a1b6235 100644 --- a/client/src/components/Chat/Chat.test.js +++ b/client/src/components/Chat/Chat.test.js @@ -3,11 +3,11 @@ import { mount } from 'enzyme' import toJson from 'enzyme-to-json' import { Chat } from './index.js' -const sendSocketMessage = jest.fn() +const sendEncryptedMessage = jest.fn() test('Chat Component', () => { const component = mount( - {}} focusChat={false} userId="foo" username="user" showNotice={() => {}} clearActivities={() => {}} sendSocketMessage={sendSocketMessage} /> + {}} focusChat={false} userId="foo" username="user" showNotice={() => {}} clearActivities={() => {}} sendEncryptedMessage={sendEncryptedMessage} /> ) const componentJSON = toJson(component) diff --git a/client/src/components/Chat/index.js b/client/src/components/Chat/index.js index f2ba71d..1148fe0 100644 --- a/client/src/components/Chat/index.js +++ b/client/src/components/Chat/index.js @@ -51,7 +51,7 @@ export class Chat extends Component { }) } - this.props.sendSocketMessage({ + this.props.sendEncryptedMessage({ type: 'CHANGE_USERNAME', payload: { id: this.props.userId, @@ -85,7 +85,7 @@ export class Chat extends Component { return false } - this.props.sendSocketMessage({ + this.props.sendEncryptedMessage({ type: 'USER_ACTION', payload: { action: actionMessage, @@ -216,8 +216,8 @@ export class Chat extends Component { return } } else { - this.props.sendSocketMessage({ - type: 'SEND_MESSAGE', + this.props.sendEncryptedMessage({ + type: 'TEXT_MESSAGE', payload: { text: message, timestamp: Date.now(), @@ -256,7 +256,7 @@ export class Chat extends Component { placeholder="Type here" onChange={this.handleInputChange.bind(this)} />
- + {touchSupport && From 71005e5f11b4a304c19dd80d3122caed35b4d16b Mon Sep 17 00:00:00 2001 From: Alan Friedman Date: Mon, 27 May 2019 16:22:04 -0400 Subject: [PATCH 06/12] Delete unused variable --- client/src/reducers/room.js | 1 - 1 file changed, 1 deletion(-) diff --git a/client/src/reducers/room.js b/client/src/reducers/room.js index 96a956b..703f8b7 100644 --- a/client/src/reducers/room.js +++ b/client/src/reducers/room.js @@ -30,7 +30,6 @@ const room = (state = initialState, action) => { }), } case 'RECEIVE_ENCRYPTED_MESSAGE_ADD_USER': - const membersWithId = state.members.filter(m => m.id) const joining = false return { From ef344ef3328ac2c7a406d5a2670b20b798f11726 Mon Sep 17 00:00:00 2001 From: Alan Friedman Date: Mon, 27 May 2019 16:22:17 -0400 Subject: [PATCH 07/12] Use Home component as root --- client/src/root.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/src/root.js b/client/src/root.js index d59b4c3..402ad85 100644 --- a/client/src/root.js +++ b/client/src/root.js @@ -8,7 +8,7 @@ import { Provider } from 'react-redux' import configureStore from 'store' import { BrowserRouter, Route, Switch } from 'react-router-dom' import shortId from 'shortid' -import Home from 'containers/Home' +import Home from 'components/Home' import { hasTouchSupport } from './utils/dom' const store = configureStore() From 3f028f06a45bfe0f3dfe21b1d30b513e49fdac92 Mon Sep 17 00:00:00 2001 From: Alan Friedman Date: Mon, 27 May 2019 17:30:39 -0400 Subject: [PATCH 08/12] Organize message actions better --- client/src/actions/app.js | 19 +++++ client/src/actions/encrypted_messages.js | 11 +++ client/src/actions/index.js | 3 +- client/src/actions/room.js | 99 ---------------------- client/src/actions/unencrypted_messages.js | 80 +++++++++++++++++ client/src/components/Home/index.js | 63 +++++--------- 6 files changed, 132 insertions(+), 143 deletions(-) create mode 100644 client/src/actions/encrypted_messages.js delete mode 100644 client/src/actions/room.js create mode 100644 client/src/actions/unencrypted_messages.js diff --git a/client/src/actions/app.js b/client/src/actions/app.js index 42e37f5..084c7a2 100644 --- a/client/src/actions/app.js +++ b/client/src/actions/app.js @@ -1,3 +1,7 @@ +import { + process as processMessage, +} from 'utils/message' + export const openModal = payload => ({ type: 'OPEN_MODAL', payload }) export const closeModal = () => ({ type: 'CLOSE_MODAL' }) @@ -18,3 +22,18 @@ export const toggleSoundEnabled = payload => async (dispatch) => { export const toggleSocketConnected = payload => async (dispatch) => { dispatch({ type: 'TOGGLE_SOCKET_CONNECTED', payload }) } + +export const receiveEncryptedMessage = payload => async (dispatch, getState) => { + const state = getState() + const message = await processMessage(payload, state) + // Pass current state to all RECEIVE_ENCRYPTED_MESSAGE reducers for convenience, since each may have different needs + dispatch({ type: `RECEIVE_ENCRYPTED_MESSAGE_${message.type}`, payload: { payload: message.payload, state } }) +} + +export const createUser = payload => async (dispatch) => { + dispatch({ type: 'CREATE_USER', payload }) +} + +export const clearActivities = () => async (dispatch) => { + dispatch({ type: 'CLEAR_ACTIVITIES' }) +} diff --git a/client/src/actions/encrypted_messages.js b/client/src/actions/encrypted_messages.js new file mode 100644 index 0000000..e934ab1 --- /dev/null +++ b/client/src/actions/encrypted_messages.js @@ -0,0 +1,11 @@ +import { getSocket } from 'utils/socket' +import { + prepare as prepareMessage, +} from 'utils/message' + +export const sendEncryptedMessage = payload => async (dispatch, getState) => { + const state = getState() + const msg = await prepareMessage(payload, state) + dispatch({ type: `SEND_ENCRYPTED_MESSAGE_${msg.original.type}`, payload: msg.original.payload }) + getSocket().emit('ENCRYPTED_MESSAGE', msg.toSend) +} \ No newline at end of file diff --git a/client/src/actions/index.js b/client/src/actions/index.js index 7949d05..3504084 100644 --- a/client/src/actions/index.js +++ b/client/src/actions/index.js @@ -1,3 +1,4 @@ -export * from './room' export * from './app' +export * from './unencrypted_messages' +export * from './encrypted_messages' diff --git a/client/src/actions/room.js b/client/src/actions/room.js deleted file mode 100644 index 64ba53c..0000000 --- a/client/src/actions/room.js +++ /dev/null @@ -1,99 +0,0 @@ -import isEqual from 'lodash/isEqual' -import { - process as processMessage, - prepare as prepareMessage, -} from 'utils/message' -import { getSocket } from 'utils/socket' - -export const receiveEncryptedMessage = payload => async (dispatch, getState) => { - const state = getState() - const message = await processMessage(payload, state) - // Pass current state to all RECEIVE_ENCRYPTED_MESSAGE reducers for convenience, since each may have different needs - dispatch({ type: `RECEIVE_ENCRYPTED_MESSAGE_${message.type}`, payload: { payload: message.payload, state } }) -} - -export const createUser = payload => async (dispatch) => { - dispatch({ type: 'CREATE_USER', payload }) -} - -export const sendUserEnter = payload => async () => { - getSocket().emit('USER_ENTER', { - publicKey: payload.publicKey, - }) -} - -export const receiveUserExit = payload => async (dispatch, getState) => { - const state = getState() - const exitingUser = state.room.members.find(m => !payload.map(p => JSON.stringify(p.publicKey)).includes(JSON.stringify(m.publicKey))) - - if (!exitingUser) { - return; - } - - const exitingUserId = exitingUser.id - const exitingUsername = exitingUser.username - - dispatch({ - type: 'USER_EXIT', - payload: { - members: payload, - id: exitingUserId, - username: exitingUsername, - }, - }) -} - -export const receiveUserEnter = payload => async (dispatch) => { - dispatch({ type: 'USER_ENTER', payload }) -} - -export const onFileTransfer = payload => async (dispatch) => { - dispatch({ type: 'PREFLIGHT_FILE_TRANSFER', payload }) -} - -export const sendEncryptedMessage = payload => async (dispatch, getState) => { - const state = getState() - const msg = await prepareMessage(payload, state) - dispatch({ type: `SEND_ENCRYPTED_MESSAGE_${msg.original.type}`, payload: msg.original.payload }) - getSocket().emit('ENCRYPTED_MESSAGE', msg.toSend) -} - -export const toggleLockRoom = () => async (dispatch, getState) => { - const state = getState() - getSocket().emit('TOGGLE_LOCK_ROOM', null, (res) => { - dispatch({ - type: 'TOGGLE_LOCK_ROOM', - payload: { - locked: res.isLocked, - username: state.user.username, - sender: state.user.id, - }, - }) - }) -} - -export const receiveToggleLockRoom = payload => async (dispatch, getState) => { - const state = getState() - - const lockedByUser = state.room.members.find(m => isEqual(m.publicKey, payload.publicKey)) - const lockedByUsername = lockedByUser.username - const lockedByUserId = lockedByUser.id - - dispatch({ - type: 'RECEIVE_TOGGLE_LOCK_ROOM', - payload: { - username: lockedByUsername, - locked: payload.locked, - id: lockedByUserId, - }, - }) -} - -export const clearActivities = () => async (dispatch) => { - dispatch({ type: 'CLEAR_ACTIVITIES' }) -} - -export const sendUserDisconnect = () => async () => { - getSocket().emit('USER_DISCONNECT') -} - diff --git a/client/src/actions/unencrypted_messages.js b/client/src/actions/unencrypted_messages.js new file mode 100644 index 0000000..85586e9 --- /dev/null +++ b/client/src/actions/unencrypted_messages.js @@ -0,0 +1,80 @@ +import { getSocket } from 'utils/socket' +import isEqual from 'lodash/isEqual' + +const receiveUserEnter = (payload, dispatch) => { + dispatch({ type: 'USER_ENTER', payload }) +} + +const receiveToggleLockRoom = (payload, dispatch, getState) => { + const state = getState() + + const lockedByUser = state.room.members.find(m => isEqual(m.publicKey, payload.publicKey)) + const lockedByUsername = lockedByUser.username + const lockedByUserId = lockedByUser.id + + dispatch({ + type: 'RECEIVE_TOGGLE_LOCK_ROOM', + payload: { + username: lockedByUsername, + locked: payload.locked, + id: lockedByUserId, + }, + }) +} + +const receiveUserExit = (payload, dispatch, getState) => { + const state = getState() + const exitingUser = state.room.members.find(m => !payload.map(p => JSON.stringify(p.publicKey)).includes(JSON.stringify(m.publicKey))) + + if (!exitingUser) { + return; + } + + const exitingUserId = exitingUser.id + const exitingUsername = exitingUser.username + + dispatch({ + type: 'USER_EXIT', + payload: { + members: payload, + id: exitingUserId, + username: exitingUsername, + }, + }) +} + +export const receiveUnencryptedMessage = (type, payload) => async (dispatch, getState) => { + switch(type) { + case 'USER_ENTER': + return receiveUserEnter(payload, dispatch); + case 'USER_EXIT': + return receiveUserExit(payload, dispatch, getState); + case 'TOGGLE_LOCK_ROOM': + return receiveToggleLockRoom(payload, dispatch, getState); + default: + return; + } +} + +const sendToggleLockRoom = (dispatch, getState) => { + const state = getState() + getSocket().emit('TOGGLE_LOCK_ROOM', null, (res) => { + dispatch({ + type: 'TOGGLE_LOCK_ROOM', + payload: { + locked: res.isLocked, + username: state.user.username, + sender: state.user.id, + }, + }) + }) +} + +export const sendUnencryptedMessage = (type, payload) => async (dispatch, getState) => { + switch(type) { + case 'TOGGLE_LOCK_ROOM': + return sendToggleLockRoom(dispatch, getState); + default: + return; + } +} \ No newline at end of file diff --git a/client/src/components/Home/index.js b/client/src/components/Home/index.js index 54a3d95..3e661cc 100644 --- a/client/src/components/Home/index.js +++ b/client/src/components/Home/index.js @@ -24,20 +24,16 @@ import { getObjectUrl } from 'utils/file' import { connect } from 'react-redux' import { receiveEncryptedMessage, - sendEncryptedMessage, createUser, - receiveUserExit, - receiveUserEnter, - toggleLockRoom, - receiveToggleLockRoom, openModal, closeModal, setScrolledToBottom, - sendUserEnter, toggleWindowFocus, toggleSoundEnabled, toggleSocketConnected, - sendUserDisconnect + receiveUnencryptedMessage, + sendUnencryptedMessage, + sendEncryptedMessage } from 'actions' import styles from './styles.module.scss' @@ -65,29 +61,19 @@ class Home extends Component { const socket = connectSocket(roomId) - const disconnectEvents = [ - 'disconnect', - ] + this.socket = socket; - disconnectEvents.forEach((evt) => { - socket.on(evt, () => { - this.props.toggleSocketConnected(false) - }) + socket.on('disconnect', () => { + this.props.toggleSocketConnected(false) }) - const connectEvents = [ - 'connect', - ] - - connectEvents.forEach((evt) => { - socket.on(evt, () => { - this.initApp(user) - this.props.toggleSocketConnected(true) - }) + socket.on('connect', () => { + this.initApp(user) + this.props.toggleSocketConnected(true) }) socket.on('USER_ENTER', (payload) => { - this.props.receiveUserEnter(payload) + this.props.receiveUnencryptedMessage('USER_ENTER', payload) this.props.sendEncryptedMessage({ type: 'ADD_USER', payload: { @@ -100,7 +86,7 @@ class Home extends Component { }) socket.on('USER_EXIT', (payload) => { - this.props.receiveUserExit(payload) + this.props.receiveUnencryptedMessage('USER_EXIT', payload) }) socket.on('ENCRYPTED_MESSAGE', (payload) => { @@ -108,7 +94,7 @@ class Home extends Component { }) socket.on('TOGGLE_LOCK_ROOM', (payload) => { - this.props.receiveToggleLockRoom(payload) + this.props.receiveUnencryptedMessage('TOGGLE_LOCK_ROOM', payload) }) socket.on('ROOM_LOCKED', (payload) => { @@ -116,7 +102,7 @@ class Home extends Component { }); window.addEventListener('beforeunload', (evt) => { - this.props.sendUserDisconnect(); + socket.emit('USER_DISCONNECT') }); } @@ -289,7 +275,7 @@ class Home extends Component { } initApp(user) { - this.props.sendUserEnter({ + this.socket.emit('USER_ENTER', { publicKey: user.publicKey, }) } @@ -363,7 +349,7 @@ class Home extends Component { members={this.props.members} roomId={this.props.roomId} roomLocked={this.props.roomLocked} - toggleLockRoom={this.props.toggleLockRoom} + toggleLockRoom={() => this.props.sendUnencryptedMessage('TOGGLE_LOCK_ROOM')} openModal={this.props.openModal} iAmOwner={this.props.iAmOwner} userId={this.props.userId} @@ -426,10 +412,7 @@ Home.defaultProps = { Home.propTypes = { receiveEncryptedMessage: PropTypes.func.isRequired, - sendEncryptedMessage: PropTypes.func.isRequired, createUser: PropTypes.func.isRequired, - receiveUserExit: PropTypes.func.isRequired, - receiveUserEnter: PropTypes.func.isRequired, activities: PropTypes.array.isRequired, username: PropTypes.string.isRequired, publicKey: PropTypes.object.isRequired, @@ -437,16 +420,12 @@ Home.propTypes = { match: PropTypes.object.isRequired, roomId: PropTypes.string.isRequired, roomLocked: PropTypes.bool.isRequired, - toggleLockRoom: PropTypes.func.isRequired, - receiveToggleLockRoom: PropTypes.func.isRequired, modalComponent: PropTypes.string, openModal: PropTypes.func.isRequired, closeModal: PropTypes.func.isRequired, setScrolledToBottom: PropTypes.func.isRequired, scrolledToBottom: PropTypes.bool.isRequired, iAmOwner: PropTypes.bool.isRequired, - sendUserEnter: PropTypes.func.isRequired, - sendUserDisconnect: PropTypes.func.isRequired, userId: PropTypes.string.isRequired, joining: PropTypes.bool.isRequired, toggleWindowFocus: PropTypes.func.isRequired, @@ -455,6 +434,8 @@ Home.propTypes = { toggleSoundEnabled: PropTypes.func.isRequired, toggleSocketConnected: PropTypes.func.isRequired, socketConnected: PropTypes.bool.isRequired, + sendUnencryptedMessage: PropTypes.func.isRequired, + sendEncryptedMessage: PropTypes.func.isRequired } const mapStateToProps = (state) => { @@ -481,20 +462,16 @@ const mapStateToProps = (state) => { const mapDispatchToProps = { receiveEncryptedMessage, - sendEncryptedMessage, - receiveUserExit, - receiveUserEnter, createUser, - toggleLockRoom, - receiveToggleLockRoom, openModal, closeModal, setScrolledToBottom, - sendUserEnter, toggleWindowFocus, toggleSoundEnabled, toggleSocketConnected, - sendUserDisconnect + receiveUnencryptedMessage, + sendUnencryptedMessage, + sendEncryptedMessage } export default connect( From f73925df6665ac848881e88aefe562396a58825a Mon Sep 17 00:00:00 2001 From: Alan Friedman Date: Mon, 27 May 2019 19:12:37 -0400 Subject: [PATCH 09/12] Cleanup reducers --- client/src/actions/app.js | 11 ----------- client/src/actions/encrypted_messages.js | 8 ++++++++ client/src/actions/unencrypted_messages.js | 3 +-- client/src/components/Home/index.js | 10 ---------- client/src/reducers/activities.js | 13 +------------ client/src/reducers/room.js | 21 +++------------------ 6 files changed, 13 insertions(+), 53 deletions(-) diff --git a/client/src/actions/app.js b/client/src/actions/app.js index 084c7a2..198dd8f 100644 --- a/client/src/actions/app.js +++ b/client/src/actions/app.js @@ -1,7 +1,3 @@ -import { - process as processMessage, -} from 'utils/message' - export const openModal = payload => ({ type: 'OPEN_MODAL', payload }) export const closeModal = () => ({ type: 'CLOSE_MODAL' }) @@ -23,13 +19,6 @@ export const toggleSocketConnected = payload => async (dispatch) => { dispatch({ type: 'TOGGLE_SOCKET_CONNECTED', payload }) } -export const receiveEncryptedMessage = payload => async (dispatch, getState) => { - const state = getState() - const message = await processMessage(payload, state) - // Pass current state to all RECEIVE_ENCRYPTED_MESSAGE reducers for convenience, since each may have different needs - dispatch({ type: `RECEIVE_ENCRYPTED_MESSAGE_${message.type}`, payload: { payload: message.payload, state } }) -} - export const createUser = payload => async (dispatch) => { dispatch({ type: 'CREATE_USER', payload }) } diff --git a/client/src/actions/encrypted_messages.js b/client/src/actions/encrypted_messages.js index e934ab1..3fdccea 100644 --- a/client/src/actions/encrypted_messages.js +++ b/client/src/actions/encrypted_messages.js @@ -1,6 +1,7 @@ import { getSocket } from 'utils/socket' import { prepare as prepareMessage, + process as processMessage, } from 'utils/message' export const sendEncryptedMessage = payload => async (dispatch, getState) => { @@ -8,4 +9,11 @@ export const sendEncryptedMessage = payload => async (dispatch, getState) => { const msg = await prepareMessage(payload, state) dispatch({ type: `SEND_ENCRYPTED_MESSAGE_${msg.original.type}`, payload: msg.original.payload }) getSocket().emit('ENCRYPTED_MESSAGE', msg.toSend) +} + +export const receiveEncryptedMessage = payload => async (dispatch, getState) => { + const state = getState() + const message = await processMessage(payload, state) + // Pass current state to all RECEIVE_ENCRYPTED_MESSAGE reducers for convenience, since each may have different needs + dispatch({ type: `RECEIVE_ENCRYPTED_MESSAGE_${message.type}`, payload: { payload: message.payload, state } }) } \ No newline at end of file diff --git a/client/src/actions/unencrypted_messages.js b/client/src/actions/unencrypted_messages.js index 85586e9..e4866bb 100644 --- a/client/src/actions/unencrypted_messages.js +++ b/client/src/actions/unencrypted_messages.js @@ -1,5 +1,4 @@ import { getSocket } from 'utils/socket' -import isEqual from 'lodash/isEqual' const receiveUserEnter = (payload, dispatch) => { dispatch({ type: 'USER_ENTER', payload }) @@ -8,7 +7,7 @@ const receiveUserEnter = (payload, dispatch) => { const receiveToggleLockRoom = (payload, dispatch, getState) => { const state = getState() - const lockedByUser = state.room.members.find(m => isEqual(m.publicKey, payload.publicKey)) + const lockedByUser = state.room.members.find(m => m.publicKey.n === payload.publicKey.n) const lockedByUsername = lockedByUser.username const lockedByUserId = lockedByUser.id diff --git a/client/src/components/Home/index.js b/client/src/components/Home/index.js index 3e661cc..995793c 100644 --- a/client/src/components/Home/index.js +++ b/client/src/components/Home/index.js @@ -109,18 +109,10 @@ class Home extends Component { componentDidMount() { this.bindEvents() - if (this.props.joining) { - this.props.openModal('Connecting') - } - this.beep = window.Audio && new window.Audio(beepFile) } componentWillReceiveProps(nextProps) { - if (this.props.joining && !nextProps.joining) { - this.props.closeModal() - } - Tinycon.setBubble(nextProps.faviconCount) if (nextProps.faviconCount !== 0 && nextProps.faviconCount !== this.props.faviconCount && this.props.soundIsEnabled) { @@ -427,7 +419,6 @@ Home.propTypes = { scrolledToBottom: PropTypes.bool.isRequired, iAmOwner: PropTypes.bool.isRequired, userId: PropTypes.string.isRequired, - joining: PropTypes.bool.isRequired, toggleWindowFocus: PropTypes.func.isRequired, faviconCount: PropTypes.number.isRequired, soundIsEnabled: PropTypes.bool.isRequired, @@ -453,7 +444,6 @@ const mapStateToProps = (state) => { modalComponent: state.app.modalComponent, scrolledToBottom: state.app.scrolledToBottom, iAmOwner: Boolean(me && me.isOwner), - joining: state.room.joining, faviconCount: state.app.unreadMessageCount, soundIsEnabled: state.app.soundIsEnabled, socketConnected: state.app.socketConnected, diff --git a/client/src/reducers/activities.js b/client/src/reducers/activities.js index 98f55b3..75b22cd 100644 --- a/client/src/reducers/activities.js +++ b/client/src/reducers/activities.js @@ -1,12 +1,5 @@ const initialState = { - items: [ - // { - // type: 'message | file | isTyping | usernameChange | slashCommand', - // data, - // username, - // timestamp - // } - ], + items: [], } const activities = (state = initialState, action) => { @@ -90,10 +83,6 @@ const activities = (state = initialState, action) => { return state } - if (action.payload.state.room.joining) { - return state - } - return { ...state, items: [ diff --git a/client/src/reducers/room.js b/client/src/reducers/room.js index 703f8b7..9a37740 100644 --- a/client/src/reducers/room.js +++ b/client/src/reducers/room.js @@ -9,33 +9,22 @@ const initialState = { ], id: '', isLocked: false, - joining: true, - size: 0, } const room = (state = initialState, action) => { switch (action.type) { case 'USER_EXIT': - const memberPubKeys = action.payload.members.map(m => JSON.stringify(m.publicKey)) + const memberPubKeys = action.payload.members.map(m => m.publicKey.n) return { ...state, members: state.members - .filter(m => memberPubKeys.includes(JSON.stringify(m.publicKey))) - .map((m) => { - const payloadMember = action.payload.members.find(member => _.isEqual(m.publicKey, member.publicKey)) - return { - ...m, - ...payloadMember, - } - }), + .filter(member => memberPubKeys.includes(member.publicKey.n)) } case 'RECEIVE_ENCRYPTED_MESSAGE_ADD_USER': - const joining = false - return { ...state, members: state.members.map((member) => { - if (_.isEqual(member.publicKey, action.payload.payload.publicKey)) { + if (member.publicKey.n === action.payload.payload.publicKey.n) { return { ...member, username: action.payload.payload.username, @@ -45,7 +34,6 @@ const room = (state = initialState, action) => { } return member }), - joining, } case 'CREATE_USER': return { @@ -61,14 +49,11 @@ const room = (state = initialState, action) => { } case 'USER_ENTER': const members = _.uniqBy(action.payload.users, member => member.publicKey.n); - const size = action.payload.users ? action.payload.users.length : 1; return { ...state, id: action.payload.id, isLocked: Boolean(action.payload.isLocked), - size, - joining: false, members: members.reduce((acc, user) => { const exists = state.members.find(m => m.publicKey.n === user.publicKey.n) if (exists) { From 8614530163f0e5cc0782c118d9fc04f9b34ab802 Mon Sep 17 00:00:00 2001 From: Alan Friedman Date: Mon, 27 May 2019 19:24:54 -0400 Subject: [PATCH 10/12] Simplify finding exiting user --- client/src/actions/unencrypted_messages.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/client/src/actions/unencrypted_messages.js b/client/src/actions/unencrypted_messages.js index e4866bb..af251df 100644 --- a/client/src/actions/unencrypted_messages.js +++ b/client/src/actions/unencrypted_messages.js @@ -23,7 +23,8 @@ const receiveToggleLockRoom = (payload, dispatch, getState) => { const receiveUserExit = (payload, dispatch, getState) => { const state = getState() - const exitingUser = state.room.members.find(m => !payload.map(p => JSON.stringify(p.publicKey)).includes(JSON.stringify(m.publicKey))) + const payloadPublicKeys = payload.map(member => member.publicKey.n); + const exitingUser = state.room.members.find(m => !payloadPublicKeys.includes(m.publicKey.n)) if (!exitingUser) { return; From 76baec6b5db174658ee4b7bcb9b2a1cd636b801b Mon Sep 17 00:00:00 2001 From: Alan Friedman Date: Mon, 27 May 2019 21:58:56 -0400 Subject: [PATCH 11/12] Send unhashed room ID --- server/src/socket.js | 20 ++++---------------- 1 file changed, 4 insertions(+), 16 deletions(-) diff --git a/server/src/socket.js b/server/src/socket.js index 1c7db12..9570753 100644 --- a/server/src/socket.js +++ b/server/src/socket.js @@ -21,24 +21,9 @@ export default class Socket { async init(opts) { const { roomId, socket, room } = opts await this.joinRoom(roomId, socket.id) - this.sendRoomInfo(); this.handleSocket(socket) } - sendRoomInfo() { - let room; - if (_.isEmpty(this.room)) { - room = { - id: this.roomIdOriginal, - users: [], - isLocked: false, - } - } else { - room = this.room; - } - this.socket.emit('CONNECTED', room); - } - sendRoomLocked() { this.socket.emit('ROOM_LOCKED'); } @@ -100,7 +85,10 @@ export default class Socket { } await this.saveRoom(newRoom) - getIO().to(this._roomId).emit('USER_ENTER', newRoom); + getIO().to(this._roomId).emit('USER_ENTER', { + ...newRoom, + id: this.roomIdOriginal + }); }) socket.on('TOGGLE_LOCK_ROOM', async (data, callback) => { From b5a4dcdb1f21d654da9c1a314e4370551b6c1b9f Mon Sep 17 00:00:00 2001 From: Alan Friedman Date: Tue, 28 May 2019 08:13:20 -0400 Subject: [PATCH 12/12] Increase ping timeout --- server/src/index.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server/src/index.js b/server/src/index.js index 9df77e5..3f55596 100644 --- a/server/src/index.js +++ b/server/src/index.js @@ -103,7 +103,7 @@ const protocol = (process.env.PROTOCOL || 'http') === 'http' ? http : https; const server = protocol.createServer(app.callback()); const io = Io(server, { pingInterval: 5000, - pingTimeout: 3000 + pingTimeout: 5000 }); io.adapter(socketRedis(process.env.REDIS_URL));