/* Copyright (C) 2025 QuantumNous This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with this program. If not, see . For commercial licensing, please contact support@quantumnous.com */ import React, { useEffect, useRef } from 'react'; import { Typography } from '@douyinfe/semi-ui'; import MarkdownRenderer from '../common/markdown/MarkdownRenderer'; import { ChevronRight, ChevronUp, Brain, Loader2 } from 'lucide-react'; import { useTranslation } from 'react-i18next'; const ThinkingContent = ({ message, finalExtractedThinkingContent, thinkingSource, styleState, onToggleReasoningExpansion, }) => { const { t } = useTranslation(); const scrollRef = useRef(null); const lastContentRef = useRef(''); const isThinkingStatus = message.status === 'loading' || message.status === 'incomplete'; const headerText = isThinkingStatus && !message.isThinkingComplete ? t('思考中...') : t('思考过程'); useEffect(() => { if ( scrollRef.current && finalExtractedThinkingContent && message.isReasoningExpanded ) { scrollRef.current.scrollTop = scrollRef.current.scrollHeight; } }, [finalExtractedThinkingContent, message.isReasoningExpanded]); useEffect(() => { if (!isThinkingStatus) { lastContentRef.current = ''; } }, [isThinkingStatus]); if (!finalExtractedThinkingContent) return null; let prevLength = 0; if (isThinkingStatus && lastContentRef.current) { if (finalExtractedThinkingContent.startsWith(lastContentRef.current)) { prevLength = lastContentRef.current.length; } } if (isThinkingStatus) { lastContentRef.current = finalExtractedThinkingContent; } return (
onToggleReasoningExpansion(message.id)} >
{headerText} {thinkingSource && ( 来源: {thinkingSource} )}
{isThinkingStatus && !message.isThinkingComplete && (
思考中
)} {(!isThinkingStatus || message.isThinkingComplete) && (
{message.isReasoningExpanded ? ( ) : ( )}
)}
{message.isReasoningExpanded && (
)}
); }; export default ThinkingContent;