Skip to content

Commit eae3e4f

Browse files
authored
Clear timeouts when unmounting (#479)
1 parent c500674 commit eae3e4f

File tree

2 files changed

+18
-2
lines changed

2 files changed

+18
-2
lines changed

src/OptionList.tsx

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -135,7 +135,7 @@ const OptionList: React.RefForwardingComponent<
135135
* `setActive` function will call root accessibility state update which makes re-render.
136136
* So we need to delay to let Input component trigger onChange first.
137137
*/
138-
setTimeout(() => {
138+
const timeoutId = setTimeout(() => {
139139
if (!multiple && open && values.size === 1) {
140140
const value: RawValueType = Array.from(values)[0];
141141
const index = memoFlattenOptions.findIndex(
@@ -145,6 +145,8 @@ const OptionList: React.RefForwardingComponent<
145145
scrollIntoView(index);
146146
}
147147
});
148+
149+
return () => clearTimeout(timeoutId);
148150
}, [open]);
149151

150152
// ========================== Values ==========================

src/generate.tsx

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -780,19 +780,33 @@ export default function generateSelector<
780780
}
781781
};
782782

783+
const activeTimeoutIds: number[] = [];
784+
React.useEffect(() => () => {
785+
activeTimeoutIds.forEach(timeoutId => clearTimeout(timeoutId));
786+
activeTimeoutIds.splice(0, activeTimeoutIds.length);
787+
}, []);
788+
783789
const onInternalMouseDown: React.MouseEventHandler<HTMLDivElement> = (event, ...restArgs) => {
784790
const { target } = event;
785791
const popupElement: HTMLDivElement =
786792
triggerRef.current && triggerRef.current.getPopupElement();
787793

788794
// We should give focus back to selector if clicked item is not focusable
789795
if (popupElement && popupElement.contains(target as HTMLElement)) {
790-
setTimeout(() => {
796+
const timeoutId = setTimeout(() => {
797+
const index = activeTimeoutIds.indexOf(timeoutId);
798+
if (index !== -1) {
799+
activeTimeoutIds.splice(index, 1);
800+
}
801+
791802
cancelSetMockFocused();
803+
792804
if (!popupElement.contains(document.activeElement)) {
793805
selectorRef.current.focus();
794806
}
795807
});
808+
809+
activeTimeoutIds.push(timeoutId);
796810
}
797811

798812
if (onMouseDown) {

0 commit comments

Comments
 (0)