diff --git a/packages/sdk/src/index.ts b/packages/sdk/src/index.ts index 86b3c0315e..b6e459602d 100644 --- a/packages/sdk/src/index.ts +++ b/packages/sdk/src/index.ts @@ -75,16 +75,15 @@ export { sendAnalyticsEvent } from './analytics/sendAnalyticsEvent' export { useAnalyticsEvent } from './analytics/useAnalyticsEvent' // Faceted Search -export { - parse as parseSearchState, - format as formatSearchState, -} from './search/serializer' +export { parse as parseSearchState } from './search/serializer' + +export { default as formatSearchState } from './utils/format' export { initialize as initSearchState } from './search/useSearchState' export { Provider as SearchProvider } from './search/Provider' export { useSearch } from './search/useSearch' export { usePagination } from './search/usePagination' -export type { State as SearchState } from './search/useSearchState' +export type { State as SearchState } from './types' // UI export { Provider as UIProvider, Context as UIContext } from './ui/Provider' diff --git a/packages/sdk/src/search/Provider.tsx b/packages/sdk/src/search/Provider.tsx index 7aa65fa938..dfba064a31 100644 --- a/packages/sdk/src/search/Provider.tsx +++ b/packages/sdk/src/search/Provider.tsx @@ -1,10 +1,11 @@ -import React, { createContext, useMemo } from 'react' import type { FC } from 'react' +import React, { createContext, useMemo } from 'react' +import type { State as SearchState } from '../types' +import type { UseSearchInfiniteState } from './useInfiniteSearchState' import { useSearchInfiniteState } from './useInfiniteSearchState' +import type { UseSearchState } from './useSearchState' import { useSearchState } from './useSearchState' -import type { UseSearchInfiniteState } from './useInfiniteSearchState' -import type { State as SearchState, UseSearchState } from './useSearchState' export interface SearchContext extends UseSearchInfiniteState, UseSearchState { itemsPerPage: number diff --git a/packages/sdk/src/search/serializer.ts b/packages/sdk/src/search/serializer.ts index 0f2e7ecf27..be30e4d41b 100644 --- a/packages/sdk/src/search/serializer.ts +++ b/packages/sdk/src/search/serializer.ts @@ -1,32 +1,7 @@ +import type { SearchSort, State } from '../types' import { initialize, reducer } from './useSearchState' -import type { State as SearchState, SearchSort } from './useSearchState' -export const format = (params: SearchState): URL => { - const url = new URL(params.base, 'http://localhost') - const { page, selectedFacets, sort, term } = params - - if (term !== null) { - url.searchParams.set('q', term) - } - - const facets = new Set() - - for (const facet of selectedFacets) { - url.searchParams.append(facet.key, facet.value) - facets.add(facet.key) - } - - if (selectedFacets.length > 0) { - url.searchParams.set('facets', Array.from(facets).join(',')) - } - - url.searchParams.set('sort', sort) - url.searchParams.set('page', page.toString()) - - return url -} - -export const parse = ({ pathname, searchParams }: URL): SearchState => { +export const parse = ({ pathname, searchParams }: URL): State => { let state = initialize({ base: pathname, term: searchParams.get('q') ?? null, diff --git a/packages/sdk/src/search/usePagination.ts b/packages/sdk/src/search/usePagination.ts index cb797faf31..2f22e6fc2a 100644 --- a/packages/sdk/src/search/usePagination.ts +++ b/packages/sdk/src/search/usePagination.ts @@ -1,8 +1,8 @@ import { useMemo } from 'react' -import { format } from './serializer' +import type { State as SearchState } from '../types' +import format from '../utils/format' import { useSearch } from './useSearch' -import type { State as SearchState } from './useSearchState' const getLink = (state: SearchState) => { const { pathname, search } = format(state) diff --git a/packages/sdk/src/search/useSearchState.ts b/packages/sdk/src/search/useSearchState.ts index f0e1bf7ff3..f3cc86c6f7 100644 --- a/packages/sdk/src/search/useSearchState.ts +++ b/packages/sdk/src/search/useSearchState.ts @@ -1,41 +1,8 @@ import { useMemo } from 'react' -import { format } from './serializer' +import type { Facet, SearchSort, State } from '../types' import { SDKError } from '../utils/error' - -export type SearchSort = - | 'price_desc' - | 'price_asc' - | 'orders_desc' - | 'name_desc' - | 'name_asc' - | 'release_desc' - | 'discount_desc' - | 'score_desc' - -export interface Facet { - key: string - value: string -} - -export interface State { - /** @description search sorting criteria */ - sort: SearchSort - /** - * @description selected facets - * */ - selectedFacets: Facet[] - /** @description full text term */ - term: string | null - /** - * @description the base path url for the search context - * */ - base: string - /** - * @description current pagination cursor - */ - page: number -} +import format from '../utils/format' const sortKeys = new Set([ 'price_desc', diff --git a/packages/sdk/src/types.ts b/packages/sdk/src/types.ts new file mode 100644 index 0000000000..4942d42bb6 --- /dev/null +++ b/packages/sdk/src/types.ts @@ -0,0 +1,33 @@ +export type SearchSort = + | 'price_desc' + | 'price_asc' + | 'orders_desc' + | 'name_desc' + | 'name_asc' + | 'release_desc' + | 'discount_desc' + | 'score_desc' + +export interface Facet { + key: string + value: string +} + +export interface State { + /** @description search sorting criteria */ + sort: SearchSort + /** + * @description selected facets + * */ + selectedFacets: Facet[] + /** @description full text term */ + term: string | null + /** + * @description the base path url for the search context + * */ + base: string + /** + * @description current pagination cursor + */ + page: number +} diff --git a/packages/sdk/src/utils/format.ts b/packages/sdk/src/utils/format.ts new file mode 100644 index 0000000000..86c7c065db --- /dev/null +++ b/packages/sdk/src/utils/format.ts @@ -0,0 +1,28 @@ +import type { State } from '../types' + +const format = (params: State): URL => { + const url = new URL(params.base, 'http://localhost') + const { page, selectedFacets, sort, term } = params + + if (term !== null) { + url.searchParams.set('q', term) + } + + const facets = new Set() + + for (const facet of selectedFacets) { + url.searchParams.append(facet.key, facet.value) + facets.add(facet.key) + } + + if (selectedFacets.length > 0) { + url.searchParams.set('facets', Array.from(facets).join(',')) + } + + url.searchParams.set('sort', sort) + url.searchParams.set('page', page.toString()) + + return url +} + +export default format