...
This commit is contained in:
parent
065126c761
commit
76c577ce6c
|
@ -9,6 +9,10 @@ import type {
|
||||||
ObjectReducerBehaviorsConfig,
|
ObjectReducerBehaviorsConfig,
|
||||||
ObjectReducerBehaviors,
|
ObjectReducerBehaviors,
|
||||||
} from './reducers/objectReducer';
|
} from './reducers/objectReducer';
|
||||||
|
import type {
|
||||||
|
StructureType,
|
||||||
|
PrimitiveType,
|
||||||
|
} from './structure';
|
||||||
|
|
||||||
//==============================
|
//==============================
|
||||||
// Flow types
|
// Flow types
|
||||||
|
@ -62,3 +66,12 @@ export function createReducerBehaviors(behaviorsConfig: ReducerBehaviorsConfig,
|
||||||
[`${locationString}.${name}`]: behavior.reducer,
|
[`${locationString}.${name}`]: behavior.reducer,
|
||||||
}), {});
|
}), {});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export function calculateDefaults(typeDescription: StructureType | PrimitiveType) {
|
||||||
|
const { type, structure = {}} = typeDescription;
|
||||||
|
if ([PROP_TYPES.array, PROP_TYPES.shape].find(type))
|
||||||
|
return reduce(reducerStructure, (memo, propValue, propName) => ({
|
||||||
|
...memo,
|
||||||
|
[propName]: propValue().defaultValue,
|
||||||
|
}), {});
|
||||||
|
}
|
||||||
|
|
|
@ -47,7 +47,7 @@ function checkIndex(state: Object, payload: any, behaviorName: string): boolean
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
const DEFAULT_OBJECT_BEHAVIORS: ArrayReducerBehaviorsConfig = {
|
const DEFAULT_ARRAY_BEHAVIORS: ArrayReducerBehaviorsConfig = {
|
||||||
updateAtIndex: {
|
updateAtIndex: {
|
||||||
action(value) { return value },
|
action(value) { return value },
|
||||||
reducer(state, payload, initialState, index) {
|
reducer(state, payload, initialState, index) {
|
||||||
|
@ -95,29 +95,24 @@ export function createArrayReducer(reducerShape: StructureType, {
|
||||||
locationString
|
locationString
|
||||||
}: ArrayReducerOptions = {}) {
|
}: ArrayReducerOptions = {}) {
|
||||||
return {
|
return {
|
||||||
reducers: createReducer(reducerShape, createReducerBehaviors(DEFAULT_OBJECT_BEHAVIORS, locationString)),
|
reducers: createReducer(reducerShape, createReducerBehaviors(DEFAULT_ARRAY_BEHAVIORS, locationString)),
|
||||||
actionsObject: createActions(DEFAULT_OBJECT_BEHAVIORS, locationString, {}),
|
actionsObject: createActions(DEFAULT_ARRAY_BEHAVIORS, locationString, {}),
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
function calculateDefaults(reducerStructure) {
|
|
||||||
return reduce(reducerStructure, (memo, propValue, propName) => ({
|
|
||||||
...memo,
|
|
||||||
[propName]: propValue().defaultValue,
|
|
||||||
}), {});
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
function createReducer(arrayStructure: StructureType, behaviors: ArrayReducerBehaviors): ArrayReducer {
|
|
||||||
const initialState = calculateDefaults(arrayStructure().structure);
|
function createReducer(arrayTypeDescription: StructureType, behaviors: ArrayReducerBehaviors): ArrayReducer {
|
||||||
|
const initialState = calculateDefaults(arrayTypeDescription);
|
||||||
return (state = initialState, { type, payload }: ArrayReducerAction) => {
|
return (state = initialState, { type, payload }: ArrayReducerAction) => {
|
||||||
//If the action type does not match any of the specified behaviors, just return the current state.
|
//If the action type does not match any of the specified behaviors, just return the current state.
|
||||||
if (!behaviors[type]) return state;
|
if (!behaviors[type]) return state;
|
||||||
|
|
||||||
//Sanitize the payload using the reducer shape, then apply the sanitized
|
//Sanitize the payload using the reducer shape, then apply the sanitized
|
||||||
//payload to the state using the behavior linked to this action type.
|
//payload to the state using the behavior linked to this action type.
|
||||||
return behaviors[type](state, validateArray(arrayStructure, payload), initialState);
|
return behaviors[type](state, validateArray(arrayTypeDescription, payload), initialState);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue