import isElectron from 'is-electron'; import { useTranslation } from 'react-i18next'; import { languages } from '/@/i18n/i18n'; import { SettingOption, SettingsSection, } from '/@/renderer/features/settings/components/settings-section'; import { useLyricsSettings, useSettingsStoreActions } from '/@/renderer/store'; import { MultiSelect } from '/@/shared/components/multi-select/multi-select'; import { NumberInput } from '/@/shared/components/number-input/number-input'; import { Select } from '/@/shared/components/select/select'; import { Switch } from '/@/shared/components/switch/switch'; import { TextInput } from '/@/shared/components/text-input/text-input'; import { LyricSource } from '/@/shared/types/domain-types'; const localSettings = isElectron() ? window.api.localSettings : null; export const LyricSettings = () => { const { t } = useTranslation(); const settings = useLyricsSettings(); const { setSettings } = useSettingsStoreActions(); const lyricOptions: SettingOption[] = [ { control: ( { setSettings({ lyrics: { ...settings, follow: e.currentTarget.checked, }, }); }} /> ), description: t('setting.followLyric', { context: 'description', postProcess: 'sentenceCase', }), title: t('setting.followLyric', { postProcess: 'sentenceCase' }), }, { control: ( { setSettings({ lyrics: { ...settings, preferLocalLyrics: e.currentTarget.checked, }, }); }} /> ), description: t('setting.preferLocalLyrics', { context: 'description', postProcess: 'sentenceCase', }), isHidden: !isElectron(), title: t('setting.preferLocalLyrics', { postProcess: 'sentenceCase' }), }, { control: ( { setSettings({ lyrics: { ...settings, fetch: e.currentTarget.checked, }, }); }} /> ), description: t('setting.lyricFetch', { context: 'description', postProcess: 'sentenceCase', }), isHidden: !isElectron(), title: t('setting.lyricFetch', { postProcess: 'sentenceCase' }), }, { control: ( { localSettings?.set('lyrics', e); setSettings({ lyrics: { ...settings, sources: e.map((source) => source as LyricSource), }, }); }} width={300} /> ), description: t('setting.lyricFetchProvider', { context: 'description', postProcess: 'sentenceCase', }), isHidden: !isElectron(), title: t('setting.lyricFetchProvider', { postProcess: 'sentenceCase' }), }, { control: ( { const isChecked = e.currentTarget.checked; setSettings({ lyrics: { ...settings, enableNeteaseTranslation: e.currentTarget.checked, }, }); localSettings?.set('enableNeteaseTranslation', isChecked); }} /> ), description: t('setting.neteaseTranslation', { context: 'description', postProcess: 'sentenceCase', }), isHidden: !isElectron(), title: t('setting.neteaseTranslation', { postProcess: 'sentenceCase' }), }, { control: ( { const value = Number(e.currentTarget.value); setSettings({ lyrics: { ...settings, delayMs: value, }, }); }} step={10} width={100} /> ), description: t('setting.lyricOffset', { context: 'description', postProcess: 'sentenceCase', }), isHidden: !isElectron(), title: t('setting.lyricOffset', { postProcess: 'sentenceCase' }), }, { control: ( { setSettings({ lyrics: { ...settings, translationApiProvider: value } }); }} value={settings.translationApiProvider} /> ), description: t('setting.translationApiProvider', { context: 'description', postProcess: 'sentenceCase', }), isHidden: !isElectron(), title: t('setting.translationApiProvider', { postProcess: 'sentenceCase' }), }, { control: ( { setSettings({ lyrics: { ...settings, translationApiKey: e.currentTarget.value }, }); }} value={settings.translationApiKey} /> ), description: t('setting.translationApiKey', { context: 'description', postProcess: 'sentenceCase', }), isHidden: !isElectron(), title: t('setting.translationApiKey', { postProcess: 'sentenceCase' }), }, ]; return ( ); };