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;
|