cec-product-card
Version:
Esto es un paquete de pruebas en NPM
59 lines (46 loc) • 1.45 kB
text/typescript
import { useEffect, useRef, useState } from "react"
import { onChangeArgs, Product, InitialValues } from '../interfaces/product.interface';
interface Props {
product: Product
onChange?: (args: onChangeArgs) => void
value?: number,
initialValues?: InitialValues
}
export const useProduct = ({ onChange, product, value = 0, initialValues }: Props) => {
const [count, setCount] = useState(initialValues?.count || value)
const isMounted = useRef(false)
const isControlled = useRef(!!onChange)
const increaseBy = (value: number) => {
let newValue = Math.max(count + value, 0)
if (initialValues?.maxCount) {
newValue = Math.min(newValue, initialValues.maxCount)
}
if (isControlled.current) {
return onChange!({ count: value, product })
}
setCount(newValue)
if (onChange) {
onChange({
count: newValue,
product
})
}
}
const reset = () => {
setCount(initialValues?.count || value)
}
useEffect(() => {
if(!isMounted.current) return
setCount(value)
}, [value])
useEffect(()=> {
isMounted.current = true
}, [])
return {
count,
increaseBy,
isMaxCountReached: !!initialValues?.count && initialValues.maxCount === count,
maxCount: initialValues?.maxCount,
reset
}
}