Skip to content

Commit 3f01f52

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

File tree

2 files changed

+49
-7
lines changed

2 files changed

+49
-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: 44 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,17 @@ type CompositeBarViewProps = CompositeBarProps & {
4949
collapseItems?: MenuItem[];
5050
};
5151

52+
function getTime() {
53+
const now = new Date();
54+
const hours = String(now.getHours()).padStart(2, '0');
55+
const minutes = String(now.getMinutes()).padStart(2, '0');
56+
const seconds = String(now.getSeconds()).padStart(2, '0');
57+
const milliseconds = String(now.getMilliseconds()).padStart(3, '0');
58+
59+
const formattedTime = `${hours}:${minutes}:${seconds}.${milliseconds}`;
60+
return formattedTime;
61+
}
62+
5263
const CompositeBarView: FC<CompositeBarViewProps> = ({
5364
type,
5465
items,
@@ -68,6 +79,38 @@ const CompositeBarView: FC<CompositeBarViewProps> = ({
6879
} = useContext(MultipleTooltipContext);
6980
const {compact} = useAsideHeaderContext();
7081

82+
const handleTransitionRun = React.useCallback<(e: TransitionEvent) => void>(
83+
(e) => {
84+
if (e.target) {
85+
const computedStyle = getComputedStyle(e.target as HTMLElement);
86+
const isHovered = computedStyle.transform !== 'none';
87+
console.log('isHovered=', isHovered, getTime());
88+
if (!isHovered && multipleTooltip && multipleTooltipActive) {
89+
setMultipleTooltipContextValue({active: false});
90+
}
91+
}
92+
},
93+
[multipleTooltip, multipleTooltipActive],
94+
);
95+
96+
React.useEffect(() => {
97+
if (ref.current?.refContainer.current?.node) {
98+
const listNode = ref.current.refContainer.current.node as HTMLElement;
99+
// this hack allow to detect hover events on element like browser css engine
100+
listNode.style.setProperty('transition', 'transform 0.001ms step-start');
101+
listNode.style.setProperty('transition-behavior', 'allow-discrete');
102+
listNode.addEventListener('transitionrun', handleTransitionRun);
103+
104+
return () => {
105+
listNode.removeEventListener('transitionrun', handleTransitionRun);
106+
listNode.style.removeProperty('transition-behavior');
107+
listNode.style.removeProperty('transition');
108+
};
109+
}
110+
111+
return;
112+
}, []);
113+
71114
React.useEffect(() => {
72115
function handleBlurWindow() {
73116
if (multipleTooltip && multipleTooltipActive) {
@@ -93,7 +136,6 @@ const CompositeBarView: FC<CompositeBarViewProps> = ({
93136
activeIndex !== lastClickedItemIndex &&
94137
e.clientX <= ASIDE_HEADER_COMPACT_WIDTH
95138
) {
96-
console.log(`onTooltipMouseEnter: active=true`);
97139
setMultipleTooltipContextValue?.({
98140
active: true,
99141
});
@@ -119,7 +161,6 @@ const CompositeBarView: FC<CompositeBarViewProps> = ({
119161
debounce(
120162
() => {
121163
if (multipleTooltip && multipleTooltipActive && document.hasFocus()) {
122-
console.log(`onTooltipMouseLeave: active=false`);
123164
setMultipleTooltipContextValue?.({
124165
active: false,
125166
lastClickedItemIndex: undefined,
@@ -139,7 +180,6 @@ const CompositeBarView: FC<CompositeBarViewProps> = ({
139180
(itemIndex: number) =>
140181
debounce(
141182
() => {
142-
console.log(`onMouseEnterByIndex: itemIndex=${itemIndex}`);
143183
if (multipleTooltip && document.hasFocus()) {
144184
let multipleTooltipActiveValue = multipleTooltipActive;
145185
if (!multipleTooltipActive && itemIndex !== lastClickedItemIndex) {
@@ -149,10 +189,8 @@ const CompositeBarView: FC<CompositeBarViewProps> = ({
149189
activeIndex === itemIndex &&
150190
multipleTooltipActive === multipleTooltipActiveValue
151191
) {
152-
console.log('onMouseEnterByIndex: skip change');
153192
return;
154193
}
155-
console.log(`onMouseEnterByIndex: set active=${itemIndex}`);
156194
setMultipleTooltipContextValue({
157195
activeIndex: itemIndex,
158196
active: multipleTooltipActiveValue,
@@ -183,7 +221,6 @@ const CompositeBarView: FC<CompositeBarViewProps> = ({
183221
multipleTooltip &&
184222
(activeIndex !== undefined || lastClickedItemIndex !== undefined)
185223
) {
186-
console.log('onMouseLeave: deactivate tooltip');
187224
setMultipleTooltipContextValue({
188225
activeIndex: undefined,
189226
lastClickedItemIndex: undefined,
@@ -239,6 +276,7 @@ const CompositeBarView: FC<CompositeBarViewProps> = ({
239276
onMouseLeave={onTooltipMouseLeave}
240277
>
241278
<List<CompositeBarItem>
279+
className={b('list')}
242280
ref={ref}
243281
items={items}
244282
selectedItemIndex={type === 'menu' ? getSelectedItemIndex(items) : undefined}
@@ -249,7 +287,6 @@ const CompositeBarView: FC<CompositeBarViewProps> = ({
249287
filterable={false}
250288
sortable={false}
251289
renderItem={(item, _isItemActive, itemIndex) => {
252-
// console.log('renderItem: ', itemIndex);
253290
const itemExtraProps = isMenuItem(item) ? {item} : item;
254291
const enableTooltip = isMenuItem(item)
255292
? !multipleTooltip

0 commit comments

Comments
 (0)