11import React from 'react' ;
22
33import { Button , Flex , Tooltip } from '@gravity-ui/uikit' ;
4+ import { debounce } from 'lodash' ;
45
56import { cn } from '../../utils/cn' ;
67import type { PreparedVersion } from '../../utils/versions/types' ;
@@ -15,6 +16,9 @@ const TRUNCATION_THRESHOLD = 4;
1516// One more line for Show more / Hide button
1617const MAX_DISPLAYED_VERSIONS = TRUNCATION_THRESHOLD - 1 ;
1718
19+ const HOVER_DELAY = 200 ;
20+ const TOOLTIP_OPEN_DELAY = 200 ;
21+
1822interface VersionsBarProps {
1923 preparedVersions : PreparedVersion [ ] ;
2024}
@@ -60,31 +64,39 @@ export function VersionsBar({preparedVersions}: VersionsBarProps) {
6064 } ;
6165
6266 const renderButton = ( ) => {
63- if ( shouldTruncateVersions ) {
64- const truncatedVersionsCount = preparedVersions . length - MAX_DISPLAYED_VERSIONS ;
65-
66- if ( allVersionsDisplayed ) {
67- return (
68- < Button view = "flat-secondary" size = { 's' } onClick = { handleHideAllVersions } >
69- { i18n ( 'action_hide' , {
70- count : truncatedVersionsCount ,
71- } ) }
72- </ Button >
73- ) ;
74- } else {
75- return (
76- < Button view = "flat-secondary" size = { 's' } onClick = { handleShowAllVersions } >
77- { i18n ( 'action_show_more' , {
78- count : truncatedVersionsCount ,
79- } ) }
80- </ Button >
81- ) ;
82- }
67+ if ( ! shouldTruncateVersions ) {
68+ return null ;
69+ }
70+
71+ const truncatedVersionsCount = preparedVersions . length - MAX_DISPLAYED_VERSIONS ;
72+
73+ if ( allVersionsDisplayed ) {
74+ return (
75+ < Button view = "flat-secondary" size = { 's' } onClick = { handleHideAllVersions } >
76+ { i18n ( 'action_hide' , {
77+ count : truncatedVersionsCount ,
78+ } ) }
79+ </ Button >
80+ ) ;
81+ } else {
82+ return (
83+ < Button view = "flat-secondary" size = { 's' } onClick = { handleShowAllVersions } >
84+ { i18n ( 'action_show_more' , {
85+ count : truncatedVersionsCount ,
86+ } ) }
87+ </ Button >
88+ ) ;
8389 }
84- return null ;
8590 } ;
8691
92+ const handleMouseEnter = React . useMemo ( ( ) => {
93+ return debounce ( ( version : string ) => {
94+ setHoveredVersion ( version ) ;
95+ } , HOVER_DELAY ) ;
96+ } , [ ] ) ;
97+
8798 const handleMouseLeave = ( ) => {
99+ handleMouseEnter . cancel ( ) ;
88100 setHoveredVersion ( undefined ) ;
89101 } ;
90102
@@ -106,11 +118,11 @@ export function VersionsBar({preparedVersions}: VersionsBarProps) {
106118 </ React . Fragment >
107119 }
108120 placement = { 'top-start' }
109- openDelay = { 100 }
121+ openDelay = { TOOLTIP_OPEN_DELAY }
110122 >
111123 < span
112124 onMouseEnter = { ( ) => {
113- setHoveredVersion ( item . version ) ;
125+ handleMouseEnter ( item . version ) ;
114126 } }
115127 onMouseLeave = { handleMouseLeave }
116128 className = { b ( 'version' , { dimmed : isDimmed ( item . version ) } ) }
@@ -126,7 +138,7 @@ export function VersionsBar({preparedVersions}: VersionsBarProps) {
126138 key = { item . version }
127139 content = { i18n ( 'tooltip_nodes' , { count : item . count } ) }
128140 placement = { 'bottom-end' }
129- openDelay = { 100 }
141+ openDelay = { TOOLTIP_OPEN_DELAY }
130142 >
131143 < Flex gap = { 1 } alignItems = { 'center' } className = { b ( 'titles-wrapper' ) } >
132144 < svg
@@ -142,7 +154,7 @@ export function VersionsBar({preparedVersions}: VersionsBarProps) {
142154 < div
143155 className = { b ( 'title' , { dimmed : isDimmed ( item . version ) } ) }
144156 onMouseEnter = { ( ) => {
145- setHoveredVersion ( item . version ) ;
157+ handleMouseEnter ( item . version ) ;
146158 } }
147159 onMouseLeave = { handleMouseLeave }
148160 >
0 commit comments