ldc-groupe/resources/ts/back/Components/Inputs/SimpleNumber.tsx
2025-10-17 14:52:51 +02:00

75 lines
2.2 KiB
TypeScript

// * Packages
import { useState, useEffect } from "react";
import { usePage } from "@inertiajs/react";
// * Components shadcn
import { Input } from "@/components/ui/input";
import { Label } from "@/components/ui/label";
// * Other
import InputError from "@/back/Components/InputError";
import { cn } from "@/lib/utils";
import useTrans from "@/hooks/use-translations";
type SimpleNumberProps = {
className?: string;
name: string;
label: string;
value?: number;
id?: string;
step?: number;
limits?: Record<string, number>;
placeholder?: string;
required?: boolean;
disabled?: boolean;
setData: (name: string, value: string) => void;
};
export default function SimpleNumber({
className,
value = 0,
name,
label,
id = name,
step = 1,
limits = { min: 0, max: 1000 },
placeholder = "back.enter_number_here",
required = true,
disabled = false,
setData,
}: SimpleNumberProps) {
const safeValue = value >= limits.min && value <= limits.max ? value : limits.min;
const { errors } = usePage().props;
const [inputValue, setInputValue] = useState(safeValue);
useEffect(() => {
setInputValue(safeValue);
}, [safeValue]);
return (
<div className={cn("flex flex-col w-full gap-1.5", className)}>
<Label htmlFor={name}>{label + (required ? " *" : "")}</Label>
<div className="flex w-full">
<Input
id={id}
name={name}
type="number"
placeholder={useTrans(placeholder)}
value={inputValue}
min={limits.min}
max={limits.max}
step={step}
onChange={(e) => {
setInputValue(Number(e.target.value));
setData(name, e.target.value);
}}
required={required}
disabled={disabled}
className={cn("w-full", {
"border-destructive/50": errors[name],
})}
/>
</div>
<InputError message={errors[name]} />
</div>
);
}