in src/hooks/useWebsocket/index.tsx [16:59]
export default function useWebsocket<T>({
url,
queryParams = emptyQueryParams,
enabled = true,
uuid,
onUpdate,
onReconnect,
}: HookConfig<T>): void {
const resource = new URL(url, document.baseURI).pathname;
const [lastConnectedTime, setLastConnectedTime] = useState<Date | null>(null);
useEffect(() => {
const onOpen = () => {
if (onReconnect && lastConnectedTime) {
onReconnect(lastConnectedTime);
setLastConnectedTime(null);
}
};
const onClose = () => {
if (!lastConnectedTime) {
setLastConnectedTime(new Date());
}
};
ResourceEvents.addEventListener('open', onOpen);
ResourceEvents.addEventListener('close', onClose);
return () => {
ResourceEvents.removeEventListener('open', onOpen);
ResourceEvents.removeEventListener('close', onClose);
};
});
useEffect(() => {
const uniqueId = uuid || generateIdentifier();
const unsubWebsocket = enabled && ResourceEvents.subscribe(uniqueId, resource, queryParams, onUpdate);
return () => {
unsubWebsocket && unsubWebsocket();
};
}, [url, enabled, uuid, resource, queryParams, onUpdate]);
}