'use client' import { useEffect } from 'react' import { CustomCheckbox } from 'components' import { useAppDispatch, useAppSelector, useDebounce } from 'hooks' import { loadFilters, updateFilter, resetFilter } from 'store' import { useUrlQuery } from '@/hooks' const FilterOperation = props => { //? Props const { mainMaxPrice, mainMinPrice, handleChangeRoute, onClose } = props //? Assets const dispatch = useAppDispatch() const query = useUrlQuery() //? State const filters = useAppSelector(state => state.filters) //? Debounced Values const debouncedMinPrice = useDebounce(filters.minPrice, 1200) const debouncedMaxPrice = useDebounce(filters.maxPrice, 1200) //? Handlers const handlefilter = e => { const { name, type, checked, value } = e.target const filterValue = type === 'checkbox' ? checked : +value dispatch(updateFilter({ name: name, value: filterValue })) if (type === 'checkbox') handleChangeRoute({ [name]: filterValue }) } const handleResetFilters = () => { handleChangeRoute({ inStock: '', discount: '', price: '' }) dispatch(resetFilter({ maxPrice: mainMaxPrice, minPrice: mainMinPrice })) if (onClose) onClose() } const canReset = !!query.inStock || !!query.discount || mainMinPrice !== debouncedMinPrice || mainMaxPrice !== debouncedMaxPrice //? Re-Renders //* load Filters useEffect(() => { dispatch( loadFilters({ price: `${mainMinPrice}-${mainMaxPrice}`, discount: 'false', inStock: 'false', ...query, }) ) }, [query.category, mainMaxPrice, mainMinPrice, dispatch]) //* Change Route After Debounce useEffect(() => { if (debouncedMinPrice && mainMinPrice !== debouncedMinPrice) handleChangeRoute({ price: `${debouncedMinPrice}-${debouncedMaxPrice}`, }) }, [debouncedMinPrice]) useEffect(() => { if (debouncedMaxPrice && mainMaxPrice !== debouncedMaxPrice) handleChangeRoute({ price: `${debouncedMinPrice}-${debouncedMaxPrice}`, }) }, [debouncedMaxPrice]) //* Close Modal on Change Filter useEffect(() => { if (onClose) onClose() }, [filters.discount, filters.inStock, debouncedMaxPrice, debouncedMinPrice]) //? Render(s) return ( <>
价格范围
¥
¥
) } export default FilterOperation