useStockSocketClient.ts 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. import { useEffect, useState, useCallback } from 'react';
  2. import { io, Socket } from 'socket.io-client';
  3. import { useAuth } from '../../../hooks.tsx';
  4. interface ExamData {
  5. roomId: string;
  6. question: {
  7. date: string;
  8. price: number;
  9. };
  10. }
  11. interface StockSocketClient {
  12. // connect(): void;
  13. // disconnect(): void;
  14. pushExamData(data: { roomId: string; question: { date: string; price: number } }): void;
  15. error: Error | null;
  16. isConnected: boolean;
  17. }
  18. export function useStockSocket(classRoom: string | null): StockSocketClient {
  19. const { token } = useAuth();
  20. const [socket, setSocket] = useState<Socket | null>(null);
  21. const [error, setError] = useState<Error | null>(null);
  22. const [isConnected, setIsConnected] = useState(false);
  23. // 初始化socket连接
  24. useEffect(() => {
  25. if (!token || !classRoom) return;
  26. const newSocket = io('/', {
  27. path: '/socket.io',
  28. transports: ['websocket'],
  29. withCredentials: true,
  30. query: {
  31. socket_token:token
  32. },
  33. reconnection: true,
  34. reconnectionAttempts: 5,
  35. reconnectionDelay: 1000,
  36. });
  37. newSocket.on('connect', () => {
  38. console.log('Exam socket connected');
  39. setIsConnected(true);
  40. });
  41. newSocket.on('disconnect', () => {
  42. console.log('Exam socket disconnected');
  43. setIsConnected(false);
  44. });
  45. newSocket.on('error', (err) => {
  46. console.error('Exam socket error:', err);
  47. setError(err);
  48. });
  49. setSocket(newSocket);
  50. return () => {
  51. newSocket.disconnect();
  52. };
  53. }, [token]);
  54. // const connect = useCallback(() => {
  55. // if (socket && !socket.connected) {
  56. // socket.connect();
  57. // }
  58. // }, [socket]);
  59. // const disconnect = useCallback(() => {
  60. // if (socket && socket.connected) {
  61. // socket.disconnect();
  62. // }
  63. // }, [socket]);
  64. const pushExamData = useCallback((data: ExamData) => {
  65. if (socket) {
  66. socket.emit('exam:question', {
  67. roomId: data.roomId,
  68. question: {
  69. date: data.question.date,
  70. price: data.question.price
  71. }
  72. });
  73. }
  74. }, [socket]);
  75. return {
  76. // connect,
  77. // disconnect,
  78. pushExamData,
  79. error,
  80. isConnected,
  81. };
  82. }