UNPKG

raulrobi-product-card

Version:
61 lines (49 loc) 2.09 kB
import { useState, useEffect, useRef } from 'react'; import { InitialValuesProps, onChangeArgsProps, Product } from '../interfaces/interfaces'; interface useProductProps { product: Product; onChange?: (args: onChangeArgsProps) => void; value?: number; initialValues?: InitialValuesProps } export const useProduct = ({ onChange, product, value = 0, initialValues }: useProductProps) => { //Si initialValues.count no es null, entonces asigna ese valor, sino el de value const [counter, setCounter] = useState<number>(initialValues?.count || value); const isMounted = useRef(false); const increaseBy = (value: number) => { //Aquí se hacen 2 cosas //Si se establece un máximo, se evalúa el valor del counter + value y si es menor que el maxCount lo //establece, sino lo deja con el maxCount //Si no está establecido un máximo, se asigna el máximo entre counter + value y 0. Esto asegura que //el valorfd del newCounter nunca va a ser menor a 0 let newCounter = initialValues?.maxCount ? Math.min(counter + value, initialValues.maxCount) : Math.max(counter + value, 0); setCounter(newCounter); onChange && onChange({ count: newCounter, product }); }; const reset = () => { setCounter(initialValues?.count || value) } const plusTwo = () => { setCounter(initialValues?.maxCount && initialValues?.maxCount - counter >= 2 ? counter + 2 : counter); } const minusTwo = () => { setCounter(counter === 0 ? counter : counter - 2); } useEffect(() => { if (!isMounted.current) return; setCounter(initialValues?.count || value) }, [value]); useEffect(() => { isMounted.current = true; }, []) return { counter, isMaxCountReached: !!initialValues?.count && initialValues.maxCount === counter, maxCount: initialValues?.maxCount, increaseBy, reset, plusTwo, minusTwo } }