afo-state
v1.0.4
Published
Already Figured Out State Bootstraps/provides helpers for reducers/state management. Use it to easily manage normalized relational data, such as from an RDB.
Downloads
9
Maintainers
Readme
Already Figured Out State
A convenient library for managing centralized state in Typescript/JS
Reducer Helper Functions
InsertOrUpdate
const state = {
entities: {
1: { id: 1, name: "one" },
3: { id: 3, name: "three" },
},
order: [1, 3],
};
const newObject = { id: 2, name: "two" };
const newState = insertOrUpdate(
state,
newObject
);
newState will now be:
{
entities: {
1: { id: 1, name: "one" },
3: { id: 3, name: "three" },
2: newObject,
},
order: [1, 3, 2],
}
InsertOrUpdateMultiple
const state = {
entities: {
1: { id: 1, name: "one" },
3: { id: 3, name: "three" },
},
order: [1, 3],
};
// object with id 2 does not exist yet
const newObject = { id: 2, name: "two" };
// object id 1 already exists in the store
const updatedObject = { id: 1, name: "Fancy new title" };
const newState = insertOrUpdateMultiple(
state,
[newObject, updatedObject]
);
newState will now be:
{
entities: {
1: { id: 1, name: "Fancy new title" },
3: { id: 3, name: "three" },
2: { id: 2, name: "two" },
},
order: [1, 3, 2],
}
Selector Functions
selectById
selectById will select entities by their id. If you only pass a single id (not wrapped in an array) it will return a single object. Note that this behavior does not apply to other select functions, because no other key is unique
const state = {
entities: {
1: { id: 1, name: "one" },
2: { id: 2, name: "two" },
3: { id: 3, name: "three" },
},
order: [1, 2, 3],
};
// returns { id: 1, name: "one" }
const singleResultId = selectById(state, 1);
// returns [ { id: 2, name: "two" }, { id: 3, name: "three" } ]
const multiIdResult = selectById(state, [2,3]);
// returns undefined
const noResult = selectByFunction(state, 5);
selectByProp
selectByProp will select from the store according to a filter function. The function receives the object, the larger store, and the index of the object in the order
const state = {
entities: {
1: { id: 1, name: "one" },
2: { id: 2, name: "two" },
3: { id: 3, name: "three" },
},
order: [1, 2, 3],
};
// returns [{ id: 1, name: "one" }]
const singleResultId = selectByProp(state, id, 1);
// returns [ { id: 2, name: "two" }, { id: 3, name: "three" } ]
const multiplePropValues = selectByProp(state, "name", ["two","three"]);
// returns []
const noResult = selectByProp(state, ({ id }) => id == 5);
selectByFunction
selectByFunction will select from the store according to a filter function. The function receives the object, the larger store, and the index of the object in the order
const state = {
entities: {
1: { id: 1, name: "one" },
2: { id: 2, name: "two" },
3: { id: 3, name: "three" },
},
order: [1, 2, 3],
};
// returns [{ id: 1, name: "one" }]
const singleResultId = selectByFunction(state, ({ id }) => id == 1);
// returns [ { id: 2, name: "two" }, { id: 3, name: "three" } ]
const multiResult = selectByFunction(state, ({ id }) => id > 1);
// returns []
const noResult = selectByFunction(state, ({ id }) => id == 5);