🔄 Regenerar resposta + edit icon placeholder
This commit is contained in:
+80
-11
@@ -513,6 +513,12 @@ document.addEventListener('DOMContentLoaded', () => {
|
||||
</svg>
|
||||
<span>Copiar</span>
|
||||
</button>
|
||||
<button class="msg-action-btn btn-regenerate" title="Regenerar resposta">
|
||||
<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor">
|
||||
<path stroke-linecap="round" stroke-linejoin="round" d="M16.023 9.348h4.992v-.001M2.985 19.644v-4.992m0 0h4.992m-4.993 0 3.181 3.183a8.25 8.25 0 0 0 13.803-3.7M4.031 9.865a8.25 8.25 0 0 1 13.803-3.7l3.181 3.182m0-4.991v4.99" />
|
||||
</svg>
|
||||
<span>Regenerar</span>
|
||||
</button>
|
||||
</div>
|
||||
` : '';
|
||||
|
||||
@@ -545,15 +551,78 @@ document.addEventListener('DOMContentLoaded', () => {
|
||||
});
|
||||
}
|
||||
|
||||
// Event listener para regenerar resposta
|
||||
const regenBtn = row.querySelector('.btn-regenerate');
|
||||
if (regenBtn) {
|
||||
regenBtn.addEventListener('click', () => {
|
||||
if (isGenerating) return;
|
||||
regenerateLastResponse();
|
||||
});
|
||||
}
|
||||
|
||||
return row;
|
||||
};
|
||||
|
||||
// Regenerar última resposta do bot
|
||||
const regenerateLastResponse = () => {
|
||||
const chat = chats.find(c => c.id === currentChatId);
|
||||
if (!chat || chat.messages.length === 0) return;
|
||||
|
||||
// Encontrar última mensagem do bot
|
||||
let lastBotIdx = -1;
|
||||
for (let i = chat.messages.length - 1; i >= 0; i--) {
|
||||
if (chat.messages[i].role === 'assistant') {
|
||||
lastBotIdx = i;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (lastBotIdx === -1) return;
|
||||
|
||||
// Remover última mensagem do bot e todas as mensagens depois da última mensagem do usuário
|
||||
let lastUserIdx = -1;
|
||||
for (let i = lastBotIdx - 1; i >= 0; i--) {
|
||||
if (chat.messages[i].role === 'user') {
|
||||
lastUserIdx = i;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// Cortar mensagens até a última do usuário
|
||||
if (lastUserIdx >= 0) {
|
||||
chat.messages = chat.messages.slice(0, lastUserIdx + 1);
|
||||
} else {
|
||||
chat.messages = [];
|
||||
}
|
||||
|
||||
// Remover da UI as mensagens depois do último user
|
||||
const rows = conversationList.querySelectorAll('.message-row');
|
||||
for (let i = rows.length - 1; i >= 0; i--) {
|
||||
const row = rows[i];
|
||||
const isBot = row.classList.contains('assistant');
|
||||
const isUser = row.classList.contains('user');
|
||||
if (isBot) {
|
||||
row.remove();
|
||||
} else if (isUser) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
saveChats();
|
||||
scrollToBottom();
|
||||
|
||||
// Reenviar última mensagem do usuário para gerar nova resposta
|
||||
const lastUserMsg = chat.messages[chat.messages.length - 1];
|
||||
if (lastUserMsg && lastUserMsg.role === 'user') {
|
||||
handleSendMessage(lastUserMsg.content, true);
|
||||
}
|
||||
};
|
||||
|
||||
const scrollToBottom = () => {
|
||||
messagesContainer.scrollTop = messagesContainer.scrollHeight;
|
||||
};
|
||||
|
||||
// Função principal de envio de mensagens
|
||||
const handleSendMessage = async (text) => {
|
||||
const handleSendMessage = async (text, skipUserAppend = false) => {
|
||||
if (!text || isGenerating) return;
|
||||
|
||||
isGenerating = true;
|
||||
@@ -589,16 +658,16 @@ document.addEventListener('DOMContentLoaded', () => {
|
||||
const chat = chats.find(c => c.id === currentChatId);
|
||||
if (!chat) return;
|
||||
|
||||
// Adicionar mensagem do usuário no estado e na tela
|
||||
const userMsg = { role: 'user', content: text };
|
||||
chat.messages.push(userMsg);
|
||||
chat.updatedAt = Date.now();
|
||||
appendMessageUI('user', text);
|
||||
scrollToBottom();
|
||||
|
||||
// Salvar estado temporário do chat
|
||||
saveChats();
|
||||
renderHistory();
|
||||
// Adicionar mensagem do usuário no estado e na tela (pula se for regeneração)
|
||||
if (!skipUserAppend) {
|
||||
const userMsg = { role: 'user', content: text };
|
||||
chat.messages.push(userMsg);
|
||||
chat.updatedAt = Date.now();
|
||||
appendMessageUI('user', text);
|
||||
scrollToBottom();
|
||||
saveChats();
|
||||
renderHistory();
|
||||
}
|
||||
|
||||
// Criar container para a resposta do bot (Camila AI) na tela
|
||||
const botRow = document.createElement('div');
|
||||
|
||||
@@ -1229,6 +1229,19 @@ code {
|
||||
50% { transform: scale(1.15); opacity: 0.8; }
|
||||
}
|
||||
|
||||
/* Botão regenerar */
|
||||
.msg-action-btn.btn-regenerate:hover {
|
||||
color: #10b981 !important;
|
||||
}
|
||||
|
||||
.msg-action-btn.btn-regenerate:hover svg {
|
||||
transform: rotate(-30deg);
|
||||
}
|
||||
|
||||
.msg-action-btn.btn-regenerate svg {
|
||||
transition: transform 0.3s ease;
|
||||
}
|
||||
|
||||
.disclaimer {
|
||||
font-size: 11px;
|
||||
color: var(--text-muted);
|
||||
|
||||
Reference in New Issue
Block a user