1
0
mirror of https://github.com/Radarr/Radarr.git synced 2026-03-05 13:21:25 -05:00
Files
Radarr/frontend/src/Store/Selectors/createProviderSettingsSelector.ts
Mark McDowall 3945a2eeb8 Convert Indexer settings to TypeScript
(cherry picked from commit 6e008a8e855e67bb14b0e04bdb9042eebcacb59f)
2025-06-04 15:57:46 +03:00

106 lines
2.5 KiB
TypeScript

import { createSelector } from 'reselect';
import ModelBase from 'App/ModelBase';
import {
AppSectionItemSchemaState,
AppSectionProviderState,
AppSectionSchemaState,
} from 'App/State/AppSectionState';
import AppState from 'App/State/AppState';
import selectSettings, {
ModelBaseSetting,
} from 'Store/Selectors/selectSettings';
import { PendingSection } from 'typings/pending';
import getSectionState from 'Utilities/State/getSectionState';
type SchemaState<T> = AppSectionSchemaState<T> | AppSectionItemSchemaState<T>;
function selector<
T extends ModelBaseSetting,
S extends AppSectionProviderState<T> & SchemaState<T>
>(id: number | undefined, section: S) {
if (id) {
const {
isFetching,
isPopulated,
error,
isSaving,
saveError,
isTesting,
pendingChanges,
} = section;
const item = section.items.find((i) => i.id === id)!;
const settings = selectSettings<T>(item, pendingChanges, saveError);
return {
isFetching,
isPopulated,
error,
isSaving,
saveError,
isTesting,
...settings,
item: settings.settings,
};
}
const item =
'selectedSchema' in section
? section.selectedSchema
: (section.schema as T);
const settings = selectSettings(
Object.assign({ name: '' }, item),
section.pendingChanges ?? {},
section.saveError
);
const {
isSchemaFetching: isFetching,
isSchemaPopulated: isPopulated,
schemaError: error,
isSaving,
saveError,
isTesting,
pendingChanges,
} = section;
return {
isFetching,
isPopulated,
error,
isSaving,
saveError,
isTesting,
...settings,
pendingChanges,
item: settings.settings as PendingSection<T>,
};
}
export default function createProviderSettingsSelector<
T extends ModelBase,
S extends AppSectionProviderState<T> & SchemaState<T>
>(sectionName: string) {
// @ts-expect-error - This isn't fully typed
return createSelector(
(_state: AppState, { id }: { id: number }) => id,
(state) => state.settings[sectionName] as S,
(id: number, section: S) => selector(id, section)
);
}
export function createProviderSettingsSelectorHook<
T extends ModelBaseSetting,
S extends AppSectionProviderState<T> & SchemaState<T>
>(sectionName: string, id: number | undefined) {
return createSelector(
(state: AppState) => state.settings,
(state) => {
const sectionState = getSectionState(state, sectionName, false) as S;
return selector<T, S>(id, sectionState);
}
);
}