refactor(translate): migrate auto copy preference setting to usePreference

Move auto copy setting from redux store to preference system for better consistency
This commit is contained in:
icarus 2025-10-14 21:47:31 +08:00
parent 9ebe4801f4
commit 2bd5f39740
4 changed files with 11 additions and 22 deletions

View File

@ -395,6 +395,8 @@ export interface PreferenceSchemas {
'topic.tab.show': boolean 'topic.tab.show': boolean
// redux/settings/showTopicTime // redux/settings/showTopicTime
'topic.tab.show_time': boolean 'topic.tab.show_time': boolean
// redux/translate/settings
'translate.settings.auto_copy': boolean
// redux/settings/customCss // redux/settings/customCss
'ui.custom_css': string 'ui.custom_css': string
// redux/settings/navbarPosition // redux/settings/navbarPosition
@ -654,6 +656,7 @@ export const DefaultPreferences: PreferenceSchemas = {
'topic.tab.pin_to_top': false, 'topic.tab.pin_to_top': false,
'topic.tab.show': true, 'topic.tab.show': true,
'topic.tab.show_time': false, 'topic.tab.show_time': false,
'translate.settings.auto_copy': false,
'ui.custom_css': '', 'ui.custom_css': '',
'ui.navbar.position': 'top', 'ui.navbar.position': 'top',
'ui.sidebar.icons.invisible': [], 'ui.sidebar.icons.invisible': [],

View File

@ -1,14 +1,10 @@
import { usePreference } from '@data/hooks/usePreference' import { usePreference } from '@data/hooks/usePreference'
import { loggerService } from '@logger' import { loggerService } from '@logger'
import { builtinLanguages, UNKNOWN } from '@renderer/config/translate' import { builtinLanguages, UNKNOWN } from '@renderer/config/translate'
import { useAppSelector } from '@renderer/store'
import type { TranslateState } from '@renderer/store/translate'
import { updateSettings } from '@renderer/store/translate'
import type { TranslateLanguage } from '@renderer/types' import type { TranslateLanguage } from '@renderer/types'
import { runAsyncFunction } from '@renderer/utils' import { runAsyncFunction } from '@renderer/utils'
import { getTranslateOptions } from '@renderer/utils/translate' import { getTranslateOptions } from '@renderer/utils/translate'
import { useCallback, useEffect, useState } from 'react' import { useCallback, useEffect, useState } from 'react'
import { useDispatch } from 'react-redux'
const logger = loggerService.withContext('useTranslate') const logger = loggerService.withContext('useTranslate')
@ -21,12 +17,9 @@ const logger = loggerService.withContext('useTranslate')
*/ */
export default function useTranslate() { export default function useTranslate() {
const [prompt] = usePreference('feature.translate.model_prompt') const [prompt] = usePreference('feature.translate.model_prompt')
const settings = useAppSelector((state) => state.translate.settings)
const [translateLanguages, setTranslateLanguages] = useState<TranslateLanguage[]>(builtinLanguages) const [translateLanguages, setTranslateLanguages] = useState<TranslateLanguage[]>(builtinLanguages)
const [isLoaded, setIsLoaded] = useState(false) const [isLoaded, setIsLoaded] = useState(false)
const dispatch = useDispatch()
useEffect(() => { useEffect(() => {
runAsyncFunction(async () => { runAsyncFunction(async () => {
const options = await getTranslateOptions() const options = await getTranslateOptions()
@ -53,18 +46,9 @@ export default function useTranslate() {
[isLoaded, translateLanguages] [isLoaded, translateLanguages]
) )
const handleUpdateSettings = useCallback(
(update: Partial<TranslateState['settings']>) => {
dispatch(updateSettings(update))
},
[dispatch]
)
return { return {
prompt, prompt,
settings,
translateLanguages, translateLanguages,
getLanguageByLangcode, getLanguageByLangcode
updateSettings: handleUpdateSettings
} }
} }

View File

@ -1,6 +1,7 @@
import { PlusOutlined, SendOutlined, SwapOutlined } from '@ant-design/icons' import { PlusOutlined, SendOutlined, SwapOutlined } from '@ant-design/icons'
import { Button, Flex, Tooltip } from '@cherrystudio/ui' import { Button, Flex, Tooltip } from '@cherrystudio/ui'
import { useCache } from '@data/hooks/useCache' import { useCache } from '@data/hooks/useCache'
import { usePreference } from '@data/hooks/usePreference'
import { loggerService } from '@logger' import { loggerService } from '@logger'
import { Navbar, NavbarCenter } from '@renderer/components/app/Navbar' import { Navbar, NavbarCenter } from '@renderer/components/app/Navbar'
import { CopyIcon } from '@renderer/components/Icons' import { CopyIcon } from '@renderer/components/Icons'
@ -63,8 +64,8 @@ const TranslatePage: FC = () => {
// hooks // hooks
const { t } = useTranslation() const { t } = useTranslation()
const { translateModel, setTranslateModel } = useDefaultModel() const { translateModel, setTranslateModel } = useDefaultModel()
const { prompt, getLanguageByLangcode, settings } = useTranslate() const { prompt, getLanguageByLangcode } = useTranslate()
const { autoCopy } = settings const [autoCopy] = usePreference('translate.settings.auto_copy')
const { shikiMarkdownIt } = useCodeStyle() const { shikiMarkdownIt } = useCodeStyle()
const { onSelectFile, selecting, clearFiles } = useFiles({ extensions: [...imageExts, ...textExts] }) const { onSelectFile, selecting, clearFiles } = useFiles({ extensions: [...imageExts, ...textExts] })
const { ocr } = useOcr() const { ocr } = useOcr()

View File

@ -1,4 +1,5 @@
import { Button, ColFlex, Flex, HelpTooltip, RowFlex, Switch, Tooltip } from '@cherrystudio/ui' import { Button, ColFlex, Flex, HelpTooltip, RowFlex, Switch, Tooltip } from '@cherrystudio/ui'
import { usePreference } from '@data/hooks/usePreference'
import LanguageSelect from '@renderer/components/LanguageSelect' import LanguageSelect from '@renderer/components/LanguageSelect'
import db from '@renderer/databases' import db from '@renderer/databases'
import useTranslate from '@renderer/hooks/useTranslate' import useTranslate from '@renderer/hooks/useTranslate'
@ -41,8 +42,8 @@ const TranslateSettings: FC<{
}) => { }) => {
const { t } = useTranslation() const { t } = useTranslation()
const [localPair, setLocalPair] = useState<[TranslateLanguage, TranslateLanguage]>(bidirectionalPair) const [localPair, setLocalPair] = useState<[TranslateLanguage, TranslateLanguage]>(bidirectionalPair)
const { getLanguageByLangcode, settings, updateSettings } = useTranslate() const { getLanguageByLangcode } = useTranslate()
const { autoCopy } = settings const [autoCopy, setAutoCopy] = usePreference('translate.settings.auto_copy')
useEffect(() => { useEffect(() => {
setLocalPair(bidirectionalPair) setLocalPair(bidirectionalPair)
@ -83,7 +84,7 @@ const TranslateSettings: FC<{
isSelected={autoCopy} isSelected={autoCopy}
color="primary" color="primary"
onValueChange={(isSelected) => { onValueChange={(isSelected) => {
updateSettings({ autoCopy: isSelected }) setAutoCopy(isSelected)
}} }}
/> />
</RowFlex> </RowFlex>