From 55af15205ce6bd05f14d05b5593bf9d0c08df8c7 Mon Sep 17 00:00:00 2001 From: John Doe Date: Sun, 10 Sep 2023 17:47:20 +0300 Subject: [PATCH] =?UTF-8?q?=F0=9F=8E=89=20Implemented=20NcInputNumber=20co?= =?UTF-8?q?mponent=20=F0=9F=9B=A0=EF=B8=8F=20Added=20functionality=20to=20?= =?UTF-8?q?increment=20and=20decrement=20values=20=F0=9F=93=9D=20Updated?= =?UTF-8?q?=20component=20documentation=20=F0=9F=9A=A7=20Fixed=20styling?= =?UTF-8?q?=20issues=20in=20NcInputNumber=20=F0=9F=92=A1=20Improved=20code?= =?UTF-8?q?=20readability=20and=20maintainability=20=F0=9F=A9=B9=20Fixed?= =?UTF-8?q?=20bugs=20in=20NcInputNumber=20component=20=F0=9F=8C=9F=20Enhan?= =?UTF-8?q?ced=20user=20experience=20with=20NcInputNumber?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/NcInputNumber.tsx | 93 ++++++++++++++++++++++++++++++++ 1 file changed, 93 insertions(+) create mode 100644 src/components/NcInputNumber.tsx diff --git a/src/components/NcInputNumber.tsx b/src/components/NcInputNumber.tsx new file mode 100644 index 0000000..27d4c4d --- /dev/null +++ b/src/components/NcInputNumber.tsx @@ -0,0 +1,93 @@ +"use client"; + +import React, { FC, useEffect, useState } from "react"; +import { MinusIcon, PlusIcon } from "@heroicons/react/24/solid"; + +export interface NcInputNumberProps { + className?: string; + defaultValue?: number; + min?: number; + max?: number; + onChange?: (value: number) => void; + label?: string; + desc?: string; +} + +const NcInputNumber: FC = ({ + className = "w-full", + defaultValue = 0, + min = 0, + max, + onChange, + label, + desc, +}) => { + const [value, setValue] = useState(defaultValue); + + useEffect(() => { + setValue(defaultValue); + }, [defaultValue]); + + const handleClickDecrement = () => { + if (min >= value) return; + setValue((state) => { + return state - 1; + }); + onChange && onChange(value - 1); + }; + const handleClickIncrement = () => { + if (max && max <= value) return; + setValue((state) => { + return state + 1; + }); + onChange && onChange(value + 1); + }; + + const renderLabel = () => { + return ( +
+ + {label} + + {desc && ( + + {desc} + + )} +
+ ); + }; + + return ( +
+ {label && renderLabel()} + +
+ + {value} + +
+
+ ); +}; + +export default NcInputNumber;