entity-state-adapter v0.1.4
Entity-state-adapter
Entity State adapter for managing record collections (based on @ngrx/entitywork with redux and useReducer hooks
Entity-state-adapter provides an API to manipulate and query entity collections.
Reduces boilerplate for creating reducers that manage a collection of models. Provides performant CRUD operations for managing entity collections. Extensible adapters for selecting entity information.
usage
Installation
npm i entity-state-adapteror
yarn add entity-state-adapterThe initialisation
import { createEntityAdapter } from "entity-state-adapter";
export function selectUserId(a) {
//In this case this would be optional since primary key is id
return a.id;
}
export function sortByName(a, b): number {
return a.name.localeCompare(b.name);
}
export const adapter = createEntityAdapter({
selectId: selectUserId,
sortComparer: sortByName
});Adapter Collection Methods
The entity adapter also provides methods for operations against an entity. These methods can change one to many records at a time. Each method returns the newly modified state if changes were made and the same state if no changes were made.
addOne: Add one entity to the collectionaddMany: Add multiple entities to the collectionaddAll: Replace current collection with provided collectionremoveOne: Remove one entity from the collectionremoveMany: Remove multiple entities from the collection, by id or by predicateremoveAll: Clear entity collectionupdateOne: Update one entity in the collectionupdateMany: Update multiple entities in the collectionupsertOne: Add or Update one entity in the collectionupsertMany: Add or Update multiple entities in the collectionmap: Update multiple entities in the collection by defining a map function, similar to Array.map
The initialState is always required and must be create with adapter.getInitialState({otherState: optional})
export const userInitialState = adapter.getInitialState({});
const [users, dispatch] = useReducer(
userReducer,
userInitialState,
state => state
);And the reducer
export function userReducer(state, action) {
switch (action.type) {
case ADD_ALL:
return adapter.addMany(action.payload.users, state);
case ADD_ONE:
return adapter.addOne(action.payload.user, state);
case UPSERT_ONE:
return adapter.upsertOne(action.payload.user, state);
case UPSERT_ALL:
return adapter.upsertUsers(action.payload.users, state);
case UPDATE_ONE:
return adapter.updateOne(action.payload.user, state);
case UPDATE_ALL:
return adapter.updateMany(action.payload.users, state);
case MAP_ALL:
return adapter.map(action.payload.entityMap, state);
case DELETE_ONE:
return adapter.removeOne(action.payload.id, state);
case DELETE_ALL_BY_IDS:
return adapter.removeMany(action.payload.ids, state);
case DELETE_ALL_BY_PREDICAT:
return adapter.removeMany(action.payload.predicate, state);
case CLEAR_SELECTED_USER:
return adapter.removeAll({ ...state, selectedUserId: null });
default:
return state;
}
}Paix et Guerisons - with 💘 Thony