actioncable-client-react
Version:
A react wrapper for working with rails actioncable. Requires react v16.3 and above.
153 lines (113 loc) • 3.9 kB
Markdown
A react wrapper for working with rails actioncable. Requires react v16.3 and above.
# Install
`npm i --save actioncable actioncable-client-react`
or
`yarn add actioncable actioncable-client-react`
# Usage
## Subscription
```javascript
import React, { PureComponent } from 'react'
import { ActionCable } from 'actioncable-client-react'
class chatRoom extends PureComponent {
state = {
messages = [],
message
}
handleReceived = message => {
this.setState({
messages: [
...this.state.messages,
message
]
})
}
sendMessage = () => {
this.props.send(this.state.message)
}
onChange = e => {
this.setState({message: e.target.value})
}
render() {
return (
<div>
<ActionCable
channel={'ChatRoom'}
room={1}
onReceived={this.handleReceived}
/>
<h2>Chat Room 1</h2>
<h5>Messages</h5>
<ul>
{this.state.messages.map((message) =>
<li key={message.id}>{message.body}</li>
)}
</ul>
<input onChange={this.onChange} type='text' />
<button onClick={this.sendMessage} type='button'>
Send
</button>
</div>
)
}
}
export default chatRoom
```
## Connection
With a url prop:
```javascript
import { ActionCableProvider } from "actioncable-client-react";
import ChatRoom from "./chatRoom";
// With jwt authentication
const WSS_URL = `wss://example.com/cable?${YOUR_TOKEN}`;
// Without authentication
const WSS_URL = `wss://example.com/cable`;
export default function Container(props) {
return (
<ActionCableProvider url={WSS_URL}>
<ChatRoom />
</ActionCableProvider>
);
}
```
With a custom cable:
```javascript
import { ActionCableProvider } from "actioncable-client-react";
import { ActionCable } from "actioncable";
import ChatRoom from "./chatRoom";
// With jwt authentication
const WSS_URL = `wss://example.com/cable?${YOUR_TOKEN}`;
// Without authentication
const WSS_URL = `wss://example.com/cable`;
const cable = ActionCable.createConsumer(WSS_URL);
export default function Container(props) {
return (
<ActionCableProvider cable={cable}>
<ChatRoom />
</ActionCableProvider>
);
}
```
# Documentation
## ActionCableProvider
It establishes connection between the server and the client and returns a cable object.
It accepts the following props:
Atleast one of them must be present.
- **cable** (object): The object created by rails actioncable's createConsumer method.
- **url** (string): The url of the server with which to establish a connection. Authentication can be passed as a param in the string.
## ActionCable
It creates a subscription with a channel. It needs the ActionCableProvider component to be present somewhere in its parent node.
It accepts the following props:
- **onReceived** (function): Function to handle data received from the server. It should accept one param.
- **onInitialized** (function): This function is invoked after initializing a subscription.
- **onConnected** (function): This function is invoked after the subscription is successfully connected to a channel.
- **onDisconnected** (function): This function is invoked after a subscription is disconnected.
- **onRejected** (function): This function is invoked when a connection is rejected.
- **channel** (string): The class name of the rails channel to subscribe to. **Required**
- **room** (string, number): The room in a channel to subscribe to, must be present if there are mutiple rooms in a channel.
It adds the following props to its child components:
- **perform** (function, params: (action, data)): This function requires two params - the action to be performed on the channel and the data for it.
- **send** (function, params: (data)): This function requires one param - the data to be sent to the server.
# To-Do
- Write tests
- Add examples
- Create a template for opening issues