feathers-redux-immutable

An immutable, redux data store for FeathersJS services.
Install
npm install feathers-redux-immutable --save
Usage
import reduxifyServices from 'feathers-redux-immutable';
const feathersClient = feathers()...;
const services = reduxifyServices(feathersClient, ['messages', 'users']);
export default combineReducers({
messages: services.messages.reducer,
users: services.users.reducer,
});
store.dispatch(services.messages.get('557XxUL8PalGMgOo'));
Action creators
reduxifyServices returns an object with the shape:
{
messages: {
create(data, params) {},
update(id, data, params) {},
patch(id, data, params) {},
remove(id, params) {},
find(params) {},
get(id, params) {},
store(object) {},
reset() {},
reducer() {},
},
users: { ... },
}
Service calls can be dispatched by:
dispatch(services.messages.create(data, params));
Shape of the store
The usage example code produces a Redux state with the shape:
state = {
messages: {
isLoading: boolean,
isSaving: boolean,
isFinished: boolean,
isError: Feathers error,
data: hook.result,
queryResult: hook.result,
},
users: { ... },
};
If integrating with feathers-offline-realtime-immutable, the state will be decorated with these additional properties:
state = {
messages: {
store: {
connected: boolean,
last: {
action: string,
eventName: string,
records: object,
},
records: [ objects ],
},
},
users: { ... },
}
Replication Engine Integration
const Realtime = require('feathers-offline-realtime-immutable');
const messages = feathersClient.service('/messages');
const messagesRealtime = new Realtime(messages, { subscriber: (records, last) => {
store.dispatch(services.messages.store({ connected: messagesRealtime.connected, last, records }));
} });
Why Immutable?
Immutable objects allow for shallow equality checking.
If you're using React to render your application, you can increase performance by utilizing a shallow comparison (as opposed to a more expensive deep object comparison) in the shouldComponentUpdate lifecycle method. The behavior is the default when extending from React.PureComponent.
This implementation uses timm, which uses plain JS objects.
Acknowledgements
License
MIT