live-photo/src/components/socket-provider.tsx
2025-08-01 15:41:44 +08:00

73 lines
1.7 KiB
TypeScript

'use client';
import React, { createContext, useContext, useEffect, useState } from 'react';
import { io, Socket } from 'socket.io-client';
import { File } from '@/types/file';
interface SocketContextType {
socket: Socket | null;
isConnected: boolean;
onlineUsers: number;
}
const SocketContext = createContext<SocketContextType>({
socket: null,
isConnected: false,
onlineUsers: 0,
});
export const useSocket = () => {
const context = useContext(SocketContext);
if (!context) {
throw new Error('useSocket must be used within a SocketProvider');
}
return context;
};
interface SocketProviderProps {
children: React.ReactNode;
}
export const SocketProvider: React.FC<SocketProviderProps> = ({ children }) => {
const [socket, setSocket] = useState<Socket | null>(null);
const [isConnected, setIsConnected] = useState(false);
const [onlineUsers, setOnlineUsers] = useState(0);
useEffect(() => {
const socketConnection = io(process.env.NEXT_PUBLIC_SOCKET_URL || 'http://localhost:3001', {
transports: ['websocket', 'polling'],
});
socketConnection.on('connect', () => {
setIsConnected(true);
console.log('Connected to WebSocket server');
});
socketConnection.on('disconnect', () => {
setIsConnected(false);
console.log('Disconnected from WebSocket server');
});
socketConnection.on('user:count', (count: number) => {
setOnlineUsers(count);
});
setSocket(socketConnection);
return () => {
socketConnection.disconnect();
};
}, []);
const value: SocketContextType = {
socket,
isConnected,
onlineUsers,
};
return (
<SocketContext.Provider value={value}>
{children}
</SocketContext.Provider>
);
};