117 lines
3.5 KiB
JavaScript
Raw Normal View History

2017-05-10 11:41:53 +02:00
import { LOCATION_CHANGE } from 'react-router-redux';
2017-08-30 17:56:52 +02:00
import { call, cancel, fork, put, take, select, takeLatest } from 'redux-saga/effects';
2017-01-26 18:53:52 +01:00
2017-05-16 16:32:54 +02:00
import request from 'utils/request';
import cleanData from 'utils/cleanData';
2017-05-16 16:32:54 +02:00
import { router } from 'app';
2017-01-26 18:53:52 +01:00
import {
2017-04-21 17:19:41 +02:00
recordLoaded,
recordEdited,
recordEditError,
2017-04-21 17:52:18 +02:00
recordDeleted,
recordDeleteError,
2017-01-26 18:53:52 +01:00
} from './actions';
2017-05-11 10:54:44 +02:00
import { LOAD_RECORD, EDIT_RECORD, DELETE_RECORD } from './constants';
import {
2017-04-21 17:19:41 +02:00
makeSelectCurrentModelName,
makeSelectRecord,
2017-05-05 11:40:52 +02:00
makeSelectIsCreating,
} from './selectors';
export function* getRecord(params) {
2017-04-21 17:19:41 +02:00
const currentModelName = yield select(makeSelectCurrentModelName());
try {
const requestUrl = `${strapi.backendURL}/content-manager/explorer/${currentModelName}/${params.id}`;
2017-04-21 17:19:41 +02:00
// Call our request helper (see 'utils/request')
const response = yield request(requestUrl, {
method: 'GET',
2017-04-21 17:19:41 +02:00
});
2017-01-26 18:53:52 +01:00
2017-07-21 18:15:43 +02:00
yield put(recordLoaded(response));
} catch (err) {
strapi.notification.error('content-manager.error.record.fetch');
}
2017-01-26 18:53:52 +01:00
}
2017-04-21 17:19:41 +02:00
export function* editRecord() {
const currentModelName = yield select(makeSelectCurrentModelName());
const record = yield select(makeSelectRecord());
const recordJSON = record.toJSON();
const recordCleaned = Object.keys(recordJSON).reduce((acc, current) => {
acc[current] = cleanData(recordJSON[current], 'value', 'id');
return acc;
}, {});
2017-05-10 11:41:53 +02:00
const isCreating = yield select(makeSelectIsCreating());
const id = isCreating ? '' : recordCleaned.id;
2017-05-05 11:40:52 +02:00
2017-04-21 17:19:41 +02:00
try {
const requestUrl = `${strapi.backendURL}/content-manager/explorer/${currentModelName}/${id}`;
2017-04-21 17:19:41 +02:00
// Call our request helper (see 'utils/request')
2017-06-19 19:47:38 +02:00
yield call(request, requestUrl, {
2017-05-05 11:40:52 +02:00
method: isCreating ? 'POST' : 'PUT',
body: recordCleaned,
2017-04-21 17:19:41 +02:00
});
yield put(recordEdited());
strapi.notification.success('content-manager.success.record.save');
2017-04-21 17:19:41 +02:00
} catch (err) {
yield put(recordEditError());
strapi.notification.error(isCreating ? 'content-manager.error.record.create' : 'content-manager.error.record.update');
2017-04-21 17:19:41 +02:00
}
}
export function* deleteRecord({ id, modelName }) {
function* httpCall(id, modelName) {
try {
const requestUrl = `${strapi.backendURL}/content-manager/explorer/${modelName}/${id}`;
// Call our request helper (see 'utils/request')
yield call(request, requestUrl, {
method: 'DELETE',
});
yield put(recordDeleted(id));
strapi.notification.success('content-manager.success.record.delete');
// Redirect to the list page.
router.push(`/plugins/content-manager/${modelName}`);
} catch (err) {
yield put(recordDeleteError());
strapi.notification.error('content-manager.error.record.delete');
}
}
2017-04-21 17:52:18 +02:00
if (id && modelName) {
yield httpCall(id, modelName);
} else {
const currentModelName = yield select(makeSelectCurrentModelName());
const record = yield select(makeSelectRecord());
const recordJSON = record.toJSON();
2017-05-09 17:35:36 +02:00
yield httpCall(recordJSON.id, currentModelName);
2017-04-21 17:52:18 +02:00
}
}
export function* defaultSaga() {
2017-05-10 11:41:53 +02:00
const loadRecordWatcher = yield fork(takeLatest, LOAD_RECORD, getRecord);
const editRecordWatcher = yield fork(takeLatest, EDIT_RECORD, editRecord);
const deleteRecordWatcher = yield fork(takeLatest, DELETE_RECORD, deleteRecord);
2017-05-10 11:41:53 +02:00
// Suspend execution until location changes
yield take(LOCATION_CHANGE);
2017-05-10 11:41:53 +02:00
yield cancel(loadRecordWatcher);
yield cancel(editRecordWatcher);
yield cancel(deleteRecordWatcher);
}
// All sagas to be loaded
2017-08-30 17:56:52 +02:00
export default defaultSaga;