Skip to content

Commit d77bcf7

Browse files
authored
fix(protocol-designer): fix step summary flickering issue (#19161)
* fix(protocol-designer): fix step summary flickering issue
1 parent 2da4c80 commit d77bcf7

File tree

1 file changed

+30
-10
lines changed

1 file changed

+30
-10
lines changed

protocol-designer/src/pages/Designer/ProtocolSteps/Timeline/ConnectedStepInfo.tsx

Lines changed: 30 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
1+
import { useEffect, useMemo } from 'react'
12
import { useTranslation } from 'react-i18next'
23
import { useDispatch, useSelector } from 'react-redux'
4+
import debounce from 'lodash/debounce'
35

46
import { useConditionalConfirm } from '@opentrons/components'
57

@@ -40,10 +42,7 @@ import type { Dispatch, MouseEvent, SetStateAction } from 'react'
4042
import type { DeleteModalType } from '../../../../components/organisms'
4143
import type { StepIdType } from '../../../../form-types'
4244
import type { BaseState, ThunkAction } from '../../../../types'
43-
import type {
44-
HoverOnStepAction,
45-
SelectMultipleStepsAction,
46-
} from '../../../../ui/steps'
45+
import type { SelectMultipleStepsAction } from '../../../../ui/steps'
4746

4847
export interface ConnectedStepInfoProps {
4948
stepId: StepIdType
@@ -54,6 +53,8 @@ export interface ConnectedStepInfoProps {
5453
sidebarWidth: number
5554
}
5655

56+
const DEBOUNCE_DURATION_MS = 500
57+
5758
export function ConnectedStepInfo(props: ConnectedStepInfoProps): JSX.Element {
5859
const {
5960
stepId,
@@ -111,14 +112,18 @@ export function ConnectedStepInfo(props: ConnectedStepInfoProps): JSX.Element {
111112
): ThunkAction<SelectMultipleStepsAction> =>
112113
dispatch(stepsActions.selectMultipleSteps(steps, lastSelected))
113114

115+
const debouncedUnhighlightStep = useMemo(
116+
() =>
117+
debounce(() => {
118+
dispatch(stepsActions.hoverOnStep(null))
119+
}, DEBOUNCE_DURATION_MS),
120+
[dispatch]
121+
)
122+
114123
const selectStep = (): ThunkAction<any> =>
115124
dispatch(stepsActions.resetSelectStep(stepId))
116125
const selectStepOnDoubleClick = (): ThunkAction<any> =>
117126
dispatch(stepsActions.selectStep(stepId))
118-
const highlightStep = (): HoverOnStepAction =>
119-
dispatch(stepsActions.hoverOnStep(stepId))
120-
const unhighlightStep = (): HoverOnStepAction =>
121-
dispatch(stepsActions.hoverOnStep(null))
122127
const handleSelectStep = (event: MouseEvent): void => {
123128
if (selectedStep !== stepId) {
124129
dispatch(toggleViewSubstep(null))
@@ -196,6 +201,21 @@ export function ConnectedStepInfo(props: ConnectedStepInfoProps): JSX.Element {
196201

197202
const iconName = stepIconsByType[step.stepType]
198203

204+
const handleMouseEnter = (): void => {
205+
debouncedUnhighlightStep.cancel()
206+
dispatch(stepsActions.hoverOnStep(stepId))
207+
}
208+
209+
const handleMouseLeave = (): void => {
210+
debouncedUnhighlightStep()
211+
}
212+
213+
useEffect(() => {
214+
return () => {
215+
debouncedUnhighlightStep.cancel()
216+
}
217+
}, [debouncedUnhighlightStep, hoveredStep, stepId])
218+
199219
return (
200220
<>
201221
{showConfirmationDoubleClick && (
@@ -218,12 +238,12 @@ export function ConnectedStepInfo(props: ConnectedStepInfoProps): JSX.Element {
218238
hasError={hasError}
219239
isStepAfterError={stepAfterError}
220240
stepId={stepId}
221-
onMouseLeave={unhighlightStep}
241+
onMouseLeave={handleMouseLeave}
222242
selected={selected}
223243
onDoubleClick={confirmDoubleClick}
224244
onClick={confirm}
225245
hovered={hoveredStep === stepId && !hoveredSubstep}
226-
onMouseEnter={highlightStep}
246+
onMouseEnter={handleMouseEnter}
227247
iconName={hasError || hasWarnings ? 'alert-circle' : iconName}
228248
title={`${stepNumber}. ${
229249
i18n.format(step.stepName, 'titleCase') ||

0 commit comments

Comments
 (0)