1
- import React , { createContext , useContext , useEffect } from 'react' ;
2
- import useMessageQueue , { Message } from '../../hooks/useMessageQueue' ;
1
+ import React , { createContext , useContext , useEffect , useMemo , useReducer } from 'react' ;
2
+ import messageQueueReducer , { Message } from './messageQueueReducer' ;
3
+
4
+ type FeedbackMessageContextValue = {
5
+ messages : Message [ ] ;
6
+ clearMessage : ( id : string ) => void ;
7
+ } ;
3
8
4
9
const defaultEmit = ( _message : string ) => { } ;
5
10
@@ -8,31 +13,36 @@ export const FeedbackEmitContext = createContext({
8
13
error : defaultEmit ,
9
14
warning : defaultEmit ,
10
15
} ) ;
11
- const FeedbackMessageContext = createContext < Message [ ] > ( [ ] ) ;
16
+ const FeedbackMessageContext = createContext < FeedbackMessageContextValue > ( { messages : [ ] , clearMessage : ( ) => { } } ) ;
12
17
13
18
const FeedbackProvider = ( { children } : { children : React . ReactElement } ) => {
14
- const [ messages , messageQueue ] = useMessageQueue ( ) ;
19
+ const [ messages , dispatch ] = useReducer ( messageQueueReducer , [ ] ) ;
15
20
16
21
useEffect ( ( ) => {
17
22
const callback = ( error : PromiseRejectionEvent ) => {
18
23
if ( error ?. reason ?. message ) {
19
- messageQueue . push ( { message : error . reason . message , type : 'error' } ) ;
24
+ dispatch ( { type : 'ADD_MESSAGE' , payload : { message : error . reason . message , type : 'error' } } ) ;
20
25
}
21
26
} ;
22
27
window . addEventListener ( 'unhandledrejection' , callback ) ;
23
28
return ( ) => window . removeEventListener ( 'unhandledrejection' , callback ) ;
24
- } , [ messageQueue ] ) ;
29
+ } , [ ] ) ;
30
+
31
+ const emit = useMemo (
32
+ ( ) => ( {
33
+ success : ( message : string ) => dispatch ( { type : 'ADD_MESSAGE' , payload : { message, type : 'success' } } ) ,
34
+ warning : ( message : string ) => dispatch ( { type : 'ADD_MESSAGE' , payload : { message, type : 'warning' } } ) ,
35
+ error : ( message : string ) => dispatch ( { type : 'ADD_MESSAGE' , payload : { message, type : 'error' } } ) ,
36
+ } ) ,
37
+ [ ] ,
38
+ ) ;
25
39
26
- const emit = {
27
- success : ( message : string ) => messageQueue . push ( { message, type : 'success' } ) ,
28
- warning : ( message : string ) => messageQueue . push ( { message, type : 'warning' } ) ,
29
- error : ( message : string ) => messageQueue . push ( { message, type : 'error' } ) ,
30
- } ;
40
+ const clearMessage = ( id : string ) => dispatch ( { type : 'REMOVE_MESSAGE' , payload : { id } } ) ;
31
41
32
42
return (
33
- < FeedbackEmitContext . Provider value = { emit } >
34
- < FeedbackMessageContext . Provider value = { messages } > { children } </ FeedbackMessageContext . Provider >
35
- </ FeedbackEmitContext . Provider >
43
+ < FeedbackMessageContext . Provider value = { { messages , clearMessage } } >
44
+ < FeedbackEmitContext . Provider value = { emit } > { children } </ FeedbackEmitContext . Provider >
45
+ </ FeedbackMessageContext . Provider >
36
46
) ;
37
47
} ;
38
48
0 commit comments