Sonarr/frontend/src/Settings/General/GeneralSettings.js

222 lines
6.0 KiB
JavaScript
Raw Normal View History

2018-01-13 02:01:27 +00:00
import _ from 'lodash';
import PropTypes from 'prop-types';
import React, { Component } from 'react';
2023-06-20 20:02:28 +00:00
import Alert from 'Components/Alert';
2022-05-20 04:15:43 +00:00
import Form from 'Components/Form/Form';
2018-01-13 02:01:27 +00:00
import LoadingIndicator from 'Components/Loading/LoadingIndicator';
2022-05-20 04:15:43 +00:00
import ConfirmModal from 'Components/Modal/ConfirmModal';
2018-01-13 02:01:27 +00:00
import PageContent from 'Components/Page/PageContent';
import PageContentBody from 'Components/Page/PageContentBody';
2022-05-20 04:15:43 +00:00
import { kinds } from 'Helpers/Props';
2018-01-13 02:01:27 +00:00
import SettingsToolbarConnector from 'Settings/SettingsToolbarConnector';
2023-07-22 19:14:33 +00:00
import translate from 'Utilities/String/translate';
2018-01-13 02:01:27 +00:00
import AnalyticSettings from './AnalyticSettings';
import BackupSettings from './BackupSettings';
import HostSettings from './HostSettings';
import LoggingSettings from './LoggingSettings';
import ProxySettings from './ProxySettings';
import SecuritySettings from './SecuritySettings';
import UpdateSettings from './UpdateSettings';
const requiresRestartKeys = [
'bindAddress',
'port',
'urlBase',
2022-05-12 16:10:10 +00:00
'instanceName',
'enableSsl',
'sslPort',
'sslCertHash',
'sslCertPassword'
];
2018-01-13 02:01:27 +00:00
class GeneralSettings extends Component {
//
// Lifecycle
constructor(props, context) {
super(props, context);
this.state = {
isRestartRequiredModalOpen: false
};
}
componentDidUpdate(prevProps) {
const {
settings,
isSaving,
saveError,
isResettingApiKey
2018-01-13 02:01:27 +00:00
} = this.props;
if (!isResettingApiKey && prevProps.isResettingApiKey) {
this.setState({ isRestartRequiredModalOpen: true });
return;
}
2018-01-13 02:01:27 +00:00
if (isSaving || saveError || !prevProps.isSaving) {
return;
}
const prevSettings = prevProps.settings;
const pendingRestart = _.some(requiresRestartKeys, (key) => {
2018-01-13 02:01:27 +00:00
const setting = settings[key];
const prevSetting = prevSettings[key];
if (!setting || !prevSetting) {
return false;
}
const previousValue = prevSetting.previousValue;
const value = setting.value;
return previousValue != null && previousValue !== value;
});
this.setState({ isRestartRequiredModalOpen: pendingRestart });
}
//
// Listeners
onConfirmRestart = () => {
this.setState({ isRestartRequiredModalOpen: false });
this.props.onConfirmRestart();
2022-05-20 04:15:43 +00:00
};
2018-01-13 02:01:27 +00:00
onCloseRestartRequiredModalOpen = () => {
this.setState({ isRestartRequiredModalOpen: false });
2022-05-20 04:15:43 +00:00
};
2018-01-13 02:01:27 +00:00
//
// Render
render() {
const {
advancedSettings,
isFetching,
isPopulated,
error,
settings,
hasSettings,
isResettingApiKey,
isWindows,
isWindowsService,
2018-01-13 02:01:27 +00:00
mode,
2018-11-25 22:40:25 +00:00
packageUpdateMechanism,
2018-01-13 02:01:27 +00:00
onInputChange,
onConfirmResetApiKey,
...otherProps
} = this.props;
return (
2023-07-22 19:14:33 +00:00
<PageContent title={translate('GeneralSettings')}>
2018-01-13 02:01:27 +00:00
<SettingsToolbarConnector
{...otherProps}
/>
<PageContentBody>
2018-01-13 02:01:27 +00:00
{
isFetching && !isPopulated &&
<LoadingIndicator />
}
{
!isFetching && error &&
2023-07-22 19:14:33 +00:00
<Alert kind={kinds.DANGER}>
{translate('GeneralSettingsLoadError')}
</Alert>
2018-01-13 02:01:27 +00:00
}
{
hasSettings && isPopulated && !error &&
<Form
id="generalSettings"
{...otherProps}
>
<HostSettings
advancedSettings={advancedSettings}
settings={settings}
isWindows={isWindows}
mode={mode}
onInputChange={onInputChange}
/>
<SecuritySettings
settings={settings}
isResettingApiKey={isResettingApiKey}
onInputChange={onInputChange}
onConfirmResetApiKey={onConfirmResetApiKey}
/>
<ProxySettings
settings={settings}
onInputChange={onInputChange}
/>
<LoggingSettings
settings={settings}
onInputChange={onInputChange}
/>
<AnalyticSettings
settings={settings}
onInputChange={onInputChange}
/>
<UpdateSettings
advancedSettings={advancedSettings}
settings={settings}
2022-05-30 01:07:45 +00:00
isWindows={isWindows}
2018-11-25 22:40:25 +00:00
packageUpdateMechanism={packageUpdateMechanism}
2018-01-13 02:01:27 +00:00
onInputChange={onInputChange}
/>
<BackupSettings
advancedSettings={advancedSettings}
settings={settings}
onInputChange={onInputChange}
/>
</Form>
}
</PageContentBody>
2018-01-13 02:01:27 +00:00
<ConfirmModal
isOpen={this.state.isRestartRequiredModalOpen}
kind={kinds.DANGER}
2023-07-22 19:14:33 +00:00
title={translate('RestartSonarr')}
message={`${translate('RestartRequiredToApplyChanges')} ${isWindowsService ? translate('RestartRequiredWindowsService') : ''}`}
cancelLabel={translate('RestartLater')}
confirmLabel={translate('RestartNow')}
2018-01-13 02:01:27 +00:00
onConfirm={this.onConfirmRestart}
onCancel={this.onCloseRestartRequiredModalOpen}
/>
</PageContent>
);
}
}
GeneralSettings.propTypes = {
advancedSettings: PropTypes.bool.isRequired,
isFetching: PropTypes.bool.isRequired,
isPopulated: PropTypes.bool.isRequired,
error: PropTypes.object,
isSaving: PropTypes.bool.isRequired,
saveError: PropTypes.object,
settings: PropTypes.object.isRequired,
isResettingApiKey: PropTypes.bool.isRequired,
hasSettings: PropTypes.bool.isRequired,
isWindows: PropTypes.bool.isRequired,
isWindowsService: PropTypes.bool.isRequired,
2018-01-13 02:01:27 +00:00
mode: PropTypes.string.isRequired,
2018-11-25 22:40:25 +00:00
packageUpdateMechanism: PropTypes.string.isRequired,
2018-01-13 02:01:27 +00:00
onInputChange: PropTypes.func.isRequired,
onConfirmResetApiKey: PropTypes.func.isRequired,
onConfirmRestart: PropTypes.func.isRequired
};
export default GeneralSettings;