UNPKG

@snipsonian/observable-state

Version:

Observable-state snippets (redux-like)

61 lines (60 loc) 2.54 kB
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, } }); }, }; }