npm install redux-persist-pouchdb
import PouchDB from 'pouchdb';
import { createStore } from 'redux';
import { persistStore, persistReducer } from 'redux-persist';
import PouchDBStorage from 'redux-persist-pouchdb';
// the usual PouchDB stuff
PouchDB.plugin( require( 'pouchdb-adapter-memory' ) );
const pouchdb = new PouchDB( 'test', { adapter: 'memory' } );
const storage = new PouchDBStorage(pouchdb);
// your regular reducer
const reducer = function( state={ i: 0 }, action ) {
if( action.type === 'INC' ) { return { i: 1 + state.i } };
return state;
}
const persistedReducer = persistReducer(
{ storage, key: 'myRoot' },
reducer
);
const store = createStore( persistedReducer );
const persistor = persistStore( store, null, () => {
store.dispatch({ type: INC });
});
This package exports the class PouchDBStorage
.
Connect to the PouchDB backend.
const storage = new PouchDBStorage( db_name, { ...pouchDB_options } );
// or
const pouchdb = new PouchDB( db_name, { ...options } );
const storage = new PouchDBStorage( pouchdb );
The PouchDBStorage
object has the following attributes and methods:
const doc = storage.db.get({ id: 'my_doc' });
The underlying PouchDB object.
Object which keys are the documents known to the object, and the values their current (as far as the PouchDBStorage knows) revision.
Retrieves the persisted document based on its key.
Save the document to PouchDB.
Savagely destroy the document in PouchDB (but doesn't touch the current state in the Redux store).
Returns all keys currently used by the PouchDBStorage object.
It's totally possible to listen to database changes via the
db
attribute of the PouchDBStorage object. Keep in mind, however,
that if you get a new revision from the database, you'll have to
update docRevs
manually to be sure that the new update from
PouchDBStorage won't result in a conflict.
storage.db
.changes({
live: true,
include_docs: true
})
.on("change", ({ id, changes, doc }) => {
// not one of ours, nevermind
if ( !storage.docRevs[id] ) return;
// skip if we are the instigators of the change
if (doc._rev === storage.docRevs[id]) return;
// manually update the docRevs and tell the
// store to deal with the change
storage.docRevs[id] = doc._rev;
store.dispatch({
type: "DB_CHANGE",
payload: doc.doc
});
});