import { ItemSelector, EntityItemCommon } from 'interfaces'; // action types export const SUCCESS_ADD_ITEM: 'SUCCESS_ADD_ITEM' = 'SUCCESS_ADD_ITEM'; export const SUCCESS_UPDATE_ITEM: 'SUCCESS_UPDATE_ITEM' = 'SUCCESS_UPDATE_ITEM'; export const SUCCESS_DELETE_ITEM: 'SUCCESS_DELETE_ITEM' = 'SUCCESS_DELETE_ITEM'; export const SUCCESS_FETCH_ITEM: 'SUCCESS_FETCH_ITEM' = 'SUCCESS_FETCH_ITEM'; export const SUCCESS_FETCH_LIST: 'SUCCESS_FETCH_LIST' = 'SUCCESS_FETCH_LIST'; export const SUCCESS_QUERY_LIST: 'SUCCESS_QUERY_LIST' = 'SUCCESS_QUERY_LIST'; // Action types export type SuccessAddItem = { type: typeof SUCCESS_ADD_ITEM, payload: { entityType: string, id: string, entityItem: any } }; export type SuccessUpdateItem = { type: typeof SUCCESS_UPDATE_ITEM, payload: { entityType: string, id: string, entityItem: any } }; export type SuccessDeleteItem = { type: typeof SUCCESS_DELETE_ITEM, payload: { entityType: string, id: string, entityItem: any } }; export type SuccessFetchItemAction = { type: typeof SUCCESS_FETCH_ITEM, payload: { entityType: string, id: string, entityItem: any, } }; export type SuccessFetchListAction = { type: typeof SUCCESS_FETCH_LIST, payload: { entityType: string, orderBy: string, ids: Array, itemListById: { [id: string]: any }, needResetList: boolean } }; export type SuccessQueryListAction = { type: typeof SUCCESS_QUERY_LIST, payload: { entityType: string, queryName: string, ids: Array, // ordered itemListById: { [id: string]: any }, needResetList: boolean } }; // Action creators export function successAddItem( itemSelector: ItemSelector, entityItem: any ): SuccessAddItem { return { type: SUCCESS_ADD_ITEM, payload: { entityType: itemSelector.entityType, id: itemSelector.id, entityItem } }; } export function successUpdateItem( itemSelector: ItemSelector, entityItem: any ): SuccessUpdateItem { return { type: SUCCESS_UPDATE_ITEM, payload: { entityType: itemSelector.entityType, id: itemSelector.id, entityItem } }; } export function successDeleteItem( itemSelector: ItemSelector, entityItem: Object ): SuccessDeleteItem { return { type: SUCCESS_DELETE_ITEM, payload: { entityType: itemSelector.entityType, id: itemSelector.id, entityItem } }; } export function successFetchItem( itemSelector: ItemSelector, entityItem: any ): SuccessFetchItemAction { return { type: SUCCESS_FETCH_ITEM, payload: { entityType: itemSelector.entityType, id: itemSelector.id, entityItem: { ...entityItem, id: itemSelector.id } } }; } export function successFetchList( entityType: string, orderBy: string, ids: Array, itemListById: { [id:string]: EntityItemCommon }, needResetList: boolean = false ): SuccessFetchListAction { const idAddedItemListById = Object.keys(itemListById) .reduce( (result, key) => ({ ...result, [key]: { ...itemListById[key], id: key } }), {} ); return { type: SUCCESS_FETCH_LIST, payload: { entityType, orderBy, ids, itemListById: idAddedItemListById, needResetList } }; } export function successQueryList( entityType: string, queryName: string, ids: Array, itemListById: { [id:string]: EntityItemCommon }, needResetList: boolean = false ): SuccessQueryListAction { const idAddedItemListById = Object.keys(itemListById) .reduce( (result, key) => ({ ...result, [key]: { ...itemListById[key], id: key } }), {} ); return { type: SUCCESS_QUERY_LIST, payload: { entityType, queryName, ids, itemListById: idAddedItemListById, needResetList } }; }