Skip to content

Commit 8d458ce

Browse files
authored
refactor: delete ClickListener and replace with useOutsideClick (#19063)
1 parent dae0aa2 commit 8d458ce

File tree

4 files changed

+16
-160
lines changed

4 files changed

+16
-160
lines changed

packages/react/src/components/OverflowMenu/OverflowMenu.tsx

Lines changed: 16 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,6 @@ import { OverflowMenuVertical } from '@carbon/icons-react';
2626
import classNames from 'classnames';
2727
import invariant from 'invariant';
2828
import PropTypes from 'prop-types';
29-
import { ClickListener } from '../../internal/ClickListener';
3029
import {
3130
DIRECTION_BOTTOM,
3231
DIRECTION_TOP,
@@ -41,6 +40,7 @@ import deprecate from '../../prop-types/deprecate';
4140
import mergeRefs from '../../tools/mergeRefs';
4241
import setupGetInstanceId from '../../tools/setupGetInstanceId';
4342
import { IconButton } from '../IconButton';
43+
import { useOutsideClick } from '../../internal/useOutsideClick';
4444

4545
const getInstanceId = setupGetInstanceId();
4646

@@ -275,6 +275,7 @@ export const OverflowMenu = forwardRef<HTMLButtonElement, OverflowMenuProps>(
275275
const prevOpenState = useRef(open);
276276
/** The element ref of the tooltip's trigger button. */
277277
const triggerRef = useRef<HTMLButtonElement>(null);
278+
const wrapperRef = useRef<HTMLSpanElement>(null);
278279

279280
// Sync open prop changes.
280281
useEffect(() => {
@@ -299,6 +300,16 @@ export const OverflowMenu = forwardRef<HTMLButtonElement, OverflowMenuProps>(
299300
prevOpenState.current = open;
300301
}, [open, onClose]);
301302

303+
useOutsideClick(wrapperRef, ({ target }) => {
304+
if (
305+
open &&
306+
(!menuBodyRef.current ||
307+
(target instanceof Node && !menuBodyRef.current.contains(target)))
308+
) {
309+
closeMenu();
310+
}
311+
});
312+
302313
const focusMenuEl = useCallback(() => {
303314
if (triggerRef.current) {
304315
triggerRef.current.focus();
@@ -369,17 +380,6 @@ export const OverflowMenu = forwardRef<HTMLButtonElement, OverflowMenuProps>(
369380
}
370381
};
371382

372-
const handleClickOutside = (evt: globalThis.MouseEvent) => {
373-
if (
374-
open &&
375-
(!menuBodyRef.current ||
376-
(evt.target instanceof Node &&
377-
!menuBodyRef.current.contains(evt.target)))
378-
) {
379-
closeMenu();
380-
}
381-
};
382-
383383
/**
384384
* Focuses the next enabled overflow menu item given the currently focused
385385
* item index and direction to move.
@@ -545,10 +545,11 @@ export const OverflowMenu = forwardRef<HTMLButtonElement, OverflowMenuProps>(
545545
);
546546

547547
return (
548-
<ClickListener onClickOutside={handleClickOutside}>
548+
<>
549549
<span
550550
className={`${prefix}--overflow-menu__wrapper`}
551-
aria-owns={open ? menuBodyId : undefined}>
551+
aria-owns={open ? menuBodyId : undefined}
552+
ref={wrapperRef}>
552553
<IconButton
553554
{...other}
554555
type="button"
@@ -569,7 +570,7 @@ export const OverflowMenu = forwardRef<HTMLButtonElement, OverflowMenuProps>(
569570
</IconButton>
570571
{open && hasMountedTrigger && wrappedMenuBody}
571572
</span>
572-
</ClickListener>
573+
</>
573574
);
574575
}
575576
);

packages/react/src/internal/ClickListener.ts

Lines changed: 0 additions & 64 deletions
This file was deleted.

packages/react/src/internal/__tests__/ClickListener-test.js

Lines changed: 0 additions & 63 deletions
This file was deleted.

packages/react/src/internal/__tests__/__snapshots__/ClickListener-test.js.snap

Lines changed: 0 additions & 18 deletions
This file was deleted.

0 commit comments

Comments
 (0)