gallium-react v1.0.3
What is this about ?
This is the frontend package for gallium-io. It is responsible for the interaction, between the WebSocket connection, between the frontend (gallium-react) and backend (gallium-io).
How to install ?
npm i gallium-react --save
How to start ?
Step 1. Start a new react project, by using the following command, npx create-react-app.
Step 2. In your App.js, start by calling the inbuilt WebSocket class supported by most browsers.
Initiate it at the imports section inside your App.js like so...
const ws = new WebSocket("ws://localhost:9876/websocket");Note: The default route for websocket handshake, for gallium-io and gallium-react is /websocket. Also be sure to provide same url for the connection as provide during the server setup.
Step 3. After initializing the connection both in gallium-react and gallium-io, we should see
Websocket connection madeThat is when we know, we can proceed forward.
WebSocket property
The only two properties that will be used in our project are
First is
ws.onmessage = function(event){
let data = JSON.parse(event.data)
console.log(data)
}Second is
ws.send(JSON.stringify(obj))This block of code can be used inside the App component. To keep a watch on the types of messages we are getting back from the server. The data is that message object.
Setting up a sample page.
For example purpose, set up a page with minimal html and css in the App.js. Here is the code...
return (
<div className="App">
<button onClick={CreateARoom}>Create</button>
<input type="text" name="room-code" id="room-code" value={roomcode} onChange={(e)=>setroomcode(e.target.value)}/>
<button onClick={JoinARoom}>Join</button>
<button onClick={LeaveARoom}>Leave</button>
<p><b id="last-msg"></b></p>
{
info ? (<p>Joined Room: {info.room}</p>):(null)
}
<p id = "roomId"></p>
<label>Send message to room</label><br/>
<input id="message-input" type="text" value={message} onChange={(e)=>setmessage(e.target.value)}/><button onClick={()=>sendMessageToRoom(roomcode)}>Send</button>
<ul id="messages">
{
messagelist?.map((item,i)=>{
return(
<div key = {i}>{item}</div>
)
})
}
</ul>
</div>
);The messagelist is the messages we recieve that we map later.
1 - As we see we have a button called Create. That will be used to create a room in the websocket. 2 - We also have an input box. This input will be used for providing the chat room code, your about to join. 3 - We also have two buttons side by side, named Join and Leave respectively. The Join button will be used to join a chatroom once the room code is provided. And the leave button will be used to leave the room. 4 - Create the functions for the respective buttons.
Before creating the functions, we must take a look at the Hooks provided by gallium-react.
Hooks
CreateRoom({SetPassword:true,hash:'Password for room'}) - Used to create a WebSocket Room.
Options:
CreateRoom supports two options SetPassword and hash.
- SetPassword - boolean (true or false)
- hash - String The password for your room, if SetPassword is true.
CheckPass({room:'MyRoom'}) - Used to check password for room before joining.
Options:
- room - String (The room code)
JoinRoom({room:'roomcode',trypass:'roompassword'}) - Used to join the room, once password is entered.
Options:
- room - String The roomcode, which we are to join.
- trypass - String The password for the room.
SendMessage({room:'roomcode',message:'Hello world'})
Options:
- room - String The roomcode, which we are about to send message to.
- message - String The message that has to be sent.
LeaveRoom({room:'roomcode'}) - Used to leave the current room your in.
Options:
- room - String The room code for the room to leave
Object
The structure used for messages
{
"type":"create","params":{"roomc":"at3ka09t","trypass":'thepassword'}
}These objects are recieved on each hook call
Example:
const roomdata = JoinRoom({room:'roomcode',trypass:'thepassword'})
ws.send(JSON.stringify(roomdata))This block of code will send the roomdata to the server. And will recieve message in the ws.onmessage.
Here is a full working App.js page
import React,{useState} from 'react';
import {CreateRoom,CheckPass,JoinRoom,SendMessage,LeaveRoom} from 'gallium-react'
const ws = new WebSocket("ws://localhost:9876/websocket");
function App() {
const [info,setinfo] = useState({})
const [roomcode,setroomcode] = useState('')
const [message,setmessage] = useState('')
const [messagelist,setmessagelist] = useState([])
ws.onmessage = function(event){
let rawData = JSON.parse(event.data)
setroomcode(rawData.params.room)
setinfo(rawData.params)
if(rawData.type === 'check_password'){
ActivateJoin(rawData.params.protected)
}
if(rawData.type === 'leave'){
window.location.reload()
}
if(rawData.type === 'message'){
let Amessage = rawData.params.message
let cloneArray = [...messagelist]
cloneArray.push(Amessage)
setmessagelist(cloneArray)
}
}
const CreateARoom = () =>{
let hash = 'ageka03'
const obj = CreateRoom({SetPassword:true,hash:hash})
ws.send(JSON.stringify(obj))
}
const JoinARoom = () =>{
const obj = CheckPass({room:roomcode})
ws.send(JSON.stringify(obj))
}
const ActivateJoin = (check) =>{
if(check){
let password = prompt('Enter room password')
if(password){
let obj = JoinRoom({room:roomcode,trypass:password})
ws.send(JSON.stringify(obj))
}
else{
let obj = JoinRoom({room:roomcode})
ws.send(JSON.stringify(obj))
}
}
else{
let obj = JoinRoom({room:roomcode})
ws.send(JSON.stringify(obj))
}
}
const sendMessageToRoom = () =>{
const text = SendMessage({room:roomcode,message:message})
ws.send(JSON.stringify(text))
}
const LeaveARoom = () =>{
const obj = LeaveRoom({room:roomcode})
ws.send(JSON.stringify(obj))
}
return (
<div className="App">
<button onClick={CreateARoom}>Create</button>
<input type="text" name="room-code" id="room-code" value={roomcode} onChange={(e)=>setroomcode(e.target.value)}/>
<button onClick={JoinARoom}>Join</button>
<button onClick={LeaveARoom}>Leave</button>
<p><b id="last-msg"></b></p>
{
info ? (<p>Joined Room: {info.room}</p>):(null)
}
<p id = "roomId"></p>
<label>Send message to room</label><br/>
<input id="message-input" type="text" value={message} onChange={(e)=>setmessage(e.target.value)}/><button onClick={()=>sendMessageToRoom(roomcode)}>Send</button>
<ul id="messages">
{
messagelist?.map((item,i)=>{
return(
<div key = {i}>{item}</div>
)
})
}
</ul>
</div>
);
}
export default App;