1
0
forked from notnull/chatz
chatz/src/components/Chat.js
2019-07-14 15:29:00 -04:00

104 lines
2.5 KiB
JavaScript

import React from 'react'
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 {
constructor() {
super()
this.state = {
text: '',
messages: [],
user: {},
}
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() {
socket.on('typing', () => this.toggleTyping())
socket.on('message', message => {
this.addMessage(message)
})
socket.on('user connection', payload =>
console.log('a user has logged in:', payload)
)
socket.on('connect', () => {
console.log('Connected!')
this.setState({
user: { socketId: socket.id, userImage },
userNick: socket.id,
})
})
}
handleKey(e) {
socket.emit('typing')
}
handleChange(e) {
this.setState({ [e.target.name]: e.target.value })
}
handleSubmit(e) {
e.preventDefault()
const message = { socketId: socket.id, id: uuid(), text: this.state.text }
const messages = this.state.messages.concat(message)
this.setState({ messages, text: '' })
socket.emit('message', message)
}
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 (
<Card style={{ height: '90vh' }} className="mt-5">
<Messages
user={this.state.user}
messages={this.state.messages}
messagesEnd={this.messagesEnd}
/>
<MessageEntry
handleSubmit={this.handleSubmit}
handleChange={this.handleChange}
handleKey={this.handleKey}
text={this.state.text}
/>
<ControlPanel
typing={this.state.typing}
userNick={this.state.userNick}
userImage={userImage}
handleChange={this.handleChange}
editNick={this.editNick}
toggleNick={this.toggleNick}
/>
</Card>
)
}
}
export default Chat