Skip to content

Commit e39d054

Browse files
authored
fix: blur unique logic not trigger close (#1184)
1 parent c67f9f4 commit e39d054

File tree

3 files changed

+31
-4
lines changed

3 files changed

+31
-4
lines changed

src/BaseSelect/index.tsx

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ import type { RefTriggerProps } from '../SelectTrigger';
2121
import SelectTrigger from '../SelectTrigger';
2222
import { getSeparatedContent, isValidCount } from '../utils/valueUtil';
2323
import Polite from './Polite';
24-
import useOpen from '../hooks/useOpen';
24+
import useOpen, { macroTask } from '../hooks/useOpen';
2525
import { useEvent } from '@rc-component/util';
2626
import type { SelectInputRef } from '../SelectInput';
2727
import SelectInput from '../SelectInput';
@@ -547,8 +547,7 @@ const BaseSelect = React.forwardRef<BaseSelectRef, BaseSelectProps>((props, ref)
547547
useSelectTriggerControl(getSelectElements, mergedOpen, triggerOpen, !!mergedComponents.root);
548548

549549
// ========================== Focus / Blur ==========================
550-
/** Record real focus status */
551-
// const focusRef = React.useRef<boolean>(false);
550+
const internalMouseDownRef = React.useRef(false);
552551

553552
const onInternalFocus: React.FocusEventHandler<HTMLElement> = (event) => {
554553
setFocused(true);
@@ -565,7 +564,7 @@ const BaseSelect = React.forwardRef<BaseSelectRef, BaseSelectProps>((props, ref)
565564

566565
const onRootBlur = () => {
567566
// Delay close should check the activeElement
568-
if (mergedOpen) {
567+
if (mergedOpen && !internalMouseDownRef.current) {
569568
triggerOpen(false, {
570569
cancelFun: () => isInside(getSelectElements(), document.activeElement as HTMLElement),
571570
});
@@ -605,6 +604,11 @@ const BaseSelect = React.forwardRef<BaseSelectRef, BaseSelectProps>((props, ref)
605604
}
606605

607606
onMouseDown?.(event, ...restArgs);
607+
608+
internalMouseDownRef.current = true;
609+
macroTask(() => {
610+
internalMouseDownRef.current = false;
611+
});
608612
};
609613

610614
// ============================ Dropdown ============================

tests/Combobox.test.tsx

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -500,6 +500,8 @@ describe('Select.Combobox', () => {
500500
for (let i = 0; i < 10; i += 1) {
501501
fireEvent.mouseDown(container.querySelector('input')!);
502502
expectOpen(container);
503+
504+
await delay(100);
503505
}
504506

505507
fireEvent.blur(container.querySelector('input')!);

tests/focus.test.tsx

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -118,4 +118,25 @@ describe('Select.Focus', () => {
118118

119119
expect(onPopupVisibleChange).toHaveBeenCalledWith(false);
120120
});
121+
122+
it('click inner that no have focusable element should not close the popup', () => {
123+
const onPopupVisibleChange = jest.fn();
124+
125+
const { container } = render(
126+
<Select
127+
open
128+
onPopupVisibleChange={onPopupVisibleChange}
129+
popupRender={() => <div className="bamboo" />}
130+
/>,
131+
);
132+
133+
fireEvent.mouseDown(container.querySelector('.bamboo'));
134+
fireEvent.blur(container.querySelector('input'));
135+
136+
act(() => {
137+
jest.runAllTimers();
138+
});
139+
140+
expect(onPopupVisibleChange).not.toHaveBeenCalled();
141+
});
121142
});

0 commit comments

Comments
 (0)