Merge branch '21128-toolbar-context-menu'
[arvados-workbench2.git] / src / store / snackbar / snackbar-reducer.ts
1 // Copyright (C) The Arvados Authors. All rights reserved.
2 //
3 // SPDX-License-Identifier: AGPL-3.0
4
5 import { SnackbarAction, snackbarActions, SnackbarKind, SnackbarMessage } from "./snackbar-actions";
6
7 export interface SnackbarState {
8     messages: SnackbarMessage[];
9     open: boolean;
10 }
11
12 const DEFAULT_HIDE_DURATION = 3000;
13
14 const initialState: SnackbarState = {
15     messages: [],
16     open: false
17 };
18
19 export const snackbarReducer = (state = initialState, action: SnackbarAction) => {
20     return snackbarActions.match(action, {
21         OPEN_SNACKBAR: data => {
22             return {
23                 open: true,
24                 messages: state.messages.concat({
25                     message: data.message,
26                     hideDuration: data.hideDuration ? data.hideDuration : DEFAULT_HIDE_DURATION,
27                     kind: data.kind ? data.kind : SnackbarKind.INFO, 
28                     link: data.link
29                 })
30             };
31         },
32         CLOSE_SNACKBAR: (payload) => {
33             let newMessages: any = [...state.messages];// state.messages.filter(({ message }) => message !== payload);
34
35             if (payload === undefined || JSON.stringify(payload) === '{}') {
36                 newMessages.pop();
37             } else {
38                 newMessages = state.messages.filter((message, index) => index !== payload);
39             }
40
41             return {
42                 ...state,
43                 messages: newMessages,
44                 open: newMessages.length > 0
45             }
46         },
47         SHIFT_MESSAGES: () => {
48             const messages = state.messages.filter((m, idx) => idx > 0);
49             return {
50                 open: messages.length > 0,
51                 messages
52             };
53         },
54         default: () => state,
55     });
56 };