Files
calculatorEstateSolution/src/components/InputComponent/InputComponent.js
T
2023-02-06 17:10:05 +05:00

158 lines
3.6 KiB
JavaScript

import './InputComponent.css'
import edit from './edit.svg'
import { useEffect, useState } from "react";
import CurrencyInput from "react-currency-input-field";
import { useDispatch } from "react-redux";
import { calcSlice } from "../../store/reducers/calcSlice";
export const InputComponent = ({ value, name, min, max, inputClass, large }) => {
const dispatch = useDispatch();
const { handleValue, handleTotal } = calcSlice.actions;
const [valid, setValid] = useState(false);
const [valueInput, setValueInput] = useState(value);
useEffect(() => {
setValueInput(value)
}, [value])
const handleNumber = (number) => {
if (!number) {
return;
}
const num = Number(number.replace(/ /g, ""));
console.log(num, "test");
return num;
};
useEffect(() => {
dispatch(handleTotal());
}, []);
const handleTotalValues = (value, name) => {
dispatch(handleValue({ name: name, value: value }));
dispatch(handleTotal());
};
const handleState = (e) => {
const { value, name } = e.target;
setValueInput(value);
handleTotalValues(value, name);
handleStyle();
};
const handleValidity = (number) => {
if (!(number < max && number > min && number !== 0)) {
setValid(false);
return false;
} else {
setValid(true);
return true;
}
};
const handleOnValueChange = (value, name) => {
const number = handleNumber(value);
setValueInput(number);
handleStyle();
setValid(false);
if (!name) {
return;
}
if (!value) {
setValueInput("");
return;
}
if (!Number.isNaN(number)) {
const validity = handleValidity(number);
if (validity) {
handleTotalValues(number, name);
return;
} else {
return;
}
}
};
const handleFocusLeft = (e) => {
const { name, value } = e.target;
const number = handleNumber(value);
console.log(number, value, "valuie");
if (number === 0 && number === undefined) {
handleTotalValues(min, name);
return;
} else {
if (!valid) {
if (!(number < max)) {
handleTotalValues(max, name);
setValueInput(max);
return;
}
if (number <= min) {
handleTotalValues(min, name);
setValueInput(min);
return;
}
} else {
return;
}
}
};
const handleStyle = () => {
let width;
if (valueInput < min) {
return (width = "0%");
}
width = ((valueInput - min) * 100) / (max - min) + "% 100%";
return width;
};
return (
<>
<div className='number-container'>
<CurrencyInput
className="number-input"
decimalsLimit={3}
allowNegativeValue={false}
allowDecimals={false}
groupSeparator={" "}
style={large ? {width: '78px'} : {width: '45px'}}
min={min}
max={max}
name={name}
value={valueInput}
onBlur={(e) => handleFocusLeft(e)}
onValueChange={(value, name) => handleOnValueChange(value, name)}
/>
<img className='edit-icon' alt='edit/изменить' src={edit} />
</div>
<div className="input-container">
<input
style={{
backgroundSize: handleStyle(),
}}
type="range"
className={inputClass}
name={name}
min={min}
value={valueInput === "" ? 0 : valueInput}
max={max}
onChange={(e) => handleState(e)}
></input>
<div className="value-container">
<span>{min}</span>
<span>{max}</span>
</div>
</div>
</>
);
};