PromucFlow_constructor/app/client/src/sagas/InitSagas.ts

194 lines
5.5 KiB
TypeScript
Raw Normal View History

import { all, call, put, select, take, takeLatest } from "redux-saga/effects";
2019-11-08 11:02:00 +00:00
import {
InitializeEditorPayload,
Page,
ReduxAction,
ReduxActionErrorTypes,
ReduxActionTypes,
} from "constants/ReduxActionConstants";
2019-11-25 05:07:27 +00:00
import { fetchEditorConfigs } from "actions/configsActions";
2020-08-24 12:09:17 +00:00
import {
fetchPage,
fetchPageList,
fetchPublishedPage,
2020-08-24 12:09:17 +00:00
setAppMode,
updateAppStore,
} from "actions/pageActions";
import { fetchDatasources } from "actions/datasourceActions";
import { fetchPlugins } from "actions/pluginActions";
import { fetchActions, fetchActionsForView } from "actions/actionActions";
import { fetchApplication } from "actions/applicationActions";
2020-03-06 04:59:24 +00:00
import AnalyticsUtil from "utils/AnalyticsUtil";
import { getCurrentApplication } from "selectors/applicationSelectors";
import { AppState } from "reducers";
import PageApi, { FetchPageResponse } from "api/PageApi";
import { validateResponse } from "./ErrorSagas";
import { extractCurrentDSL } from "utils/WidgetPropsUtils";
import { APP_MODE } from "reducers/entityReducers/appReducer";
2020-08-24 12:09:17 +00:00
import { getAppStoreName } from "constants/AppConstants";
import { getDefaultPageId } from "./selectors";
2020-08-24 12:09:17 +00:00
const getAppStore = (appId: string) => {
const appStoreName = getAppStoreName(appId);
const storeString = localStorage.getItem(appStoreName) || "{}";
let store;
try {
store = JSON.parse(storeString);
} catch (e) {
store = {};
}
return store;
};
2019-11-01 07:11:32 +00:00
function* initializeEditorSaga(
initializeEditorAction: ReduxAction<InitializeEditorPayload>,
) {
2020-03-24 14:05:19 +00:00
const { applicationId, pageId } = initializeEditorAction.payload;
// Step 1: Start getting all the data needed by the
2019-11-01 07:11:32 +00:00
yield all([
put(fetchPageList(applicationId)),
2019-11-22 12:15:33 +00:00
put(fetchEditorConfigs()),
2020-01-24 09:54:40 +00:00
put(fetchActions(applicationId)),
2020-03-24 14:05:19 +00:00
put(fetchPage(pageId)),
put(fetchApplication(applicationId)),
2019-11-01 07:11:32 +00:00
]);
// Step 2: Wait for all data to be in the state
yield all([
take(ReduxActionTypes.FETCH_PAGE_LIST_SUCCESS),
2020-03-24 14:05:19 +00:00
take(ReduxActionTypes.FETCH_PAGE_SUCCESS),
take(ReduxActionTypes.SWITCH_CURRENT_PAGE_ID),
2019-11-01 07:11:32 +00:00
take(ReduxActionTypes.FETCH_ACTIONS_SUCCESS),
]);
// Step 3: Call all the APIs which needs Organization Id from PageList API response.
yield all([put(fetchPlugins()), put(fetchDatasources())]);
// Step 4: Wait for all data to be in the state
yield all([
take(ReduxActionTypes.FETCH_PLUGINS_SUCCESS),
2019-11-07 09:32:38 +00:00
take(ReduxActionTypes.FETCH_DATASOURCES_SUCCESS),
2019-11-01 07:11:32 +00:00
]);
// Step 5: Set app mode
yield put(setAppMode(APP_MODE.EDIT));
2020-08-24 12:09:17 +00:00
yield put(updateAppStore(getAppStore(applicationId)));
const currentApplication = yield select(getCurrentApplication);
2020-03-06 04:59:24 +00:00
const appName = currentApplication ? currentApplication.name : "";
const appId = currentApplication ? currentApplication.id : "";
AnalyticsUtil.logEvent("EDITOR_OPEN", {
appId: appId,
appName: appName,
});
// Step 6: Notify UI that the editor is ready to go
2019-11-13 07:34:59 +00:00
yield put({
type: ReduxActionTypes.INITIALIZE_EDITOR_SUCCESS,
2019-11-13 07:34:59 +00:00
});
yield call(populatePageDSLsSaga);
}
function* fetchPageDSLSaga(action: ReduxAction<{ pageId: string }>) {
try {
const fetchPageResponse: FetchPageResponse = yield call(PageApi.fetchPage, {
id: action.payload.pageId,
});
const isValidResponse = yield validateResponse(fetchPageResponse);
if (isValidResponse) {
yield put({
type: ReduxActionTypes.FETCH_PAGE_DSL_SUCCESS,
payload: {
pageId: action.payload.pageId,
dsl: extractCurrentDSL(fetchPageResponse),
},
});
}
} catch (error) {
yield put({
type: ReduxActionTypes.FETCH_PAGE_DSL_ERROR,
payload: {
pageId: action.payload.pageId,
error,
show: false,
},
});
}
}
export function* populatePageDSLsSaga() {
try {
yield put({
type: ReduxActionTypes.POPULATE_PAGEDSLS_INIT,
});
const pageIds: string[] = yield select((state: AppState) =>
state.entities.pageList.pages.map((page: Page) => page.pageId),
);
yield all(
pageIds.map((pageId: string) => {
return call(fetchPageDSLSaga, {
type: ReduxActionTypes.FETCH_PAGE_DSL_INIT,
payload: { pageId },
});
}),
);
yield put({
type: ReduxActionTypes.POPULATE_PAGEDSLS_SUCCESS,
});
} catch (error) {
yield put({
type: ReduxActionErrorTypes.POPULATE_PAGEDSLS_ERROR,
payload: {
error,
},
});
}
2019-11-01 07:11:32 +00:00
}
2019-11-08 11:02:00 +00:00
export function* initializeAppViewerSaga(
action: ReduxAction<{ applicationId: string }>,
2019-11-08 11:02:00 +00:00
) {
const { applicationId } = action.payload;
2020-01-24 09:54:40 +00:00
yield all([
put(fetchActionsForView(applicationId)),
2020-01-24 09:54:40 +00:00
put(fetchPageList(applicationId)),
put(fetchApplication(applicationId)),
2020-01-24 09:54:40 +00:00
]);
2019-11-08 11:02:00 +00:00
yield all([
take(ReduxActionTypes.FETCH_ACTIONS_VIEW_MODE_SUCCESS),
2020-01-24 09:54:40 +00:00
take(ReduxActionTypes.FETCH_PAGE_LIST_SUCCESS),
2019-11-08 11:02:00 +00:00
]);
const pageId = yield select(getDefaultPageId);
if (pageId) {
yield put(fetchPublishedPage(pageId, true));
yield take(ReduxActionTypes.FETCH_PUBLISHED_PAGE_SUCCESS);
yield put(setAppMode(APP_MODE.PUBLISHED));
yield put(updateAppStore(getAppStore(applicationId)));
yield put({
type: ReduxActionTypes.INITIALIZE_PAGE_VIEWER_SUCCESS,
});
if ("serviceWorker" in navigator) {
yield put({
type: ReduxActionTypes.FETCH_ALL_PUBLISHED_PAGES,
});
}
}
2019-11-08 11:02:00 +00:00
}
2019-11-01 07:11:32 +00:00
export default function* watchInitSagas() {
2019-11-08 11:02:00 +00:00
yield all([
takeLatest(ReduxActionTypes.INITIALIZE_EDITOR, initializeEditorSaga),
2019-11-08 11:02:00 +00:00
takeLatest(
ReduxActionTypes.INITIALIZE_PAGE_VIEWER,
initializeAppViewerSaga,
),
]);
2019-11-01 07:11:32 +00:00
}