(setMessages: React.Dispatch<React.SetStateAction<ChatMessage[]>>)
| 75 | const lastDisplayedPositionRef = useRef<number>(0) // Track displayed text in synced mode |
| 76 | |
| 77 | const stopStreaming = (setMessages: React.Dispatch<React.SetStateAction<ChatMessage[]>>) => { |
| 78 | if (abortControllerRef.current) { |
| 79 | // Abort the fetch request |
| 80 | abortControllerRef.current.abort() |
| 81 | abortControllerRef.current = null |
| 82 | |
| 83 | const latestContent = accumulatedTextRef.current |
| 84 | |
| 85 | setMessages((prev) => { |
| 86 | const lastMessage = prev[prev.length - 1] |
| 87 | |
| 88 | if (lastMessage && lastMessage.type === 'assistant') { |
| 89 | const content = latestContent || lastMessage.content |
| 90 | const updatedContent = |
| 91 | content + (content ? '\n\n_Response stopped by user._' : '_Response stopped by user._') |
| 92 | |
| 93 | return [ |
| 94 | ...prev.slice(0, -1), |
| 95 | { ...lastMessage, content: updatedContent, isStreaming: false }, |
| 96 | ] |
| 97 | } |
| 98 | |
| 99 | return prev |
| 100 | }) |
| 101 | |
| 102 | setIsStreamingResponse(false) |
| 103 | accumulatedTextRef.current = '' |
| 104 | lastStreamedPositionRef.current = 0 |
| 105 | lastDisplayedPositionRef.current = 0 |
| 106 | audioStreamingActiveRef.current = false |
| 107 | } |
| 108 | } |
| 109 | |
| 110 | const handleStreamedResponse = async ( |
| 111 | response: Response, |
no test coverage detected