aboutsummaryrefslogtreecommitdiffstats
path: root/server/sonar-web/src/main/js/components/store/globalMessages.js
blob: b5e11e1f5df73595889a414a04fb6d9cb485f9f4 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
/*
 * SonarQube
 * Copyright (C) 2009-2016 SonarSource SA
 * mailto:contact AT sonarsource DOT com
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 3 of the License, or (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public License
 * along with this program; if not, write to the Free Software Foundation,
 * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
 */
// @flow
import uniqueId from 'lodash/uniqueId';
import { actions } from '../../app/store/appState/duck';

type Level = 'ERROR' | 'SUCCESS';

type Message = {
  id: string,
  message: string,
  level: Level
};

export type State = Array<Message>;

type Action = Object;

export const ERROR = 'ERROR';
export const SUCCESS = 'SUCCESS';

/* Actions */
const ADD_GLOBAL_MESSAGE = 'ADD_GLOBAL_MESSAGE';
const CLOSE_GLOBAL_MESSAGE = 'CLOSE_GLOBAL_MESSAGE';
const CLOSE_ALL_GLOBAL_MESSAGES = 'CLOSE_ALL_GLOBAL_MESSAGES';

const addGlobalMessageActionCreator = (id: string, message: string, level: Level) => ({
  type: ADD_GLOBAL_MESSAGE,
  message,
  level,
  id
});

export const closeGlobalMessage = (id: string) => ({
  type: CLOSE_GLOBAL_MESSAGE,
  id
});

export const closeAllGlobalMessages = (id: string) => ({
  type: CLOSE_ALL_GLOBAL_MESSAGES,
  id
});

const addGlobalMessage = (message: string, level: Level) => (dispatch: Function) => {
  const id = uniqueId('global-message-');
  dispatch(addGlobalMessageActionCreator(id, message, level));
  setTimeout(() => dispatch(closeGlobalMessage(id)), 5000);
};

export const addGlobalErrorMessage = (message: string) =>
    addGlobalMessage(message, ERROR);

export const addGlobalSuccessMessage = (message: string) =>
    addGlobalMessage(message, SUCCESS);

/* Reducer */
const globalMessages = (state: State = [], action: Action = {}) => {
  switch (action.type) {
    case ADD_GLOBAL_MESSAGE:
      return [{
        id: action.id,
        message: action.message,
        level: action.level
      }];

    case actions.REQUIRE_AUTHENTICATION:
      // FIXME l10n
      return [{
        id: uniqueId('global-message-'),
        message: 'Authentication required to see this page.',
        level: ERROR
      }];

    case actions.REQUIRE_AUTHORIZATION:
      // FIXME l10n
      return [{
        id: uniqueId('global-message-'),
        message: 'You are not authorized to access this page. Please log in with more privileges and try again.',
        level: ERROR
      }];

    case CLOSE_GLOBAL_MESSAGE:
      return state.filter(message => message.id !== action.id);


    case CLOSE_ALL_GLOBAL_MESSAGES:
      return [];
    default:
      return state;
  }
};

export default globalMessages;

/* Selectors */
export const getGlobalMessages = (state: State) => state;