/
App.js
80 lines (69 loc) · 1.83 KB
/
App.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
import React from 'react';
import './App.css';
import Cable from 'actioncable';
class App extends React.Component {
state = {
newMessage: "",
messages: []
}
handleData = data => {
switch (data.type) {
case 'current_messages':
this.setState({
messages: data.messages
})
break;
case 'new_message':
this.setState(prevState => ({
messages: [...prevState.messages, data.message]
}))
break;
default:
break;
}
}
componentDidMount(){
this.cable = Cable.createConsumer(`ws://localhost:3001/cable`);
this.subscription = this.cable.subscriptions.create({
channel: "MessagesChannel",
}, {
connected: () => {console.log('WS connected')},
disconnected: () => {console.log('WS disconnected')},
received: data => {
console.log(data);
this.handleData(data);
},
createMessage: function(data){
this.perform("create_message", { content: data });
}
})
}
componentWillUnmount(){
this.cable.subscriptions.remove(this.subscription);
}
submitHandler = event => {
event.preventDefault();
this.subscription.createMessage(this.state.newMessage);
}
changeHandler = event => {
this.setState({
newMessage: event.target.value
})
}
renderMessages = () => (this.state.messages.map((message, index) => <li key={index}>{message.content}</li>));
render() {
return (
<div className="App">
Messages Board:
<ul>
{this.renderMessages()}
</ul>
<form onSubmit={this.submitHandler}>
<input type="text" onChange={this.changeHandler} value={this.state.newMessage} name="newMessage"/>
<input type="submit" value="Post"/>
</form>
</div>
);
}
}
export default App;