11import React , { createContext , useContext , useState , useEffect , useRef , ReactNode } from 'react' ;
22import { Message , Chat } from '../types' ;
3- import { sendMessage as apiSendMessage , getChatHistory , API_URL , regenerateMessage as apiRegenerateMessage , logout as apiLogout } from '../api/chatApi' ;
3+ import { sendMessage as apiSendMessage , getChatHistory , API_URL , logout as apiLogout } from '../api/chatApi' ;
44import { v4 as uuid } from 'uuid' ;
55
66interface ChatContextType {
@@ -14,7 +14,6 @@ interface ChatContextType {
1414 toggleSidebar : ( ) => void ;
1515 startNewSession : ( ) => void ;
1616 copyMessage : ( content : string ) => void ;
17- regenerateMessage : ( messageId : string , includeHistory : boolean ) => Promise < void > ;
1817 logout : ( ) => void ;
1918 error : string | null ;
2019 clearError : ( ) => void ;
@@ -217,140 +216,6 @@ export const ChatProvider = ({ children }: { children: ReactNode }) => {
217216 } ) ;
218217 } ;
219218
220- const regenerateMessage = async ( messageId : string , includeHistory : boolean = true ) => {
221- console . log ( 'Regenerating message:' , messages ) ;
222- console . log ( 'Current session ID:' , currentSessionId ) ;
223-
224- const messageIndex = messages . findIndex ( msg => msg . message_id === messageId ) ;
225- if ( messageIndex === - 1 ) {
226- console . error ( 'Message not found:' , messageId ) ;
227- setError ( 'Cannot regenerate message: message not found.' ) ;
228- return ;
229- }
230-
231- const previousUserMessage = [ ...messages ]
232- . slice ( 0 , messageIndex )
233- . reverse ( )
234- . find ( msg => msg . role === 'user' ) ;
235-
236- if ( ! previousUserMessage || ! currentSessionId ) {
237- console . error ( 'Cannot regenerate: missing user message or session ID' ) ;
238- setError ( 'Cannot regenerate message: missing context or session ID.' ) ;
239- return ;
240- }
241-
242- setLoading ( true ) ;
243- setError ( null ) ;
244-
245- const thinkingMessage : Message = {
246- message_id : messageId ,
247- content : '' ,
248- role : 'assistant' ,
249- timestamp : new Date ( ) ,
250- isThinking : true ,
251- model : currentEndpoint
252- } ;
253-
254- setMessages ( prev => {
255- const updatedMessages = [ ...prev ] ;
256- updatedMessages [ messageIndex ] = thinkingMessage ;
257- return updatedMessages ;
258- } ) ;
259-
260- try {
261- let messageSources : any [ ] | null = null ;
262- let messageMetrics : {
263- timeToFirstToken ?: number ;
264- totalTime ?: number ;
265- } | null = null ;
266- let accumulatedContent = '' ;
267-
268- await apiRegenerateMessage (
269- previousUserMessage . content ,
270- currentSessionId ,
271- messageId ,
272- includeHistory ,
273- currentEndpoint ,
274- ( chunk ) => {
275- if ( chunk . content ) {
276- accumulatedContent = chunk . content ;
277- setMessages ( prev => {
278- const updatedMessages = [ ...prev ] ;
279- const currentMessage = updatedMessages [ messageIndex ] ;
280- updatedMessages [ messageIndex ] = {
281- ...currentMessage ,
282- message_id : messageId ,
283- content : accumulatedContent ,
284- sources : chunk . sources || messageSources ,
285- metrics : chunk . metrics || messageMetrics ,
286- isThinking : false ,
287- model : currentEndpoint
288- } ;
289- return updatedMessages ;
290- } ) ;
291- }
292- if ( chunk . sources ) {
293- messageSources = chunk . sources ;
294- }
295- if ( chunk . metrics ) {
296- messageMetrics = chunk . metrics ;
297- }
298- }
299- ) ;
300-
301- const finalMessage : Message = {
302- message_id : messageId ,
303- content : accumulatedContent ,
304- role : 'assistant' ,
305- timestamp : new Date ( ) ,
306- isThinking : false ,
307- model : currentEndpoint ,
308- sources : messageSources ,
309- metrics : messageMetrics
310- } ;
311-
312- setMessages ( prev => prev . map ( msg =>
313- msg . message_id === messageId ? finalMessage : msg
314- ) ) ;
315-
316- } catch ( error ) {
317- console . error ( 'Error regenerating message:' , error ) ;
318- setError ( 'Failed to regenerate message. Please try again.' ) ;
319-
320- const errorMessage : Message = {
321- message_id : messageId ,
322- content : error instanceof Error && error . message === 'HTTP error! status: 429'
323- ? 'The service is currently experiencing high demand. Please wait a moment and try again.'
324- : 'Sorry, I encountered an error while regenerating the message. Please try again.' ,
325- role : 'assistant' ,
326- timestamp : new Date ( ) ,
327- model : currentEndpoint ,
328- isThinking : false ,
329- metrics : null
330- } ;
331-
332- setMessages ( prev => {
333- const updatedMessages = [ ...prev ] ;
334- const messageIndex = updatedMessages . findIndex ( msg => msg . message_id === messageId ) ;
335- if ( messageIndex !== - 1 ) {
336- updatedMessages [ messageIndex ] = errorMessage ;
337- }
338- return updatedMessages ;
339- } ) ;
340- console . log ( 'error message:' , errorMessage ) ;
341- } finally {
342- try {
343- const historyResponse = await fetch ( `${ API_URL } /chats` ) ;
344- const historyData = await historyResponse . json ( ) ;
345- setChats ( historyData . sessions || [ ] ) ;
346- } catch ( error ) {
347- console . error ( 'Error fetching chat history:' , error ) ;
348- setError ( 'Failed to update chat history.' ) ;
349- }
350- setLoading ( false ) ;
351- }
352- } ;
353-
354219 const logout = ( ) => {
355220 // Clear local state
356221 setCurrentChat ( null ) ;
@@ -379,7 +244,6 @@ export const ChatProvider = ({ children }: { children: ReactNode }) => {
379244 toggleSidebar,
380245 startNewSession,
381246 copyMessage,
382- regenerateMessage,
383247 logout,
384248 error,
385249 clearError,
0 commit comments