Skip to content

Instantly share code, notes, and snippets.

@c80609a
Created October 4, 2019 15:43
Show Gist options
  • Save c80609a/54949aabb33101c62eb4086c6e588177 to your computer and use it in GitHub Desktop.
Save c80609a/54949aabb33101c62eb4086c6e588177 to your computer and use it in GitHub Desktop.
import { call, put, select, takeLatest } from "redux-saga/effects";
import {makeCheckFormData, makeFormData} from "./helpers/boat_form";
import {growl} from "../actions/growl";
import { POST, POST2 } from "../../../../utils/api/request";
import {
EDIT_BOAT_REQUESTED,
EDIT_BOAT_INVALID,
EDIT_BOAT_VALID,
EDIT_BOAT_SUCCEEDED,
EDIT_BOAT_FAILED
} from "../constants/boat_form";
import {NAV_TAB_BOATS} from "../../Nav/tabs_list";
import {changeTab} from "../actions/nav";
/**
* @param action.url_save - урл, по которому надо совершить запрос на сохранение после успешной валидации
* @param action.url_boats_list - урл, на который надо перейти после успешного сохранения данных лодки
*/
function* Edit(action) {
// console.log("<CheckEdit> url_save = " + action.url_save);
const getStoreBoatForm0 = (state) => state.boat_form; // существующие значения (т.е. то, что было подано в форму изначально)
const boatFormOld = yield select(getStoreBoatForm0);
const getStoreBoatForm = (state) => state.boat_form_new; // новые значения (т.е. юзер что-то изменил в форме)
const boatFormNew = yield select(getStoreBoatForm);
const form_data = makeFormData(boatFormOld.values, boatFormNew.values);
try {
const response = yield call(
() => POST2(action.url_save, form_data)
);
if (response.status === 200) {
yield put({
type: EDIT_BOAT_SUCCEEDED,
payload: response.data
})
yield put(growl({ type: 'success', msg: 'information_saved' }));
yield put(changeTab(NAV_TAB_BOATS))
} else {
yield put({ type: EDIT_BOAT_INVALID, payload: response.data })
}
} catch (e) {
yield put({
type: EDIT_BOAT_FAILED,
payload: {
message: e.message
}
});
}
}
/** Сначала отправим запрос на валидацию данных.
*
* @param action.url_save - урл, по которому надо совершить запрос на сохранение после успешной валидации
* @param action.url_validate - урл, по которому надо совершить запрос на валидацию
*/
function* CheckEdit(action) {
// console.log("<CheckEdit> url_save = " + action.url_save + ', url_validate = ' + action.url_validate);
const getStoreBoatForm0 = (state) => state.boat_form; // существующие значения (т.е. то, что было подано в форму изначально)
const boatFormOld = yield select(getStoreBoatForm0);
const getStoreBoatForm = (state) => state.boat_form_new; // новые значения (т.е. юзер что-то изменил в форме)
const boatFormNew = yield select(getStoreBoatForm);
const boat_values = makeCheckFormData(boatFormOld.values, boatFormNew.values); // на сервер отправляем существующие значения, поверх которых наложены новые значения
try {
const response = yield call(
() => POST(action.url_validate, { boat: boat_values })
);
if (response.status === 200)
// а теперь можно слать запрос на создание
yield put({
type: EDIT_BOAT_VALID,
url_save: action.url_save
});
else
yield put({ type: EDIT_BOAT_INVALID, payload: response.data });
} catch (e) {
yield put({
type: EDIT_BOAT_FAILED,
payload: {
message: e.message
}
});
}
}
function* BoatFormSaga() {
yield takeLatest(EDIT_BOAT_REQUESTED, CheckEdit);
yield takeLatest(EDIT_BOAT_VALID, Edit);
}
export default BoatFormSaga;
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment