mirror of
https://github.com/CherryHQ/cherry-studio.git
synced 2025-12-24 02:20:10 +08:00
refactor(translate): simplify translation component by removing unused state
Remove unused assistant state and refactor topic initialization Clean up unused imports and simplify logic for translation flow fix: Error: Calling setState synchronously within an effect can trigger cascading renders
This commit is contained in:
parent
cf9bfce43c
commit
24d2e6e6ce
@ -9,7 +9,7 @@ import { useSettings } from '@renderer/hooks/useSettings'
|
|||||||
import useTranslate from '@renderer/hooks/useTranslate'
|
import useTranslate from '@renderer/hooks/useTranslate'
|
||||||
import MessageContent from '@renderer/pages/home/Messages/MessageContent'
|
import MessageContent from '@renderer/pages/home/Messages/MessageContent'
|
||||||
import { getDefaultTopic, getDefaultTranslateAssistant } from '@renderer/services/AssistantService'
|
import { getDefaultTopic, getDefaultTranslateAssistant } from '@renderer/services/AssistantService'
|
||||||
import { Assistant, Topic, TranslateLanguage, TranslateLanguageCode } from '@renderer/types'
|
import { Topic, TranslateLanguage, TranslateLanguageCode } from '@renderer/types'
|
||||||
import type { ActionItem } from '@renderer/types/selectionTypes'
|
import type { ActionItem } from '@renderer/types/selectionTypes'
|
||||||
import { runAsyncFunction } from '@renderer/utils'
|
import { runAsyncFunction } from '@renderer/utils'
|
||||||
import { abortCompletion } from '@renderer/utils/abortController'
|
import { abortCompletion } from '@renderer/utils/abortController'
|
||||||
@ -31,7 +31,7 @@ const logger = loggerService.withContext('ActionTranslate')
|
|||||||
|
|
||||||
const ActionTranslate: FC<Props> = ({ action, scrollToBottom }) => {
|
const ActionTranslate: FC<Props> = ({ action, scrollToBottom }) => {
|
||||||
const { t } = useTranslation()
|
const { t } = useTranslation()
|
||||||
const { translateModelPrompt, language } = useSettings()
|
const { language } = useSettings()
|
||||||
|
|
||||||
const [targetLanguage, setTargetLanguage] = useState<TranslateLanguage>(LanguagesEnum.enUS)
|
const [targetLanguage, setTargetLanguage] = useState<TranslateLanguage>(LanguagesEnum.enUS)
|
||||||
const [alterLanguage, setAlterLanguage] = useState<TranslateLanguage>(LanguagesEnum.zhCN)
|
const [alterLanguage, setAlterLanguage] = useState<TranslateLanguage>(LanguagesEnum.zhCN)
|
||||||
@ -41,16 +41,16 @@ const ActionTranslate: FC<Props> = ({ action, scrollToBottom }) => {
|
|||||||
const [isContented, setIsContented] = useState(false)
|
const [isContented, setIsContented] = useState(false)
|
||||||
const [isLoading, setIsLoading] = useState(true)
|
const [isLoading, setIsLoading] = useState(true)
|
||||||
const [contentToCopy, setContentToCopy] = useState('')
|
const [contentToCopy, setContentToCopy] = useState('')
|
||||||
const [topic, setTopic] = useState<Topic | null>(null)
|
// use default assistant.
|
||||||
|
// FIXME: this component create a new topic every time, but related data would not be cleared.
|
||||||
|
const [topic] = useState<Topic>(getDefaultTopic('default'))
|
||||||
const { getLanguageByLangcode } = useTranslate()
|
const { getLanguageByLangcode } = useTranslate()
|
||||||
|
|
||||||
// Use useRef for values that shouldn't trigger re-renders
|
// Use useRef for values that shouldn't trigger re-renders
|
||||||
const initialized = useRef(false)
|
|
||||||
const assistantRef = useRef<Assistant | null>(null)
|
|
||||||
const topicRef = useRef<Topic | null>(topic)
|
const topicRef = useRef<Topic | null>(topic)
|
||||||
const askId = useRef('')
|
const askId = useRef('')
|
||||||
|
|
||||||
// update ref
|
// Sync ref
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
topicRef.current = topic
|
topicRef.current = topic
|
||||||
}, [topic])
|
}, [topic])
|
||||||
@ -85,22 +85,8 @@ const ActionTranslate: FC<Props> = ({ action, scrollToBottom }) => {
|
|||||||
})
|
})
|
||||||
}, [getLanguageByLangcode, language])
|
}, [getLanguageByLangcode, language])
|
||||||
|
|
||||||
// Initialize values only once when action changes
|
|
||||||
useEffect(() => {
|
|
||||||
if (initialized.current || !action.selectedText) return
|
|
||||||
initialized.current = true
|
|
||||||
|
|
||||||
// Initialize assistant
|
|
||||||
const currentAssistant = getDefaultTranslateAssistant(targetLanguage, action.selectedText)
|
|
||||||
|
|
||||||
assistantRef.current = currentAssistant
|
|
||||||
|
|
||||||
// Initialize topic
|
|
||||||
topicRef.current = getDefaultTopic(currentAssistant.id)
|
|
||||||
}, [action, targetLanguage, translateModelPrompt])
|
|
||||||
|
|
||||||
const fetchResult = useCallback(async () => {
|
const fetchResult = useCallback(async () => {
|
||||||
if (!assistantRef.current || !topicRef.current || !action.selectedText) return
|
if (!topicRef.current || !action.selectedText) return
|
||||||
|
|
||||||
const setAskId = (id: string) => {
|
const setAskId = (id: string) => {
|
||||||
askId.current = id
|
askId.current = id
|
||||||
@ -118,8 +104,6 @@ const ActionTranslate: FC<Props> = ({ action, scrollToBottom }) => {
|
|||||||
setError(error.message)
|
setError(error.message)
|
||||||
}
|
}
|
||||||
|
|
||||||
setIsLoading(true)
|
|
||||||
|
|
||||||
let sourceLanguageCode: TranslateLanguageCode
|
let sourceLanguageCode: TranslateLanguageCode
|
||||||
|
|
||||||
try {
|
try {
|
||||||
@ -145,7 +129,6 @@ const ActionTranslate: FC<Props> = ({ action, scrollToBottom }) => {
|
|||||||
}
|
}
|
||||||
|
|
||||||
const assistant = getDefaultTranslateAssistant(translateLang, action.selectedText)
|
const assistant = getDefaultTranslateAssistant(translateLang, action.selectedText)
|
||||||
assistantRef.current = assistant
|
|
||||||
processMessages(assistant, topicRef.current, assistant.content, setAskId, onStream, onFinish, onError)
|
processMessages(assistant, topicRef.current, assistant.content, setAskId, onStream, onFinish, onError)
|
||||||
}, [action, targetLanguage, alterLanguage, scrollToBottom])
|
}, [action, targetLanguage, alterLanguage, scrollToBottom])
|
||||||
|
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user