import {Link} from 'react-router'; import {Image, Money, Pagination} from '@shopify/hydrogen'; import {urlWithTrackingParams, type RegularSearchReturn} from '~/lib/search'; type SearchItems = RegularSearchReturn['result']['items']; type PartialSearchResult = Pick< SearchItems, ItemType > & Pick; type SearchResultsProps = RegularSearchReturn & { children: (args: SearchItems & {term: string}) => React.ReactNode; }; export function SearchResults({ term, result, children, }: Omit) { if (!result?.total) { return null; } return children({...result.items, term}); } SearchResults.Articles = SearchResultsArticles; SearchResults.Pages = SearchResultsPages; SearchResults.Products = SearchResultsProducts; SearchResults.Empty = SearchResultsEmpty; function SearchResultsArticles({ term, articles, }: PartialSearchResult<'articles'>) { if (!articles?.nodes.length) { return null; } return (

Articles

{articles?.nodes?.map((article) => { const articleUrl = urlWithTrackingParams({ baseUrl: `/blogs/${article.handle}`, trackingParams: article.trackingParameters, term, }); return (
{article.title}
); })}

); } function SearchResultsPages({term, pages}: PartialSearchResult<'pages'>) { if (!pages?.nodes.length) { return null; } return (

Pages

{pages?.nodes?.map((page) => { const pageUrl = urlWithTrackingParams({ baseUrl: `/pages/${page.handle}`, trackingParams: page.trackingParameters, term, }); return (
{page.title}
); })}

); } function SearchResultsProducts({ term, products, }: PartialSearchResult<'products'>) { if (!products?.nodes.length) { return null; } return (

Products

{({nodes, isLoading, NextLink, PreviousLink}) => { const ItemsMarkup = nodes.map((product) => { const productUrl = urlWithTrackingParams({ baseUrl: `/products/${product.handle}`, trackingParams: product.trackingParameters, term, }); const price = product?.selectedOrFirstAvailableVariant?.price; const image = product?.selectedOrFirstAvailableVariant?.image; return (
{image && ( {product.title} )}

{product.title}

{price && }
); }); return (
{isLoading ? 'Loading...' : ↑ Load previous}
{ItemsMarkup}
{isLoading ? 'Loading...' : Load more ↓}
); }}

); } function SearchResultsEmpty() { return

No results, try a different search.

; }