diff --git a/app/search/[collection]/page.tsx b/app/search/[collection]/page.tsx index ea52c14ab..0c34864c9 100644 --- a/app/search/[collection]/page.tsx +++ b/app/search/[collection]/page.tsx @@ -20,8 +20,6 @@ import { } from 'lib/constants'; import { Suspense } from 'react'; -export const runtime = 'edge'; - export async function generateMetadata({ params }: { diff --git a/app/search/page.tsx b/app/search/page.tsx index 2f7a53bd4..60f11b189 100644 --- a/app/search/page.tsx +++ b/app/search/page.tsx @@ -3,8 +3,6 @@ import ProductGridItems from 'components/layout/product-grid-items'; import { defaultSort, sorting } from 'lib/constants'; import { getProducts } from 'lib/shopify'; -export const runtime = 'edge'; - export const metadata = { title: 'Search', description: 'Search for products in the store.' diff --git a/components/layout/search/filters/filters-list.tsx b/components/layout/search/filters/filters-list.tsx index 83c7276b8..1cdb72ac0 100644 --- a/components/layout/search/filters/filters-list.tsx +++ b/components/layout/search/filters/filters-list.tsx @@ -5,6 +5,7 @@ import clsx from 'clsx'; import { Filter } from 'lib/shopify/types'; import { createUrl } from 'lib/utils'; import { usePathname, useRouter, useSearchParams } from 'next/navigation'; +import SelectedList from './selected-list'; const Filters = ({ filters, defaultOpen = true }: { filters: Filter[]; defaultOpen?: boolean }) => { const router = useRouter(); @@ -31,43 +32,47 @@ const Filters = ({ filters, defaultOpen = true }: { filters: Filter[]; defaultOp }; return ( -
- {filters.map(({ label, id, values }) => ( - - -
{label}
- -
- - {values.map(({ id: valueId, label, count, value }) => ( - - ))} - -
- ))} -
+ <> + +
+ {filters.map(({ label, id, values }) => ( + + +
{label}
+ +
+ + {values.map(({ id: valueId, label, count, value }) => ( + + ))} + +
+ ))} +
+ ); }; diff --git a/components/layout/search/filters/selected-list.tsx b/components/layout/search/filters/selected-list.tsx index 1e7d1a14e..16f8a8cfa 100644 --- a/components/layout/search/filters/selected-list.tsx +++ b/components/layout/search/filters/selected-list.tsx @@ -1,5 +1,73 @@ -const SelectedList = () => { - return
SelectedList
; +'use client'; + +import { XMarkIcon } from '@heroicons/react/16/solid'; +import { Filter } from 'lib/shopify/types'; +import { createUrl } from 'lib/utils'; +import { usePathname, useRouter, useSearchParams } from 'next/navigation'; + +const SelectedList = ({ filters }: { filters: Filter[] }) => { + const searchParams = useSearchParams(); + const router = useRouter(); + const pathname = usePathname(); + + const selectedFilters = filters.flatMap(({ id, values }) => { + const selectedValues = searchParams.getAll(id); + if (selectedValues.length === 0) return []; + return values + .filter(({ value }) => selectedValues.includes(String(value))) + .map(({ id: valueId, value, label }) => ({ + valueId, + value, + id, + label + })); + }); + + const handleClear = (id: string, value: string) => { + const newSearchParams = new URLSearchParams(searchParams); + const selectedValues = newSearchParams.getAll(id); + selectedValues.splice(selectedValues.indexOf(value), 1); + newSearchParams.delete(id); + for (const value of selectedValues) { + newSearchParams.append(id, value); + } + + router.replace(createUrl(pathname, newSearchParams), { scroll: false }); + }; + + const handleClearAll = () => { + const sort = searchParams.get('sort'); + const collection = searchParams.get('collection'); + const q = searchParams.get('q'); + const newSearchParams = new URLSearchParams({ + ...(sort && { sort }), + ...(collection && { collection }), + ...(q && { q }) + }); + router.replace(createUrl(pathname, newSearchParams), { scroll: false }); + }; + + return selectedFilters.length ? ( +
+ {selectedFilters.map((filter) => ( +
+ {filter.label} + +
+ ))} + +
+ ) : null; }; export default SelectedList;