frontend-app / client /src /contexts /SocketContext.jsx
Keys
fixes
2ecbb66
import { SOCKET_HOST } from "@/lib/constants";
import { useAppStore } from "@/store";
import React, { createContext, useContext, useEffect, useRef } from "react";
import { io } from "socket.io-client";
const SocketContext = createContext(null);
export const useSocket = () => {
return useContext(SocketContext);
};
export const SocketProvider = ({ children }) => {
const socket = useRef();
const { userInfo } = useAppStore();
useEffect(() => {
if (userInfo) {
socket.current = io(SOCKET_HOST, {
withCredentials: true,
query: { userId: userInfo.id },
});
socket.current.on("connect", () => {
console.log("Connected to socket server");
});
const handleReceiveMessage = (message) => {
// Access the latest state values
const {
selectedChatData: currentChatData,
selectedChatType: currentChatType,
addMessage,
addContactInDMContacts,
} = useAppStore.getState();
if (
currentChatType !== undefined &&
(currentChatData._id === message.sender._id ||
currentChatData._id === message.recipient._id)
) {
addMessage(message);
}
addContactInDMContacts(message);
};
const handleReceiveChannelMessage = (message) => {
const {
selectedChatData,
selectedChatType,
addMessage,
addChannelInChannelLists,
} = useAppStore.getState();
if (
selectedChatType !== undefined &&
selectedChatData._id === message.channelId
) {
addMessage(message);
}
addChannelInChannelLists(message);
};
const addNewChannel = (channel) => {
const { addChannel } = useAppStore.getState();
addChannel(channel);
};
socket.current.on("receiveMessage", handleReceiveMessage);
socket.current.on("recieve-channel-message", handleReceiveChannelMessage);
socket.current.on("new-channel-added", addNewChannel);
return () => {
socket.current.disconnect();
};
}
}, [userInfo]);
return (
<SocketContext.Provider value={socket.current}>
{children}
</SocketContext.Provider>
);
};
export default SocketProvider;