2018-11-13 08:07:09 -08:00
|
|
|
import { SagaIterator } from 'redux-saga';
|
2018-11-13 14:51:02 -08:00
|
|
|
import { takeEvery, takeLatest, put, call, select } from 'redux-saga/effects';
|
2018-11-13 08:07:09 -08:00
|
|
|
import { push } from 'connected-react-router';
|
2018-11-14 08:43:00 -08:00
|
|
|
import { postProposalDraft, getProposalDrafts, putProposal } from 'api/api';
|
|
|
|
import { getDraftById, getFormState } from './selectors';
|
|
|
|
import { createDraft, initializeForm } from './actions';
|
2018-11-13 08:07:09 -08:00
|
|
|
import types from './types';
|
|
|
|
|
|
|
|
export function* handleCreateDraft(action: ReturnType<typeof createDraft>): SagaIterator {
|
|
|
|
try {
|
|
|
|
const res: Yielded<typeof postProposalDraft> = yield call(postProposalDraft);
|
|
|
|
yield put({
|
|
|
|
type: types.CREATE_DRAFT_FULFILLED,
|
|
|
|
payload: res.data,
|
|
|
|
});
|
|
|
|
|
|
|
|
if (action.payload.redirect) {
|
|
|
|
yield put(push(`/proposals/${res.data.proposalId}/edit`));
|
|
|
|
}
|
2018-11-13 08:07:37 -08:00
|
|
|
} catch (err) {
|
2018-11-13 08:07:09 -08:00
|
|
|
yield put({
|
|
|
|
type: types.CREATE_DRAFT_REJECTED,
|
|
|
|
payload: err.message || err.toString(),
|
|
|
|
error: true,
|
|
|
|
});
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2018-11-13 14:51:02 -08:00
|
|
|
export function* handleFetchDrafts(): SagaIterator {
|
|
|
|
try {
|
|
|
|
const res: Yielded<typeof getProposalDrafts> = yield call(getProposalDrafts);
|
|
|
|
yield put({
|
|
|
|
type: types.FETCH_DRAFTS_FULFILLED,
|
|
|
|
payload: res.data,
|
|
|
|
});
|
|
|
|
} catch (err) {
|
|
|
|
yield put({
|
|
|
|
type: types.FETCH_DRAFTS_REJECTED,
|
|
|
|
payload: err.message || err.toString(),
|
|
|
|
error: true,
|
|
|
|
});
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2018-11-14 08:43:00 -08:00
|
|
|
export function* handleSaveDraft(): SagaIterator {
|
|
|
|
try {
|
|
|
|
const draft: Yielded<typeof getFormState> = yield select(getFormState);
|
|
|
|
if (!draft) {
|
|
|
|
throw new Error('No form state to save draft');
|
|
|
|
}
|
|
|
|
yield call(putProposal, draft);
|
|
|
|
yield put({ type: types.SAVE_DRAFT_FULFILLED });
|
|
|
|
} catch (err) {
|
|
|
|
yield put({
|
|
|
|
type: types.SAVE_DRAFT_REJECTED,
|
|
|
|
payload: err.message || err.toString(),
|
|
|
|
error: true,
|
|
|
|
});
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2018-11-13 14:51:02 -08:00
|
|
|
export function* handleInitializeForm(
|
|
|
|
action: ReturnType<typeof initializeForm>,
|
|
|
|
): SagaIterator {
|
|
|
|
try {
|
|
|
|
let draft: Yielded<typeof getDraftById> = yield select(getDraftById, action.payload);
|
|
|
|
if (!draft) {
|
|
|
|
yield call(handleFetchDrafts);
|
|
|
|
draft = yield select(getDraftById, action.payload);
|
|
|
|
if (!draft) {
|
|
|
|
throw new Error('Proposal not found');
|
|
|
|
}
|
|
|
|
}
|
|
|
|
yield put({
|
|
|
|
type: types.INITIALIZE_FORM_FULFILLED,
|
|
|
|
payload: draft,
|
|
|
|
});
|
|
|
|
} catch (err) {
|
|
|
|
yield put({
|
|
|
|
type: types.INITIALIZE_FORM_REJECTED,
|
|
|
|
payload: err.message || err.toString(),
|
|
|
|
error: true,
|
|
|
|
});
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2018-11-13 08:07:09 -08:00
|
|
|
export default function* createSagas(): SagaIterator {
|
|
|
|
yield takeEvery(types.CREATE_DRAFT_PENDING, handleCreateDraft);
|
2018-11-13 14:51:02 -08:00
|
|
|
yield takeLatest(types.FETCH_DRAFTS_PENDING, handleFetchDrafts);
|
2018-11-14 08:43:00 -08:00
|
|
|
yield takeLatest(types.SAVE_DRAFT_PENDING, handleSaveDraft);
|
2018-11-13 14:51:02 -08:00
|
|
|
yield takeEvery(types.INITIALIZE_FORM_PENDING, handleInitializeForm);
|
2018-11-13 08:07:37 -08:00
|
|
|
}
|