Skip to content

Commit 595413c

Browse files
authored
fix: update open state while disabled (#641)
* fix: update open state while disabled * ci: pin react-doctor version
1 parent a2fcd03 commit 595413c

3 files changed

Lines changed: 33 additions & 3 deletions

File tree

.github/workflows/react-doctor.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,4 +21,4 @@ jobs:
2121
persist-credentials: false
2222
- uses: millionco/react-doctor@0b4f4f4bd248a154e64eb508a48347f71154b3f3
2323
with:
24-
github-token: ${{ secrets.GITHUB_TOKEN }}
24+
version: 0.7.4

src/index.tsx

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -322,7 +322,8 @@ export function generateTrigger(
322322
popupVisible,
323323
);
324324

325-
const mergedOpen = (internalOpen || false) && !disabled;
325+
const rawOpen = internalOpen || false;
326+
const mergedOpen = rawOpen && !disabled;
326327

327328
// ========================== Children ==========================
328329
const child = React.useMemo(() => {
@@ -387,7 +388,7 @@ export function generateTrigger(
387388

388389
const internalTriggerOpen = useEvent((nextOpen: boolean) => {
389390
flushSync(() => {
390-
if (mergedOpen !== nextOpen) {
391+
if (rawOpen !== nextOpen) {
391392
setInternalOpen(nextOpen);
392393
onOpenChange?.(nextOpen);
393394
onPopupVisibleChange?.(nextOpen);

tests/basic.test.jsx

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -208,6 +208,35 @@ describe('Trigger.Basic', () => {
208208
expect(isPopupHidden()).toBeFalsy();
209209
expect(onOpenChange).not.toHaveBeenCalled();
210210
});
211+
212+
it('updates open state when mouse leaves while disabled', () => {
213+
const onOpenChange = jest.fn();
214+
const Demo = ({ disabled = false }) => (
215+
<Trigger
216+
action={['hover']}
217+
disabled={disabled}
218+
onOpenChange={onOpenChange}
219+
popup={<strong>trigger</strong>}
220+
>
221+
<div className="target">hover</div>
222+
</Trigger>
223+
);
224+
225+
const { container, rerender } = render(<Demo />);
226+
227+
trigger(container, '.target', 'mouseEnter');
228+
expect(isPopupHidden()).toBeFalsy();
229+
onOpenChange.mockReset();
230+
231+
rerender(<Demo disabled />);
232+
expect(isPopupHidden()).toBeTruthy();
233+
234+
trigger(container, '.target', 'mouseLeave');
235+
expect(onOpenChange).toHaveBeenCalledWith(false);
236+
237+
rerender(<Demo />);
238+
expect(isPopupHidden()).toBeTruthy();
239+
});
211240
});
212241

213242
it('contextMenu works', () => {

0 commit comments

Comments
 (0)