GitHub Actions
Deploy from GitHub Actions (2026-03-16 04:38 UTC)
4413b85
import { useState, useRef } from 'preact/hooks';
async function waitForConfig() {
return new Promise((resolve) => {
const check = () => {
if (window.ChatbotConfig) resolve(window.ChatbotConfig);
else setTimeout(check, 50);
};
check();
});
}
export function useChat() {
const [messages, setMessages] = useState([]);
const [isTyping, setIsTyping] = useState(false);
const sessionId = useRef(null);
const config = useRef(null);
async function getConfig() {
if (!config.current) {
config.current = await waitForConfig();
}
return config.current;
}
async function initialize() {
await getConfig();
setMessages([{
id: Date.now(),
sender: 'bot',
text: 'Hello! How can I help you today? \u60A8\u597D\uFF01\u4ECA\u5929\u6211\u80FD\u4E3A\u60A8\u505A\u4E9B\u4EC0\u4E48\uFF1F',
}]);
}
async function sendMessage(text) {
if (isTyping || !text.trim()) return;
const cfg = await getConfig();
setMessages(prev => [...prev, { id: Date.now(), sender: 'user', text }]);
setIsTyping(true);
try {
const body = { message: text };
if (sessionId.current) body.session_id = sessionId.current;
const controller = new AbortController();
const timeout = setTimeout(() => controller.abort(), cfg.REQUEST_TIMEOUT_MS);
const thinkingStart = Date.now();
const res = await fetch(`${cfg.API_URL}/chat`, {
method: 'POST',
headers: { 'X-API-Key': cfg.API_KEY, 'Content-Type': 'application/json' },
body: JSON.stringify(body),
signal: controller.signal,
});
clearTimeout(timeout);
if (!res.ok) throw new Error(`HTTP ${res.status}: ${res.statusText}`);
const data = await res.json();
const thinkingDuration = data.thinking
? ((Date.now() - thinkingStart) / 1000).toFixed(1)
: null;
sessionId.current = data.session_id;
let debugInfo = null;
if (cfg.SHOW_DEBUG_INFO) {
debugInfo = {
intent: data.intent,
confidence: data.confidence?.toFixed(2),
entities: data.entities,
language: data.debug_info?.language,
environment: data.debug_info?.environment,
};
}
setMessages(prev => [...prev, {
id: Date.now(),
sender: 'bot',
text: data.response,
thinking: data.thinking || null,
thinkingDuration,
debugInfo,
}]);
} catch (err) {
const cfg = config.current;
const errMsg = cfg?.DEBUG
? `Error: ${err.message}`
: 'Sorry, I encountered an error. Please try again.';
setMessages(prev => [...prev, { id: Date.now(), sender: 'bot', text: errMsg }]);
} finally {
setIsTyping(false);
}
}
return { messages, isTyping, initialize, sendMessage };
}