|
|
@@ -2,25 +2,18 @@ import { useEffect, useState, useCallback } from 'react';
|
|
|
import { io, Socket } from 'socket.io-client';
|
|
|
import { useAuth } from '../../../hooks.tsx';
|
|
|
|
|
|
-interface StockPriceUpdate {
|
|
|
- symbol: string;
|
|
|
- price: number;
|
|
|
- timestamp: Date;
|
|
|
-}
|
|
|
-
|
|
|
-interface ProfitSummary {
|
|
|
- dailyStats: {
|
|
|
- close: number;
|
|
|
+interface ExamData {
|
|
|
+ roomId: string;
|
|
|
+ question: {
|
|
|
+ date: string;
|
|
|
+ price: number;
|
|
|
};
|
|
|
}
|
|
|
|
|
|
interface StockSocketClient {
|
|
|
connect(): void;
|
|
|
disconnect(): void;
|
|
|
- subscribe(symbol: string): void;
|
|
|
- unsubscribe(symbol: string): void;
|
|
|
- currentPrice: number | null;
|
|
|
- lastUpdate: Date | null;
|
|
|
+ pushExamData(data: { roomId: string; question: { date: string; price: number } }): void;
|
|
|
error: Error | null;
|
|
|
isConnected: boolean;
|
|
|
}
|
|
|
@@ -28,12 +21,8 @@ interface StockSocketClient {
|
|
|
export function useStockSocket(): StockSocketClient {
|
|
|
const { token } = useAuth();
|
|
|
const [socket, setSocket] = useState<Socket | null>(null);
|
|
|
- const [currentPrice, setCurrentPrice] = useState<number | null>(null);
|
|
|
- const [lastUpdate, setLastUpdate] = useState<Date | null>(null);
|
|
|
const [error, setError] = useState<Error | null>(null);
|
|
|
const [isConnected, setIsConnected] = useState(false);
|
|
|
- const [currentDate, setCurrentDate] = useState<Date | null>(null);
|
|
|
- const [profitSummary, setProfitSummary] = useState<ProfitSummary | null>(null);
|
|
|
|
|
|
// 初始化socket连接
|
|
|
useEffect(() => {
|
|
|
@@ -49,36 +38,20 @@ export function useStockSocket(): StockSocketClient {
|
|
|
});
|
|
|
|
|
|
newSocket.on('connect', () => {
|
|
|
- console.log('Stock socket connected');
|
|
|
+ console.log('Exam socket connected');
|
|
|
setIsConnected(true);
|
|
|
});
|
|
|
|
|
|
newSocket.on('disconnect', () => {
|
|
|
- console.log('Stock socket disconnected');
|
|
|
+ console.log('Exam socket disconnected');
|
|
|
setIsConnected(false);
|
|
|
});
|
|
|
|
|
|
newSocket.on('error', (err) => {
|
|
|
- console.error('Stock socket error:', err);
|
|
|
+ console.error('Exam 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 () => {
|
|
|
@@ -98,25 +71,22 @@ export function useStockSocket(): StockSocketClient {
|
|
|
}
|
|
|
}, [socket]);
|
|
|
|
|
|
- const subscribe = useCallback((symbol: string) => {
|
|
|
- if (socket) {
|
|
|
- socket.emit('stock:subscribe', { symbol });
|
|
|
- }
|
|
|
- }, [socket]);
|
|
|
-
|
|
|
- const unsubscribe = useCallback((symbol: string) => {
|
|
|
+ const pushExamData = useCallback((data: ExamData) => {
|
|
|
if (socket) {
|
|
|
- socket.emit('stock:unsubscribe', { symbol });
|
|
|
+ socket.emit('exam:question', {
|
|
|
+ roomId: data.roomId,
|
|
|
+ question: {
|
|
|
+ date: data.question.date,
|
|
|
+ price: data.question.price
|
|
|
+ }
|
|
|
+ });
|
|
|
}
|
|
|
}, [socket]);
|
|
|
|
|
|
return {
|
|
|
connect,
|
|
|
disconnect,
|
|
|
- subscribe,
|
|
|
- unsubscribe,
|
|
|
- currentPrice,
|
|
|
- lastUpdate,
|
|
|
+ pushExamData,
|
|
|
error,
|
|
|
isConnected,
|
|
|
};
|