mirror of
https://github.com/karpathy/nanochat.git
synced 2025-12-06 04:12:13 +00:00
allow user to click on their message to edit them. conversation after that point is wiped
This commit is contained in:
parent
92d52ecc92
commit
2846999b8f
|
|
@ -115,6 +115,12 @@
|
||||||
border-radius: 1.25rem;
|
border-radius: 1.25rem;
|
||||||
padding: 0.8rem 1rem;
|
padding: 0.8rem 1rem;
|
||||||
max-width: 65%;
|
max-width: 65%;
|
||||||
|
cursor: pointer;
|
||||||
|
transition: background-color 0.2s ease;
|
||||||
|
}
|
||||||
|
|
||||||
|
.message.user .message-content:hover {
|
||||||
|
background-color: #e5e7eb;
|
||||||
}
|
}
|
||||||
|
|
||||||
.message.console .message-content {
|
.message.console .message-content {
|
||||||
|
|
@ -300,7 +306,7 @@
|
||||||
chatInput.focus();
|
chatInput.focus();
|
||||||
}
|
}
|
||||||
|
|
||||||
function addMessage(role, content) {
|
function addMessage(role, content, messageIndex = null) {
|
||||||
const messageDiv = document.createElement('div');
|
const messageDiv = document.createElement('div');
|
||||||
messageDiv.className = `message ${role}`;
|
messageDiv.className = `message ${role}`;
|
||||||
|
|
||||||
|
|
@ -308,6 +314,17 @@
|
||||||
contentDiv.className = 'message-content';
|
contentDiv.className = 'message-content';
|
||||||
contentDiv.textContent = content;
|
contentDiv.textContent = content;
|
||||||
|
|
||||||
|
// Add click handler for user messages to enable editing
|
||||||
|
if (role === 'user' && messageIndex !== null) {
|
||||||
|
contentDiv.setAttribute('data-message-index', messageIndex);
|
||||||
|
contentDiv.setAttribute('title', 'Click to edit and restart from here');
|
||||||
|
contentDiv.addEventListener('click', function() {
|
||||||
|
if (!isGenerating) {
|
||||||
|
editMessage(messageIndex);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
messageDiv.appendChild(contentDiv);
|
messageDiv.appendChild(contentDiv);
|
||||||
chatWrapper.appendChild(messageDiv);
|
chatWrapper.appendChild(messageDiv);
|
||||||
|
|
||||||
|
|
@ -315,6 +332,32 @@
|
||||||
return contentDiv;
|
return contentDiv;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function editMessage(messageIndex) {
|
||||||
|
// Find the message in the messages array
|
||||||
|
if (messageIndex < 0 || messageIndex >= messages.length) return;
|
||||||
|
|
||||||
|
const messageToEdit = messages[messageIndex];
|
||||||
|
if (messageToEdit.role !== 'user') return;
|
||||||
|
|
||||||
|
// Copy message content to input
|
||||||
|
chatInput.value = messageToEdit.content;
|
||||||
|
chatInput.style.height = 'auto';
|
||||||
|
chatInput.style.height = Math.min(chatInput.scrollHeight, 200) + 'px';
|
||||||
|
|
||||||
|
// Remove this message and all subsequent messages from the array
|
||||||
|
messages = messages.slice(0, messageIndex);
|
||||||
|
|
||||||
|
// Remove message elements from DOM starting from messageIndex
|
||||||
|
const allMessages = chatWrapper.querySelectorAll('.message');
|
||||||
|
for (let i = messageIndex; i < allMessages.length; i++) {
|
||||||
|
allMessages[i].remove();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Enable send button and focus input
|
||||||
|
sendButton.disabled = false;
|
||||||
|
chatInput.focus();
|
||||||
|
}
|
||||||
|
|
||||||
function handleSlashCommand(command) {
|
function handleSlashCommand(command) {
|
||||||
const parts = command.trim().split(/\s+/);
|
const parts = command.trim().split(/\s+/);
|
||||||
const cmd = parts[0].toLowerCase();
|
const cmd = parts[0].toLowerCase();
|
||||||
|
|
@ -381,8 +424,9 @@
|
||||||
chatInput.style.height = 'auto';
|
chatInput.style.height = 'auto';
|
||||||
sendButton.disabled = true;
|
sendButton.disabled = true;
|
||||||
|
|
||||||
|
const userMessageIndex = messages.length;
|
||||||
messages.push({ role: 'user', content: message });
|
messages.push({ role: 'user', content: message });
|
||||||
addMessage('user', message);
|
addMessage('user', message, userMessageIndex);
|
||||||
|
|
||||||
const assistantContent = addMessage('assistant', '');
|
const assistantContent = addMessage('assistant', '');
|
||||||
assistantContent.innerHTML = '<span class="typing-indicator"></span>';
|
assistantContent.innerHTML = '<span class="typing-indicator"></span>';
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue
Block a user