Skip to content

Commit e108d4d

Browse files
committed
Function: Finish Chat Branching
1 parent e8180d8 commit e108d4d

File tree

10 files changed

+482
-343
lines changed

10 files changed

+482
-343
lines changed

src/components/chat/ChatMessageArea.tsx

Lines changed: 18 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
11
import React, { useState, FormEvent, useRef, useEffect } from 'react';
2-
import { Conversation } from '../../types/chat';
2+
import { Conversation, Message } from '../../types/chat';
33
import { Send, Square, Copy, RotateCcw, Share2, Pencil, Loader2 } from 'lucide-react';
44
import MarkdownContent from './MarkdownContent';
55
import MessageToolboxMenu, { ToolboxAction } from '../ui/MessageToolboxMenu';
6+
import { MessageHelper } from '../../services/message-helper';
67

78
interface ChatMessageAreaProps {
89
activeConversation: Conversation | null;
@@ -30,12 +31,19 @@ export const ChatMessageArea: React.FC<ChatMessageAreaProps> = ({
3031
const [hoveredMessageId, setHoveredMessageId] = useState<string | null>(null);
3132
const [editingMessageId, setEditingMessageId] = useState<string | null>(null);
3233
const [editingContent, setEditingContent] = useState('');
34+
const [messagesList, setMessagesList] = useState<Message[]>([]);
3335

3436
// Scroll to bottom when messages change
3537
useEffect(() => {
3638
setTimeout(() => {
3739
messagesEndRef.current?.scrollIntoView({ behavior: 'smooth' });
3840
}, 50);
41+
42+
console.log(activeConversation);
43+
44+
if(activeConversation) {
45+
setMessagesList(MessageHelper.mapMessagesTreeToList(activeConversation));
46+
}
3947
}, [activeConversation?.messages]);
4048

4149
const handleSubmit = (e: FormEvent) => {
@@ -70,23 +78,16 @@ export const ChatMessageArea: React.FC<ChatMessageAreaProps> = ({
7078
setEditingContent(content);
7179
};
7280

73-
// Handle save edit
74-
const handleSaveEdit = () => {
75-
if (editingMessageId && onEditMessage && editingContent.trim()) {
76-
onEditMessage(editingMessageId, editingContent);
77-
setEditingMessageId(null);
78-
setEditingContent('');
79-
}
80-
};
81-
8281
// Handle send edited message
8382
const handleSendEditedMessage = () => {
84-
if (editingMessageId && editingContent.trim()) {
83+
if (editingMessageId && onEditMessage && editingContent.trim()) {
84+
const newContent = editingContent;
85+
8586
// First cancel the edit mode
8687
setEditingMessageId(null);
8788
setEditingContent('');
8889

89-
onSendMessage(input);
90+
onEditMessage(editingMessageId, newContent);
9091
}
9192
};
9293

@@ -109,6 +110,10 @@ export const ChatMessageArea: React.FC<ChatMessageAreaProps> = ({
109110
console.error(`Function not implemented yet: ${action}`);
110111
};
111112

113+
const getMessagesList = () => {
114+
return messagesList;
115+
}
116+
112117
// If no active conversation is selected
113118
if (!activeConversation) {
114119
return (
@@ -125,7 +130,7 @@ export const ChatMessageArea: React.FC<ChatMessageAreaProps> = ({
125130
<div className="flex flex-col h-full">
126131
{/* Messages area */}
127132
<div className="flex-1 p-4 space-y-4 overflow-y-auto">
128-
{activeConversation.messages.filter(m => m.role !== 'system').map((message) => {
133+
{getMessagesList().map((message) => {
129134
const isUserMessage = message.role === 'user';
130135
const isEditing = editingMessageId === message.messageId;
131136

src/pages/ChatPage.tsx

Lines changed: 29 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -171,11 +171,11 @@ export const ChatPage: React.FC<ChatPageProps> = ({
171171
} catch (err) {
172172
console.error('Error sending streaming message:', err);
173173

174-
// If streaming fails, we'll try to fall back to regular mode
175-
const error = err as Error;
176-
if (error.message && error.message.includes('does not support streaming')) {
177-
await handleSendMessage(content);
178-
}
174+
// // If streaming fails, we'll try to fall back to regular mode
175+
// const error = err as Error;
176+
// if (error.message && error.message.includes('does not support streaming')) {
177+
// await handleSendMessage(content);
178+
// }
179179
}
180180
};
181181

@@ -264,37 +264,33 @@ export const ChatPage: React.FC<ChatPageProps> = ({
264264

265265
// Handle editing a message
266266
const handleEditMessage = async (messageId: string, newContent: string) => {
267-
if (!isServiceInitialized || !chatServiceRef.current || !activeConversation) return;
267+
if (!activeConversationId || !isServiceInitialized || !chatServiceRef.current) return;
268268

269269
try {
270-
// Find the message being edited
271-
const message = activeConversation.messages.find(m => m.messageId === messageId);
272-
273-
if (message && message.role === 'user') {
274-
// Delete this message and all subsequent messages
275-
const messageIndex = activeConversation.messages.findIndex(m => m.messageId === messageId);
276-
277-
// If this is not the last message, we need to delete all subsequent messages
278-
if (messageIndex < activeConversation.messages.length - 1) {
279-
// Delete from last to first to avoid index shifting issues
280-
for (let i = activeConversation.messages.length - 1; i > messageIndex; i--) {
281-
const msgToDelete = activeConversation.messages[i];
282-
await chatServiceRef.current.deleteMessage(msgToDelete.messageId, (updatedConversation) => {
283-
setConversations(updatedConversation);
284-
});
285-
}
286-
}
287-
288-
// Then delete the edited message itself
289-
await chatServiceRef.current.deleteMessage(messageId, (updatedConversation) => {
270+
const chatService = chatServiceRef.current;
271+
const selectedModel = SettingsService.getInstance().getSelectedModel();
272+
const selectedProvider = SettingsService.getInstance().getSelectedProvider();
273+
console.log('Using streaming with provider:', selectedProvider);
274+
console.log('Using streaming with model:', selectedModel);
275+
276+
// Send user message with streaming
277+
await chatService.editMessage(
278+
messageId,
279+
activeConversationId,
280+
newContent,
281+
true,
282+
(updatedConversation) => {
290283
setConversations(updatedConversation);
291-
});
292-
293-
// Finally, send the new message
294-
await handleSendMessage(newContent);
295-
}
296-
} catch (error) {
297-
console.error('Error editing message:', error);
284+
}
285+
);
286+
287+
} catch (err) {
288+
console.error('Error editing message:', err);
289+
// // If streaming fails, we'll try to fall back to regular mode
290+
// const error = err as Error;
291+
// if (error.message && error.message.includes('does not support streaming')) {
292+
// await handleSendMessage(content);
293+
// }
298294
}
299295
};
300296

src/services/ai-service.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,9 @@ export class AIService {
7171
const settings = settingsService.getSettings();
7272
for (const provider of Object.keys(settings.providers)) {
7373
const providerSettings = settings.providers[provider];
74-
console.log('Provider: ', provider, ' Provider settings: ', providerSettings);
74+
75+
// console.log('Provider: ', provider, ' Provider settings: ', providerSettings);
76+
7577
if (providerSettings && providerSettings.apiKey && providerSettings.apiKey.length > 0) {
7678
const providerInstance = ProviderFactory.getNewProvider(provider as AIProvider);
7779
if (providerInstance) {

0 commit comments

Comments
 (0)