diff --git a/.github/workflows/react-doctor.yml b/.github/workflows/react-doctor.yml
index 56430b6e..4a3e5284 100644
--- a/.github/workflows/react-doctor.yml
+++ b/.github/workflows/react-doctor.yml
@@ -21,4 +21,4 @@ jobs:
persist-credentials: false
- uses: millionco/react-doctor@0b4f4f4bd248a154e64eb508a48347f71154b3f3
with:
- github-token: ${{ secrets.GITHUB_TOKEN }}
+ version: 0.7.4
diff --git a/src/index.tsx b/src/index.tsx
index 90f8202d..22f29a0a 100644
--- a/src/index.tsx
+++ b/src/index.tsx
@@ -322,7 +322,8 @@ export function generateTrigger(
popupVisible,
);
- const mergedOpen = (internalOpen || false) && !disabled;
+ const rawOpen = internalOpen || false;
+ const mergedOpen = rawOpen && !disabled;
// ========================== Children ==========================
const child = React.useMemo(() => {
@@ -387,7 +388,7 @@ export function generateTrigger(
const internalTriggerOpen = useEvent((nextOpen: boolean) => {
flushSync(() => {
- if (mergedOpen !== nextOpen) {
+ if (rawOpen !== nextOpen) {
setInternalOpen(nextOpen);
onOpenChange?.(nextOpen);
onPopupVisibleChange?.(nextOpen);
diff --git a/tests/basic.test.jsx b/tests/basic.test.jsx
index edebbd61..159c857f 100644
--- a/tests/basic.test.jsx
+++ b/tests/basic.test.jsx
@@ -208,6 +208,35 @@ describe('Trigger.Basic', () => {
expect(isPopupHidden()).toBeFalsy();
expect(onOpenChange).not.toHaveBeenCalled();
});
+
+ it('updates open state when mouse leaves while disabled', () => {
+ const onOpenChange = jest.fn();
+ const Demo = ({ disabled = false }) => (
+ trigger}
+ >
+ hover
+
+ );
+
+ const { container, rerender } = render();
+
+ trigger(container, '.target', 'mouseEnter');
+ expect(isPopupHidden()).toBeFalsy();
+ onOpenChange.mockReset();
+
+ rerender();
+ expect(isPopupHidden()).toBeTruthy();
+
+ trigger(container, '.target', 'mouseLeave');
+ expect(onOpenChange).toHaveBeenCalledWith(false);
+
+ rerender();
+ expect(isPopupHidden()).toBeTruthy();
+ });
});
it('contextMenu works', () => {