mirror of
https://github.com/vercel/commerce.git
synced 2025-07-29 13:11:22 +00:00
✨ feat: QuanittyInput
:%s
This commit is contained in:
@@ -1,13 +1,39 @@
|
||||
// .quanittyInput::-webkit-outer-spin-button,
|
||||
// .quanittyInput::-webkit-inner-spin-button {
|
||||
// -webkit-appearance: none;
|
||||
// margin: 0;
|
||||
// }
|
||||
.quanittyInput{
|
||||
@apply bg-background;
|
||||
color: theme("textColor.active");
|
||||
&::-webkit-inner-spin-button, &::-webkit-inner-spin-button{
|
||||
-webkit-appearance: none;
|
||||
margin: 0;
|
||||
@import '../../../styles/utilities';
|
||||
.quanittyInputWarper{
|
||||
border-color: theme("textColor.active");
|
||||
@apply border border-solid inline-flex justify-between items-center custom-border-radius;
|
||||
.plusIcon, .minusIcon{
|
||||
&:hover{
|
||||
cursor: pointer;
|
||||
}
|
||||
}
|
||||
&.default{
|
||||
max-width: 18.4rem;
|
||||
min-height: 4rem;
|
||||
.plusIcon, .minusIcon{
|
||||
margin: 0.8rem;
|
||||
width: 2.4rem;
|
||||
height: 2.4rem;
|
||||
}
|
||||
}
|
||||
&.small{
|
||||
max-width: 10rem;
|
||||
min-height: 2.8rem;
|
||||
.plusIcon, .minusIcon{
|
||||
margin: 0 0.6rem;
|
||||
// width: 1rem;
|
||||
// height: 1rem;
|
||||
}
|
||||
}
|
||||
.quanittyInput{
|
||||
@apply bg-background outline-none w-1/2 text-center h-full font-bold;
|
||||
font-size: 20px;
|
||||
line-height: 28px;
|
||||
color: theme("textColor.active");
|
||||
&::-webkit-inner-spin-button, &::-webkit-inner-spin-button{
|
||||
-webkit-appearance: none;
|
||||
margin: 0;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
@@ -1,16 +1,83 @@
|
||||
import React, { useState } from 'react'
|
||||
import s from "./QuanittyInput.module.scss"
|
||||
interface QuanittyInputProps {
|
||||
|
||||
import React, { ChangeEvent, useEffect, useState } from 'react'
|
||||
import s from './QuanittyInput.module.scss'
|
||||
import classNames from 'classnames'
|
||||
import { Minus, Plus } from '@components/icons'
|
||||
interface QuanittyInputProps
|
||||
extends Omit<
|
||||
React.InputHTMLAttributes<HTMLInputElement>,
|
||||
'onChange' | 'min' | 'max' | 'step'
|
||||
> {
|
||||
type?: 'default' | 'small'
|
||||
onChange?: (value: number) => void
|
||||
initValue?: number
|
||||
min?: number
|
||||
max?: number
|
||||
step?: number
|
||||
}
|
||||
|
||||
const QuanittyInput = (props: QuanittyInputProps) => {
|
||||
const [value, setvalue] = useState(0)
|
||||
return (
|
||||
<div>
|
||||
<input type="number" value={value} onChange={(e)=>setvalue(+e.target.value)} className={s.quanittyInput}/>
|
||||
</div>
|
||||
)
|
||||
const QuanittyInput = ({
|
||||
type = 'default',
|
||||
onChange,
|
||||
initValue = 0,
|
||||
min,
|
||||
max,
|
||||
step = 1,
|
||||
...props
|
||||
}: QuanittyInputProps) => {
|
||||
const [value, setValue] = useState<number>(0)
|
||||
|
||||
useEffect(() => {
|
||||
onChange && onChange(value)
|
||||
}, [value])
|
||||
|
||||
useEffect(() => {
|
||||
initValue && setValue(initValue)
|
||||
}, [initValue])
|
||||
|
||||
const onPlusClick = () => {
|
||||
if (max && value + step > max) {
|
||||
setValue(max)
|
||||
} else {
|
||||
setValue(value + step)
|
||||
}
|
||||
}
|
||||
|
||||
const onMinusClick = () => {
|
||||
if (min && value - step < min) {
|
||||
setValue(min)
|
||||
} else {
|
||||
setValue(value - step)
|
||||
}
|
||||
}
|
||||
|
||||
const onValueChange = (e: ChangeEvent<HTMLInputElement>) => {
|
||||
let value = Number(e.target.value) || 0
|
||||
if (min && value < min) {
|
||||
setValue(min)
|
||||
} else if (max && value > max) {
|
||||
setValue(max)
|
||||
} else {
|
||||
setValue(value)
|
||||
}
|
||||
}
|
||||
|
||||
return (
|
||||
<div className={classNames(s.quanittyInputWarper, { [s[type]]: type })}>
|
||||
<div className={s.minusIcon} onClick={onMinusClick}>
|
||||
<Minus />
|
||||
</div>
|
||||
<input
|
||||
{...props}
|
||||
type="number"
|
||||
value={value}
|
||||
onChange={onValueChange}
|
||||
className={s.quanittyInput}
|
||||
/>
|
||||
<div className={s.plusIcon} onClick={onPlusClick}>
|
||||
<Plus />
|
||||
</div>
|
||||
</div>
|
||||
)
|
||||
}
|
||||
|
||||
export default QuanittyInput
|
||||
|
Reference in New Issue
Block a user