import { useEffect, useState, useCallback } from 'react'; import { io, Socket } from 'socket.io-client'; import { useAuth } from '../../mobile/hooks.tsx'; interface StockPriceUpdate { symbol: string; price: number; timestamp: Date; } interface ProfitSummary { dailyStats: { close: number; }; } interface StockSocketClient { connect(): void; disconnect(): void; subscribe(symbol: string): void; unsubscribe(symbol: string): void; currentPrice: number | null; lastUpdate: Date | null; error: Error | null; isConnected: boolean; } export function useStockSocket(): StockSocketClient { const { token } = useAuth(); const [socket, setSocket] = useState(null); const [currentPrice, setCurrentPrice] = useState(null); const [lastUpdate, setLastUpdate] = useState(null); const [error, setError] = useState(null); const [isConnected, setIsConnected] = useState(false); const [currentDate, setCurrentDate] = useState(null); const [profitSummary, setProfitSummary] = useState(null); // 初始化socket连接 useEffect(() => { if (!token) return; const newSocket = io('/', { path: '/socket.io', transports: ['websocket'], query: { token }, reconnection: true, reconnectionAttempts: 5, reconnectionDelay: 1000, }); newSocket.on('connect', () => { console.log('Stock socket connected'); setIsConnected(true); }); newSocket.on('disconnect', () => { console.log('Stock socket disconnected'); setIsConnected(false); }); newSocket.on('error', (err) => { console.error('Stock socket error:', err); setError(err); }); // 监听股票价格更新 newSocket.on('stock:priceUpdate', (data: StockPriceUpdate) => { setCurrentPrice(data.price); setLastUpdate(new Date(data.timestamp)); }); // 监听当前日期更新 newSocket.on('stock:currentDate', (date: string) => { setCurrentDate(new Date(date)); }); // 监听收益摘要更新 newSocket.on('stock:profitSummary', (summary: ProfitSummary) => { setProfitSummary(summary); }); setSocket(newSocket); return () => { newSocket.disconnect(); }; }, [token]); const connect = useCallback(() => { if (socket && !socket.connected) { socket.connect(); } }, [socket]); const disconnect = useCallback(() => { if (socket && socket.connected) { socket.disconnect(); } }, [socket]); const subscribe = useCallback((symbol: string) => { if (socket) { socket.emit('stock:subscribe', { symbol }); } }, [socket]); const unsubscribe = useCallback((symbol: string) => { if (socket) { socket.emit('stock:unsubscribe', { symbol }); } }, [socket]); return { connect, disconnect, subscribe, unsubscribe, currentPrice, lastUpdate, error, isConnected, }; }