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>`;
    }
}