Spaces:
Sleeping
Sleeping
| import React, { createContext, useContext, useEffect, useState } from 'react'; | |
| import { io } from 'socket.io-client'; | |
| import { useAuth } from './AuthContext'; | |
| const SocketContext = createContext(); | |
| export const SocketProvider = ({ children }) => { | |
| const { user } = useAuth(); | |
| const [socket, setSocket] = useState(null); | |
| const [notifications, setNotifications] = useState([]); | |
| useEffect(() => { | |
| if (user) { | |
| const newSocket = io('/'); // Dynamic relative host | |
| setSocket(newSocket); | |
| newSocket.emit('join', user._id); | |
| newSocket.on('receiveNotification', (notification) => { | |
| setNotifications(prev => [notification, ...prev]); | |
| // Optional: Play a sound or show a toast | |
| }); | |
| return () => newSocket.close(); | |
| } else { | |
| if (socket) { | |
| socket.close(); | |
| setSocket(null); | |
| } | |
| } | |
| }, [user]); | |
| return ( | |
| <SocketContext.Provider value={{ socket, notifications, setNotifications }}> | |
| {children} | |
| </SocketContext.Provider> | |
| ); | |
| }; | |
| export const useSocket = () => useContext(SocketContext); | |