@@ -8,8 +8,9 @@ import React, { useState, useCallback, useContext } from 'react'
8
8
import Banner from '../components/InfoBanner'
9
9
10
10
export interface Message {
11
- text : string | undefined
12
- type : 'error' | 'success'
11
+ content : string | JSX . Element | undefined
12
+ type : 'success' | 'info' | 'warning' | 'error'
13
+ showMs : number | null // null = infinite
13
14
}
14
15
15
16
interface MessageBannerState {
@@ -22,14 +23,13 @@ export const Context = React.createContext<MessageBannerState>({
22
23
}
23
24
} )
24
25
25
- export function MessageBannerProvider ( { children } : any ) : JSX . Element {
26
+ export function MessageBannerProvider ( { children } : any ) : JSX . Element {
26
27
// We need to store the last timeout, so we can clear when a new message is shown
27
- const [ lastTimeout , setLastTimeout ] = useState < NodeJS . Timeout | undefined > (
28
- undefined
29
- )
28
+ const [ lastTimeout , setLastTimeout ] = useState < NodeJS . Timeout > ( )
30
29
const [ message , setMessage ] = useState < Message > ( {
31
- text : undefined ,
32
- type : 'success'
30
+ content : undefined ,
31
+ type : 'success' ,
32
+ showMs : 6000
33
33
} )
34
34
35
35
const showMessage = useCallback ( ( message : Message ) => {
@@ -39,25 +39,28 @@ export function MessageBannerProvider({ children }: any): JSX.Element {
39
39
40
40
setMessage ( message )
41
41
42
+ if ( message . showMs === null ) {
43
+ // don't hide message
44
+ return
45
+ }
46
+
42
47
// Hide message after 6 seconds
43
48
const newTimeout = setTimeout (
44
49
( ) =>
45
50
setMessage ( {
46
- text : undefined ,
47
- type : 'success'
51
+ content : undefined ,
52
+ type : 'success' ,
53
+ showMs : 6000
48
54
} ) ,
49
- 6000
55
+ message . showMs
50
56
)
51
57
52
58
setLastTimeout ( newTimeout )
53
59
} , [ ] )
54
60
55
61
return (
56
62
< Context . Provider value = { { showMessage } } >
57
- < Banner
58
- successMsg = { message . type === 'success' ? message . text : undefined }
59
- errorMsg = { message . type === 'error' ? message . text : undefined }
60
- />
63
+ < Banner message = { message } />
61
64
{ children }
62
65
</ Context . Provider >
63
66
)
0 commit comments