Skip to content

Commit f398fcc

Browse files
authored
fix: Warn correct state usage for modals (#8495)
* fix: Warn correct state usage for modals * Clarify other props for ModalOverlay * add process node env
1 parent c05bb9c commit f398fcc

File tree

1 file changed

+11
-0
lines changed

1 file changed

+11
-0
lines changed

packages/react-aria-components/src/Modal.tsx

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,12 @@ export const Modal = /*#__PURE__*/ (forwardRef as forwardRefType)(function Modal
6969
let ctx = useContext(InternalModalContext);
7070

7171
if (ctx) {
72+
if (process.env.NODE_ENV !== 'production' && (props.onOpenChange || props.defaultOpen !== undefined || props.isOpen !== undefined)) {
73+
// create a list of props that are passed in but not allowed when using an external ModalOverlay
74+
const invalidSet = new Set(['isDismissable', 'isKeyboardDismissDisabled', 'isOpen', 'defaultOpen', 'onOpenChange', 'isEntering', 'isExiting', 'UNSTABLE_portalContainer', 'shouldCloseOnInteractOutside']);
75+
const invalidProps = Object.keys(props).filter(key => invalidSet.has(key));
76+
console.warn(`This modal is already wrapped in a ModalOverlay, props [${invalidProps.join(', ')}] should be placed on the ModalOverlay instead.`);
77+
}
7278
return <ModalContent {...props} modalRef={ref}>{props.children}</ModalContent>;
7379
}
7480

@@ -116,6 +122,11 @@ function ModalOverlayWithForwardRef(props: ModalOverlayProps, ref: ForwardedRef<
116122
let contextState = useContext(OverlayTriggerStateContext);
117123
let localState = useOverlayTriggerState(props);
118124
let state = props.isOpen != null || props.defaultOpen != null || !contextState ? localState : contextState;
125+
if (state === contextState) {
126+
if (process.env.NODE_ENV !== 'production' && (props.onOpenChange || props.defaultOpen !== undefined || props.isOpen !== undefined)) {
127+
console.warn('This modals state is controlled by a trigger, place onOpenChange on the trigger instead.');
128+
}
129+
}
119130

120131
let objectRef = useObjectRef(ref);
121132
let modalRef = useRef<HTMLDivElement>(null);

0 commit comments

Comments
 (0)