Skip to content

Commit a68f312

Browse files
author
Simon Bigelmayr
committed
feat: refactor pipetting loss calculation for 'factorWithMinimum' type
1 parent 9edff7e commit a68f312

File tree

2 files changed

+41
-17
lines changed

2 files changed

+41
-17
lines changed

src/MasterMix/index.stories.tsx

Lines changed: 14 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -57,19 +57,20 @@ function Template({
5757
minPositions = 2,
5858
...props
5959
}: StoryProps): React.ReactElement {
60-
let pipettingLoss;
61-
62-
if (lossType === 'absolute') {
63-
pipettingLoss = { type: 'absolute', count: lossValue };
64-
} else if (lossType === 'factor') {
65-
pipettingLoss = { type: 'factor', factor: lossValue };
66-
} else {
67-
pipettingLoss = {
68-
type: 'factorWithMinimum',
69-
factor: lossValue,
70-
minPositions,
71-
};
72-
}
60+
const pipettingLoss = (() => {
61+
switch (lossType) {
62+
case 'absolute':
63+
return { type: lossType, count: lossValue };
64+
case 'factor':
65+
return { type: lossType, factor: lossValue };
66+
case 'factorWithMinimum':
67+
return {
68+
type: lossType,
69+
factor: lossValue,
70+
minPositions,
71+
};
72+
}
73+
})();
7374

7475
return <MasterMix {...props} pipettingLoss={pipettingLoss} />;
7576
}

src/MasterMix/pipettingLossTableColumn.tsx

Lines changed: 27 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,28 @@ import { Tooltip } from '../Tooltip';
55
import {
66
IngredientWithStringOrNumberKey,
77
PipettingLoss,
8+
PipettingLossFactorWithMinimum,
89
PipettingLossTableColumn,
910
PipettingLossTableColumnArgs,
1011
} from './types';
1112

13+
type PipettingLosses = {
14+
factorLoss: number;
15+
minPositionsLoss: number;
16+
};
17+
18+
function calculatePipettingLosses(
19+
count: number,
20+
pipettingLoss: PipettingLossFactorWithMinimum,
21+
volume = 1,
22+
): PipettingLosses {
23+
const baseVolume = volume * count;
24+
return {
25+
factorLoss: baseVolume * pipettingLoss.factor,
26+
minPositionsLoss: volume * pipettingLoss.minPositions,
27+
};
28+
}
29+
1230
function pipettingLossTitle(
1331
pipettingLoss: PipettingLoss,
1432
count: number,
@@ -20,8 +38,10 @@ function pipettingLossTitle(
2038
case 'factor':
2139
return `${pipettingLoss.factor * 100}%`;
2240
case 'factorWithMinimum': {
23-
const factorLoss = count * pipettingLoss.factor;
24-
const minPositionsLoss = pipettingLoss.minPositions;
41+
const { factorLoss, minPositionsLoss } = calculatePipettingLosses(
42+
count,
43+
pipettingLoss,
44+
);
2545
return factorLoss > minPositionsLoss
2646
? `${(pipettingLoss.factor * 100).toFixed(0)}%`
2747
: `${pipettingLoss.minPositions}x`;
@@ -45,8 +65,11 @@ function totalVolume(
4565
).toFixed(1);
4666
case 'factorWithMinimum': {
4767
const baseVolume = record.volume * args.count;
48-
const factorLoss = baseVolume * args.pipettingLoss.factor;
49-
const minPositionsLoss = record.volume * args.pipettingLoss.minPositions;
68+
const { factorLoss, minPositionsLoss } = calculatePipettingLosses(
69+
args.count,
70+
args.pipettingLoss,
71+
record.volume,
72+
);
5073
const pipettingLoss = Math.max(factorLoss, minPositionsLoss);
5174
return (baseVolume + pipettingLoss).toFixed(1);
5275
}

0 commit comments

Comments
 (0)