diff --git a/src/types.ts b/src/types.ts index 977cd1bf2..dc2011c19 100644 --- a/src/types.ts +++ b/src/types.ts @@ -134,6 +134,9 @@ export type Filters = Partial< export type FiltersWithMultipleValues = Partial< Record >; +export type Search = Partial<{ + query: string; +}>; export type SingleAction = Partial<{ id: string; }>; diff --git a/src/utils/handlers/filterHandlers.ts b/src/utils/handlers/filterHandlers.ts new file mode 100644 index 000000000..3b932fd8b --- /dev/null +++ b/src/utils/handlers/filterHandlers.ts @@ -0,0 +1,65 @@ +import { IFilter, IFilterElement } from "@saleor/components/Filter"; +import { UseNavigatorResult } from "@saleor/hooks/useNavigator"; +import { Sort, Pagination, ActiveTab, Search } from "@saleor/types"; +import { getFilterQueryParams } from "../filters"; + +type RequiredParams = ActiveTab & Search & Sort & Pagination; +type CreateUrl = (params: RequiredParams) => string; +type GetFilterQueryParam< + TFilterKeys extends string, + TFilters extends object +> = (filter: IFilterElement) => TFilters; +type CreateFilterHandlers = [ + (filter: IFilter) => void, + () => void, + (query: string) => void +]; + +function createFilterHandlers< + TFilterKeys extends string, + TFilters extends object +>(opts: { + getFilterQueryParam: GetFilterQueryParam; + navigate: UseNavigatorResult; + createUrl: CreateUrl; + params: RequiredParams; + cleanupFn: () => void; +}): CreateFilterHandlers { + const { getFilterQueryParam, navigate, createUrl, params, cleanupFn } = opts; + + const changeFilters = (filter: IFilter) => { + cleanupFn(); + navigate( + createUrl({ + ...params, + ...getFilterQueryParams(filter, getFilterQueryParam), + activeTab: undefined + }) + ); + }; + + const resetFilters = () => { + cleanupFn(); + navigate( + createUrl({ + asc: params.asc, + sort: params.sort + }) + ); + }; + + const handleSearchChange = (query: string) => { + cleanupFn(); + navigate( + createUrl({ + ...params, + activeTab: undefined, + query + }) + ); + }; + + return [changeFilters, resetFilters, handleSearchChange]; +} + +export default createFilterHandlers;