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 { router } from 'app';
|
2017-05-11 14:17:21 +02:00
|
|
|
|
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';
|
2017-03-20 22:08:49 +01:00
|
|
|
import {
|
2017-04-21 17:19:41 +02:00
|
|
|
makeSelectCurrentModelName,
|
|
|
|
makeSelectRecord,
|
2017-05-05 11:40:52 +02:00
|
|
|
makeSelectIsCreating,
|
2017-03-20 22:08:49 +01:00
|
|
|
} from './selectors';
|
|
|
|
|
|
|
|
export function* getRecord(params) {
|
2017-04-21 17:19:41 +02:00
|
|
|
const currentModelName = yield select(makeSelectCurrentModelName());
|
2017-03-20 22:08:49 +01:00
|
|
|
|
|
|
|
try {
|
2017-07-21 18:15:43 +02:00
|
|
|
const requestUrl = `${window.Strapi.apiUrl}/content-manager/explorer/${currentModelName}/${params.id}`;
|
2017-04-21 17:19:41 +02:00
|
|
|
|
|
|
|
// Call our request helper (see 'utils/request')
|
2017-07-21 18:15:43 +02:00
|
|
|
const response = yield call(request, requestUrl, {
|
2017-03-20 22:08:49 +01:00
|
|
|
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));
|
2017-03-20 22:08:49 +01:00
|
|
|
} catch (err) {
|
2017-05-11 10:54:44 +02:00
|
|
|
window.Strapi.notification.error('An error occurred during record fetch.');
|
2017-03-20 22:08:49 +01:00
|
|
|
}
|
2017-01-26 18:53:52 +01:00
|
|
|
}
|
2017-01-26 17:53:47 +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();
|
|
|
|
|
2017-05-10 11:41:53 +02:00
|
|
|
const isCreating = yield select(makeSelectIsCreating());
|
2017-05-05 11:40:52 +02:00
|
|
|
const id = isCreating ? '' : recordJSON.id;
|
|
|
|
|
2017-04-21 17:19:41 +02:00
|
|
|
try {
|
2017-07-21 18:15:43 +02:00
|
|
|
const requestUrl = `${window.Strapi.apiUrl}/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',
|
2017-04-21 17:19:41 +02:00
|
|
|
body: recordJSON,
|
|
|
|
});
|
|
|
|
|
|
|
|
yield put(recordEdited());
|
2017-05-11 10:54:44 +02:00
|
|
|
window.Strapi.notification.success(
|
|
|
|
`The entry has been successfully ${isCreating ? 'created' : 'updated'}.`
|
|
|
|
);
|
2017-04-21 17:19:41 +02:00
|
|
|
} catch (err) {
|
|
|
|
yield put(recordEditError());
|
2017-05-11 10:54:44 +02:00
|
|
|
window.Strapi.notification.error(
|
|
|
|
`An error occurred during record ${isCreating ? 'creation' : 'update'}.`
|
|
|
|
);
|
2017-04-21 17:19:41 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2017-08-31 17:26:44 +02:00
|
|
|
export function* deleteRecord({ id, modelName }) {
|
|
|
|
function* httpCall(id, modelName) {
|
|
|
|
try {
|
|
|
|
const requestUrl = `${window.Strapi.apiUrl}/content-manager/explorer/${modelName}/${id}`;
|
|
|
|
|
|
|
|
// Call our request helper (see 'utils/request')
|
|
|
|
yield call(request, requestUrl, {
|
|
|
|
method: 'DELETE',
|
|
|
|
});
|
|
|
|
|
|
|
|
yield put(recordDeleted(id));
|
|
|
|
window.Strapi.notification.success(
|
|
|
|
'The entry has been successfully deleted.'
|
|
|
|
);
|
|
|
|
|
|
|
|
// Redirect to the list page.
|
|
|
|
router.push(`/plugins/content-manager/${modelName}`);
|
|
|
|
} catch (err) {
|
|
|
|
yield put(recordDeleteError());
|
|
|
|
window.Strapi.notification.error(
|
|
|
|
'An error occurred during record deletion.'
|
|
|
|
);
|
|
|
|
}
|
|
|
|
}
|
2017-04-21 17:52:18 +02:00
|
|
|
|
2017-08-31 17:26:44 +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
|
|
|
|
2017-08-31 17:26:44 +02:00
|
|
|
yield httpCall(recordJSON.id, currentModelName);
|
2017-04-21 17:52:18 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2017-01-26 17:53:47 +01: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);
|
2017-05-11 10:54:44 +02:00
|
|
|
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);
|
|
|
|
yield cancel(loadRecordWatcher);
|
|
|
|
yield cancel(editRecordWatcher);
|
|
|
|
yield cancel(deleteRecordWatcher);
|
2017-01-26 17:53:47 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
// All sagas to be loaded
|
2017-08-30 17:56:52 +02:00
|
|
|
export default defaultSaga;
|