--- /dev/null
+// Copyright (C) The Arvados Authors. All rights reserved.
+//
+// SPDX-License-Identifier: AGPL-3.0
+
+import { unionize, ofType, UnionOf } from "unionize";
+
+export const favoritesActions = unionize({
+ UPDATE_FAVORITES: ofType<Record<string, boolean>>()
+}, { tag: 'type', value: 'payload' });
+
+export type FavoritesAction = UnionOf<typeof favoritesActions>;
\ No newline at end of file
--- /dev/null
+// Copyright (C) The Arvados Authors. All rights reserved.
+//
+// SPDX-License-Identifier: AGPL-3.0
+
+import { FavoritesAction, favoritesActions } from "./favorites-actions";
+
+export type FavoritesState = Record<string, boolean>;
+
+export const favoritesReducer = (state: FavoritesState = {}, action: FavoritesAction) =>
+ favoritesActions.match(action, {
+ UPDATE_FAVORITES: favorites => ({...state, ...favorites}),
+ default: () => state
+ });
+
+export const isFavorite = (uuid: string, state: FavoritesState) => state[uuid] === true;
\ No newline at end of file
import { projectPanelMiddleware } from './project-panel/project-panel-middleware';
import { detailsPanelReducer, DetailsPanelState } from './details-panel/details-panel-reducer';
import { contextMenuReducer, ContextMenuState } from './context-menu/context-menu-reducer';
+import { FavoritesState, favoritesReducer } from './favorites/favorites-reducer';
const composeEnhancers =
(process.env.NODE_ENV === 'development' &&
sidePanel: SidePanelState;
detailsPanel: DetailsPanelState;
contextMenu: ContextMenuState;
+ favorites: FavoritesState;
}
const rootReducer = combineReducers({
dataExplorer: dataExplorerReducer,
sidePanel: sidePanelReducer,
detailsPanel: detailsPanelReducer,
- contextMenu: contextMenuReducer
+ contextMenu: contextMenuReducer,
+ favorites: favoritesReducer,
});