Home Reference Source

src/sagas/modals.js

import { takeEvery, select, put, call, race } from 'redux-saga/effects';
import { isDirty } from 'redux-form';
import { CLOSE } from '../constants/modals';
import { keys } from 'lodash';
import { makePageWidgetsByIdSelector } from '../selectors/pages';
import { showPrompt, destroyModal } from '../actions/modals';

/**
 * Проверка на изменение данных в формах
 * @param name
 * @returns {IterableIterator<*>}
 */
export function* checkOnDirtyForm(name) {
  let someOneDirtyForm = false;
  const state = yield select();
  const widgets = makePageWidgetsByIdSelector(name)(state);
  const widgetsKeys = keys(widgets);
  for (let i = 0; i < widgetsKeys.length; i++) {
    if (widgets[widgetsKeys[i]].src === 'FormWidget') {
      someOneDirtyForm = isDirty(widgetsKeys[i])(state);
    }
  }
  return someOneDirtyForm;
}

/**
 * Функция показа подтверждения закрытия
 * @param action
 * @returns {IterableIterator<*>}
 */
export function* checkPrompt(action) {
  const { name, prompt } = action.payload;
  let needToShowPrompt = false;
  if (prompt) {
    needToShowPrompt = yield call(checkOnDirtyForm, name);
  }
  if (!needToShowPrompt) {
    yield put(destroyModal());
  } else {
    yield put(showPrompt(name));
  }
}

export const modalsSagas = [
  takeEvery(CLOSE, checkPrompt),
  takeEvery(
    action =>
      action.meta &&
      action.payload &&
      !action.payload.prompt &&
      action.meta.closeLastModal,
    checkPrompt
  ),
];