in projects/inclusive_ai_a_chatgpt_plugin_and_dao_to_engage_marginalized_groups_in_ai/Inclusive.AI app/website/src/hooks/useSocket.ts [12:49]
export function useSocket(opts: UseSocketParams) {
const { namespace, jwtToken, url: _url, autoJoin, autoJoinChannel } = opts
const [socket, setSocket] = useState<Socket | undefined>(undefined)
const url = _url || (process.env.NEXT_PUBLIC_WS_URL as string)
const urlNamespaced = `${url}/${namespace}`
useEffect(() => {
if (!urlNamespaced || !jwtToken) return
// console.log('socket', socket)
// todo: if already connected to the same `urlNamespace`, then skip
const _socket = socketIo(urlNamespaced, {
path: '/socket', // socket.io server opened at /socket not /socket.io
transports: ['websocket'],
auth: { token: `Bearer ${jwtToken}` },
})
setSocket(_socket)
// clean up
return () => {
_socket.disconnect()
}
}, [urlNamespaced, jwtToken])
useEffect(() => {
if (!socket || !autoJoin || !autoJoinChannel) return
socket.emit('join', { channel: autoJoinChannel })
return () => {
socket.emit('leave', { channel: autoJoinChannel })
}
}, [socket, autoJoin, autoJoinChannel])
return socket
}