Skip to content

Commit 41b107f

Browse files
authored
chore: bump react-overlays to v5 (#5685)
* chore: bump react-overlays to v5 * fix tests * Update src/DropdownMenu.tsx
1 parent b123f57 commit 41b107f

File tree

6 files changed

+43
-40
lines changed

6 files changed

+43
-40
lines changed

package.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,7 @@
7575
"invariant": "^2.2.4",
7676
"prop-types": "^15.7.2",
7777
"prop-types-extra": "^1.1.0",
78-
"react-overlays": "^4.1.1",
78+
"react-overlays": "^5.0.0",
7979
"react-transition-group": "^4.4.1",
8080
"uncontrollable": "^7.0.0",
8181
"warning": "^4.0.3"
@@ -133,6 +133,7 @@
133133
"react": "^16.14.0",
134134
"react-dom": "^16.14.0",
135135
"react-test-renderer": "^16.14.0",
136+
"simulant": "^0.2.2",
136137
"sinon": "^9.2.4",
137138
"sinon-chai": "^3.5.0",
138139
"typescript": "^4.1.5",

src/Dropdown.tsx

Lines changed: 17 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -145,7 +145,11 @@ const Dropdown: Dropdown = (React.forwardRef((pProps: DropdownProps, ref) => {
145145

146146
const handleToggle = useEventCallback(
147147
(nextShow, event, source = event.type) => {
148-
if (event.currentTarget === document) source = 'rootClose';
148+
if (
149+
event.currentTarget === document &&
150+
(source !== 'keydown' || event.key === 'Escape')
151+
)
152+
source = 'rootClose';
149153
if (onToggle) {
150154
onToggle(nextShow, event, { source });
151155
}
@@ -168,21 +172,18 @@ const Dropdown: Dropdown = (React.forwardRef((pProps: DropdownProps, ref) => {
168172
focusFirstItemOnShow={focusFirstItemOnShow}
169173
itemSelector={`.${prefix}-item:not(.disabled):not(:disabled)`}
170174
>
171-
{({ props: dropdownProps }) => (
172-
<Component
173-
{...props}
174-
{...dropdownProps}
175-
ref={ref}
176-
className={classNames(
177-
className,
178-
show && 'show',
179-
(!drop || drop === 'down') && prefix,
180-
drop === 'up' && 'dropup',
181-
drop === 'right' && 'dropright',
182-
drop === 'left' && 'dropleft',
183-
)}
184-
/>
185-
)}
175+
<Component
176+
{...props}
177+
ref={ref}
178+
className={classNames(
179+
className,
180+
show && 'show',
181+
(!drop || drop === 'down') && prefix,
182+
drop === 'up' && 'dropup',
183+
drop === 'right' && 'dropright',
184+
drop === 'left' && 'dropleft',
185+
)}
186+
/>
186187
</BaseDropdown>
187188
</SelectableContext.Provider>
188189
);

src/DropdownMenu.tsx

Lines changed: 8 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@ import PropTypes from 'prop-types';
33
import React, { useContext } from 'react';
44
import {
55
useDropdownMenu,
6-
UseDropdownMenuValue,
76
UseDropdownMenuOptions,
87
} from 'react-overlays/DropdownMenu';
98
import useMergedRefs from '@restart/hooks/useMergedRefs';
@@ -116,8 +115,6 @@ const defaultProps: Partial<DropdownMenuProps> = {
116115
flip: true,
117116
};
118117

119-
// TODO: remove this hack
120-
type UseDropdownMenuValueHack = UseDropdownMenuValue & { placement: any };
121118

122119
const DropdownMenu: DropdownMenu = React.forwardRef(
123120
(
@@ -168,14 +165,10 @@ const DropdownMenu: DropdownMenu = React.forwardRef(
168165
}
169166
}
170167

171-
const {
172-
hasShown,
173-
placement,
174-
show,
175-
alignEnd,
176-
close,
177-
props: menuProps,
178-
} = useDropdownMenu({
168+
const [
169+
menuProps,
170+
{ hasShown, popper, show, alignEnd, toggle },
171+
] = useDropdownMenu({
179172
flip,
180173
rootCloseEvent,
181174
show: showProps,
@@ -185,7 +178,7 @@ const DropdownMenu: DropdownMenu = React.forwardRef(
185178
...popperConfig,
186179
modifiers: marginModifiers.concat(popperConfig?.modifiers || []),
187180
},
188-
}) as UseDropdownMenuValueHack;
181+
});
189182

190183
menuProps.ref = useMergedRefs(
191184
popperRef,
@@ -200,16 +193,16 @@ const DropdownMenu: DropdownMenu = React.forwardRef(
200193
// For custom components provide additional, non-DOM, props;
201194
if (typeof Component !== 'string') {
202195
(menuProps as any).show = show;
203-
(menuProps as any).close = close;
196+
(menuProps as any).close = () => toggle?.(false);
204197
(menuProps as any).alignRight = alignEnd;
205198
}
206199

207200
let style = (props as any).style;
208-
if (placement) {
201+
if (popper?.placement) {
209202
// we don't need the default popper style,
210203
// menus are display: none when not shown.
211204
style = { ...(props as any).style, ...menuProps.style };
212-
props['x-placement'] = placement;
205+
props['x-placement'] = popper.placement;
213206
}
214207

215208
return (

src/DropdownToggle.tsx

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,7 @@ const DropdownToggle: DropdownToggle = React.forwardRef(
7272
(props as any).bsPrefix = childBsPrefix;
7373
}
7474

75-
const [toggleProps, { toggle }] = useDropdownToggle();
75+
const [toggleProps] = useDropdownToggle();
7676

7777
toggleProps.ref = useMergedRefs(
7878
toggleProps.ref,
@@ -83,7 +83,6 @@ const DropdownToggle: DropdownToggle = React.forwardRef(
8383
// underlying component, to allow it to render size and style variants.
8484
return (
8585
<Component
86-
onClick={toggle}
8786
className={classNames(className, prefix, split && `${prefix}-split`)}
8887
{...toggleProps}
8988
{...props}

test/DropdownSpec.js

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import { mount } from 'enzyme';
22
import React from 'react';
33
import ReactDOM from 'react-dom';
4+
import simulant from 'simulant';
45
import Dropdown from '../src/Dropdown';
56

67
describe('<Dropdown>', () => {
@@ -247,14 +248,17 @@ describe('<Dropdown>', () => {
247248
const spy = sinon.spy();
248249
const wrapper = mount(
249250
<Dropdown onToggle={spy}>{dropdownChildren}</Dropdown>,
251+
{ attachTo: focusableContainer },
250252
);
251253

252-
wrapper.find('button').simulate('keyDown', { key: 'ArrowDown' });
254+
simulant.fire(wrapper.find('button').getDOMNode(), 'keydown', {
255+
key: 'ArrowDown',
256+
});
253257

254258
expect(spy).to.have.been.calledOnce;
255259
expect(spy.getCall(0).args.length).to.equal(3);
256260
expect(spy.getCall(0).args[0]).to.equal(true);
257-
expect(spy.getCall(0).args[1]).to.be.an('object');
261+
expect(spy.getCall(0).args[1]).to.be.an('event');
258262
assert.deepEqual(spy.getCall(0).args[2], { source: 'keydown' });
259263
});
260264
});

yarn.lock

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7666,10 +7666,10 @@ react-lifecycles-compat@^3.0.4:
76667666
resolved "https://registry.yarnpkg.com/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz#4f1a273afdfc8f3488a8c516bfda78f872352362"
76677667
integrity sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA==
76687668

7669-
react-overlays@^4.1.1:
7670-
version "4.1.1"
7671-
resolved "https://registry.yarnpkg.com/react-overlays/-/react-overlays-4.1.1.tgz#0060107cbe1c5171a744ccda3fbf0556d064bc5f"
7672-
integrity sha512-WtJifh081e6M24KnvTQoNjQEpz7HoLxqt8TwZM7LOYIkYJ8i/Ly1Xi7RVte87ZVnmqQ4PFaFiNHZhSINPSpdBQ==
7669+
react-overlays@^5.0.0:
7670+
version "5.0.0"
7671+
resolved "https://registry.yarnpkg.com/react-overlays/-/react-overlays-5.0.0.tgz#b50351de194dda0706b40f9632d261c9f0011c4c"
7672+
integrity sha512-TKbqfAv23TFtCJ2lzISdx76p97G/DP8Rp4TOFdqM9n8GTruVYgE3jX7Zgb8+w7YJ18slTVcDTQ1/tFzdCqjVhA==
76737673
dependencies:
76747674
"@babel/runtime" "^7.12.1"
76757675
"@popperjs/core" "^2.5.3"
@@ -8275,6 +8275,11 @@ signal-exit@^3.0.0, signal-exit@^3.0.2, signal-exit@^3.0.3:
82758275
resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.3.tgz#a1410c2edd8f077b08b4e253c8eacfcaf057461c"
82768276
integrity sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==
82778277

8278+
simulant@^0.2.2:
8279+
version "0.2.2"
8280+
resolved "https://registry.yarnpkg.com/simulant/-/simulant-0.2.2.tgz#f1bce52712b6a7a0da38ddfdda7e83b20b1da01e"
8281+
integrity sha1-8bzlJxK2p6DaON392n6DsgsdoB4=
8282+
82788283
sinon-chai@^3.5.0:
82798284
version "3.5.0"
82808285
resolved "https://registry.yarnpkg.com/sinon-chai/-/sinon-chai-3.5.0.tgz#c9a78304b0e15befe57ef68e8a85a00553f5c60e"

0 commit comments

Comments
 (0)