Skip to content

Commit 3753bc0

Browse files
authored
Merge pull request #35 from TommyBacco/master
feat(react-positioning-portal): add prop to close portal on scroll
2 parents 875aa7d + 71dcfec commit 3753bc0

File tree

1 file changed

+15
-8
lines changed

1 file changed

+15
-8
lines changed

src/components/PositioningPortal.tsx

Lines changed: 15 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ export interface Props<Strategy> {
1313
onOpen?: () => void;
1414
onClose?: () => void;
1515
onShouldClose?: () => void;
16+
closeOnScroll?: boolean;
1617
closeOnOutsideClick?: boolean;
1718
closeOnKeyDown?: (event: KeyboardEvent) => boolean;
1819
isOpen?: boolean;
@@ -127,6 +128,7 @@ class PositioningPortal<Strategy = Position> extends React.Component<
127128
> {
128129
public static defaultProps = {
129130
isOpen: false,
131+
closeOnScroll: true,
130132
onOpen: noop,
131133
onClose: noop,
132134
onShouldClose: noop,
@@ -185,9 +187,11 @@ class PositioningPortal<Strategy = Position> extends React.Component<
185187
);
186188

187189
// Remove scroll event listeners
188-
this.state.scrollParents.forEach((node) =>
189-
node.removeEventListener('scroll', this.close, false)
190-
);
190+
if (this.props.closeOnScroll) {
191+
this.state.scrollParents.forEach((node) =>
192+
node.removeEventListener('scroll', this.close, false)
193+
);
194+
}
191195
}
192196

193197
public close = () => {
@@ -300,12 +304,15 @@ class PositioningPortal<Strategy = Position> extends React.Component<
300304
if (parentDom && parentDom.nodeType === Node.ELEMENT_NODE) {
301305
const parentRect = (parentDom as Element).getBoundingClientRect();
302306

303-
let scrollParents = [];
307+
let scrollParents: (HTMLElement | Window)[] = [];
308+
304309
// Register scroll listener on all scrollable parents to close the portal on scroll
305-
scrollParents = getScrollParents(parentDom as HTMLElement);
306-
scrollParents.forEach((node) =>
307-
node.addEventListener('scroll', this.close, false)
308-
);
310+
if (this.props.closeOnScroll) {
311+
scrollParents = getScrollParents(parentDom as HTMLElement);
312+
scrollParents.forEach((node) =>
313+
node.addEventListener('scroll', this.close, false)
314+
);
315+
}
309316

310317
this.setState(
311318
{

0 commit comments

Comments
 (0)