diff --git a/src/components/Chat.js b/src/components/Chat.js index 2fe8e71..cd0add3 100644 --- a/src/components/Chat.js +++ b/src/components/Chat.js @@ -1,10 +1,13 @@ import React from 'react' -import { Form, Row, Col, Button, Card, ListGroup, Image } from 'react-bootstrap' -import SingleMessage from './SingleMessage' +import { Card } from 'react-bootstrap' + +import Messages from './Messages' +import MessageEntry from './MessageEntry' +import ControlPanel from './ControlPanel' + import userImage from '../assets/default-user-image.png' import uuid from 'uuid' - import socket from '../socket' class Chat extends React.Component { @@ -18,11 +21,10 @@ class Chat extends React.Component { this.handleSubmit = this.handleSubmit.bind(this) this.handleChange = this.handleChange.bind(this) this.handleKey = this.handleKey.bind(this) + this.toggleNick = this.toggleNick.bind(this) } componentDidMount() { - this.scrollToBottom() - socket.on('typing', () => this.toggleTyping()) socket.on('message', message => { this.addMessage(message) @@ -33,34 +35,21 @@ class Chat extends React.Component { socket.on('connect', () => { console.log('Connected!') - this.setState({ user: { socketId: socket.id, userImage } }) + this.setState({ + user: { socketId: socket.id, userImage }, + userNick: socket.id, + }) }) } - componentDidUpdate() { - this.scrollToBottom() - } - scrollToBottom = () => { - this.messagesEnd.scrollIntoView({ behavior: 'smooth' }) + handleKey(e) { + socket.emit('typing') } handleChange(e) { this.setState({ [e.target.name]: e.target.value }) } - toggleTyping() { - if (this.state.typing) return - this.setState({ typing: true }) - setTimeout(() => this.setState({ typing: false }), 2000) - } - - handleKey(e) { - socket.emit('typing') - } - addMessage(message) { - const messages = this.state.messages.concat(message) - this.setState({ messages }) - } handleSubmit(e) { e.preventDefault() const message = { socketId: socket.id, id: uuid(), text: this.state.text } @@ -69,68 +58,43 @@ class Chat extends React.Component { socket.emit('message', message) } - getStatus() { - console.log('this is the status') + toggleTyping() { + if (this.state.typing) return + this.setState({ typing: true }) + setTimeout(() => this.setState({ typing: false }), 2000) } + + addMessage(message) { + const messages = this.state.messages.concat(message) + this.setState({ messages }) + } + + toggleNick() { + this.setState({ editNick: !this.state.editNick }) + } + render() { return ( - - - - {this.state.messages.map(msg => { - return ( - - ) - })} -
{ - this.messagesEnd = el - }} - /> - - - -
- - - - - - - - -
-
- - - {this.state.typing ? 'Someone is typing...' : ''} - - - {this.state.user.socketId} - - - + + + + ) } diff --git a/src/components/ControlPanel.js b/src/components/ControlPanel.js new file mode 100644 index 0000000..08055dd --- /dev/null +++ b/src/components/ControlPanel.js @@ -0,0 +1,36 @@ +import React from 'react' +import { Card, Image, Row, Col } from 'react-bootstrap' + +const ControlPanel = props => { + const { + typing, + userNick, + userImage, + handleChange, + editNick, + toggleNick, + } = props + return ( + + + {typing ? 'Someone is typing...' : ''} + +
+
+ +
+ +
+ +
+
+ ) +} + +export default ControlPanel diff --git a/src/components/MessageEntry.js b/src/components/MessageEntry.js new file mode 100644 index 0000000..462654a --- /dev/null +++ b/src/components/MessageEntry.js @@ -0,0 +1,30 @@ +import React from 'react' +import { Card, Form, Row, Col, Button } from 'react-bootstrap' + +const MessageEntry = props => { + const { handleSubmit, handleChange, handleKey, text } = props + return ( + +
+ + + + + + + + +
+
+ ) +} + +export default MessageEntry diff --git a/src/components/Messages.js b/src/components/Messages.js new file mode 100644 index 0000000..9aee4f3 --- /dev/null +++ b/src/components/Messages.js @@ -0,0 +1,52 @@ +import React from 'react' +import { Card, ListGroup } from 'react-bootstrap' +import SingleMessage from './SingleMessage' +import uuid from 'uuid' + +class Messages extends React.Component { + constructor() { + super() + this.state = {} + } + + componentDidMount() { + this.scrollToBottom() + } + + componentDidUpdate() { + this.scrollToBottom() + } + + scrollToBottom = () => { + this.messagesEnd.scrollIntoView({ behavior: 'smooth' }) + } + render() { + const { user, messages } = this.props + + return ( + + + {messages.map(msg => { + return ( + + ) + })} + +
{ + this.messagesEnd = el + }} + /> + + + ) + } +} + +export default Messages