31 lines
1.0 KiB
JavaScript
31 lines
1.0 KiB
JavaScript
// src/hooks/useChatSocket.js
|
|
import { useEffect, useRef, useCallback } from "react";
|
|
import { useStompClient, parseStompMessage } from "./useStompClient";
|
|
|
|
export function useChatSocket(chatId, onMessage) {
|
|
const onMessageRef = useRef(onMessage);
|
|
|
|
useEffect(() => {
|
|
onMessageRef.current = onMessage;
|
|
}, [onMessage]);
|
|
|
|
const handleConnect = useCallback((client) => {
|
|
client.subscribe(`/topic/chat/${chatId}`, (msg) => {
|
|
parseStompMessage(msg, (body) => onMessageRef.current(body));
|
|
});
|
|
}, [chatId]);
|
|
|
|
const { clientRef, connected } = useStompClient(!!chatId, handleConnect);
|
|
|
|
/** @returns {boolean} true если сообщение реально ушло в сокет, false если соединения нет */
|
|
const sendMessage = useCallback((content) => {
|
|
if (!clientRef.current?.connected) return false;
|
|
clientRef.current.publish({
|
|
destination: "/app/chat.send",
|
|
body: JSON.stringify({ chatId, content }),
|
|
});
|
|
return true;
|
|
}, [chatId, clientRef]);
|
|
|
|
return { connected, sendMessage };
|
|
} |