Spaces:
Running
Running
File size: 2,527 Bytes
3f7a9ed 40b4a22 3f7a9ed 40b4a22 c564bcb 703af34 8aa84ea 40b4a22 8aa84ea 40b4a22 7cb4a8e 8aa84ea 3f7a9ed 8aa84ea 40b4a22 8aa84ea 40b4a22 c564bcb 40b4a22 8aa84ea 40b4a22 8aa84ea 703af34 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 |
// scripts/chat.js
export function initChat() {
const sendBtn = document.getElementById('send-btn');
const userInput = document.getElementById('user-input');
if (sendBtn && userInput) {
sendBtn.addEventListener('click', sendMessage);
userInput.addEventListener('keypress', (e) => {
if (e.key === 'Enter') sendMessage();
});
}
}
async function sendMessage() {
const userInput = document.getElementById('user-input');
const chatMessages = document.getElementById('chat-messages');
const userMessageText = userInput.value.trim();
if (userMessageText === '') return;
// 1. Add styled user bubble
const userBubble = document.createElement('div');
userBubble.className = 'chat-bubble user-bubble p-4 fade-in';
userBubble.innerHTML = `<p>${userMessageText}</p>`;
chatMessages.appendChild(userBubble);
userInput.value = '';
chatMessages.scrollTop = chatMessages.scrollHeight;
// 2. Add styled AI bubble with a typing indicator
const aiBubble = document.createElement('div');
aiBubble.className = 'chat-bubble ai-bubble p-4 fade-in';
aiBubble.innerHTML = '<div class="typing-indicator"><span></span><span></span><span></span></div>';
chatMessages.appendChild(aiBubble);
chatMessages.scrollTop = chatMessages.scrollHeight;
// 3. Fetch the real response
const workerUrl = 'https://stream-ai-backend.smplushypermedia.workers.dev/'; // <-- Make sure your URL is here
try {
const response = await fetch(workerUrl, {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ prompt: userMessageText }),
});
if (!response.ok) throw new Error(`Network response was not ok. Status: ${response.status}`);
// 4. Handle streaming response
const reader = response.body.getReader();
const decoder = new TextDecoder();
aiBubble.innerHTML = ''; // Clear the typing indicator
const aiParagraph = document.createElement('p');
aiBubble.appendChild(aiParagraph);
while (true) {
const { done, value } = await reader.read();
if (done) break;
aiParagraph.textContent += decoder.decode(value, { stream: true });
chatMessages.scrollTop = chatMessages.scrollHeight;
}
} catch (error) {
aiBubble.innerHTML = `<p class="text-red-400">Error: Could not connect to the AI assistant. ${error.message}</p>`;
}
} |