Files
antigol-service/frontend/composables/useSupportRealtime.ts
talorr cda36918e8 init
2026-03-27 03:36:08 +03:00

71 lines
1.7 KiB
TypeScript

import { io, type Socket } from "socket.io-client";
import type { SupportConversation, SupportMessage } from "~/types";
type SupportRealtimePayload = {
conversation: SupportConversation;
message?: SupportMessage;
};
export function useSupportRealtime() {
const socket = useState<Socket | null>("support-realtime-socket", () => null);
const { token } = useAuth();
const config = useRuntimeConfig();
const connect = () => {
if (!process.client || !token.value) {
return null;
}
if (socket.value?.connected) {
return socket.value;
}
if (socket.value) {
socket.value.auth = { token: token.value };
socket.value.connect();
return socket.value;
}
const nextSocket = io(config.public.chatApiBase, {
transports: ["websocket", "polling"],
withCredentials: true,
auth: {
token: token.value
}
});
socket.value = nextSocket;
return nextSocket;
};
const disconnect = () => {
socket.value?.disconnect();
};
const onConversationUpdated = (handler: (payload: SupportRealtimePayload) => void) => {
const activeSocket = connect();
activeSocket?.on("support:conversation.updated", handler);
return () => {
activeSocket?.off("support:conversation.updated", handler);
};
};
const onMessageCreated = (handler: (payload: SupportRealtimePayload) => void) => {
const activeSocket = connect();
activeSocket?.on("support:message.created", handler);
return () => {
activeSocket?.off("support:message.created", handler);
};
};
return {
socket,
connect,
disconnect,
onConversationUpdated,
onMessageCreated
};
}