Skip to content

Instantly share code, notes, and snippets.

@mupkoo
Created April 21, 2020 20:26
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save mupkoo/4df8c5df6f9793df735a782eb5805733 to your computer and use it in GitHub Desktop.
Save mupkoo/4df8c5df6f9793df735a782eb5805733 to your computer and use it in GitHub Desktop.
Using React Hooks for Phoenix Socket/Channels
import React, { createContext, useContext, useRef } from 'react';
import { Socket } from 'phoenix';
import AuthContext from './AuthContext';
const SocketContext = createContext<Socket>({} as Socket);
const SocketConsumer = SocketContext.Consumer;
const SocketProvider: React.FC = ({ children }) => {
let token = useContext(AuthContext).token!;
let socketRef = useRef<{
token?: string;
socket?: Socket;
}>({});
if (socketRef.current.token !== token) {
socketRef.current.socket?.disconnect();
console.log('Socket Context :: Connect');
let socket = new Socket(process.env.REACT_APP_SOCKET_HOST!, { params: { token } });
socket.connect();
socketRef.current = {
token,
socket,
};
}
if (!socketRef.current.socket) return null;
return (
<SocketContext.Provider value={socketRef.current.socket}>{children}</SocketContext.Provider>
);
};
export { SocketProvider, SocketConsumer };
export default SocketContext;
import React, { createContext, useContext, useEffect, useMemo } from 'react';
import { Socket } from 'phoenix';
import AuthContext from './AuthContext';
const SocketContext = createContext<Socket>({} as Socket);
const SocketConsumer = SocketContext.Consumer;
const SocketProvider: React.FC = ({ children }) => {
let token = useContext(AuthContext).token!;
let socket = useMemo<Socket>(
() => new Socket(process.env.REACT_APP_SOCKET_HOST!, { params: { token } }),
[token]
);
useEffect(() => {
console.log('Socket Context :: Connect');
socket.connect();
return () => socket.disconnect();
}, [socket]);
return <SocketContext.Provider value={socket}>{children}</SocketContext.Provider>;
};
export { SocketProvider, SocketConsumer };
export default SocketContext;
import React, { createContext, useContext, useState, useEffect } from 'react';
import { Socket } from 'phoenix';
import AuthContext from './AuthContext';
const SocketContext = createContext<Socket>({} as Socket);
const SocketConsumer = SocketContext.Consumer;
const SocketProvider: React.FC = ({ children }) => {
let token = useContext(AuthContext).token!;
let [socket, setSocket] = useState<Socket | null>(null);
useEffect(() => {
let socket = new Socket(process.env.REACT_APP_SOCKET_HOST!, { params: { token } });
socket.connect();
setSocket(socket);
return () => socket.disconnect();
}, [token]);
if (!socket) return null;
return <SocketContext.Provider value={socket}>{children}</SocketContext.Provider>;
};
export { SocketProvider, SocketConsumer };
export default SocketContext;
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment