-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathscript.js
130 lines (106 loc) · 3.9 KB
/
script.js
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
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
const chatBox = document.getElementById('chat-box');
const userInput = document.getElementById('user-input');
const sendButton = document.getElementById('send-btn');
const errorMessage = document.getElementById('error-message');
let isProcessing = false;
function addMessage(content, type) {
const messageDiv = document.createElement('div');
messageDiv.classList.add('message', type);
if (type === 'assistant') {
// Parse markdown for assistant messages
messageDiv.innerHTML = marked.parse(content);
} else {
// Regular text for user messages
messageDiv.textContent = content;
}
chatBox.appendChild(messageDiv);
chatBox.scrollTop = chatBox.scrollHeight;
}
function showError(message) {
errorMessage.textContent = message;
errorMessage.classList.add('visible');
setTimeout(() => {
errorMessage.classList.remove('visible');
}, 5000);
}
function showTypingIndicator() {
const indicator = document.createElement('div');
indicator.classList.add('typing-indicator');
indicator.id = 'typing-indicator';
indicator.textContent = 'Assistant is typing...';
chatBox.appendChild(indicator);
chatBox.scrollTop = chatBox.scrollHeight;
}
function removeTypingIndicator() {
const indicator = document.getElementById('typing-indicator');
if (indicator) {
indicator.remove();
}
}
function addStatusMessage(message, isTemporary = false) {
const statusDiv = document.createElement('div');
statusDiv.classList.add('message', 'assistant', 'status-message');
statusDiv.innerHTML = marked.parse(message);
chatBox.appendChild(statusDiv);
chatBox.scrollTop = chatBox.scrollHeight;
if (isTemporary) {
setTimeout(() => {
statusDiv.remove();
}, 5000);
}
}
async function sendMessage() {
const message = userInput.value.trim();
if (!message || isProcessing) return;
isProcessing = true;
sendButton.disabled = true;
userInput.value = '';
try {
// Add user message
addMessage(message, 'user');
// If it's a URL, show initial processing message
if (message.startsWith('http://') || message.startsWith('https://')) {
addStatusMessage('🔍 Processing URL...\n- Crawling webpage\n- Creating embeddings\n- Storing data');
}
showTypingIndicator();
// Send message to backend
const response = await fetch('/api/chat', {
method: 'POST',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify({ message })
});
if (!response.ok) {
throw new Error('Failed to get response from server');
}
const data = await response.json();
removeTypingIndicator();
// Remove the processing message if it exists
const processingMessages = document.querySelectorAll('.status-message');
processingMessages.forEach(msg => msg.remove());
// Add the response
addMessage(data.response, 'assistant');
// If URL was processed successfully, show a temporary success message
if (data.type === 'url_processed') {
addStatusMessage('✨ Ready for questions about the webpage content!', true);
}
} catch (error) {
removeTypingIndicator();
showError('Failed to send message. Please try again.');
console.error('Error:', error);
} finally {
isProcessing = false;
sendButton.disabled = false;
}
}
// Event listeners
sendButton.addEventListener('click', sendMessage);
userInput.addEventListener('keypress', (e) => {
if (e.key === 'Enter' && !e.shiftKey) {
e.preventDefault();
sendMessage();
}
});
// Focus input on load
userInput.focus();