UNPKG

@shopify/shop-minis-react

Version:

React component library for Shopify Shop Minis with Tailwind CSS v4 support (source-only, requires TypeScript)

96 lines (83 loc) 2.02 kB
import {useCallback, useEffect, useMemo, useState} from 'react' import debounce from 'lodash/debounce' import {useShopActions} from '../../internal/useShopActions' import {useShopActionsPaginatedDataFetching} from '../../internal/useShopActionsPaginatedDataFetching' import { PaginatedDataHookOptionsBase, PaginatedDataHookReturnsBase, Product, ProductFilters, ProductSearchSortBy, } from '../../types' export interface UseProductSearchParams extends PaginatedDataHookOptionsBase { /** * The search query. */ query: string /** * The filters to apply to the search. */ filters?: ProductFilters /** * The sort order of the results. */ sortBy?: ProductSearchSortBy /** * Whether to include sensitive products. */ includeSensitive?: boolean } interface UseProductSearchReturns extends PaginatedDataHookReturnsBase { /** * The products returned from the query. */ products: Product[] | null } export const useProductSearch = ( params: UseProductSearchParams ): UseProductSearchReturns => { const {getProductSearch} = useShopActions() const { query, filters, sortBy, includeSensitive = false, skip = false, ...restParams } = params ?? {} const [debouncedQuery, setDebouncedQuery] = useState<string>(query) // eslint-disable-next-line react-hooks/exhaustive-deps const debouncedSetQuery = useCallback( debounce((newQuery: string) => { setDebouncedQuery(newQuery) }, 300), [] ) useEffect(() => { debouncedSetQuery(query) return () => { debouncedSetQuery.cancel() } }, [query, debouncedSetQuery]) const {data, ...rest} = useShopActionsPaginatedDataFetching( getProductSearch, { query: debouncedQuery, filters, sortBy, includeSensitive, ...restParams, }, { skip, hook: 'useProductSearch', } ) const products = useMemo(() => { return data ?? null }, [data]) return { ...rest, products, } }