You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
Readarr/frontend/src/Store/Reducers/settingsReducers.js

351 lines
9.1 KiB

import _ from 'lodash';
import { handleActions } from 'redux-actions';
import getSectionState from 'Utilities/State/getSectionState';
import selectProviderSchema from 'Utilities/State/selectProviderSchema';
import updateSectionState from 'Utilities/State/updateSectionState';
import * as types from 'Store/Actions/actionTypes';
import createSetReducer from './Creators/createSetReducer';
import createSetSettingValueReducer from './Creators/createSetSettingValueReducer';
import createSetProviderFieldValueReducer from './Creators/createSetProviderFieldValueReducer';
import createClearPendingChangesReducer from './Creators/createClearPendingChangesReducer';
import createUpdateReducer from './Creators/createUpdateReducer';
import createUpdateItemReducer from './Creators/createUpdateItemReducer';
import createRemoveItemReducer from './Creators/createRemoveItemReducer';
import createReducers from './Creators/createReducers';
export const defaultState = {
ui: {
isFetching: false,
isPopulated: false,
error: null,
pendingChanges: {},
isSaving: false,
saveError: null,
item: {}
},
mediaManagement: {
isFetching: false,
isPopulated: false,
error: null,
pendingChanges: {},
isSaving: false,
saveError: null,
item: {}
},
naming: {
isFetching: false,
isPopulated: false,
error: null,
pendingChanges: {},
isSaving: false,
saveError: null,
item: {}
},
namingExamples: {
isFetching: false,
isPopulated: false,
error: null,
item: {}
},
qualityProfiles: {
isFetching: false,
isPopulated: false,
error: null,
isDeleting: false,
deleteError: null,
isFetchingSchema: false,
schemaPopulated: false,
schemaError: null,
schema: {},
isSaving: false,
saveError: null,
items: [],
pendingChanges: {}
},
languageProfiles: {
isFetching: false,
isPopulated: false,
error: null,
isDeleting: false,
deleteError: null,
isFetchingSchema: false,
schemaPopulated: false,
schemaError: null,
schema: {},
isSaving: false,
saveError: null,
items: [],
pendingChanges: {}
},
delayProfiles: {
isFetching: false,
isPopulated: false,
error: null,
items: [],
isSaving: false,
saveError: null,
pendingChanges: {}
},
qualityDefinitions: {
isFetching: false,
isPopulated: false,
error: null,
items: [],
isSaving: false,
saveError: null,
pendingChanges: {}
},
indexers: {
isFetching: false,
isPopulated: false,
error: null,
isFetchingSchema: false,
schemaPopulated: false,
schemaError: null,
schema: [],
selectedSchema: {},
isSaving: false,
saveError: null,
isTesting: false,
items: [],
pendingChanges: {}
},
indexerOptions: {
isFetching: false,
isPopulated: false,
error: null,
pendingChanges: {},
isSaving: false,
saveError: null,
item: {}
},
restrictions: {
isFetching: false,
isPopulated: false,
error: null,
isSaving: false,
saveError: null,
items: [],
pendingChanges: {}
},
downloadClients: {
isFetching: false,
isPopulated: false,
error: null,
isFetchingSchema: false,
schemaPopulated: false,
schemaError: null,
schema: [],
selectedSchema: {},
isSaving: false,
saveError: null,
isTesting: false,
items: [],
pendingChanges: {}
},
downloadClientOptions: {
isFetching: false,
isPopulated: false,
error: null,
pendingChanges: {},
isSaving: false,
saveError: null,
item: {}
},
remotePathMappings: {
isFetching: false,
isPopulated: false,
error: null,
items: [],
isSaving: false,
saveError: null,
pendingChanges: {}
},
notifications: {
isFetching: false,
isPopulated: false,
error: null,
isFetchingSchema: false,
schemaPopulated: false,
schemaError: null,
schema: [],
selectedSchema: {},
isSaving: false,
saveError: null,
isTesting: false,
items: [],
pendingChanges: {}
},
metadata: {
isFetching: false,
isPopulated: false,
error: null,
isSaving: false,
saveError: null,
items: [],
pendingChanges: {}
},
metadataProvider: {
isFetching: false,
isPopulated: false,
error: null,
pendingChanges: {},
isSaving: false,
saveError: null,
item: {}
},
general: {
isFetching: false,
isPopulated: false,
error: null,
pendingChanges: {},
isSaving: false,
saveError: null,
item: {}
},
advancedSettings: false
};
export const persistState = [
'settings.advancedSettings'
];
const propertyNames = [
'ui',
'mediaManagement',
'naming',
'namingExamples',
'qualityDefinitions',
'indexerOptions',
'downloadClientOptions',
'general',
'metadataProvider'
];
const providerPropertyNames = [
'qualityProfiles',
'languageProfiles',
'delayProfiles',
'indexers',
'restrictions',
'downloadClients',
'remotePathMappings',
'notifications',
'metadata'
];
const settingsReducers = handleActions({
[types.TOGGLE_ADVANCED_SETTINGS]: (state, { payload }) => {
return Object.assign({}, state, { advancedSettings: !state.advancedSettings });
},
[types.SET]: createReducers([...propertyNames, ...providerPropertyNames], createSetReducer),
[types.UPDATE]: createReducers([...propertyNames, ...providerPropertyNames], createUpdateReducer),
[types.UPDATE_ITEM]: createReducers(providerPropertyNames, createUpdateItemReducer),
[types.CLEAR_PENDING_CHANGES]: createReducers([...propertyNames, ...providerPropertyNames], createClearPendingChangesReducer),
[types.REMOVE_ITEM]: createReducers(providerPropertyNames, createRemoveItemReducer),
[types.SET_UI_SETTINGS_VALUE]: createSetSettingValueReducer('ui'),
[types.SET_MEDIA_MANAGEMENT_SETTINGS_VALUE]: createSetSettingValueReducer('mediaManagement'),
[types.SET_NAMING_SETTINGS_VALUE]: createSetSettingValueReducer('naming'),
[types.SET_QUALITY_PROFILE_VALUE]: createSetSettingValueReducer('qualityProfiles'),
[types.SET_LANGUAGE_PROFILE_VALUE]: createSetSettingValueReducer('languageProfiles'),
[types.SET_DELAY_PROFILE_VALUE]: createSetSettingValueReducer('delayProfiles'),
[types.SET_QUALITY_DEFINITION_VALUE]: function(state, { payload }) {
const section = 'qualityDefinitions';
const { id, name, value } = payload;
const newState = getSectionState(state, section);
newState.pendingChanges = _.cloneDeep(newState.pendingChanges);
const pendingState = newState.pendingChanges[id] || {};
const currentValue = _.find(newState.items, { id })[name];
if (currentValue === value) {
delete pendingState[name];
} else {
pendingState[name] = value;
}
if (_.isEmpty(pendingState)) {
delete newState.pendingChanges[id];
} else {
newState.pendingChanges[id] = pendingState;
}
return updateSectionState(state, section, newState);
},
[types.SET_INDEXER_VALUE]: createSetSettingValueReducer('indexers'),
[types.SET_INDEXER_FIELD_VALUE]: createSetProviderFieldValueReducer('indexers'),
[types.SET_INDEXER_OPTIONS_VALUE]: createSetSettingValueReducer('indexerOptions'),
[types.SET_RESTRICTION_VALUE]: createSetSettingValueReducer('restrictions'),
[types.SELECT_INDEXER_SCHEMA]: function(state, { payload }) {
return selectProviderSchema(state, 'indexers', payload, (selectedSchema) => {
selectedSchema.enableRss = selectedSchema.supportsRss;
selectedSchema.enableSearch = selectedSchema.supportsSearch;
return selectedSchema;
});
},
[types.SET_DOWNLOAD_CLIENT_VALUE]: createSetSettingValueReducer('downloadClients'),
[types.SET_DOWNLOAD_CLIENT_FIELD_VALUE]: createSetProviderFieldValueReducer('downloadClients'),
[types.SELECT_DOWNLOAD_CLIENT_SCHEMA]: function(state, { payload }) {
return selectProviderSchema(state, 'downloadClients', payload, (selectedSchema) => {
selectedSchema.enable = true;
return selectedSchema;
});
},
[types.SET_DOWNLOAD_CLIENT_OPTIONS_VALUE]: createSetSettingValueReducer('downloadClientOptions'),
[types.SET_REMOTE_PATH_MAPPING_VALUE]: createSetSettingValueReducer('remotePathMappings'),
[types.SET_NOTIFICATION_VALUE]: createSetSettingValueReducer('notifications'),
[types.SET_NOTIFICATION_FIELD_VALUE]: createSetProviderFieldValueReducer('notifications'),
[types.SELECT_NOTIFICATION_SCHEMA]: function(state, { payload }) {
return selectProviderSchema(state, 'notifications', payload, (selectedSchema) => {
selectedSchema.onGrab = selectedSchema.supportsOnGrab;
selectedSchema.onDownload = selectedSchema.supportsOnDownload;
selectedSchema.onUpgrade = selectedSchema.supportsOnUpgrade;
selectedSchema.onRename = selectedSchema.supportsOnRename;
return selectedSchema;
});
},
[types.SET_METADATA_VALUE]: createSetSettingValueReducer('metadata'),
[types.SET_METADATA_FIELD_VALUE]: createSetProviderFieldValueReducer('metadata'),
[types.SET_METADATA_PROVIDER_VALUE]: createSetSettingValueReducer('metadataProvider'),
[types.SET_GENERAL_SETTINGS_VALUE]: createSetSettingValueReducer('general')
}, defaultState);
export default settingsReducers;