fixed inputs to accept decimals
All checks were successful
Deploy / deploy (push) Successful in 59s
Security Tests / security-non-db (push) Successful in 18s
Security Tests / security-db (push) Successful in 24s

This commit is contained in:
2026-03-11 20:02:32 -05:00
parent 72334b2583
commit cccce2c854
2 changed files with 51 additions and 11 deletions

View File

@@ -1,4 +1,4 @@
import React from "react";
import React, { useEffect, useState } from "react";
type BaseProps = Omit<
React.InputHTMLAttributes<HTMLInputElement>,
@@ -39,21 +39,32 @@ export default function CurrencyInput({
if ("valueCents" in rest) {
const { valueCents, onChange, ...inputProps } = rest as CentsProps;
const [display, setDisplay] = useState<string>("");
// keep display in sync when valueCents prop changes externally
useEffect(() => {
const asNumber = (valueCents ?? 0) / 100;
setDisplay(Number.isFinite(asNumber) ? asNumber.toString() : "");
}, [valueCents]);
const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {
const formatted = formatString(e.target.value);
const parsed = Number.parseFloat(formatted || "0");
onChange(Number.isFinite(parsed) ? Math.round(parsed * 100) : 0);
setDisplay(formatted);
const parsed = Number.parseFloat(formatted);
if (Number.isFinite(parsed)) {
onChange(Math.round(parsed * 100));
}
};
const displayValue = (valueCents ?? 0) / 100;
const value = Number.isFinite(displayValue) ? displayValue.toString() : "";
return (
<input
{...inputProps}
className={mergedClass}
inputMode="decimal"
placeholder={placeholder}
value={value}
value={display}
onChange={handleChange}
pattern="[0-9]*[.,]?[0-9]*"
/>
);
}
@@ -70,6 +81,7 @@ export default function CurrencyInput({
placeholder={placeholder}
value={value}
onChange={handleChange}
pattern="[0-9]*[.,]?[0-9]*"
/>
);
}