Skip to content

Commit 2db90db

Browse files
authored
Fix caret prop of DropdownMenu (#804)
1 parent cb5f437 commit 2db90db

File tree

2 files changed

+66
-3
lines changed

2 files changed

+66
-3
lines changed

src/components/dropdownmenu/DropdownMenu.js

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,14 @@
11
import React, {useState} from 'react';
22
import PropTypes from 'prop-types';
33
import {omit} from 'ramda';
4+
5+
import ButtonGroup from 'react-bootstrap/ButtonGroup';
46
import RBDropdown from 'react-bootstrap/Dropdown';
57
import Nav from 'react-bootstrap/Nav';
6-
import ButtonGroup from 'react-bootstrap/ButtonGroup';
8+
79
import {DropdownMenuContext} from '../../private/DropdownMenuContext';
810
import {bootstrapColors} from '../../private/BootstrapColors';
11+
import DropdownToggle from '../../private/DropdownToggle';
912

1013
/**
1114
* DropdownMenu creates an overlay useful for grouping together links and other
@@ -75,7 +78,8 @@ const DropdownMenu = props => {
7578
(loading_state && loading_state.is_loading) || undefined
7679
}
7780
>
78-
<RBDropdown.Toggle
81+
<DropdownToggle
82+
caret={caret}
7983
as={nav ? Nav.Link : undefined}
8084
onClick={toggle}
8185
disabled={disabled}
@@ -89,7 +93,7 @@ const DropdownMenu = props => {
8993
className={toggle_class_name || toggleClassName}
9094
>
9195
{label}
92-
</RBDropdown.Toggle>
96+
</DropdownToggle>
9397
<RBDropdown.Menu
9498
renderOnMount
9599
variant={menu_variant === 'dark' ? 'dark' : undefined}

src/private/DropdownToggle.js

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
import React, {useContext} from 'react';
2+
3+
import classNames from 'classnames';
4+
5+
import useMergedRefs from '@restart/hooks/useMergedRefs';
6+
import DropdownContext from '@restart/ui/DropdownContext';
7+
import {useDropdownToggle} from '@restart/ui/DropdownToggle';
8+
import Button from 'react-bootstrap/Button';
9+
import InputGroupContext from 'react-bootstrap/InputGroupContext';
10+
import {useBootstrapPrefix} from 'react-bootstrap/ThemeProvider';
11+
import useWrappedRefWithWarning from 'react-bootstrap/useWrappedRefWithWarning';
12+
13+
// vendored https://github.com/react-bootstrap/react-bootstrap/blob/master/src/DropdownToggle.tsx
14+
const DropdownToggle = React.forwardRef(
15+
(
16+
{
17+
caret,
18+
bsPrefix,
19+
split,
20+
className,
21+
childBsPrefix,
22+
as: Component = Button,
23+
...props
24+
},
25+
ref
26+
) => {
27+
const prefix = useBootstrapPrefix(bsPrefix, 'dropdown-toggle');
28+
const dropdownContext = useContext(DropdownContext);
29+
const isInputGroup = useContext(InputGroupContext);
30+
31+
if (childBsPrefix !== undefined) {
32+
props.bsPrefix = childBsPrefix;
33+
}
34+
35+
const [toggleProps] = useDropdownToggle();
36+
37+
toggleProps.ref = useMergedRefs(
38+
toggleProps.ref,
39+
useWrappedRefWithWarning(ref, 'DropdownToggle')
40+
);
41+
42+
// This intentionally forwards size and variant (if set) to the
43+
// underlying component, to allow it to render size and style variants.
44+
return (
45+
<Component
46+
className={classNames(
47+
className,
48+
caret && prefix, // remove dropdown-toggle class if caret is false
49+
split && `${prefix}-split`,
50+
!!isInputGroup && dropdownContext?.show && 'show'
51+
)}
52+
{...toggleProps}
53+
{...props}
54+
/>
55+
);
56+
}
57+
);
58+
59+
export default DropdownToggle;

0 commit comments

Comments
 (0)