73c566fc8cb95945e7b9b95abea9dfa4e00e6684
[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                 })
29             };
30         },
31         CLOSE_SNACKBAR: () => ({
32             ...state,
33             open: false
34         }),
35         SHIFT_MESSAGES: () => {
36             const messages = state.messages.filter((m, idx) => idx > 0);
37             return {
38                 open: messages.length > 0,
39                 messages
40             };
41         },
42         default: () => state,
43     });
44 };