decap-cms-core
Version:
Decap CMS core application, see decap-cms package for the main distribution.
60 lines (51 loc) • 1.82 kB
text/typescript
import { fromJS } from 'immutable';
import { CONFIG_SUCCESS } from '../actions/config';
import type { ConfigAction } from '../actions/config';
import type { Integrations, CmsConfig } from '../types/redux';
interface Acc {
providers: Record<string, {}>;
hooks: Record<string, string | Record<string, string>>;
}
export function getIntegrations(config: CmsConfig) {
const integrations = config.integrations || [];
const newState = integrations.reduce(
(acc, integration) => {
const { hooks, collections, provider, ...providerData } = integration;
acc.providers[provider] = { ...providerData };
if (!collections) {
hooks.forEach(hook => {
acc.hooks[hook] = provider;
});
return acc;
}
const integrationCollections =
collections === '*' ? config.collections.map(collection => collection.name) : collections;
integrationCollections.forEach(collection => {
hooks.forEach(hook => {
acc.hooks[collection]
? ((acc.hooks[collection] as Record<string, string>)[hook] = provider)
: (acc.hooks[collection] = { [hook]: provider });
});
});
return acc;
},
{ providers: {}, hooks: {} } as Acc,
);
return fromJS(newState);
}
const defaultState = fromJS({ providers: {}, hooks: {} });
function integrations(state = defaultState, action: ConfigAction): Integrations | null {
switch (action.type) {
case CONFIG_SUCCESS: {
return getIntegrations(action.payload);
}
default:
return state;
}
}
export function selectIntegration(state: Integrations, collection: string | null, hook: string) {
return collection
? state.getIn(['hooks', collection, hook], false)
: state.getIn(['hooks', hook], false);
}
export default integrations;