Skip to content

Commit c0022e9

Browse files
authored
fix(protocol-designer): fix pipette tips form data issue (#19077)
* fix(protocol-designer): fix pipette tips form data issue
1 parent 1865af9 commit c0022e9

File tree

2 files changed

+29
-37
lines changed

2 files changed

+29
-37
lines changed

protocol-designer/src/components/organisms/SelectPipetteModal/SelectPipetteTips.tsx

Lines changed: 5 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -29,31 +29,28 @@ import { useKitchen } from '../Kitchen/useKitchen'
2929

3030
import type { ThunkDispatch } from 'redux-thunk'
3131
import type { Dispatch, SetStateAction } from 'react'
32-
import type { UseFormSetValue } from 'react-hook-form'
33-
import type { PipetteMount, RobotType } from '@opentrons/shared-data'
32+
import type { RobotType } from '@opentrons/shared-data'
3433
import type { BaseState } from '../../../types'
3534

3635
interface SelectPipetteTipsProps {
37-
mount: PipetteMount
3836
robotType: RobotType
3937
tiprackOptions: Record<string, string>
40-
setValue: UseFormSetValue<any>
4138
selectedValues: string[]
4239
pipetteVolume: string | null
4340
setIncompatibleTip: Dispatch<SetStateAction<boolean>>
41+
setSelectedTipracks: Dispatch<SetStateAction<string[]>>
4442
}
4543

4644
const MAX_TIPRACKS_ALLOWED = 3
4745

4846
export function SelectPipetteTips(props: SelectPipetteTipsProps): JSX.Element {
4947
const {
50-
mount,
5148
robotType,
5249
tiprackOptions,
53-
setValue,
5450
selectedValues,
5551
pipetteVolume,
5652
setIncompatibleTip,
53+
setSelectedTipracks,
5754
} = props
5855
const { t } = useTranslation('onboarding')
5956
const { makeSnackbar } = useKitchen()
@@ -64,18 +61,12 @@ export function SelectPipetteTips(props: SelectPipetteTipsProps): JSX.Element {
6461
const isCurrentlySelected = selectedValues.includes(value)
6562

6663
if (isCurrentlySelected) {
67-
setValue(
68-
`pipettesByMount.${mount}.tiprackDefURI`,
69-
selectedValues.filter(v => v !== value)
70-
)
64+
setSelectedTipracks(selectedValues.filter(v => v !== value))
7165
} else {
7266
if (selectedValues.length === MAX_TIPRACKS_ALLOWED) {
7367
makeSnackbar(t('up_to_3_tipracks') as string)
7468
} else {
75-
setValue(`pipettesByMount.${mount}.tiprackDefURI`, [
76-
...selectedValues,
77-
value,
78-
])
69+
setSelectedTipracks([...selectedValues, value])
7970
}
8071
}
8172
}

protocol-designer/src/components/organisms/SelectPipetteModal/index.tsx

Lines changed: 24 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,10 @@ export function SelectPipetteModal(
7171
const fields = watch('fields')
7272
const allLabware = useSelector(getLabwareDefsByURI)
7373
const [showIncompatibleTip, setIncompatibleTip] = useState<boolean>(false)
74+
const [selectedTipracks, setSelectedTipracks] = useState<string[]>(
75+
() => pipettesByMount[mount].tiprackDefURI ?? []
76+
)
77+
7478
const allowAllTipracks = useSelector(getAllowAllTipracks)
7579
const allPipetteOptions = getAllPipetteNames('maxVolume', 'channels')
7680
const robotType = fields.robotType
@@ -79,25 +83,28 @@ export function SelectPipetteModal(
7983
? `${pipetteVolume}_${pipetteType}`
8084
: `${pipetteVolume}_${pipetteType}_${pipetteGen.toLowerCase()}`
8185

82-
const selectedValues = pipettesByMount[mount].tiprackDefURI ?? []
83-
84-
const noPipette =
85-
(pipettesByMount.left.pipetteName == null ||
86-
pipettesByMount.left.tiprackDefURI == null) &&
87-
(pipettesByMount.right.pipetteName == null ||
88-
pipettesByMount.right.tiprackDefURI == null)
89-
90-
const isDisabled =
91-
(pipettesByMount[mount].tiprackDefURI == null && noPipette) ||
92-
((pipettesByMount.left.tiprackDefURI == null ||
93-
pipettesByMount.left.tiprackDefURI.length === 0) &&
94-
(pipettesByMount.right.tiprackDefURI == null ||
95-
pipettesByMount.right.tiprackDefURI.length === 0))
86+
const currentPipetteSelected = pipetteType != null && pipetteVolume != null
87+
const currentTipracksSelected = selectedTipracks.length > 0
88+
const otherMount = mount === 'left' ? 'right' : 'left'
89+
const otherMountData = pipettesByMount[otherMount]
90+
const otherPipetteConfigured = otherMountData?.pipetteName != null
91+
const otherTipracksConfigured =
92+
otherMountData?.tiprackDefURI != null &&
93+
otherMountData.tiprackDefURI.length > 0
94+
const otherMountComplete = otherPipetteConfigured && otherTipracksConfigured
95+
const currentMountComplete = currentPipetteSelected && currentTipracksSelected
96+
const noPipette = !currentMountComplete && !otherMountComplete
97+
const isDisabled = noPipette || !currentTipracksSelected
9698

9799
if (robotType == null) {
98100
return null
99101
}
100102

103+
const handleSave = (): void => {
104+
setValue(`pipettesByMount.${mount}.tiprackDefURI`, selectedTipracks)
105+
setSelectedPipetteName(selectedPipetteName)
106+
}
107+
101108
return createPortal(
102109
showIncompatibleTip ? (
103110
<IncompatibleTipsModal
@@ -121,12 +128,7 @@ export function SelectPipetteModal(
121128
<SecondaryButton onClick={handleBack}>
122129
{t('shared:cancel')}
123130
</SecondaryButton>
124-
<PrimaryButton
125-
onClick={() => {
126-
setSelectedPipetteName(selectedPipetteName)
127-
}}
128-
disabled={isDisabled}
129-
>
131+
<PrimaryButton onClick={handleSave} disabled={isDisabled}>
130132
{t('shared:save')}
131133
</PrimaryButton>
132134
</Flex>
@@ -177,11 +179,10 @@ export function SelectPipetteModal(
177179
<SelectPipetteTips
178180
tiprackOptions={tiprackOptions}
179181
setIncompatibleTip={setIncompatibleTip}
180-
mount={mount}
181182
robotType={robotType}
182-
selectedValues={selectedValues}
183183
pipetteVolume={pipetteVolume}
184-
setValue={setValue}
184+
selectedValues={selectedTipracks}
185+
setSelectedTipracks={setSelectedTipracks}
185186
/>
186187
)
187188
})()

0 commit comments

Comments
 (0)