/
talk.saga.js
61 lines (57 loc) 路 1.94 KB
/
talk.saga.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
import { call, put, takeLatest, select } from 'redux-saga/effects'
import { startSubmit, stopSubmit, reset } from 'redux-form'
import { push } from 'redux-little-router'
import { toast } from 'redux/ui/toaster'
import { getUserId } from 'redux/auth'
import talkData from 'redux/data/talk'
import talkCrud from 'sagas/talk/talk.firebase'
function* createOrUpdateTalk(form, talk) {
try {
// indicate start submitting form
yield put(startSubmit(form))
if (form === 'talk-create') {
// get user id
const uid = yield select(getUserId)
// create talk into database
const ref = yield call(talkCrud.create, { ...talk, speakers: { [uid]: true } })
// go to talk page
yield put(push(`/speaker/talk/${ref.id}`))
// reset form
yield put(reset(form))
} else {
// update talk into database
yield call(talkCrud.update, talk)
// update talk into store
yield put(talkData.update(talk))
// go to talk page
yield put(push(`/speaker/talk/${talk.id}`))
}
// set form submitted
yield put(stopSubmit(form))
} catch (error) {
yield put(stopSubmit(form, { _error: error.message }))
throw error
}
}
function* getTalk() {
// get talk id from router
const { id } = yield select(state => state.router.params)
// check if already in the store
const current = yield select(talkData.get())
if (current && current.id === id) return
// wipe current talk in the store
yield put(talkData.reset())
// fetch event from id
const ref = yield call(talkCrud.read, id)
if (ref.exists) {
yield put(talkData.set({ id, ...ref.data() }))
} else {
yield put(toast(id, `Talk '${id}' not found, it might be deleted or it's not yours.`, 'warning'))
yield put(push('/speaker'))
}
}
export default function* eventSagas() {
yield takeLatest('SUBMIT_TALK_FORM', ({ payload }) =>
createOrUpdateTalk(payload.form, payload.talk))
yield takeLatest('FETCH_TALK', getTalk)
}