import isElectron from 'is-electron'; import { memo } from 'react'; 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 = memo(() => { const { t } = useTranslation(); const settings = useLyricsSettings(); const { setSettings } = useSettingsStoreActions(); const updateSetting = (updates: Partial) => { setSettings({ lyrics: { ...settings, ...updates, }, }); }; const lyricOptions: SettingOption[] = [ { control: ( updateSetting({ follow: e.currentTarget.checked })} /> ), description: t('setting.followLyric', { context: 'description', }), title: t('setting.followLyric'), }, { control: ( updateSetting({ preferLocalLyrics: e.currentTarget.checked })} /> ), description: t('setting.preferLocalLyrics', { context: 'description', }), isHidden: !isElectron(), title: t('setting.preferLocalLyrics'), }, { control: ( updateSetting({ fetch: e.currentTarget.checked })} /> ), description: t('setting.lyricFetch', { context: 'description', }), isHidden: !isElectron(), title: t('setting.lyricFetch'), }, { control: ( { localSettings?.set('lyrics', e); updateSetting({ sources: e.map((source) => source as LyricSource) }); }} width={300} /> ), description: t('setting.lyricFetchProvider', { context: 'description', }), isHidden: !isElectron(), title: t('setting.lyricFetchProvider'), }, { control: ( updateSetting({ enableFurigana: e.currentTarget.checked })} /> ), description: t('setting.enableFurigana', { context: 'description', }), isHidden: !isElectron(), title: t('setting.enableFurigana'), }, { control: ( { const isChecked = e.currentTarget.checked; updateSetting({ enableNeteaseTranslation: isChecked }); localSettings?.set('enableNeteaseTranslation', isChecked); }} /> ), description: t('setting.neteaseTranslation', { context: 'description', }), isHidden: !isElectron(), title: t('setting.neteaseTranslation'), }, { control: ( { const value = Number(e.currentTarget.value); updateSetting({ delayMs: value }); }} step={10} width={100} /> ), description: t('setting.lyricOffset', { context: 'description', }), isHidden: !isElectron(), title: t('setting.lyricOffset'), }, { control: ( { updateSetting({ translationApiProvider: value }); }} value={settings.translationApiProvider} /> ), description: t('setting.translationApiProvider', { context: 'description', }), isHidden: !isElectron(), title: t('setting.translationApiProvider'), }, { control: ( { updateSetting({ translationApiKey: e.currentTarget.value }); }} value={settings.translationApiKey} /> ), description: t('setting.translationApiKey', { context: 'description', }), isHidden: !isElectron(), title: t('setting.translationApiKey'), }, { control: ( updateSetting({ enableAutoTranslation: e.currentTarget.checked }) } /> ), description: t('setting.enableAutoTranslation', { context: 'description', }), isHidden: !isElectron(), title: t('setting.enableAutoTranslation'), }, ]; return ; });