Skip to content

Commit 4345ddf

Browse files
committed
fix(CompositeBar): improve hover detection
1 parent 2faab2f commit 4345ddf

File tree

2 files changed

+38
-7
lines changed

2 files changed

+38
-7
lines changed

src/components/CompositeBar/CompositeBar.scss

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,4 +12,9 @@ $block: '.#{variables.$ns}composite-bar';
1212
& &__root-menu-item[class] {
1313
background-color: transparent;
1414
}
15+
16+
&__list:hover > div > div:first-child {
17+
transform: translateY(0);
18+
outline: solid 2px var(--g-color-line-info);
19+
}
1520
}

src/components/CompositeBar/CompositeBar.tsx

Lines changed: 33 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,38 @@ const CompositeBarView: FC<CompositeBarViewProps> = ({
6868
} = useContext(MultipleTooltipContext);
6969
const {compact} = useAsideHeaderContext();
7070

71+
const handleTransitionRun = React.useCallback<(e: TransitionEvent) => void>(
72+
(e) => {
73+
if (e.target) {
74+
const computedStyle = getComputedStyle(e.target as HTMLElement);
75+
const isHovered = computedStyle.transform !== 'none';
76+
console.log('isHovered=', isHovered, new Date());
77+
if (!isHovered && multipleTooltip && multipleTooltipActive) {
78+
setMultipleTooltipContextValue({active: false});
79+
}
80+
}
81+
},
82+
[multipleTooltip, multipleTooltipActive],
83+
);
84+
85+
React.useEffect(() => {
86+
if (ref.current?.refContainer.current?.node) {
87+
const listNode = ref.current.refContainer.current.node as HTMLElement;
88+
// this hack allow to detect hover events on element like browser css engine
89+
listNode.style.setProperty('transition', 'transform 0.001ms step-start');
90+
listNode.style.setProperty('transition-behavior', 'allow-discrete');
91+
listNode.addEventListener('transitionrun', handleTransitionRun);
92+
93+
return () => {
94+
listNode.removeEventListener('transitionrun', handleTransitionRun);
95+
listNode.style.removeProperty('transition-behavior');
96+
listNode.style.removeProperty('transition');
97+
};
98+
}
99+
100+
return;
101+
}, []);
102+
71103
React.useEffect(() => {
72104
function handleBlurWindow() {
73105
if (multipleTooltip && multipleTooltipActive) {
@@ -93,7 +125,6 @@ const CompositeBarView: FC<CompositeBarViewProps> = ({
93125
activeIndex !== lastClickedItemIndex &&
94126
e.clientX <= ASIDE_HEADER_COMPACT_WIDTH
95127
) {
96-
console.log(`onTooltipMouseEnter: active=true`);
97128
setMultipleTooltipContextValue?.({
98129
active: true,
99130
});
@@ -119,7 +150,6 @@ const CompositeBarView: FC<CompositeBarViewProps> = ({
119150
debounce(
120151
() => {
121152
if (multipleTooltip && multipleTooltipActive && document.hasFocus()) {
122-
console.log(`onTooltipMouseLeave: active=false`);
123153
setMultipleTooltipContextValue?.({
124154
active: false,
125155
lastClickedItemIndex: undefined,
@@ -139,7 +169,6 @@ const CompositeBarView: FC<CompositeBarViewProps> = ({
139169
(itemIndex: number) =>
140170
debounce(
141171
() => {
142-
console.log(`onMouseEnterByIndex: itemIndex=${itemIndex}`);
143172
if (multipleTooltip && document.hasFocus()) {
144173
let multipleTooltipActiveValue = multipleTooltipActive;
145174
if (!multipleTooltipActive && itemIndex !== lastClickedItemIndex) {
@@ -149,10 +178,8 @@ const CompositeBarView: FC<CompositeBarViewProps> = ({
149178
activeIndex === itemIndex &&
150179
multipleTooltipActive === multipleTooltipActiveValue
151180
) {
152-
console.log('onMouseEnterByIndex: skip change');
153181
return;
154182
}
155-
console.log(`onMouseEnterByIndex: set active=${itemIndex}`);
156183
setMultipleTooltipContextValue({
157184
activeIndex: itemIndex,
158185
active: multipleTooltipActiveValue,
@@ -183,7 +210,6 @@ const CompositeBarView: FC<CompositeBarViewProps> = ({
183210
multipleTooltip &&
184211
(activeIndex !== undefined || lastClickedItemIndex !== undefined)
185212
) {
186-
console.log('onMouseLeave: deactivate tooltip');
187213
setMultipleTooltipContextValue({
188214
activeIndex: undefined,
189215
lastClickedItemIndex: undefined,
@@ -239,6 +265,7 @@ const CompositeBarView: FC<CompositeBarViewProps> = ({
239265
onMouseLeave={onTooltipMouseLeave}
240266
>
241267
<List<CompositeBarItem>
268+
className={b('list')}
242269
ref={ref}
243270
items={items}
244271
selectedItemIndex={type === 'menu' ? getSelectedItemIndex(items) : undefined}
@@ -249,7 +276,6 @@ const CompositeBarView: FC<CompositeBarViewProps> = ({
249276
filterable={false}
250277
sortable={false}
251278
renderItem={(item, _isItemActive, itemIndex) => {
252-
// console.log('renderItem: ', itemIndex);
253279
const itemExtraProps = isMenuItem(item) ? {item} : item;
254280
const enableTooltip = isMenuItem(item)
255281
? !multipleTooltip

0 commit comments

Comments
 (0)