infoalloggi-monorepo/apps/infoalloggi/src/components/counter.tsx

64 lines
1.5 KiB
TypeScript
Raw Normal View History

2025-08-04 17:45:44 +02:00
import { Minus, Plus } from "lucide-react";
import Input from "~/components/custom_ui/input";
export const Counter = ({
2025-08-28 18:27:07 +02:00
value,
setValue,
name,
onlyPositive,
disabled,
2025-08-04 17:45:44 +02:00
}: {
2025-08-28 18:27:07 +02:00
value: number;
setValue: (value: number) => void;
name: string;
onlyPositive?: boolean;
disabled?: boolean;
2025-08-04 17:45:44 +02:00
}) => {
2025-08-28 18:27:07 +02:00
const handleChange = (change: number) => {
const newValue = value + change;
if (onlyPositive && newValue < 0) return;
setValue(newValue);
};
return (
<div className="w-[9.5rem]">
2025-08-29 16:18:32 +02:00
<label className="sr-only" htmlFor={name}>
2025-08-28 18:27:07 +02:00
{name}
</label>
2025-08-04 17:45:44 +02:00
2025-08-28 18:27:07 +02:00
<div className="flex items-center rounded-md border px-1">
<button
className="flex size-10 items-center justify-center leading-10 transition hover:opacity-75 disabled:opacity-50"
disabled={disabled}
2025-08-29 16:18:32 +02:00
onClick={() => handleChange(-1)}
type="button"
2025-08-28 18:27:07 +02:00
>
<Minus />
</button>
2025-08-04 17:45:44 +02:00
2025-08-28 18:27:07 +02:00
<Input
2025-08-29 16:18:32 +02:00
className="no-spinner h-10 w-16 rounded-md border-none text-center shadow-none disabled:cursor-default sm:text-sm"
disabled={disabled}
2025-08-28 18:27:07 +02:00
id={name}
onChange={(e) => {
if (!Number.isNaN(Number.parseInt(e.target.value))) {
setValue(Number.parseInt(e.target.value));
} else {
e.target.value = String(value);
}
}}
2025-08-29 16:18:32 +02:00
type="number"
value={value}
2025-08-28 18:27:07 +02:00
/>
2025-08-04 17:45:44 +02:00
2025-08-28 18:27:07 +02:00
<button
className="flex size-10 items-center justify-center leading-10 transition hover:opacity-75 disabled:opacity-50"
disabled={disabled}
2025-08-29 16:18:32 +02:00
onClick={() => handleChange(1)}
type="button"
2025-08-28 18:27:07 +02:00
>
<Plus />
</button>
</div>
</div>
);
2025-08-04 17:45:44 +02:00
};