From ab350649b84e95c7af634a39081259dd5fb18b18 Mon Sep 17 00:00:00 2001 From: crisis Date: Mon, 17 Jun 2024 16:15:31 -0300 Subject: [PATCH] feat: add number input to NumberSelect component (#41) * feat: add number input to NumberSelect component * fix: remove onChange infinite loop --- app/components/ui/NumberSelect.tsx | 41 +++++++++++++++++------------- 1 file changed, 23 insertions(+), 18 deletions(-) diff --git a/app/components/ui/NumberSelect.tsx b/app/components/ui/NumberSelect.tsx index 0714913..0d5679c 100644 --- a/app/components/ui/NumberSelect.tsx +++ b/app/components/ui/NumberSelect.tsx @@ -1,5 +1,4 @@ import { Minus as MinusIcon, Plus as PlusIcon } from "lucide-react"; -import React, { useState } from "react"; import { cn } from "~/lib/utils"; @@ -12,42 +11,48 @@ export const NumberSelect = ({ onChange: (num: number) => void; value: number; }) => { - const [number, setNumber] = useState(value); - - const updateNumber = (direction: "add" | "sub") => { - if (direction === "add" && number < max) { - return setNumber(number + 1); + const updateNumber = (direction: "add" | "sub" | "replace") => { + if (direction === "add" && value < max) { + onChange(value + 1); } - if (direction === "sub" && number > 0) { - return setNumber(number - 1); + if (direction === "sub" && value > 0) { + onChange(value - 1); } }; - React.useEffect(() => { - onChange(number); - }, [number, onChange]); + const overrideNumber = (stringValue: string) => { + const newValue = Number(stringValue); + if (isNaN(newValue)) return; + onChange(Math.min(newValue, max)); + }; return (
-

- {number} -

+ { + overrideNumber(e.target.value); + }} + className="center w-10 bg-transparent text-center text-sm font-medium text-night-100" + />