PromucFlow_constructor/app/client/src/sagas/GlobalSearchSagas.ts
2021-10-18 19:33:44 +05:30

105 lines
2.8 KiB
TypeScript

import { ReduxActionTypes, ReduxAction } from "constants/ReduxActionConstants";
import {
all,
call,
put,
takeLatest,
select,
putResolve,
take,
} from "redux-saga/effects";
import { setRecentAppEntities, fetchRecentAppEntities } from "utils/storage";
import {
restoreRecentEntitiesSuccess,
setRecentEntities,
} from "actions/globalSearchActions";
import { AppState } from "reducers";
import {
getCurrentApplicationId,
getIsEditorInitialized,
} from "selectors/editorSelectors";
import { RecentEntity } from "components/editorComponents/GlobalSearch/utils";
import log from "loglevel";
import { getCurrentGitBranch } from "selectors/gitSyncSelectors";
const getRecentEntitiesKey = (applicationId: string, branch?: string) =>
branch ? `${applicationId}-${branch}` : applicationId;
export function* updateRecentEntitySaga(
actionPayload: ReduxAction<RecentEntity>,
) {
try {
const branch = yield select(getCurrentGitBranch);
const applicationId = yield select(getCurrentApplicationId);
const recentEntitiesRestored = yield select(
(state: AppState) => state.ui.globalSearch.recentEntitiesRestored,
);
const isEditorInitialised = yield select(getIsEditorInitialized);
const waitForEffects = [];
if (!isEditorInitialised) {
waitForEffects.push(take(ReduxActionTypes.INITIALIZE_EDITOR_SUCCESS));
}
if (!recentEntitiesRestored) {
waitForEffects.push(
take(ReduxActionTypes.RESTORE_RECENT_ENTITIES_SUCCESS),
);
}
yield all(waitForEffects);
const { payload: entity } = actionPayload;
let recentEntities = yield select(
(state: AppState) => state.ui.globalSearch.recentEntities,
);
recentEntities = recentEntities.slice();
recentEntities = recentEntities.filter(
(recentEntity: { type: string; id: string }) =>
recentEntity.id !== entity.id,
);
recentEntities.unshift(entity);
recentEntities = recentEntities.slice(0, 6);
yield put(setRecentEntities(recentEntities));
if (applicationId) {
yield call(
setRecentAppEntities,
recentEntities,
getRecentEntitiesKey(applicationId, branch),
);
}
} catch (e) {
log.error(e);
}
}
export function* restoreRecentEntities(
actionPayload: ReduxAction<{ applicationId: string; branch?: string }>,
) {
const {
payload: { applicationId, branch },
} = actionPayload;
const recentAppEntities = yield call(
fetchRecentAppEntities,
getRecentEntitiesKey(applicationId, branch),
);
yield putResolve(setRecentEntities(recentAppEntities));
yield put(restoreRecentEntitiesSuccess());
}
export default function* globalSearchSagas() {
yield all([
takeLatest(ReduxActionTypes.UPDATE_RECENT_ENTITY, updateRecentEntitySaga),
takeLatest(
ReduxActionTypes.RESTORE_RECENT_ENTITIES_REQUEST,
restoreRecentEntities,
),
]);
}