@@ -71,6 +71,10 @@ export function SelectPipetteModal(
71
71
const fields = watch ( 'fields' )
72
72
const allLabware = useSelector ( getLabwareDefsByURI )
73
73
const [ showIncompatibleTip , setIncompatibleTip ] = useState < boolean > ( false )
74
+ const [ selectedTipracks , setSelectedTipracks ] = useState < string [ ] > (
75
+ ( ) => pipettesByMount [ mount ] . tiprackDefURI ?? [ ]
76
+ )
77
+
74
78
const allowAllTipracks = useSelector ( getAllowAllTipracks )
75
79
const allPipetteOptions = getAllPipetteNames ( 'maxVolume' , 'channels' )
76
80
const robotType = fields . robotType
@@ -79,25 +83,28 @@ export function SelectPipetteModal(
79
83
? `${ pipetteVolume } _${ pipetteType } `
80
84
: `${ pipetteVolume } _${ pipetteType } _${ pipetteGen . toLowerCase ( ) } `
81
85
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
96
98
97
99
if ( robotType == null ) {
98
100
return null
99
101
}
100
102
103
+ const handleSave = ( ) : void => {
104
+ setValue ( `pipettesByMount.${ mount } .tiprackDefURI` , selectedTipracks )
105
+ setSelectedPipetteName ( selectedPipetteName )
106
+ }
107
+
101
108
return createPortal (
102
109
showIncompatibleTip ? (
103
110
< IncompatibleTipsModal
@@ -121,12 +128,7 @@ export function SelectPipetteModal(
121
128
< SecondaryButton onClick = { handleBack } >
122
129
{ t ( 'shared:cancel' ) }
123
130
</ SecondaryButton >
124
- < PrimaryButton
125
- onClick = { ( ) => {
126
- setSelectedPipetteName ( selectedPipetteName )
127
- } }
128
- disabled = { isDisabled }
129
- >
131
+ < PrimaryButton onClick = { handleSave } disabled = { isDisabled } >
130
132
{ t ( 'shared:save' ) }
131
133
</ PrimaryButton >
132
134
</ Flex >
@@ -177,11 +179,10 @@ export function SelectPipetteModal(
177
179
< SelectPipetteTips
178
180
tiprackOptions = { tiprackOptions }
179
181
setIncompatibleTip = { setIncompatibleTip }
180
- mount = { mount }
181
182
robotType = { robotType }
182
- selectedValues = { selectedValues }
183
183
pipetteVolume = { pipetteVolume }
184
- setValue = { setValue }
184
+ selectedValues = { selectedTipracks }
185
+ setSelectedTipracks = { setSelectedTipracks }
185
186
/>
186
187
)
187
188
} ) ( )
0 commit comments