mirror of
https://github.com/vercel/commerce.git
synced 2025-05-11 04:07:50 +00:00
fix reset search on filters
Signed-off-by: Chloe <pinkcloudvnn@gmail.com>
This commit is contained in:
parent
d12c264a1c
commit
eb9b6a9e59
@ -13,12 +13,13 @@ const title: Record<string, string> = {
|
||||
const { STORE_PREFIX } = process.env;
|
||||
|
||||
const HomePageFilters = async () => {
|
||||
const makes = await fetchMakes();
|
||||
const menu = await getMenu('main-menu');
|
||||
// preload models and years
|
||||
fetchModels();
|
||||
fetchYears();
|
||||
|
||||
const makes = await fetchMakes();
|
||||
const menu = await getMenu('main-menu');
|
||||
|
||||
return (
|
||||
<>
|
||||
<h1 className="text-4xl font-bold tracking-tight text-white lg:text-6xl">
|
||||
|
@ -15,12 +15,13 @@ const YMMFiltersContainer = ({ children }: { children: ReactNode }) => {
|
||||
};
|
||||
|
||||
const YMMFilters = async () => {
|
||||
const makes = await fetchMakes();
|
||||
const menu = await getMenu('main-menu');
|
||||
// preload models and years
|
||||
fetchModels();
|
||||
fetchYears();
|
||||
|
||||
const makes = await fetchMakes();
|
||||
const menu = await getMenu('main-menu');
|
||||
|
||||
return (
|
||||
<YMMFiltersContainer>
|
||||
<div className="flex grow flex-col items-center gap-3 @md:flex-row">
|
||||
|
@ -3,7 +3,7 @@ import { Disclosure, DisclosureButton, DisclosurePanel } from '@headlessui/react
|
||||
import { ChevronDownIcon } from '@heroicons/react/24/outline';
|
||||
import clsx from 'clsx';
|
||||
import { Filter, FilterType } from 'lib/shopify/types';
|
||||
import { createUrl } from 'lib/utils';
|
||||
import { createUrl, getInitialSearchParams } from 'lib/utils';
|
||||
import { usePathname, useRouter, useSearchParams } from 'next/navigation';
|
||||
import PriceRange from './price-range';
|
||||
import SelectedList from './selected-list';
|
||||
@ -12,12 +12,7 @@ const Filters = ({ filters, defaultOpen = true }: { filters: Filter[]; defaultOp
|
||||
const router = useRouter();
|
||||
const pathname = usePathname();
|
||||
const searchParams = useSearchParams();
|
||||
const { q, sort, collection } = Object.fromEntries(searchParams);
|
||||
const initialFilters = {
|
||||
...(q && { q }),
|
||||
...(sort && { sort }),
|
||||
...(collection && { collection })
|
||||
};
|
||||
const initialFilters = getInitialSearchParams(searchParams);
|
||||
|
||||
const handleChange = (e: React.FormEvent<HTMLFormElement>) => {
|
||||
const formData = new FormData(e.currentTarget);
|
||||
|
@ -2,7 +2,7 @@
|
||||
|
||||
import { XMarkIcon } from '@heroicons/react/16/solid';
|
||||
import { Filter } from 'lib/shopify/types';
|
||||
import { createUrl } from 'lib/utils';
|
||||
import { createUrl, getInitialSearchParams } from 'lib/utils';
|
||||
import { usePathname, useRouter, useSearchParams } from 'next/navigation';
|
||||
|
||||
const SelectedList = ({ filters }: { filters: Filter[] }) => {
|
||||
@ -36,14 +36,9 @@ const SelectedList = ({ filters }: { filters: Filter[] }) => {
|
||||
};
|
||||
|
||||
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 })
|
||||
});
|
||||
const initialSearchParams = getInitialSearchParams(searchParams);
|
||||
const newSearchParams = new URLSearchParams(initialSearchParams);
|
||||
|
||||
router.replace(createUrl(pathname, newSearchParams), { scroll: false });
|
||||
};
|
||||
|
||||
|
24
lib/utils.ts
24
lib/utils.ts
@ -1,6 +1,7 @@
|
||||
import clsx, { ClassValue } from 'clsx';
|
||||
import { ReadonlyURLSearchParams } from 'next/navigation';
|
||||
import { twMerge } from 'tailwind-merge';
|
||||
import { MAKE_FILTER_ID, MODEL_FILTER_ID, YEAR_FILTER_ID } from './constants';
|
||||
import { Menu, Product, ProductVariant } from './shopify/types';
|
||||
|
||||
export function cx(...args: ClassValue[]) {
|
||||
@ -161,3 +162,26 @@ export const getSelectedProductVariant = ({
|
||||
|
||||
return variant || product.variants[0];
|
||||
};
|
||||
|
||||
const YMM_KEYS = [MAKE_FILTER_ID, YEAR_FILTER_ID, MODEL_FILTER_ID];
|
||||
|
||||
export const getInitialSearchParams = (searchParams: URLSearchParams) => {
|
||||
const { q, sort, collection, ...rest } = Object.fromEntries(searchParams);
|
||||
|
||||
const initialFilters: { [key: string]: string } = {
|
||||
...(q && { q }),
|
||||
...(sort && { sort }),
|
||||
...(collection && { collection })
|
||||
};
|
||||
|
||||
Object.keys(rest)
|
||||
.filter((key) => YMM_KEYS.includes(key))
|
||||
.forEach((key) => {
|
||||
const value = searchParams.get(key);
|
||||
if (value) {
|
||||
initialFilters[key] = value;
|
||||
}
|
||||
});
|
||||
|
||||
return initialFilters;
|
||||
};
|
||||
|
Loading…
x
Reference in New Issue
Block a user