@data-client/core
Version:
Async State Management without the Management. REST, GraphQL, SSE, Websockets, Fetch
46 lines (43 loc) • 1.26 kB
text/typescript
import { normalize } from '@data-client/normalizr';
import Controller from '../../controller/Controller.js';
import type { State, SetAction } from '../../types.js';
export function setReducer(
state: State<unknown>,
action: SetAction,
controller: Controller,
) {
let value: any;
if (typeof action.value === 'function') {
const previousValue = controller.get(action.schema, ...action.args, state);
if (previousValue === undefined) return state;
value = action.value(previousValue);
} else {
value = action.value;
}
try {
const { entities, indexes, entityMeta } = normalize(
action.schema,
value,
action.args,
state,
action.meta,
);
return {
entities,
endpoints: state.endpoints,
indexes,
meta: state.meta,
entityMeta,
optimistic: state.optimistic,
lastReset: state.lastReset,
};
// reducer must update the state, so in case of processing errors we simply compute the endpoints inline
} catch (error: any) {
// this is not always bubbled up, so let's double sure this doesn't fail silently
/* istanbul ignore else */
if (process.env.NODE_ENV !== 'production') {
console.error(error);
}
return state;
}
}