From de36bfab87719274af0d6f29b7d061f8d7a4b72e Mon Sep 17 00:00:00 2001 From: Cliff Meyers Date: Fri, 29 Jul 2016 20:07:48 -0400 Subject: [PATCH] [JENKINS-36582] add store logic to update the favorite cards' job status in real time --- .../src/main/js/redux/FavoritesStore.jsx | 25 +++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/blueocean-personalization/src/main/js/redux/FavoritesStore.jsx b/blueocean-personalization/src/main/js/redux/FavoritesStore.jsx index 9bb74c96..b04efd15 100644 --- a/blueocean-personalization/src/main/js/redux/FavoritesStore.jsx +++ b/blueocean-personalization/src/main/js/redux/FavoritesStore.jsx @@ -21,8 +21,13 @@ export const ACTION_TYPES = keymirror({ SET_USER: null, SET_FAVORITES: null, TOGGLE_FAVORITE: null, + UPDATE_RUN: null, }); +function clone(json) { + return JSON.parse(JSON.stringify(json)); +} + const actionHandlers = { [ACTION_TYPES.SET_USER](state, { payload }) { const user = new User(payload); @@ -52,6 +57,26 @@ const actionHandlers = { return state.set('favorites', prunedList); }, + [ACTION_TYPES.UPDATE_RUN](state, { jobRun }) { + const favorites = state.get('favorites'); + + for (const fav of favorites) { + const runsBaseUrl = `${fav.item._links.self.href}runs`; + const runUrl = jobRun._links.self.href; + + // TODO; this might be broken for non-multibranch as the URL structures are different + if (runUrl.indexOf(runsBaseUrl) === 0) { + const index = favorites.indexOf(fav); + const updatedFavorite = clone(fav); + updatedFavorite.item.latestRun = jobRun; + const updatedFavorites = favorites.set(index, updatedFavorite); + return state.set('favorites', updatedFavorites); + } + } + + console.warn('run was not updated; likely an error?'); + return state; + }, }; const favoritesStore = state => state.favoritesStore;