-
Notifications
You must be signed in to change notification settings - Fork 4
/
useSnackMessage.js
128 lines (118 loc) · 3.14 KB
/
useSnackMessage.js
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
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
/**
* Copyright (c) 2021, RTE (http://www.rte-france.com)
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
*/
import { useCallback } from 'react';
import { useSnackbar } from 'notistack';
import { useIntlRef } from './useIntlRef';
export function useSnackMessage() {
const intlRef = useIntlRef();
const { enqueueSnackbar } = useSnackbar();
/*
There is two kind of messages : the message itself (bottom of snackbar), and the header (top of snackbar).
As inputs, you can give either a text message, or an ID with optional values (for translation with intl).
snackInputs: {
messageTxt,
messageId,
messageValues,
headerTxt,
headerId,
headerValues,
}
*/
const snackError = useCallback(
(snackInputs) =>
makeSnackbar(snackInputs, intlRef, enqueueSnackbar, 'error', true),
[enqueueSnackbar, intlRef]
);
/* see snackError */
const snackWarning = useCallback(
(snackInputs) =>
makeSnackbar(
snackInputs,
intlRef,
enqueueSnackbar,
'warning',
true
),
[enqueueSnackbar, intlRef]
);
/* see snackError */
const snackInfo = useCallback(
(snackInputs) =>
makeSnackbar(snackInputs, intlRef, enqueueSnackbar, 'info', false),
[enqueueSnackbar, intlRef]
);
return { snackError, snackInfo, snackWarning };
}
function makeSnackbar(
snackInputs,
intlRef,
enqueueSnackbar,
level,
persistent
) {
const message = checkAndTranslateIfNecessary(
snackInputs.messageTxt,
snackInputs.messageId,
snackInputs.messageValues,
intlRef
);
const header = checkAndTranslateIfNecessary(
snackInputs.headerTxt,
snackInputs.headerId,
snackInputs.headerValues,
intlRef
);
displayMessageWithSnackbar(
message,
header,
enqueueSnackbar,
level,
persistent
);
}
function checkAndTranslateIfNecessary(txt, id, values, intlRef) {
checkInputs(txt, id, values);
return (
txt ??
(id
? intlRef.current.formatMessage(
{
id: id,
},
values
)
: null)
);
}
function checkInputs(txt, id, values) {
if (txt && (id || values)) {
console.warn('Snack inputs should be [*Txt] OR [*Id, *Values]');
}
}
function displayMessageWithSnackbar(
message,
header,
enqueueSnackbar,
level,
persistent
) {
let fullMessage = '';
if (header) {
fullMessage += header;
}
if (message) {
if (header) {
fullMessage += '\n\n';
}
fullMessage += message;
}
enqueueSnackbar(fullMessage, {
variant: level,
persist: persistent,
style: { whiteSpace: 'pre-line' },
});
}