From 95a1c8d66f1711d88eb05c4b1e48569e48a6f232 Mon Sep 17 00:00:00 2001 From: Stephen Smith Date: Fri, 18 Oct 2024 16:43:45 -0400 Subject: [PATCH] 21838: Convert load public favorites to saga Arvados-DCO-1.1-Signed-off-by: Stephen Smith --- services/workbench2/src/store/redux-saga.ts | 2 + .../store/tree-picker/tree-picker-actions.ts | 45 ++++++++++++++----- 2 files changed, 35 insertions(+), 12 deletions(-) diff --git a/services/workbench2/src/store/redux-saga.ts b/services/workbench2/src/store/redux-saga.ts index 1897be5418..56c87941ef 100644 --- a/services/workbench2/src/store/redux-saga.ts +++ b/services/workbench2/src/store/redux-saga.ts @@ -10,6 +10,7 @@ import { refreshTreePickerWatcher, setTreePickerCollectionFilterWatcher, loadFavoritesProjectWatcher, + loadPublicFavoritesProjectWatcher, } from "./tree-picker/tree-picker-actions"; /** @@ -23,6 +24,7 @@ export const rootSaga = function* () { loadProjectWatcher, loadSearchWatcher, loadFavoritesProjectWatcher, + loadPublicFavoritesProjectWatcher, ]; yield all(sagas.map(saga => diff --git a/services/workbench2/src/store/tree-picker/tree-picker-actions.ts b/services/workbench2/src/store/tree-picker/tree-picker-actions.ts index 955d801001..40dff58b20 100644 --- a/services/workbench2/src/store/tree-picker/tree-picker-actions.ts +++ b/services/workbench2/src/store/tree-picker/tree-picker-actions.ts @@ -69,6 +69,7 @@ export const treePickerSearchSagas = unionize({ LOAD_PROJECT: ofType(), LOAD_SEARCH: ofType(), LOAD_FAVORITES_PROJECT: ofType(), + LOAD_PUBLIC_FAVORITES_PROJECT: ofType(), REFRESH_TREE_PICKER: ofType<{ pickerId: string }>(), }); @@ -586,10 +587,12 @@ function* refreshTreePickerSaga({type, payload}: { }})); } if (node.id === PUBLIC_FAVORITES_PROJECT_ID) { - return acc.concat(put(loadPublicFavoritesProject({ - ...loadParams, - pickerId, - }))); + return acc.concat(call(loadPublicFavoritesProjectSaga, { + type: treePickerSearchSagas.tags.LOAD_PUBLIC_FAVORITES_PROJECT, + payload: { + ...loadParams, + pickerId, + }})); } } return acc; @@ -913,10 +916,22 @@ function* loadFavoritesProjectSaga({type, payload}: { } } -export const loadPublicFavoritesProject = (params: LoadFavoritesProjectParams) => - async (dispatch: Dispatch, getState: () => RootState, services: ServiceRepository) => { - const { pickerId, includeCollections = false, includeDirectories = false, includeFiles = false } = params; - const uuidPrefix = getState().auth.config.uuidPrefix; +export const loadPublicFavoritesProject = (params: typeof treePickerSearchSagas._Record.LOAD_PUBLIC_FAVORITES_PROJECT) => (treePickerSearchSagas.LOAD_PUBLIC_FAVORITES_PROJECT(params)); + +export function* loadPublicFavoritesProjectWatcher() { + yield takeEvery(treePickerSearchSagas.tags.LOAD_PUBLIC_FAVORITES_PROJECT, loadPublicFavoritesProjectSaga); +} + +function* loadPublicFavoritesProjectSaga({type, payload}: { + type: typeof treePickerSearchSagas.tags.LOAD_PUBLIC_FAVORITES_PROJECT, + payload: typeof treePickerSearchSagas._Record.LOAD_PUBLIC_FAVORITES_PROJECT, +}) { + try { + const services: ServiceRepository = yield getContext("services"); + const state: RootState = yield select(); + + const { pickerId, includeCollections = false, includeDirectories = false, includeFiles = false, options } = payload; + const uuidPrefix = state.auth.config.uuidPrefix; const publicProjectUuid = `${uuidPrefix}-j7d0g-publicfavorites`; // TODO: @@ -933,13 +948,16 @@ export const loadPublicFavoritesProject = (params: LoadFavoritesProjectParams) = .getFilters(), )(new FilterBuilder()); - const { items } = await services.linkService.list({ filters }); + const { items } = yield call( + {context: services.linkService, fn: services.linkService.list}, + { filters }, + ); - dispatch(receiveTreePickerData({ + yield put(receiveTreePickerData({ id: 'Public Favorites', pickerId, data: items.filter(item => { - if (params.options && params.options.showOnlyWritable && item.hasOwnProperty('frozenByUuid') && (item as any).frozenByUuid) { + if (options && options.showOnlyWritable && item.hasOwnProperty('frozenByUuid') && (item as any).frozenByUuid) { return false; } @@ -955,7 +973,10 @@ export const loadPublicFavoritesProject = (params: LoadFavoritesProjectParams) = : TreeNodeStatus.LOADED }), })); - }; + } catch (e) { + yield put(snackbarActions.OPEN_SNACKBAR({ message: `Failed to load public favorites`, kind: SnackbarKind.ERROR })); + } +} export const receiveTreePickerProjectsData = (id: string, projects: ProjectResource[], pickerId: string) => (dispatch: Dispatch, getState: () => RootState, services: ServiceRepository) => { -- 2.30.2