@snipsonian/observable-state
Version:
Observable-state snippets (redux-like)
61 lines (60 loc) • 2.54 kB
JavaScript
import { AsyncOperation, AsyncStatus, } from './types';
export const asyncEntityFetch = initAsyncEntityUpdaters(AsyncOperation.fetch);
export const asyncEntityCreate = initAsyncEntityUpdaters(AsyncOperation.create);
export const asyncEntityUpdate = initAsyncEntityUpdaters(AsyncOperation.update);
export const asyncEntityRemove = initAsyncEntityUpdaters(AsyncOperation.remove);
export const ASYNC_OPERATION_2_ASYNC_ENTITY_UPDATERS = {
[AsyncOperation.fetch]: asyncEntityFetch,
[AsyncOperation.create]: asyncEntityCreate,
[AsyncOperation.update]: asyncEntityUpdate,
[AsyncOperation.remove]: asyncEntityRemove,
};
export function initAsyncEntityUpdaters(operation) {
return {
trigger(entity, initialData) {
return Object.assign(Object.assign({}, entity), { data: initialData, [operation]: {
status: AsyncStatus.Busy,
error: null,
} });
},
triggerWithoutDataReset(entity) {
return Object.assign(Object.assign({}, entity), { [operation]: {
status: AsyncStatus.Busy,
error: null,
} });
},
succeeded(entity, data) {
return Object.assign(Object.assign({}, entity), { data, [operation]: {
status: AsyncStatus.Success,
error: null,
} });
},
succeededWithoutDataSet(entity) {
return Object.assign(Object.assign({}, entity), { [operation]: {
status: AsyncStatus.Success,
error: null,
} });
},
failed(entity, error) {
return Object.assign(Object.assign({}, entity), { [operation]: {
status: AsyncStatus.Error,
error,
} });
},
cancel(entity) {
return Object.assign(Object.assign({}, entity), { [operation]: Object.assign(Object.assign({}, entity[operation]), { status: AsyncStatus.Initial }) });
},
reset(entity, initialData) {
return Object.assign(Object.assign({}, entity), { data: initialData, [operation]: {
status: AsyncStatus.Initial,
error: null,
} });
},
resetWithoutDataReset(entity) {
return Object.assign(Object.assign({}, entity), { [operation]: {
status: AsyncStatus.Initial,
error: null,
} });
},
};
}