Skip to content

Commit 5ce2b09

Browse files
authored
Merge pull request #351 from simenko/fix/582503-styled-tooltip
Fix/582503 styled tooltip
2 parents 92725bf + d4b1643 commit 5ce2b09

File tree

6 files changed

+36
-53
lines changed

6 files changed

+36
-53
lines changed

CHANGELOG.md

+5
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,10 @@
11
# Precise UI Changelog
22

3+
## 2.1.1
4+
5+
- Fix Flyout styling when extended with styled components
6+
- Remove dead code in Tooltip component
7+
38
## 2.1.0
49

510
- Flyout component reimplemented using Popper.js (556349)
-1.11 KB
Loading

package-lock.json

+1-1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "precise-ui",
3-
"version": "2.1.0",
3+
"version": "2.1.1",
44
"description": "Precise UI React component library powered by Styled Components.",
55
"keywords": [
66
"react",

src/components/Flyout/index.tsx

+29-16
Original file line numberDiff line numberDiff line change
@@ -30,8 +30,7 @@ const FlyoutBody = styled.div(
3030
${getFontStyle({ size: 'medium' })}
3131
z-index: 100;
3232
position: absolute;
33-
width: fit-conent;
34-
box-shadow: 0 2px 6px 0 rgba(75, 78, 82, 0.2);
33+
box-shadow: 0 2qpx 6px 0 rgba(75, 78, 82, 0.2);
3534
border: 1px solid ${theme.ui4};
3635
overflow: visible;
3736
&[data-popper-reference-hidden='true'] {
@@ -95,20 +94,33 @@ const FlyoutContent = styled.div<FlyoutContentProps>(
9594
FlyoutContent.displayName = 'FlyoutContent';
9695

9796
const FlyoutInt: React.FC<FlyoutProps & WithClickOutsideFCProps> = props => {
98-
const [controlled] = useState<boolean>(props.open !== undefined);
99-
const [visible, setVisible] = useState<boolean>(Boolean(props.open));
97+
const {
98+
position,
99+
defaultPosition,
100+
offset,
101+
open,
102+
outsideClickEvent,
103+
onChange,
104+
children,
105+
content,
106+
theme,
107+
...restProps
108+
} = props;
109+
110+
const [controlled] = useState<boolean>(open !== undefined);
111+
const [visible, setVisible] = useState<boolean>(Boolean(open));
100112
const [referenceElement, setReferenceElement] = useState<HTMLDivElement | undefined>();
101113
const [popperElement, setPopperElement] = useState<HTMLDivElement | undefined>();
102114
const [arrowElement, setArrowElement] = useState<HTMLDivElement | undefined>();
103115

104116
const popperModifiers: Array<Modifier<unknown>> = [
105117
{ name: 'hide' },
106-
{ name: 'flip', enabled: !props.position },
118+
{ name: 'flip', enabled: !position },
107119
{ name: 'arrow', options: { element: arrowElement } },
108-
{ name: 'offset', options: { offset: [0, props.offset || 4 + flyout.arrowSize / 2] } },
120+
{ name: 'offset', options: { offset: [0, offset || 4 + flyout.arrowSize / 2] } },
109121
];
110122

111-
if (!props.position) {
123+
if (!position) {
112124
popperModifiers.push({
113125
name: 'preventOverflow',
114126
options: {
@@ -118,35 +130,35 @@ const FlyoutInt: React.FC<FlyoutProps & WithClickOutsideFCProps> = props => {
118130
}
119131

120132
const { styles, attributes } = usePopper(referenceElement, popperElement, {
121-
placement: mapFlyoutPositionToPopperPlacement(props.position || props.defaultPosition),
133+
placement: mapFlyoutPositionToPopperPlacement(position || defaultPosition),
122134
modifiers: popperModifiers,
123135
});
124136

125-
useEffect(() => setVisible(Boolean(props.open)), [props.open]);
126-
useEffect(() => changeVisibility(false), [props.outsideClickEvent]);
137+
useEffect(() => setVisible(Boolean(open)), [open]);
138+
useEffect(() => changeVisibility(false), [outsideClickEvent]);
127139

128140
const onClick = () => changeVisibility(!visible);
129141

130142
const changeVisibility = (nextVisibility: boolean) => {
131143
if (controlled || nextVisibility === visible) {
132144
return;
133145
}
134-
typeof props.onChange === 'function' && props.onChange({ open: nextVisibility });
146+
typeof onChange === 'function' && onChange({ open: nextVisibility });
135147
setVisible(nextVisibility);
136148
};
137149

138150
return (
139151
<FlyoutContainer>
140152
<FlyoutTarget onClick={onClick} ref={setReferenceElement}>
141-
{props.children}
153+
{children}
142154
</FlyoutTarget>
143-
{visible && props.content && (
144-
<FlyoutBody ref={setPopperElement} style={styles.popper} {...attributes.popper}>
155+
{visible && content && (
156+
<FlyoutBody ref={setPopperElement} style={styles.popper} {...attributes.popper} {...restProps}>
145157
{/* Normally a styled component gets the theme from context. But some other component
146158
may pass a customized theme as a prop. See example at Tooltip component */}
147-
<FlyoutContent theme={props.theme}>{props.content}</FlyoutContent>
159+
<FlyoutContent theme={theme}>{content}</FlyoutContent>
148160
<FlyoutArrow
149-
theme={props.theme}
161+
theme={theme}
150162
ref={setArrowElement}
151163
style={calculateArrowStyleOverrides(attributes.popper, styles.arrow)}
152164
/>
@@ -155,6 +167,7 @@ const FlyoutInt: React.FC<FlyoutProps & WithClickOutsideFCProps> = props => {
155167
</FlyoutContainer>
156168
);
157169
};
170+
158171
FlyoutInt.displayName = 'FlyoutInt';
159172

160173
export const Flyout = withClickOutsideFC<FlyoutProps>(FlyoutInt);

src/components/Tooltip/index.tsx

-35
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,6 @@ const TooltipContainer = styled.div`
1515

1616
export interface TooltipState {
1717
controlled: boolean;
18-
targetRect: ClientRect;
19-
dirtyFlag: boolean;
2018
open: boolean;
2119
}
2220

@@ -28,46 +26,15 @@ export class Tooltip extends React.Component<TooltipProps, TooltipState> {
2826
this.state = {
2927
controlled: props.open !== undefined,
3028
open: props.open || false,
31-
// Typing error here looks like a bug, so 'any' makes sense
32-
targetRect: { top: 0, right: 0, bottom: 0, left: 0, width: 0, height: 0 } as any,
33-
dirtyFlag: false,
3429
};
3530
}
3631

37-
componentDidMount() {
38-
this.updateMeasurements();
39-
}
40-
4132
UNSAFE_componentWillReceiveProps(nextProps: TooltipProps) {
4233
if (this.state.controlled && nextProps.open !== undefined) {
4334
this.setOpen(nextProps.open);
4435
}
4536
}
4637

47-
componentDidUpdate() {
48-
const { dirtyFlag } = this.state;
49-
50-
if (dirtyFlag) {
51-
this.updateMeasurements();
52-
this.setState({
53-
dirtyFlag: false,
54-
});
55-
}
56-
}
57-
58-
private updateMeasurements() {
59-
if (this.targetContainer) {
60-
const targetRect = this.targetContainer.getBoundingClientRect();
61-
this.setState({
62-
targetRect,
63-
});
64-
}
65-
}
66-
67-
private setTargetRef = (el: HTMLDivElement | null) => {
68-
this.targetContainer = el;
69-
};
70-
7138
private setOpen(open: boolean) {
7239
const { onChange } = this.props;
7340

@@ -77,7 +44,6 @@ export class Tooltip extends React.Component<TooltipProps, TooltipState> {
7744

7845
this.setState({
7946
open,
80-
dirtyFlag: open === true,
8147
});
8248
}
8349

@@ -103,7 +69,6 @@ export class Tooltip extends React.Component<TooltipProps, TooltipState> {
10369

10470
return (
10571
<TooltipContainer
106-
ref={this.setTargetRef}
10772
onFocus={this.onMouseOver}
10873
onBlur={this.onMouseOut}
10974
onMouseOver={this.onMouseOver}

0 commit comments

Comments
 (0)