Socket.io hook using shared acquireSocket/releaseSocket pattern with event subscribe/unsubscribe lifecycle. Use when creating real-time hooks, WebSocket subscriptions, or any useEffect that connects to the Socket.io server.
All real-time connections share a single Socket.io instance via acquireSocket() / releaseSocket(). Hooks subscribe on mount, emit a subscription event when connected, handle reconnects via socket.on("connect", ...), and unsubscribe + release the socket on cleanup. The socket.connected check handles the case where the socket is already connected before the effect runs.
// src/lib/socket.ts — DO NOT duplicate this
export const acquireSocket = (): Socket => { ... }; // ref-counted singleton
export const releaseSocket = (socket: Socket): void => { ... }; // disconnects at refcount=0
// src/hooks/useMyFeatureSocket.ts
import { useEffect } from "react";
import { acquireSocket, releaseSocket } from "../lib/socket";
import { notifySocketErrorOnce } from "../lib/socketError";
interface UseMyFeatureSocketOptions {
onMyEvent: (payload: MyPayload) => void;
onError?: (message: string) => void;
}
export const useMyFeatureSocket = ({
onMyEvent,
onError
}: UseMyFeatureSocketOptions) => {
useEffect(() => {
const socket = acquireSocket();
const onConnect = () => {
socket.emit("my-feature:subscribe", () => undefined);
};
const onEvent = (payload: MyPayload) => {
onMyEvent(payload);
};
const onConnectError = () => {
if (onError) notifySocketErrorOnce(onError, "Falha na conexão em tempo real");
};
socket.on("connect", onConnect);
socket.on("my-feature:event", onEvent);
socket.on("connect_error", onConnectError);
// Handle already-connected case
if (socket.connected) {
onConnect();
}
return () => {
socket.off("connect", onConnect);
socket.off("my-feature:event", onEvent);
socket.off("connect_error", onConnectError);
releaseSocket(socket);
};
}, [onMyEvent, onError]);
};
<!-- Generated by skill-master command
Version: 1.0.0
Sources:
- src/hooks/useNotificationSocket.ts
- src/hooks/useOperationsBoardSocket.ts
- src/hooks/useReminderSocket.ts
- src/lib/socket.ts
- src/lib/socketError.ts
Last updated: 2026-04-04
-->releaseSocket(socket) in the useEffect cleanupsocket.off(...) for every socket.on(...) before releasingif (socket.connected) onConnect() after registering eventsnotifySocketErrorOnce from src/lib/socketError.ts to debounce error toastsio(...) directly — always use acquireSocket()useEffect dependency array| Hook | Server event | Channel |
|---|---|---|
useNotificationSocket | notification:new, notification:reminder | notifications:subscribe |
useOperationsBoardSocket | ops-board:viewed | ops-board:subscribe |
useReminderSocket | reminder:alert | reminders:subscribe |
src/hooks/use{Feature}Socket.ts