|
1 | 1 | 'use client';
|
2 | 2 | import invariant from 'invariant';
|
3 | 3 | import * as React from 'react';
|
| 4 | +import useEventCallback from '@mui/utils/useEventCallback'; |
4 | 5 | import { DialogsContext } from './DialogsContext';
|
5 | 6 | import type { DialogComponent, OpenDialog, OpenDialogOptions } from './useDialogs';
|
6 | 7 |
|
@@ -37,62 +38,56 @@ function DialogsProvider(props: DialogProviderProps) {
|
37 | 38 | const keyPrefix = React.useId();
|
38 | 39 | const nextId = React.useRef(0);
|
39 | 40 |
|
40 |
| - const requestDialog = React.useCallback<OpenDialog>( |
41 |
| - function open<P, R>( |
42 |
| - Component: DialogComponent<P, R>, |
43 |
| - payload: P, |
44 |
| - options: OpenDialogOptions<R> = {}, |
45 |
| - ) { |
46 |
| - const { onClose = async () => {} } = options; |
47 |
| - let resolve: ((result: R) => void) | undefined; |
48 |
| - const promise = new Promise<R>((resolveImpl) => { |
49 |
| - resolve = resolveImpl; |
50 |
| - }); |
51 |
| - invariant(resolve, 'resolve not set'); |
| 41 | + const requestDialog = useEventCallback<OpenDialog>(function open<P, R>( |
| 42 | + Component: DialogComponent<P, R>, |
| 43 | + payload: P, |
| 44 | + options: OpenDialogOptions<R> = {}, |
| 45 | + ) { |
| 46 | + const { onClose = async () => {} } = options; |
| 47 | + let resolve: ((result: R) => void) | undefined; |
| 48 | + const promise = new Promise<R>((resolveImpl) => { |
| 49 | + resolve = resolveImpl; |
| 50 | + }); |
| 51 | + invariant(resolve, 'resolve not set'); |
52 | 52 |
|
53 |
| - const key = `${keyPrefix}-${nextId.current}`; |
54 |
| - nextId.current += 1; |
| 53 | + const key = `${keyPrefix}-${nextId.current}`; |
| 54 | + nextId.current += 1; |
55 | 55 |
|
56 |
| - const newEntry: DialogStackEntry<P, R> = { |
57 |
| - key, |
58 |
| - open: true, |
59 |
| - promise, |
60 |
| - Component, |
61 |
| - payload, |
62 |
| - onClose, |
63 |
| - resolve, |
64 |
| - }; |
| 56 | + const newEntry: DialogStackEntry<P, R> = { |
| 57 | + key, |
| 58 | + open: true, |
| 59 | + promise, |
| 60 | + Component, |
| 61 | + payload, |
| 62 | + onClose, |
| 63 | + resolve, |
| 64 | + }; |
65 | 65 |
|
66 |
| - setStack((prevStack) => [...prevStack, newEntry]); |
67 |
| - return promise; |
68 |
| - }, |
69 |
| - [keyPrefix], |
70 |
| - ); |
| 66 | + setStack((prevStack) => [...prevStack, newEntry]); |
| 67 | + return promise; |
| 68 | + }); |
71 | 69 |
|
72 |
| - const closeDialogUi = React.useCallback( |
73 |
| - function closeDialogUi<R>(dialog: Promise<R>) { |
74 |
| - setStack((prevStack) => |
75 |
| - prevStack.map((entry) => (entry.promise === dialog ? { ...entry, open: false } : entry)), |
76 |
| - ); |
77 |
| - setTimeout(() => { |
78 |
| - // wait for closing animation |
79 |
| - setStack((prevStack) => prevStack.filter((entry) => entry.promise !== dialog)); |
80 |
| - }, unmountAfter); |
81 |
| - }, |
82 |
| - [unmountAfter], |
83 |
| - ); |
| 70 | + const closeDialogUi = useEventCallback(function closeDialogUi<R>(dialog: Promise<R>) { |
| 71 | + setStack((prevStack) => |
| 72 | + prevStack.map((entry) => (entry.promise === dialog ? { ...entry, open: false } : entry)), |
| 73 | + ); |
| 74 | + setTimeout(() => { |
| 75 | + // wait for closing animation |
| 76 | + setStack((prevStack) => prevStack.filter((entry) => entry.promise !== dialog)); |
| 77 | + }, unmountAfter); |
| 78 | + }); |
84 | 79 |
|
85 |
| - const closeDialog = React.useCallback( |
86 |
| - async function closeDialog<R>(dialog: Promise<R>, result: R) { |
87 |
| - const entryToClose = stack.find((entry) => entry.promise === dialog); |
88 |
| - invariant(entryToClose, 'dialog not found'); |
89 |
| - await entryToClose.onClose(result); |
90 |
| - entryToClose.resolve(result); |
91 |
| - closeDialogUi(dialog); |
92 |
| - return dialog; |
93 |
| - }, |
94 |
| - [stack, closeDialogUi], |
95 |
| - ); |
| 80 | + const closeDialog = useEventCallback(async function closeDialog<R>( |
| 81 | + dialog: Promise<R>, |
| 82 | + result: R, |
| 83 | + ) { |
| 84 | + const entryToClose = stack.find((entry) => entry.promise === dialog); |
| 85 | + invariant(entryToClose, 'dialog not found'); |
| 86 | + await entryToClose.onClose(result); |
| 87 | + entryToClose.resolve(result); |
| 88 | + closeDialogUi(dialog); |
| 89 | + return dialog; |
| 90 | + }); |
96 | 91 |
|
97 | 92 | const contextValue = React.useMemo(
|
98 | 93 | () => ({ open: requestDialog, close: closeDialog }),
|
|
0 commit comments