diff --git a/package-lock.json b/package-lock.json index 908f46b..1af5023 100644 --- a/package-lock.json +++ b/package-lock.json @@ -8389,6 +8389,11 @@ } } }, + "moment": { + "version": "2.24.0", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.24.0.tgz", + "integrity": "sha512-bV7f+6l2QigeBBZSM/6yTNq4P2fNpSWj/0e7jQcy87A8e7o2nAfP/34/2ky5Vw4B9S446EtIhodAzkFCcR4dQg==" + }, "morgan": { "version": "1.9.1", "resolved": "https://registry.npmjs.org/morgan/-/morgan-1.9.1.tgz", diff --git a/package.json b/package.json index babb683..52f84ca 100644 --- a/package.json +++ b/package.json @@ -5,12 +5,14 @@ "dependencies": { "bootstrap": "^4.3.1", "cors": "^2.8.5", + "moment": "^2.24.0", "morgan": "^1.9.1", "react": "^16.8.6", "react-dom": "^16.8.6", "react-scripts": "3.0.1", "socket.io": "^2.2.0", - "socket.io-client": "^2.2.0" + "socket.io-client": "^2.2.0", + "uuid": "^3.3.2" }, "scripts": { "start": "react-scripts start", diff --git a/server/socket/index.js b/server/socket/index.js index b930ab7..b2d8285 100644 --- a/server/socket/index.js +++ b/server/socket/index.js @@ -1,13 +1,39 @@ module.exports = io => { io.on('connection', async socket => { console.log(`A socket connection to the server has been made: ${socket.id}`) + socket.join('#chat') + io.emit( + 'received rooms', + Object.keys(io.sockets.adapter.rooms) + .filter(r => r[0] === '#') + .map(k => ({ + roomName: k, + sockets: Object.keys(io.sockets.adapter.rooms[k]['sockets']), + })) + ) + socket.broadcast.emit('user connected', { socketId: socket.id }) socket.on('message', message => { - socket.broadcast.emit('message', message) + io.to(message.room).emit(message) + }) + socket.on('join', payload => { + console.log(payload.room) + socket.join({ room: payload.room }) + }) + socket.on('disconnect', async () => { + io.emit('user disconnected', { socketId: socket.id }) + console.log(`${socket.id} has disconnected.`) + io.emit( + 'received rooms', + Object.keys(io.sockets.adapter.rooms) + .filter(r => r[0] === '#') + .map(k => ({ + roomName: k, + sockets: Object.keys(io.sockets.adapter.rooms[k]['sockets']), + })) + ) }) - socket.on('disconnect', async () => - console.log(`${socket.id} has disconnected.`) - ) + console.log(io.sockets.adapter.rooms['#chat']) }) } diff --git a/src/App.js b/src/App.js index 2cabb61..3418b39 100644 --- a/src/App.js +++ b/src/App.js @@ -1,27 +1,67 @@ import React from 'react' import socket from './socket' -const initialState = { loading: true } -const initialData = { message: 'Hello, world!' } +import uuid from 'uuid' +import moment from 'moment' + +const initialState = { + loading: true, + messages: [], + message: '', + rooms: [], + room: '/', +} class App extends React.Component { constructor() { super() this.state = initialState this.socket = socket + this.handleChange = this.handleChange.bind(this) + this.handleSubmit = this.handleSubmit.bind(this) + this.joinRoom = this.joinRoom.bind(this) } async fetchData() { - try { - const data = await initialData - this.setState({ ...data }) - } catch (e) { - } finally { - this.setState({ loading: false }) - } + this.setState({ loading: false }) } - componentWillMount() { + + componentDidMount() { this.fetchData() + this.socket.on('message', msg => { + const messages = this.state.messages.concat(msg) + this.setState({ messages }) + }) + + this.socket.on('user connected', payload => { + console.log('a new user connected!', payload) + }) + + this.socket.on('user disconnected', payload => { + console.log('a user disconnected.', payload) + }) + + this.socket.on('received rooms', rooms => { + console.log(rooms) + this.setState({ rooms }) + }) + } + + handleChange(e) { + this.setState({ [e.target.name]: e.target.value }) + } + + handleSubmit(e) { + e.preventDefault() + const message = { + id: uuid(), + date: moment().format('MMMM D YYYY, h:mm a'), + socketId: this.socket.id, + text: this.state.message, + room: this.state.room, + } + this.sendMessage(message) + this.setState({ message: '' }) } renderLoading() { return