2026-05-10 13:12:44 +08:00

66 lines
1.5 KiB
TypeScript

import { useEffect, useState, useCallback, useRef } from 'react';
import { Socket } from 'socket.io-client';
import { createSocket } from '../services/socket';
export interface Message {
role: 'user' | 'assistant';
content: string;
timestamp: number;
}
export function useSocket(token: string | null) {
const [messages, setMessages] = useState<Message[]>([]);
const [connected, setConnected] = useState(false);
const socketRef = useRef<Socket | null>(null);
useEffect(() => {
if (!token) return;
const socket = createSocket(token);
socketRef.current = socket;
socket.on('connect', () => {
setConnected(true);
});
socket.on('disconnect', () => {
setConnected(false);
});
socket.on('ai_response', (data: { message: string; suggestions?: string[] }) => {
setMessages((prev) => [
...prev,
{
role: 'assistant',
content: data.message,
timestamp: Date.now(),
},
]);
});
socket.on('connect_error', (err) => {
console.error('Socket connection error:', err.message);
});
return () => {
socket.close();
socketRef.current = null;
};
}, [token]);
const sendMessage = useCallback((message: string) => {
if (!socketRef.current) return;
setMessages((prev) => [
...prev,
{
role: 'user',
content: message,
timestamp: Date.now(),
},
]);
socketRef.current.emit('user_message', { message });
}, []);
return { messages, sendMessage, connected };
}