client/src/sagas/index.js
author Alexandre Segura <mex.zktk@gmail.com>
Mon, 12 Jun 2017 18:12:38 +0200
changeset 29 4cfeabef7d5e
child 30 4d93f4ed95bc
permissions -rw-r--r--
Store data in PouchDB. - Introduce redux-saga to perform async actions. - Refactor actions to be async.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
29
4cfeabef7d5e Store data in PouchDB.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
     1
import PouchDB from 'pouchdb'
4cfeabef7d5e Store data in PouchDB.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
     2
import { put, takeLatest, all } from 'redux-saga/effects'
4cfeabef7d5e Store data in PouchDB.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
     3
import * as types from '../constants/actionTypes';
4cfeabef7d5e Store data in PouchDB.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
     4
import PouchDBFind from 'pouchdb-find';
4cfeabef7d5e Store data in PouchDB.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
     5
import Immutable from 'immutable';
4cfeabef7d5e Store data in PouchDB.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
     6
4cfeabef7d5e Store data in PouchDB.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
     7
PouchDB.debug.disable();
4cfeabef7d5e Store data in PouchDB.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
     8
PouchDB.plugin(PouchDBFind);
4cfeabef7d5e Store data in PouchDB.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
     9
4cfeabef7d5e Store data in PouchDB.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
    10
const sessionsDB = new PouchDB('sessions');
4cfeabef7d5e Store data in PouchDB.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
    11
const notesDB = new PouchDB('notes');
4cfeabef7d5e Store data in PouchDB.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
    12
notesDB.createIndex({
4cfeabef7d5e Store data in PouchDB.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
    13
  index: { fields: ['session'] }
4cfeabef7d5e Store data in PouchDB.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
    14
});
4cfeabef7d5e Store data in PouchDB.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
    15
4cfeabef7d5e Store data in PouchDB.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
    16
// ---
4cfeabef7d5e Store data in PouchDB.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
    17
4cfeabef7d5e Store data in PouchDB.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
    18
export function* loadSessions() {
4cfeabef7d5e Store data in PouchDB.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
    19
  const response = yield sessionsDB.allDocs({ include_docs: true })
4cfeabef7d5e Store data in PouchDB.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
    20
  const sessions = response.rows.map(row => row.doc)
4cfeabef7d5e Store data in PouchDB.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
    21
  yield put({ type: types.LOAD_SESSIONS, sessions: Immutable.List(sessions) })
4cfeabef7d5e Store data in PouchDB.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
    22
}
4cfeabef7d5e Store data in PouchDB.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
    23
4cfeabef7d5e Store data in PouchDB.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
    24
export function* watchLoadSessions() {
4cfeabef7d5e Store data in PouchDB.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
    25
  yield takeLatest(types.LOAD_SESSIONS_ASYNC, loadSessions)
4cfeabef7d5e Store data in PouchDB.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
    26
}
4cfeabef7d5e Store data in PouchDB.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
    27
4cfeabef7d5e Store data in PouchDB.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
    28
// ---
4cfeabef7d5e Store data in PouchDB.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
    29
4cfeabef7d5e Store data in PouchDB.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
    30
export function* createSession(action) {
4cfeabef7d5e Store data in PouchDB.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
    31
  const response = yield sessionsDB.put(action.session);
4cfeabef7d5e Store data in PouchDB.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
    32
  // TODO Error control
4cfeabef7d5e Store data in PouchDB.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
    33
  const session = Object.assign({}, action.session, { rev: response.rev });
4cfeabef7d5e Store data in PouchDB.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
    34
  yield put({ type: types.CREATE_SESSION, session: session })
4cfeabef7d5e Store data in PouchDB.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
    35
}
4cfeabef7d5e Store data in PouchDB.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
    36
4cfeabef7d5e Store data in PouchDB.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
    37
export function* watchCreateSession() {
4cfeabef7d5e Store data in PouchDB.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
    38
  yield takeLatest(types.CREATE_SESSION_ASYNC, createSession)
4cfeabef7d5e Store data in PouchDB.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
    39
}
4cfeabef7d5e Store data in PouchDB.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
    40
4cfeabef7d5e Store data in PouchDB.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
    41
// ---
4cfeabef7d5e Store data in PouchDB.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
    42
4cfeabef7d5e Store data in PouchDB.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
    43
export function* addNote(action) {
4cfeabef7d5e Store data in PouchDB.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
    44
  const response = yield notesDB.put(action.note);
4cfeabef7d5e Store data in PouchDB.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
    45
  // TODO Error control
4cfeabef7d5e Store data in PouchDB.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
    46
  const note = Object.assign({}, action.note, { rev: response.rev });
4cfeabef7d5e Store data in PouchDB.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
    47
  yield put({ type: types.ADD_NOTE, note: note })
4cfeabef7d5e Store data in PouchDB.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
    48
}
4cfeabef7d5e Store data in PouchDB.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
    49
4cfeabef7d5e Store data in PouchDB.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
    50
export function* watchAddNote() {
4cfeabef7d5e Store data in PouchDB.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
    51
  yield takeLatest(types.ADD_NOTE_ASYNC, addNote)
4cfeabef7d5e Store data in PouchDB.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
    52
}
4cfeabef7d5e Store data in PouchDB.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
    53
4cfeabef7d5e Store data in PouchDB.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
    54
// ---
4cfeabef7d5e Store data in PouchDB.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
    55
4cfeabef7d5e Store data in PouchDB.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
    56
export function* loadNotesBySession(action) {
4cfeabef7d5e Store data in PouchDB.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
    57
  const result = yield notesDB.find({
4cfeabef7d5e Store data in PouchDB.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
    58
    selector: { session: action.session._id },
4cfeabef7d5e Store data in PouchDB.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
    59
    // sort: ['name']
4cfeabef7d5e Store data in PouchDB.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
    60
  });
4cfeabef7d5e Store data in PouchDB.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
    61
  yield put({ type: types.LOAD_NOTES_BY_SESSION, notes: Immutable.List(result.docs) })
4cfeabef7d5e Store data in PouchDB.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
    62
}
4cfeabef7d5e Store data in PouchDB.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
    63
4cfeabef7d5e Store data in PouchDB.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
    64
export function* watchLoadNotesBySession() {
4cfeabef7d5e Store data in PouchDB.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
    65
  yield takeLatest(types.LOAD_NOTES_BY_SESSION_ASYNC, loadNotesBySession)
4cfeabef7d5e Store data in PouchDB.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
    66
}
4cfeabef7d5e Store data in PouchDB.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
    67
4cfeabef7d5e Store data in PouchDB.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
    68
// ---
4cfeabef7d5e Store data in PouchDB.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
    69
4cfeabef7d5e Store data in PouchDB.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
    70
export default function* rootSaga() {
4cfeabef7d5e Store data in PouchDB.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
    71
  yield all([
4cfeabef7d5e Store data in PouchDB.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
    72
    watchLoadSessions(),
4cfeabef7d5e Store data in PouchDB.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
    73
    watchLoadNotesBySession(),
4cfeabef7d5e Store data in PouchDB.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
    74
    watchAddNote(),
4cfeabef7d5e Store data in PouchDB.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
    75
    watchCreateSession(),
4cfeabef7d5e Store data in PouchDB.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
    76
  ])
4cfeabef7d5e Store data in PouchDB.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
    77
}