export function useSocket()

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
}