Skip to content

Commit 3789b18

Browse files
committed
[drawer] Fix nested dialog stack semantics
1 parent 8bfa605 commit 3789b18

7 files changed

Lines changed: 530 additions & 4 deletions

File tree

packages/react/src/alert-dialog/root/AlertDialogRoot.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ export function AlertDialogRoot<Payload>(props: AlertDialogRoot.Props<Payload>)
2626
defaultTriggerId: defaultTriggerIdProp = null,
2727
} = props;
2828

29-
const parentDialogRootContext = useDialogRootContext();
29+
const parentDialogRootContext = useDialogRootContext(true);
3030
const nested = Boolean(parentDialogRootContext);
3131

3232
const store = DialogStore.useStore(handle?.store, {

packages/react/src/dialog/popup/DialogPopup.tsx

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,10 @@
11
'use client';
22
import * as React from 'react';
33
import { InteractionType } from '@base-ui/utils/useEnhancedClickHandler';
4+
import { useIsoLayoutEffect } from '@base-ui/utils/useIsoLayoutEffect';
45
import { FloatingFocusManager } from '../../floating-ui-react';
56
import { useDialogRootContext } from '../root/DialogRootContext';
7+
import { useDrawerRootContext } from '../../drawer/root/DrawerRootContext';
68
import { useRenderElement } from '../../utils/useRenderElement';
79
import { type BaseUIComponentProps } from '../../utils/types';
810
import { type TransitionStatus } from '../../utils/useTransitionStatus';
@@ -50,9 +52,29 @@ export const DialogPopup = React.forwardRef(function DialogPopup(
5052
const titleElementId = store.useState('titleElementId');
5153
const transitionStatus = store.useState('transitionStatus');
5254
const role = store.useState('role');
55+
const drawerRootContext = useDrawerRootContext(true);
56+
const lastReportedOpenRef = React.useRef(false);
5357

5458
useDialogPortalContext();
5559

60+
useIsoLayoutEffect(() => {
61+
if (!drawerRootContext) {
62+
return undefined;
63+
}
64+
65+
if (lastReportedOpenRef.current !== open) {
66+
drawerRootContext.onNonDrawerDialogOpenChange(open ? 1 : -1);
67+
lastReportedOpenRef.current = open;
68+
}
69+
70+
return () => {
71+
if (lastReportedOpenRef.current) {
72+
drawerRootContext.onNonDrawerDialogOpenChange(-1);
73+
lastReportedOpenRef.current = false;
74+
}
75+
};
76+
}, [drawerRootContext, open]);
77+
5678
useOpenChangeComplete({
5779
open,
5880
ref: store.context.popupRef,

0 commit comments

Comments
 (0)