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 { getIsEditorInitialized } from "selectors/editorSelectors"; import { RecentEntity } from "components/editorComponents/GlobalSearch/utils"; import log from "loglevel"; export function* updateRecentEntity(actionPayload: ReduxAction) { try { 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 (entity?.params?.applicationId) { yield call( setRecentAppEntities, recentEntities, entity?.params?.applicationId, ); } } catch (e) { log.error(e); } } export function* restoreRecentEntities(actionPayload: ReduxAction) { const { payload: appId } = actionPayload; const recentAppEntities = yield call(fetchRecentAppEntities, appId); yield putResolve(setRecentEntities(recentAppEntities)); yield put(restoreRecentEntitiesSuccess()); } export default function* globalSearchSagas() { yield all([ takeLatest(ReduxActionTypes.UPDATE_RECENT_ENTITY, updateRecentEntity), takeLatest( ReduxActionTypes.RESTORE_RECENT_ENTITIES_REQUEST, restoreRecentEntities, ), ]); }