Skip to content

Commit ed84f5f

Browse files
authored
[Snackbar] Improve consecutive demos (#20721)
1 parent 96dc46d commit ed84f5f

File tree

2 files changed

+25
-36
lines changed

2 files changed

+25
-36
lines changed

docs/src/pages/components/snackbars/ConsecutiveSnackbars.js

+12-18
Original file line numberDiff line numberDiff line change
@@ -12,30 +12,24 @@ const useStyles = makeStyles((theme) => ({
1212
}));
1313

1414
export default function ConsecutiveSnackbars() {
15-
const queueRef = React.useRef([]);
15+
const [snackPack, setSnackPack] = React.useState([]);
1616
const [open, setOpen] = React.useState(false);
1717
const [messageInfo, setMessageInfo] = React.useState(undefined);
1818

19-
const processQueue = () => {
20-
if (queueRef.current.length > 0) {
21-
setMessageInfo(queueRef.current.shift());
19+
React.useEffect(() => {
20+
if (snackPack.length && !messageInfo) {
21+
// Set a new snack when we don't have an active one
22+
setMessageInfo({ ...snackPack[0] });
23+
setSnackPack((prev) => prev.slice(1));
2224
setOpen(true);
25+
} else if (snackPack.length && messageInfo && open) {
26+
// Close an active snack when a new one is added
27+
setOpen(false);
2328
}
24-
};
29+
}, [snackPack, messageInfo, open]);
2530

2631
const handleClick = (message) => () => {
27-
queueRef.current.push({
28-
message,
29-
key: new Date().getTime(),
30-
});
31-
32-
if (open) {
33-
// immediately begin dismissing current message
34-
// to start showing new one
35-
setOpen(false);
36-
} else {
37-
processQueue();
38-
}
32+
setSnackPack((prev) => [...prev, { message, key: new Date().getTime() }]);
3933
};
4034

4135
const handleClose = (event, reason) => {
@@ -46,7 +40,7 @@ export default function ConsecutiveSnackbars() {
4640
};
4741

4842
const handleExited = () => {
49-
processQueue();
43+
setMessageInfo(undefined);
5044
};
5145

5246
const classes = useStyles();

docs/src/pages/components/snackbars/ConsecutiveSnackbars.tsx

+13-18
Original file line numberDiff line numberDiff line change
@@ -20,34 +20,29 @@ export interface SnackbarMessage {
2020

2121
export interface State {
2222
open: boolean;
23+
snackPack: SnackbarMessage[];
2324
messageInfo?: SnackbarMessage;
2425
}
2526

2627
export default function ConsecutiveSnackbars() {
27-
const queueRef = React.useRef<SnackbarMessage[]>([]);
28+
const [snackPack, setSnackPack] = React.useState<SnackbarMessage[]>([]);
2829
const [open, setOpen] = React.useState(false);
2930
const [messageInfo, setMessageInfo] = React.useState<SnackbarMessage | undefined>(undefined);
3031

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));
3437
setOpen(true);
38+
} else if (snackPack.length && messageInfo && open) {
39+
// Close an active snack when a new one is added
40+
setOpen(false);
3541
}
36-
};
42+
}, [snackPack, messageInfo, open]);
3743

3844
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() }]);
5146
};
5247

5348
const handleClose = (event: React.SyntheticEvent | MouseEvent, reason?: string) => {
@@ -58,7 +53,7 @@ export default function ConsecutiveSnackbars() {
5853
};
5954

6055
const handleExited = () => {
61-
processQueue();
56+
setMessageInfo(undefined);
6257
};
6358

6459
const classes = useStyles();

0 commit comments

Comments
 (0)