Skip to content

Commit

Permalink
remove state from stepper input and simplify (#1264)
Browse files Browse the repository at this point in the history
* remove state from stepper input and simplify

* get rid of lodash
  • Loading branch information
davegarthsimpson authored Jul 29, 2022
1 parent 40c93bc commit 55927ac
Showing 1 changed file with 20 additions and 74 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -16,64 +16,30 @@ const SettingsStepInput: React.FC<SettingsStepInputProps> = (
const { value, setSettingsStateValue, step, maxValue, minValue, classNames } =
props;

const [stepUpDisabled, setStepUpDisabled] = React.useState(false);
const [stepDownDisabled, setStepDownDisabled] = React.useState(false);

const onStepUp = (): void => {
const valueRoundedToScale = Math.ceil(value / step) * step;
const calculatedValue =
valueRoundedToScale === value ? value + step : valueRoundedToScale;
const newValue = limitValueByCondition(
calculatedValue,
maxValue,
calculatedValue >= maxValue,
disableStepUp
);

setSettingsStateValue(newValue);
const clamp = (value: number, min: number, max: number): number => {
return Math.min(Math.max(value, min), max);
};

const onStepDown = (): void => {
const valueRoundedToScale = Math.floor(value / step) * step;
const onStep = (
roundingOperation: 'ceil' | 'floor',
stepOperation: (a: number, b: number) => number
): void => {
const valueRoundedToScale = Math[roundingOperation](value / step) * step;
const calculatedValue =
valueRoundedToScale === value ? value - step : valueRoundedToScale;
const newValue = limitValueByCondition(
calculatedValue,
minValue,
calculatedValue <= minValue,
disableStepDown
);
valueRoundedToScale === value
? stepOperation(value, step)
: valueRoundedToScale;
const newValue = clamp(calculatedValue, minValue, maxValue);

setSettingsStateValue(newValue);
};

const limitValueByCondition = (
calculatedValue: number,
limitedValue: number,
condition: boolean,
onConditionTrue: () => void,
onConditionFalse = enableButtons
): number => {
if (condition) {
onConditionTrue();
return limitedValue;
} else {
onConditionFalse();
return calculatedValue;
}
};

const enableButtons = (): void => {
setStepUpDisabled(false);
setStepDownDisabled(false);
};

const disableStepUp = (): void => {
setStepUpDisabled(true);
const onStepUp = (): void => {
onStep('ceil', (a: number, b: number) => a + b);
};

const disableStepDown = (): void => {
setStepDownDisabled(true);
const onStepDown = (): void => {
onStep('floor', (a: number, b: number) => a - b);
};

const onUserInput = (event: React.ChangeEvent<HTMLInputElement>): void => {
Expand All @@ -86,34 +52,14 @@ const SettingsStepInput: React.FC<SettingsStepInputProps> = (
const number = Number(eventValue);

if (!isNaN(number) && number !== value) {
let newValue;
if (number > value) {
newValue = limitValueByCondition(
number,
maxValue,
number >= maxValue,
disableStepUp
);
} else {
newValue = limitValueByCondition(
number,
minValue,
number <= minValue,
disableStepDown
);
}
const newValue = clamp(number, minValue, maxValue);

setSettingsStateValue(newValue);
}
};

// the component does not unmount when we close the settings dialog
// in theia which necessitates the below useEffect
React.useEffect(() => {
if (value > minValue && value < maxValue) {
enableButtons();
}
}, [value, minValue, maxValue]);
const upDisabled = value >= maxValue;
const downDisabled = value <= minValue;

return (
<div className="settings-step-input-container">
Expand All @@ -127,14 +73,14 @@ const SettingsStepInput: React.FC<SettingsStepInputProps> = (
<div className="settings-step-input-buttons-container">
<button
className="settings-step-input-button settings-step-input-up-button"
disabled={stepUpDisabled}
disabled={upDisabled}
onClick={onStepUp}
>
&#9662;
</button>
<button
className="settings-step-input-button"
disabled={stepDownDisabled}
disabled={downDisabled}
onClick={onStepDown}
>
&#9662;
Expand Down

0 comments on commit 55927ac

Please sign in to comment.