Files
OpenPipe-llm/app/src/utils/useSocket.ts
2023-08-09 14:26:15 -07:00

42 lines
1.0 KiB
TypeScript

import { useRef, useState, useEffect } from "react";
import { io, type Socket } from "socket.io-client";
import { env } from "~/env.mjs";
const url = env.NEXT_PUBLIC_SOCKET_URL;
export default function useSocket<T>(channel?: string | null) {
const socketRef = useRef<Socket>();
const [message, setMessage] = useState<T | null>(null);
useEffect(() => {
if (!channel) return;
// Create websocket connection
socketRef.current = io(url);
socketRef.current.on("connect", () => {
// Join the specific room
socketRef.current?.emit("join", channel);
// Listen for 'message' events
socketRef.current?.on("message", (message: T) => {
setMessage(message);
});
});
// Unsubscribe and disconnect on cleanup
return () => {
if (socketRef.current) {
if (channel) {
socketRef.current.off("message");
}
socketRef.current.disconnect();
socketRef.current = undefined;
}
setMessage(null);
};
}, [channel]);
return message;
}