feishin/src/renderer/features/settings/components/playback/lyric-settings.tsx

189 lines
6.3 KiB
TypeScript
Raw Normal View History

import isElectron from 'is-electron';
import { useTranslation } from 'react-i18next';
import styled from 'styled-components';
import { languages } from '/@/i18n/i18n';
import { LyricSource } from '/@/renderer/api/types';
import {
MultiSelect,
MultiSelectProps,
NumberInput,
Select,
Switch,
TextInput,
} from '/@/renderer/components';
import {
SettingOption,
SettingsSection,
} from '/@/renderer/features/settings/components/settings-section';
import { useLyricsSettings, useSettingsStoreActions } from '/@/renderer/store';
const localSettings = isElectron() ? window.api.localSettings : null;
const WorkingButtonSelect = styled(MultiSelect)<MultiSelectProps>`
2023-07-01 19:10:05 -07:00
& button {
padding: 0;
}
`;
export const LyricSettings = () => {
const { t } = useTranslation();
2023-07-01 19:10:05 -07:00
const settings = useLyricsSettings();
const { setSettings } = useSettingsStoreActions();
2023-07-01 19:10:05 -07:00
const lyricOptions: SettingOption[] = [
{
control: (
<Switch
aria-label="Follow lyrics"
defaultChecked={settings.follow}
onChange={(e) => {
setSettings({
lyrics: {
...settings,
follow: e.currentTarget.checked,
},
});
}}
/>
),
description: t('setting.followLyric', {
context: 'description',
postProcess: 'sentenceCase',
}),
title: t('setting.followLyric', { postProcess: 'sentenceCase' }),
2023-07-01 19:10:05 -07:00
},
{
control: (
<Switch
aria-label="Enable fetching lyrics"
defaultChecked={settings.fetch}
onChange={(e) => {
setSettings({
lyrics: {
...settings,
fetch: e.currentTarget.checked,
},
});
}}
/>
),
description: t('setting.lyricFetch', {
context: 'description',
postProcess: 'sentenceCase',
}),
2023-07-01 19:10:05 -07:00
isHidden: !isElectron(),
title: t('setting.lyricFetch', { postProcess: 'sentenceCase' }),
2023-07-01 19:10:05 -07:00
},
{
control: (
<WorkingButtonSelect
aria-label="Lyric providers"
clearable
2023-07-01 19:10:05 -07:00
data={Object.values(LyricSource)}
defaultValue={settings.sources}
onChange={(e: LyricSource[]) => {
localSettings?.set('lyrics', e);
setSettings({
lyrics: {
...settings,
sources: e,
},
});
}}
width={300}
2023-07-01 19:10:05 -07:00
/>
),
description: t('setting.lyricFetchProvider', {
context: 'description',
postProcess: 'sentenceCase',
}),
2023-07-01 19:10:05 -07:00
isHidden: !isElectron(),
title: t('setting.lyricFetchProvider', { postProcess: 'sentenceCase' }),
2023-07-01 19:10:05 -07:00
},
{
control: (
<NumberInput
defaultValue={settings.delayMs}
onBlur={(e) => {
const value = Number(e.currentTarget.value);
setSettings({
lyrics: {
...settings,
delayMs: value,
},
});
}}
step={10}
width={100}
2023-07-01 19:10:05 -07:00
/>
),
description: t('setting.lyricOffset', {
context: 'description',
postProcess: 'sentenceCase',
}),
2023-07-01 19:10:05 -07:00
isHidden: !isElectron(),
title: t('setting.lyricOffset', { postProcess: 'sentenceCase' }),
2023-07-01 19:10:05 -07:00
},
{
control: (
<Select
data={languages}
onChange={(value) => {
setSettings({ lyrics: { ...settings, translationTargetLanguage: value } });
}}
value={settings.translationTargetLanguage}
/>
),
description: t('setting.translationTargetLanguage', {
context: 'description',
postProcess: 'sentenceCase',
}),
isHidden: !isElectron(),
title: t('setting.translationTargetLanguage', { postProcess: 'sentenceCase' }),
},
{
control: (
<Select
data={['Microsoft Azure', 'Google Cloud']}
onChange={(value) => {
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: (
<TextInput
onChange={(e) => {
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' }),
},
2023-07-01 19:10:05 -07:00
];
return (
<SettingsSection
divider={false}
options={lyricOptions}
/>
);
};