@@ -20,34 +20,29 @@ export interface SnackbarMessage {
20
20
21
21
export interface State {
22
22
open : boolean ;
23
+ snackPack : SnackbarMessage [ ] ;
23
24
messageInfo ?: SnackbarMessage ;
24
25
}
25
26
26
27
export default function ConsecutiveSnackbars ( ) {
27
- const queueRef = React . useRef < SnackbarMessage [ ] > ( [ ] ) ;
28
+ const [ snackPack , setSnackPack ] = React . useState < SnackbarMessage [ ] > ( [ ] ) ;
28
29
const [ open , setOpen ] = React . useState ( false ) ;
29
30
const [ messageInfo , setMessageInfo ] = React . useState < SnackbarMessage | undefined > ( undefined ) ;
30
31
31
- const processQueue = ( ) => {
32
- if ( queueRef . current . length > 0 ) {
33
- setMessageInfo ( queueRef . current . shift ( ) ) ;
32
+ React . useEffect ( ( ) => {
33
+ if ( snackPack . length && ! messageInfo ) {
34
+ // Set a new snack when we don't have an active one
35
+ setMessageInfo ( { ...snackPack [ 0 ] } ) ;
36
+ setSnackPack ( ( prev ) => prev . slice ( 1 ) ) ;
34
37
setOpen ( true ) ;
38
+ } else if ( snackPack . length && messageInfo && open ) {
39
+ // Close an active snack when a new one is added
40
+ setOpen ( false ) ;
35
41
}
36
- } ;
42
+ } , [ snackPack , messageInfo , open ] ) ;
37
43
38
44
const handleClick = ( message : string ) => ( ) => {
39
- queueRef . current . push ( {
40
- message,
41
- key : new Date ( ) . getTime ( ) ,
42
- } ) ;
43
-
44
- if ( open ) {
45
- // immediately begin dismissing current message
46
- // to start showing new one
47
- setOpen ( false ) ;
48
- } else {
49
- processQueue ( ) ;
50
- }
45
+ setSnackPack ( ( prev ) => [ ...prev , { message, key : new Date ( ) . getTime ( ) } ] ) ;
51
46
} ;
52
47
53
48
const handleClose = ( event : React . SyntheticEvent | MouseEvent , reason ?: string ) => {
@@ -58,7 +53,7 @@ export default function ConsecutiveSnackbars() {
58
53
} ;
59
54
60
55
const handleExited = ( ) => {
61
- processQueue ( ) ;
56
+ setMessageInfo ( undefined ) ;
62
57
} ;
63
58
64
59
const classes = useStyles ( ) ;
0 commit comments