1 // Copyright (C) The Arvados Authors. All rights reserved.
3 // SPDX-License-Identifier: AGPL-3.0
5 import { unionize, ofType, UnionOf } from "common/unionize";
6 import { Dispatch } from "redux";
7 import { RootState } from "../store";
8 import { getUserUuid } from "common/getuser";
9 import { checkFavorite } from "./favorites-reducer";
10 import { snackbarActions, SnackbarKind } from "../snackbar/snackbar-actions";
11 import { ServiceRepository } from "services/services";
12 import { progressIndicatorActions } from "store/progress-indicator/progress-indicator-actions";
13 import { ContextMenuActionNames } from "views-components/context-menu/context-menu-action-set";
14 import { addDisabledButton, removeDisabledButton } from "store/multiselect/multiselect-actions";
15 import { loadFavoritesTree} from "store/side-panel-tree/side-panel-tree-actions";
17 export const favoritesActions = unionize({
18 TOGGLE_FAVORITE: ofType<{ resourceUuid: string }>(),
19 CHECK_PRESENCE_IN_FAVORITES: ofType<string[]>(),
20 UPDATE_FAVORITES: ofType<Record<string, boolean>>()
23 export type FavoritesAction = UnionOf<typeof favoritesActions>;
25 export const toggleFavorite = (resource: { uuid: string; name: string }) =>
26 (dispatch: Dispatch, getState: () => RootState, services: ServiceRepository): Promise<any> => {
27 const userUuid = getUserUuid(getState());
29 return Promise.reject("No user");
31 dispatch(progressIndicatorActions.START_WORKING("toggleFavorite"));
32 dispatch<any>(addDisabledButton(ContextMenuActionNames.ADD_TO_FAVORITES))
33 dispatch(favoritesActions.TOGGLE_FAVORITE({ resourceUuid: resource.uuid }));
34 const isFavorite = checkFavorite(resource.uuid, getState().favorites);
35 dispatch(snackbarActions.OPEN_SNACKBAR({
37 ? "Removing from favorites..."
38 : "Adding to favorites...",
39 kind: SnackbarKind.INFO
42 const promise: any = isFavorite
43 ? services.favoriteService.delete({ userUuid, resourceUuid: resource.uuid })
44 : services.favoriteService.create({ userUuid, resource });
48 dispatch(favoritesActions.UPDATE_FAVORITES({ [resource.uuid]: !isFavorite }));
49 dispatch(snackbarActions.CLOSE_SNACKBAR());
50 dispatch(snackbarActions.OPEN_SNACKBAR({
52 ? "Removed from favorites"
53 : "Added to favorites",
55 kind: SnackbarKind.SUCCESS
57 dispatch<any>(removeDisabledButton(ContextMenuActionNames.ADD_TO_FAVORITES))
58 dispatch(progressIndicatorActions.STOP_WORKING("toggleFavorite"));
59 dispatch<any>(loadFavoritesTree(true))
62 dispatch(progressIndicatorActions.STOP_WORKING("toggleFavorite"));
67 export const updateFavorites = (resourceUuids: string[]) =>
68 (dispatch: Dispatch, getState: () => RootState, services: ServiceRepository) => {
69 const userUuid = getUserUuid(getState());
70 if (!userUuid) { return; }
71 dispatch(favoritesActions.CHECK_PRESENCE_IN_FAVORITES(resourceUuids));
72 services.favoriteService
73 .checkPresenceInFavorites(userUuid, resourceUuids)
74 .then((results: any) => {
75 dispatch(favoritesActions.UPDATE_FAVORITES(results));