-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathscript.js
More file actions
239 lines (203 loc) · 8.5 KB
/
script.js
File metadata and controls
239 lines (203 loc) · 8.5 KB
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
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
const chatMessages = document.getElementById('chat-messages');
const userInput = document.getElementById('user-input');
const sendButton = document.getElementById('send-button');
const sendImage = document.getElementById('send-image');
let isWaitingForResponse = false;
// Ativa/desativa o botão de enviar conforme o input
userInput.addEventListener('input', () => {
sendButton.disabled = userInput.value.trim() === '' || isWaitingForResponse || !puter.auth.isSignedIn();
sendImage.disabled = userInput.value.trim() === '' || isWaitingForResponse || !puter.auth.isSignedIn();
});
function getTimeStamp () {
const now = new Date();
const hours = now.getHours().toString().padStart(2, '0');
const minutes = now.getMinutes().toString().padStart(2, '0');
const timeString = `${hours}:${minutes}`;
return timeString;
}
/**
* Adiciona uma mensagem ao chat.
* @param {string} text - Texto da mensagem a ser adicionada.
* @param {boolean} isReceived - Se a mensagem foi recebida da puter.ai (true) ou foi enviada pelo usuário (false).
*/
function addMessage(text, isReceived) {
// Cria um novo elemento de mensagem
const messageDiv = document.createElement('div');
// Adiciona classes para o lado e estilo da mensagem
messageDiv.classList.add('message');
messageDiv.classList.add(isReceived ? 'received' : 'sent');
// Obtém a hora atual
const timeString = getTimeStamp();
// Cria um elemento de parágrafo para o texto da mensagem
const textElement = document.createElement('p');
textElement.textContent = text;
// Cria um elemento de div para a hora da mensagem
const timeStampElement = document.createElement('div');
timeStampElement.classList.add('timestamp');
timeStampElement.textContent = timeString;
const containerBtnMessage = document.createElement('div');
containerBtnMessage.classList.add('container-btn-message');
if (isReceived) {
const btnMessage = document.createElement('div');
btnMessage.classList.add('btn-msg');
btnMessage.addEventListener('click', () => textSpeech(text));
const btnMessageIcon = document.createElement('div');
btnMessageIcon.classList.add('btn-msg-icon', "speak-icon");
btnMessage.appendChild(btnMessageIcon);
containerBtnMessage.appendChild(btnMessage);
messageDiv.appendChild(containerBtnMessage);
}
// Adiciona os elementos ao elemento de mensagem
messageDiv.appendChild(textElement);
messageDiv.appendChild(timeStampElement);
// Adiciona o elemento de mensagem ao chat
chatMessages.appendChild(messageDiv);
chatMessages.scrollTop = chatMessages.scrollHeight;
}
/**
* Adiciona uma imagem ao chat.
* @param {string} imageDiv - Base64 para a imagem gerada pela puter.ai.
* @param {boolean} isReceived - Se a imagem foi recebida da puter.ai (true) ou foi enviada pelo usuário (false).
*/
/**
* Adiciona uma imagem ao chat.
* @param {string} imageDiv - Base64 para a imagem gerada pela puter.ai.
* @param {boolean} isReceived - Se a imagem foi recebida da puter.ai (true) ou foi enviada pelo usuário (false).
*/
function addImage(imageDiv, isReceived) {
const messageDiv = document.createElement('div');
const figureElement = document.createElement('figure');
const imageElement = document.createElement('img');
imageElement.src = imageDiv;
imageElement.alt = 'Image-ai-generated';
figureElement.appendChild(imageElement);
messageDiv.appendChild(figureElement);
// Adiciona a hora e estilo da mensagem
const timeString = getTimeStamp();
const timestampElement = document.createElement('div');
timestampElement.classList.add('timestamp');
timestampElement.textContent = timeString;
messageDiv.appendChild(timestampElement);
messageDiv.classList.add('message');
messageDiv.classList.add(isReceived ? 'received' : 'sent');
// Adiciona a mensagem ao chat
chatMessages.appendChild(messageDiv);
chatMessages.scrollTop = chatMessages.scrollHeight;
}
// Mostra indicador de "digitando"
function showTypingIndicator() {
const typingDiv = document.createElement('div');
typingDiv.classList.add('typing-indicator');
typingDiv.id = 'typing-indicator';
typingDiv.innerHTML = `
<span></span>
<span></span>
<span></span>
`;
chatMessages.appendChild(typingDiv);
chatMessages.scrollTop = chatMessages.scrollHeight;
}
// Remove o indicador de "digitando"
function hideTypingIndicator() {
const typingIndicator = document.getElementById('typing-indicator');
if (typingIndicator) {
typingIndicator.remove();
}
}
async function sendMessage() {
const message = userInput.value.trim();
if (message === '' || isWaitingForResponse || !puter.auth.isSignedIn()) return;
// Adiciona mensagem do usuário
addMessage(message, false);
userInput.value = '';
sendButton.disabled = true;
isWaitingForResponse = true;
// Mostra que a IA está digitando
showTypingIndicator();
try {
// Chama a API da puter.ai
const response = await puter.ai.chat(message, { model: "gpt-4.1-nano" });
// Remove o indicador de digitação e mostra a resposta
hideTypingIndicator();
addMessage(response, true);
} catch (error) {
hideTypingIndicator();
addMessage("Desculpe, ocorreu um erro ao processar sua mensagem. Por favor, tente novamente.", true);
console.error("Erro ao chamar puter.ai:", error);
} finally {
isWaitingForResponse = false;
sendButton.disabled = userInput.value.trim() === '';
}
}
async function generateImage() {
const message = userInput.value.trim();
if (message === '' || isWaitingForResponse || !puter.auth.isSignedIn()) return;
// Adiciona mensagem do usuário
addMessage(message, false);
userInput.value = '';
sendButton.disabled = true;
isWaitingForResponse = true;
// Mostra que a IA está digitando
showTypingIndicator();
try {
// Chama a API da puter.ai
const response = await puter.ai.txt2img(message);
// Remove o indicador de digitação e mostra a resposta
hideTypingIndicator();
addImage(response, true);
} catch (error) {
hideTypingIndicator();
addMessage("Desculpe, ocorreu um erro ao processar sua mensagem. Por favor, tente novamente.", true);
console.error("Erro ao chamar puter.ai:", error);
} finally {
isWaitingForResponse = false;
sendButton.disabled = userInput.value.trim() === '';
}
}
function textSpeech(message) {
const options = {
language: "pt-BR",
engine: "generative"
}
puter.ai.txt2speech(message, options).then( (audio) => audio.play());
}
// Enviar mensagem quando clicar no botão
sendButton.addEventListener('click', sendMessage);
sendImage.addEventListener('click', generateImage);
// Enviar mensagem quando pressionar Enter
userInput.addEventListener('keypress', function(e) {
if (e.key === 'Enter' && !sendButton.disabled) {
sendMessage();
}
});
// Inicializa a puter.ai (opcional)
document.addEventListener('DOMContentLoaded', async () => {
// Você pode adicionar qualquer inicialização necessária aqui
const isAuth = await puter.auth.isSignedIn();
if (!isAuth) {
const messageDiv = document.createElement('div');
messageDiv.classList.add('message');
messageDiv.classList.add('received');
const messageParagraph = document.createElement('p');
messageParagraph.textContent = "Autentique-se ";
const linkButton = document.createElement('span');
linkButton.classList.add('link');
linkButton.textContent = 'pressionando aqui';
linkButton.addEventListener('click', () => {
puter.auth.signIn();
});
messageParagraph.appendChild(linkButton);
messageDiv.appendChild(messageParagraph);
chatMessages.appendChild(messageDiv);
const verifyAuth = setInterval( async() => {
if (await puter.auth.isSignedIn()) {
const user = await puter.auth.getUser();
addMessage(`Olá ${user.username}! Bem-vindo ao PuterLab! Sou seu assistente de testes de IA. Como posso te ajudar hoje?`, true);
clearInterval(verifyAuth);
}
}, 1000);
} else {
const user = await puter.auth.getUser();
addMessage(`Olá ${user.username}! Bem-vindo ao PuterLab! Sou seu assistente de testes de IA. Como posso te ajudar hoje?`, true);
}
});