glide-design-system
Version:
Glide design system is an open-source React component library. It offers numerous benefits that make them essential tools for design and development teams.
106 lines (95 loc) • 2.45 kB
JavaScript
import React, { useState, useRef, useEffect } from "react";
import classes from "./Number.module.css";
const Number = ({
value,
name,
placeholder,
required,
onChange,
className,
style,
width,
height,
label,
disabled,
...props
}) => {
const [number, setNumber] = useState(value);
const [numeberFocused, setNumberFocused] = useState(false);
const numberRef = useRef();
const onChangeHandler = (e) => {
if (e.target.value >= 0) {
onChange(e?.target?.value);
setNumber(e.target.value);
}
};
const handleFocusMail = () => {
setNumberFocused(true);
};
const combinedStyle = {
width: width ? width : "350px",
height: height ? height : "40px",
backgroundColor:disabled?'#f5f5f5':'',
...style,
};
useEffect(() => {
const handleClickOutside = (event) => {
if (numberRef.current && !numberRef.current.contains(event.target)) {
setNumberFocused(false);
}
};
document.addEventListener("mousedown", handleClickOutside);
return () => {
document.removeEventListener("mousedown", handleClickOutside);
};
}, [number]);
useEffect(() => {
if (value && value * 1 >= 0) {
setNumber(value ? value : "");
onChange(value ? value : "");
}
}, [value]);
return (
<div>
<p className={classes.headers}>
{label ? label : ""}
{required && (
<span className={classes.required}>
*
</span>
)}
</p>
<div
id="heades"
ref={numberRef}
style={{
width: width
? width
: combinedStyle?.width
? combinedStyle?.width
: "350px",
}}>
<div
style={combinedStyle}
onFocus={handleFocusMail}
className={`${classes.mailContainer} ${
numeberFocused && classes.focused
}`}>
<input
style={{backgroundColor:disabled?'#f5f5f5':''}}
className={classes.inputField}
value={number}
placeholder={placeholder ? placeholder : ""}
onFocus={(e) => (e.target.style.border = "none")}
onBlur={(e) => (e.target.style.borderBottom = "none")}
type="number"
disabled={disabled}
onChange={onChangeHandler}
{...props}
/>
</div>
</div>
</div>
);
};
export default Number;