@uniformdev/search 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/react.mjs ADDED
@@ -0,0 +1,451 @@
1
+ import {
2
+ DEFAULT_PAGE_SIZE,
3
+ FIRST_PAGE,
4
+ UNIFORM_SEARCH_ORDER_BY_KEY,
5
+ UNIFORM_SEARCH_PAGE_KEY,
6
+ UNIFORM_SEARCH_PAGE_SIZE_KEY,
7
+ UNIFORM_SEARCH_QUERY_KEY,
8
+ buildOrderByQuery,
9
+ flattenBlockParams,
10
+ getSearchParamsFromUrl
11
+ } from "./chunk-ZABEFR2D.mjs";
12
+
13
+ // src/react/SearchProvider.tsx
14
+ import {
15
+ createContext,
16
+ useMemo,
17
+ useCallback,
18
+ useState,
19
+ useEffect,
20
+ useRef
21
+ } from "react";
22
+ import { jsx } from "react/jsx-runtime";
23
+ var ALL_COLLECTIONS = ["entries", "compositions", "assets"];
24
+ var SearchContext = createContext(null);
25
+ var SearchProvider = ({
26
+ children,
27
+ performSearch,
28
+ contentType,
29
+ filterBy: filterByRaw,
30
+ orderBy: orderByRaw,
31
+ baseFilters: baseFiltersRaw,
32
+ pageSizes: pageSizesRaw,
33
+ collections: collectionsRaw,
34
+ searchDebounceMs = 300
35
+ }) => {
36
+ var _a;
37
+ const filterBy = useMemo(() => flattenBlockParams(filterByRaw), [filterByRaw]);
38
+ const baseFiltersFlat = useMemo(() => flattenBlockParams(baseFiltersRaw), [baseFiltersRaw]);
39
+ const orderByFlat = useMemo(() => flattenBlockParams(orderByRaw), [orderByRaw]);
40
+ const pageSizesFlat = useMemo(() => flattenBlockParams(pageSizesRaw), [pageSizesRaw]);
41
+ const initCollections = useMemo(() => {
42
+ if (!collectionsRaw) return void 0;
43
+ const items = Array.isArray(collectionsRaw) ? collectionsRaw : collectionsRaw.split(",").map((s) => s.trim());
44
+ const valid = items.filter(
45
+ (c) => ["entries", "compositions", "assets"].includes(c)
46
+ );
47
+ return valid.length > 0 ? valid : void 0;
48
+ }, [collectionsRaw]);
49
+ const baseFilterQuery = useMemo(
50
+ () => baseFiltersFlat.reduce((acc, filter) => {
51
+ if (!(filter == null ? void 0 : filter.fieldKey) || !Array.isArray(filter.values)) return acc;
52
+ return {
53
+ ...acc,
54
+ [`${filter.fieldKey}[eq]`]: filter.values.map((v) => v.value)
55
+ };
56
+ }, {}),
57
+ [baseFiltersFlat]
58
+ );
59
+ const facetBy = useMemo(
60
+ () => filterBy.filter((f) => (f == null ? void 0 : f.enableFaceting) && (f == null ? void 0 : f.fieldKey)).map((f) => f.fieldKey).join(","),
61
+ [filterBy]
62
+ );
63
+ const defaultOrderByQuery = useMemo(
64
+ () => orderByFlat[0] ? buildOrderByQuery(orderByFlat[0]) : "created_at_DESC",
65
+ [orderByFlat]
66
+ );
67
+ const orderByOptions = useMemo(
68
+ () => orderByFlat.map((o) => ({ title: o.title, value: buildOrderByQuery(o) })),
69
+ [orderByFlat]
70
+ );
71
+ const initPerPage = ((_a = pageSizesFlat[0]) == null ? void 0 : _a.size) || DEFAULT_PAGE_SIZE;
72
+ const hasFetchedInitial = useRef(false);
73
+ const searchDebounceRef = useRef(null);
74
+ const [selectedCollections, setSelectedCollections] = useState(
75
+ initCollections || ALL_COLLECTIONS
76
+ );
77
+ const [urlParams, setUrlParams] = useState(() => {
78
+ if (typeof window === "undefined") return {};
79
+ return getSearchParamsFromUrl(window.location.href);
80
+ });
81
+ const [searchBoxValue, setSearchBoxValue] = useState(
82
+ (urlParams == null ? void 0 : urlParams[UNIFORM_SEARCH_QUERY_KEY]) || ""
83
+ );
84
+ const [isLoading, setIsLoading] = useState(true);
85
+ const [entries, setEntries] = useState({
86
+ items: [],
87
+ page: FIRST_PAGE,
88
+ perPage: initPerPage,
89
+ total: 0,
90
+ totalPages: 0
91
+ });
92
+ const [facets, setFacets] = useState({});
93
+ const [collectionResults, setCollectionResults] = useState({});
94
+ const pathname = useMemo(() => {
95
+ if (typeof window === "undefined") return "/";
96
+ return window.location.pathname;
97
+ }, []);
98
+ const page = Number(urlParams == null ? void 0 : urlParams[UNIFORM_SEARCH_PAGE_KEY]) - 1 && Number(urlParams == null ? void 0 : urlParams[UNIFORM_SEARCH_PAGE_KEY]) - 1 > 0 ? Number(urlParams == null ? void 0 : urlParams[UNIFORM_SEARCH_PAGE_KEY]) - 1 : FIRST_PAGE;
99
+ const search = (urlParams == null ? void 0 : urlParams[UNIFORM_SEARCH_QUERY_KEY]) || "";
100
+ const perPage = Number(urlParams == null ? void 0 : urlParams[UNIFORM_SEARCH_PAGE_SIZE_KEY]) || initPerPage;
101
+ const selectedFilters = useMemo(
102
+ () => filterBy.reduce((acc, filter) => {
103
+ const value2 = urlParams == null ? void 0 : urlParams[filter.fieldId];
104
+ if (value2) {
105
+ acc[filter.fieldKey] = Array.isArray(value2) ? value2 : [value2];
106
+ }
107
+ return acc;
108
+ }, {}),
109
+ [filterBy, urlParams]
110
+ );
111
+ useEffect(() => {
112
+ const doFetch = async () => {
113
+ var _a2;
114
+ const filterQuery = Object.entries(selectedFilters).reduce((acc, [fieldKey, values]) => {
115
+ var _a3;
116
+ if (!values || values.length === 0) return acc;
117
+ const filterType = (_a3 = filterBy.find((f) => f.fieldKey === fieldKey)) == null ? void 0 : _a3.type;
118
+ if (filterType === "range") {
119
+ const [min, max] = values;
120
+ return { ...acc, [`${fieldKey}[gte]`]: min, [`${fieldKey}[lte]`]: max };
121
+ }
122
+ return { ...acc, [`${fieldKey}[in]`]: values };
123
+ }, {});
124
+ const currentOrderByQuery = (urlParams == null ? void 0 : urlParams[UNIFORM_SEARCH_ORDER_BY_KEY]) || defaultOrderByQuery;
125
+ const filters = {
126
+ ...baseFilterQuery,
127
+ ...filterQuery
128
+ };
129
+ if (contentType) {
130
+ filters["contentType[eq]"] = contentType;
131
+ }
132
+ const { results } = await performSearch({
133
+ page,
134
+ perPage,
135
+ filters,
136
+ facetBy,
137
+ search,
138
+ orderBy: currentOrderByQuery,
139
+ collections: selectedCollections
140
+ });
141
+ setCollectionResults(results || {});
142
+ const allItems = [];
143
+ let totalCount = 0;
144
+ let mergedFacets = {};
145
+ for (const col of selectedCollections) {
146
+ const colResult = results == null ? void 0 : results[col];
147
+ if ((_a2 = colResult == null ? void 0 : colResult.data) == null ? void 0 : _a2.items) {
148
+ allItems.push(...colResult.data.items);
149
+ totalCount += colResult.data.total || 0;
150
+ }
151
+ if (colResult == null ? void 0 : colResult.facets) {
152
+ mergedFacets = { ...mergedFacets, ...colResult.facets };
153
+ }
154
+ }
155
+ setEntries({
156
+ items: allItems,
157
+ total: totalCount,
158
+ page,
159
+ perPage,
160
+ totalPages: Math.ceil(totalCount / perPage)
161
+ });
162
+ setFacets(mergedFacets);
163
+ };
164
+ setIsLoading(true);
165
+ doFetch().catch((error) => console.error("[alex] Search fetch error:", error)).finally(() => {
166
+ setIsLoading(false);
167
+ hasFetchedInitial.current = true;
168
+ });
169
+ }, [
170
+ baseFilterQuery,
171
+ contentType,
172
+ defaultOrderByQuery,
173
+ facetBy,
174
+ filterBy,
175
+ urlParams,
176
+ page,
177
+ perPage,
178
+ performSearch,
179
+ search,
180
+ selectedCollections,
181
+ selectedFilters
182
+ ]);
183
+ const updateUrl = useCallback(
184
+ (params, { replace = false } = {}) => {
185
+ const qs = params.toString();
186
+ const url = qs ? `${pathname}?${qs}` : pathname;
187
+ if (replace) {
188
+ window.history.replaceState({}, "", url);
189
+ } else {
190
+ window.history.pushState({}, "", url);
191
+ }
192
+ setUrlParams(getSearchParamsFromUrl(window.location.href));
193
+ },
194
+ [pathname]
195
+ );
196
+ const commitSearchToUrl = useCallback(
197
+ (value2) => {
198
+ const params = new URLSearchParams(window.location.search);
199
+ params.delete(UNIFORM_SEARCH_PAGE_KEY);
200
+ if (!value2) {
201
+ params.delete(UNIFORM_SEARCH_QUERY_KEY);
202
+ } else {
203
+ params.set(UNIFORM_SEARCH_QUERY_KEY, value2);
204
+ }
205
+ updateUrl(params, { replace: true });
206
+ },
207
+ [updateUrl]
208
+ );
209
+ const setSearchQuery = useCallback(
210
+ (value2) => {
211
+ setSearchBoxValue(value2);
212
+ if (searchDebounceRef.current) {
213
+ clearTimeout(searchDebounceRef.current);
214
+ }
215
+ if (!value2) {
216
+ commitSearchToUrl(value2);
217
+ } else {
218
+ searchDebounceRef.current = setTimeout(() => {
219
+ commitSearchToUrl(value2);
220
+ }, searchDebounceMs);
221
+ }
222
+ },
223
+ [commitSearchToUrl, searchDebounceMs]
224
+ );
225
+ useEffect(() => {
226
+ return () => {
227
+ if (searchDebounceRef.current) {
228
+ clearTimeout(searchDebounceRef.current);
229
+ }
230
+ };
231
+ }, []);
232
+ const setPage = useCallback(
233
+ (p) => {
234
+ const params = new URLSearchParams(window.location.search);
235
+ if (p === 0) {
236
+ params.delete(UNIFORM_SEARCH_PAGE_KEY);
237
+ } else {
238
+ params.set(UNIFORM_SEARCH_PAGE_KEY, (p + 1).toString());
239
+ }
240
+ updateUrl(params);
241
+ },
242
+ [updateUrl]
243
+ );
244
+ const setPageSize = useCallback(
245
+ (size) => {
246
+ const params = new URLSearchParams(window.location.search);
247
+ params.delete(UNIFORM_SEARCH_PAGE_KEY);
248
+ params.set(UNIFORM_SEARCH_PAGE_SIZE_KEY, size.toString());
249
+ updateUrl(params);
250
+ },
251
+ [updateUrl]
252
+ );
253
+ const setOrderBy = useCallback(
254
+ (orderByQuery) => {
255
+ const params = new URLSearchParams(window.location.search);
256
+ params.delete(UNIFORM_SEARCH_PAGE_KEY);
257
+ params.set(UNIFORM_SEARCH_ORDER_BY_KEY, orderByQuery);
258
+ updateUrl(params);
259
+ },
260
+ [updateUrl]
261
+ );
262
+ const setSelectedFilters = useCallback(
263
+ (nextSelected) => {
264
+ const params = new URLSearchParams();
265
+ params.delete(UNIFORM_SEARCH_PAGE_KEY);
266
+ if (search) {
267
+ params.set(UNIFORM_SEARCH_QUERY_KEY, search);
268
+ }
269
+ Object.entries(nextSelected).forEach(([key, value2]) => {
270
+ const filter = filterBy.find((f) => f.fieldKey === key);
271
+ if (!filter) return;
272
+ value2.forEach((v) => {
273
+ params.append(filter.fieldId, v);
274
+ });
275
+ });
276
+ updateUrl(params);
277
+ },
278
+ [filterBy, search, updateUrl]
279
+ );
280
+ const clearFilters = useCallback(() => {
281
+ setIsLoading(true);
282
+ setSearchBoxValue("");
283
+ if (searchDebounceRef.current) {
284
+ clearTimeout(searchDebounceRef.current);
285
+ }
286
+ window.history.pushState({}, "", pathname);
287
+ setUrlParams(getSearchParamsFromUrl(window.location.href));
288
+ }, [pathname]);
289
+ const formatResultsSummary = useCallback(
290
+ (template) => {
291
+ if (!template) return "";
292
+ const vars = {
293
+ page: entries.page,
294
+ perPage: entries.perPage,
295
+ totalItems: entries.total,
296
+ totalPages: entries.totalPages
297
+ };
298
+ return template.replace(/{(\w+)}/g, (match, key) => {
299
+ const val = vars[key];
300
+ return val != null ? String(val) : match;
301
+ });
302
+ },
303
+ [entries]
304
+ );
305
+ const value = useMemo(
306
+ () => ({
307
+ results: entries,
308
+ facets,
309
+ isLoading,
310
+ collectionResults,
311
+ searchBoxValue,
312
+ setSearchQuery,
313
+ page,
314
+ setPage,
315
+ pageSize: perPage,
316
+ setPageSize,
317
+ pageSizes: pageSizesFlat,
318
+ orderByOptions,
319
+ selectedOrderBy: (urlParams == null ? void 0 : urlParams[UNIFORM_SEARCH_ORDER_BY_KEY]) || defaultOrderByQuery,
320
+ setOrderBy,
321
+ filterOptions: filterBy,
322
+ selectedFilters,
323
+ setSelectedFilters,
324
+ clearFilters,
325
+ selectedCollections,
326
+ setSelectedCollections,
327
+ formatResultsSummary
328
+ }),
329
+ [
330
+ clearFilters,
331
+ collectionResults,
332
+ defaultOrderByQuery,
333
+ entries,
334
+ facets,
335
+ filterBy,
336
+ formatResultsSummary,
337
+ isLoading,
338
+ orderByOptions,
339
+ page,
340
+ pageSizesFlat,
341
+ perPage,
342
+ searchBoxValue,
343
+ selectedCollections,
344
+ selectedFilters,
345
+ setOrderBy,
346
+ setPage,
347
+ setPageSize,
348
+ setSearchQuery,
349
+ setSelectedFilters,
350
+ urlParams
351
+ ]
352
+ );
353
+ return /* @__PURE__ */ jsx(SearchContext.Provider, { value, children });
354
+ };
355
+
356
+ // src/react/useSearch.ts
357
+ import { useContext } from "react";
358
+ function useSearch() {
359
+ const context = useContext(SearchContext);
360
+ if (!context) {
361
+ throw new Error("useSearch must be used within a <SearchProvider>");
362
+ }
363
+ return context;
364
+ }
365
+
366
+ // src/react/usePagination.ts
367
+ import { useMemo as useMemo2 } from "react";
368
+ var DOTS = "...";
369
+ var range = (start, end) => {
370
+ const length = end - start + 1;
371
+ return Array.from({ length }, (_, idx) => idx + start);
372
+ };
373
+ var usePagination = ({ totalCount, perPage, siblingCount = 1, currentPage }) => useMemo2(() => {
374
+ const totalPageCount = Math.ceil(totalCount / perPage);
375
+ const totalPageNumbers = siblingCount + 5;
376
+ if (totalPageNumbers >= totalPageCount) {
377
+ return range(1, totalPageCount);
378
+ }
379
+ const leftSiblingIndex = Math.max(currentPage - siblingCount, 1);
380
+ const rightSiblingIndex = Math.min(currentPage + siblingCount, totalPageCount);
381
+ const shouldShowLeftDots = leftSiblingIndex > 2;
382
+ const shouldShowRightDots = rightSiblingIndex < totalPageCount - 2;
383
+ const firstPageIndex = 1;
384
+ const lastPageIndex = totalPageCount;
385
+ if (!shouldShowLeftDots && shouldShowRightDots) {
386
+ const leftItemCount = 2 + 2 * siblingCount;
387
+ const leftRange = range(1, leftItemCount);
388
+ return [...leftRange, DOTS, totalPageCount];
389
+ }
390
+ if (shouldShowLeftDots && !shouldShowRightDots) {
391
+ const rightItemCount = 2 + 2 * siblingCount;
392
+ const rightRange = range(totalPageCount - rightItemCount + 1, totalPageCount);
393
+ return [firstPageIndex, DOTS, ...rightRange];
394
+ }
395
+ if (shouldShowLeftDots && shouldShowRightDots) {
396
+ const middleRange = range(leftSiblingIndex, rightSiblingIndex);
397
+ return [firstPageIndex, DOTS, ...middleRange, DOTS, lastPageIndex];
398
+ }
399
+ }, [totalCount, perPage, siblingCount, currentPage]);
400
+
401
+ // src/react/useSearchPagination.ts
402
+ import { useMemo as useMemo3, useCallback as useCallback2 } from "react";
403
+ function useSearchPagination(siblingCount) {
404
+ const { page, pageSize, results, setPage, isLoading } = useSearch();
405
+ const pages = usePagination({
406
+ currentPage: page,
407
+ totalCount: results.total,
408
+ perPage: pageSize,
409
+ siblingCount
410
+ }) || [];
411
+ const lastPage = useMemo3(
412
+ () => Number(pages[pages.length - 1]) || 0,
413
+ [pages]
414
+ );
415
+ const goToPage = useCallback2(
416
+ (p) => {
417
+ if (!isLoading) setPage(p);
418
+ },
419
+ [isLoading, setPage]
420
+ );
421
+ const goToPrev = useCallback2(
422
+ () => {
423
+ if (page > 0 && !isLoading) setPage(page - 1);
424
+ },
425
+ [page, isLoading, setPage]
426
+ );
427
+ const goToNext = useCallback2(
428
+ () => {
429
+ if (page < lastPage && !isLoading) setPage(page + 1);
430
+ },
431
+ [page, lastPage, isLoading, setPage]
432
+ );
433
+ return {
434
+ pages,
435
+ currentPage: page,
436
+ hasPrev: page > 0,
437
+ hasNext: page < lastPage,
438
+ goToPage,
439
+ goToPrev,
440
+ goToNext,
441
+ isLoading
442
+ };
443
+ }
444
+ export {
445
+ DOTS,
446
+ SearchProvider,
447
+ usePagination,
448
+ useSearch,
449
+ useSearchPagination
450
+ };
451
+ //# sourceMappingURL=react.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/react/SearchProvider.tsx","../src/react/useSearch.ts","../src/react/usePagination.ts","../src/react/useSearchPagination.ts"],"sourcesContent":["import {\n createContext,\n FC,\n useMemo,\n useCallback,\n useState,\n useEffect,\n useRef,\n type ReactNode,\n} from 'react';\n\nimport {\n DEFAULT_PAGE_SIZE,\n UNIFORM_SEARCH_ORDER_BY_KEY,\n UNIFORM_SEARCH_PAGE_KEY,\n UNIFORM_SEARCH_PAGE_SIZE_KEY,\n UNIFORM_SEARCH_QUERY_KEY,\n FIRST_PAGE,\n} from '../constants';\nimport { getSearchParamsFromUrl, buildOrderByQuery } from '../utils';\nimport { flattenBlockParams } from '../flattenBlockParams';\nimport type {\n SearchCollection,\n SearchHit,\n FilterBy,\n Pagination,\n Facets,\n OrderBy,\n PageSize,\n FilterQuery,\n MultiSearchResult,\n} from '../types';\nimport type { SearchParams } from '../client';\n\nconst ALL_COLLECTIONS: SearchCollection[] = ['entries', 'compositions', 'assets'];\n\nexport interface SearchProviderProps {\n children: ReactNode;\n performSearch: (params: SearchParams) => Promise<{ results: MultiSearchResult }>;\n contentType?: string;\n filterBy?: unknown;\n orderBy?: unknown;\n baseFilters?: unknown;\n pageSizes?: unknown;\n collections?: string | string[];\n searchDebounceMs?: number;\n}\n\nexport interface UseSearchReturn {\n results: Pagination<SearchHit>;\n facets: Facets | null;\n isLoading: boolean;\n collectionResults: MultiSearchResult;\n\n searchBoxValue: string;\n setSearchQuery: (value: string) => void;\n\n page: number;\n setPage: (page: number) => void;\n pageSize: number;\n setPageSize: (size: number) => void;\n pageSizes: PageSize[];\n\n orderByOptions: Array<{ title: string; value: string }>;\n selectedOrderBy: string;\n setOrderBy: (query: string) => void;\n\n filterOptions: FilterBy[];\n selectedFilters: Record<string, string[]>;\n setSelectedFilters: (filters: Record<string, string[]>) => void;\n clearFilters: () => void;\n\n selectedCollections: SearchCollection[];\n setSelectedCollections: (collections: SearchCollection[]) => void;\n\n formatResultsSummary: (template: string) => string;\n}\n\nexport const SearchContext = createContext<UseSearchReturn | null>(null);\n\nexport const SearchProvider: FC<SearchProviderProps> = ({\n children,\n performSearch,\n contentType,\n filterBy: filterByRaw,\n orderBy: orderByRaw,\n baseFilters: baseFiltersRaw,\n pageSizes: pageSizesRaw,\n collections: collectionsRaw,\n searchDebounceMs = 300,\n}) => {\n const filterBy = useMemo(() => flattenBlockParams<FilterBy>(filterByRaw), [filterByRaw]);\n const baseFiltersFlat = useMemo(() => flattenBlockParams<FilterBy>(baseFiltersRaw), [baseFiltersRaw]);\n const orderByFlat = useMemo(() => flattenBlockParams<OrderBy>(orderByRaw), [orderByRaw]);\n const pageSizesFlat = useMemo(() => flattenBlockParams<PageSize>(pageSizesRaw), [pageSizesRaw]);\n\n const initCollections = useMemo<SearchCollection[] | undefined>(() => {\n if (!collectionsRaw) return undefined;\n const items = Array.isArray(collectionsRaw)\n ? collectionsRaw\n : collectionsRaw.split(',').map(s => s.trim());\n const valid: SearchCollection[] = items.filter(\n (c): c is SearchCollection => ['entries', 'compositions', 'assets'].includes(c)\n );\n return valid.length > 0 ? valid : undefined;\n }, [collectionsRaw]);\n\n const baseFilterQuery = useMemo(\n () =>\n baseFiltersFlat.reduce<FilterQuery>((acc, filter) => {\n if (!filter?.fieldKey || !Array.isArray(filter.values)) return acc;\n return {\n ...acc,\n [`${filter.fieldKey}[eq]`]: filter.values.map(v => v.value),\n };\n }, {}),\n [baseFiltersFlat]\n );\n\n const facetBy = useMemo(\n () =>\n filterBy\n .filter(f => f?.enableFaceting && f?.fieldKey)\n .map(f => f.fieldKey)\n .join(','),\n [filterBy]\n );\n\n const defaultOrderByQuery = useMemo(\n () => (orderByFlat[0] ? buildOrderByQuery(orderByFlat[0]) : 'created_at_DESC'),\n [orderByFlat]\n );\n\n const orderByOptions = useMemo(\n () => orderByFlat.map(o => ({ title: o.title, value: buildOrderByQuery(o) })),\n [orderByFlat]\n );\n\n const initPerPage = pageSizesFlat[0]?.size || DEFAULT_PAGE_SIZE;\n\n const hasFetchedInitial = useRef(false);\n const searchDebounceRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n const [selectedCollections, setSelectedCollections] = useState<SearchCollection[]>(\n initCollections || ALL_COLLECTIONS\n );\n\n const [urlParams, setUrlParams] = useState<Record<string, string | string[]>>(() => {\n if (typeof window === 'undefined') return {};\n return getSearchParamsFromUrl(window.location.href);\n });\n\n const [searchBoxValue, setSearchBoxValue] = useState(\n (urlParams?.[UNIFORM_SEARCH_QUERY_KEY] as string) || ''\n );\n const [isLoading, setIsLoading] = useState(true);\n const [entries, setEntries] = useState<Pagination<SearchHit>>({\n items: [],\n page: FIRST_PAGE,\n perPage: initPerPage,\n total: 0,\n totalPages: 0,\n });\n const [facets, setFacets] = useState<Facets>({});\n const [collectionResults, setCollectionResults] = useState<MultiSearchResult>({});\n\n const pathname = useMemo(() => {\n if (typeof window === 'undefined') return '/';\n return window.location.pathname;\n }, []);\n\n const page =\n Number(urlParams?.[UNIFORM_SEARCH_PAGE_KEY]) - 1 && Number(urlParams?.[UNIFORM_SEARCH_PAGE_KEY]) - 1 > 0\n ? Number(urlParams?.[UNIFORM_SEARCH_PAGE_KEY]) - 1\n : FIRST_PAGE;\n const search = (urlParams?.[UNIFORM_SEARCH_QUERY_KEY] as string) || '';\n const perPage = Number(urlParams?.[UNIFORM_SEARCH_PAGE_SIZE_KEY]) || initPerPage;\n\n const selectedFilters = useMemo(\n () =>\n filterBy.reduce<Record<string, string[]>>((acc, filter) => {\n const value = urlParams?.[filter.fieldId];\n if (value) {\n acc[filter.fieldKey] = Array.isArray(value) ? value : [value];\n }\n return acc;\n }, {}),\n [filterBy, urlParams]\n );\n\n useEffect(() => {\n const doFetch = async () => {\n const filterQuery = Object.entries(selectedFilters).reduce<Record<string, unknown>>((acc, [fieldKey, values]) => {\n if (!values || values.length === 0) return acc;\n const filterType = filterBy.find(f => f.fieldKey === fieldKey)?.type;\n\n if (filterType === 'range') {\n const [min, max] = values;\n return { ...acc, [`${fieldKey}[gte]`]: min, [`${fieldKey}[lte]`]: max };\n }\n\n return { ...acc, [`${fieldKey}[in]`]: values };\n }, {});\n\n const currentOrderByQuery = (urlParams?.[UNIFORM_SEARCH_ORDER_BY_KEY] as string) || defaultOrderByQuery;\n\n const filters: Record<string, unknown> = {\n ...baseFilterQuery,\n ...filterQuery,\n };\n\n if (contentType) {\n filters['contentType[eq]'] = contentType;\n }\n\n const { results } = await performSearch({\n page,\n perPage,\n filters,\n facetBy,\n search,\n orderBy: currentOrderByQuery,\n collections: selectedCollections,\n });\n\n setCollectionResults(results || {});\n\n const allItems: SearchHit[] = [];\n let totalCount = 0;\n let mergedFacets: Facets = {};\n\n for (const col of selectedCollections) {\n const colResult = results?.[col];\n if (colResult?.data?.items) {\n allItems.push(...colResult.data.items);\n totalCount += colResult.data.total || 0;\n }\n if (colResult?.facets) {\n mergedFacets = { ...mergedFacets, ...colResult.facets };\n }\n }\n\n setEntries({\n items: allItems,\n total: totalCount,\n page,\n perPage,\n totalPages: Math.ceil(totalCount / perPage),\n });\n setFacets(mergedFacets);\n };\n\n setIsLoading(true);\n doFetch()\n .catch(error => console.error('[alex] Search fetch error:', error))\n .finally(() => {\n setIsLoading(false);\n hasFetchedInitial.current = true;\n });\n }, [\n baseFilterQuery,\n contentType,\n defaultOrderByQuery,\n facetBy,\n filterBy,\n urlParams,\n page,\n perPage,\n performSearch,\n search,\n selectedCollections,\n selectedFilters,\n ]);\n\n const updateUrl = useCallback(\n (params: URLSearchParams, { replace = false }: { replace?: boolean } = {}) => {\n const qs = params.toString();\n const url = qs ? `${pathname}?${qs}` : pathname;\n if (replace) {\n window.history.replaceState({}, '', url);\n } else {\n window.history.pushState({}, '', url);\n }\n setUrlParams(getSearchParamsFromUrl(window.location.href));\n },\n [pathname]\n );\n\n const commitSearchToUrl = useCallback(\n (value: string) => {\n const params = new URLSearchParams(window.location.search);\n params.delete(UNIFORM_SEARCH_PAGE_KEY);\n if (!value) {\n params.delete(UNIFORM_SEARCH_QUERY_KEY);\n } else {\n params.set(UNIFORM_SEARCH_QUERY_KEY, value);\n }\n updateUrl(params, { replace: true });\n },\n [updateUrl]\n );\n\n const setSearchQuery = useCallback(\n (value: string) => {\n setSearchBoxValue(value);\n if (searchDebounceRef.current) {\n clearTimeout(searchDebounceRef.current);\n }\n if (!value) {\n commitSearchToUrl(value);\n } else {\n searchDebounceRef.current = setTimeout(() => {\n commitSearchToUrl(value);\n }, searchDebounceMs);\n }\n },\n [commitSearchToUrl, searchDebounceMs]\n );\n\n useEffect(() => {\n return () => {\n if (searchDebounceRef.current) {\n clearTimeout(searchDebounceRef.current);\n }\n };\n }, []);\n\n const setPage = useCallback(\n (p: number) => {\n const params = new URLSearchParams(window.location.search);\n if (p === 0) {\n params.delete(UNIFORM_SEARCH_PAGE_KEY);\n } else {\n params.set(UNIFORM_SEARCH_PAGE_KEY, (p + 1).toString());\n }\n updateUrl(params);\n },\n [updateUrl]\n );\n\n const setPageSize = useCallback(\n (size: number) => {\n const params = new URLSearchParams(window.location.search);\n params.delete(UNIFORM_SEARCH_PAGE_KEY);\n params.set(UNIFORM_SEARCH_PAGE_SIZE_KEY, size.toString());\n updateUrl(params);\n },\n [updateUrl]\n );\n\n const setOrderBy = useCallback(\n (orderByQuery: string) => {\n const params = new URLSearchParams(window.location.search);\n params.delete(UNIFORM_SEARCH_PAGE_KEY);\n params.set(UNIFORM_SEARCH_ORDER_BY_KEY, orderByQuery);\n updateUrl(params);\n },\n [updateUrl]\n );\n\n const setSelectedFilters = useCallback(\n (nextSelected: Record<string, string[]>) => {\n const params = new URLSearchParams();\n params.delete(UNIFORM_SEARCH_PAGE_KEY);\n if (search) {\n params.set(UNIFORM_SEARCH_QUERY_KEY, search);\n }\n Object.entries(nextSelected).forEach(([key, value]) => {\n const filter = filterBy.find(f => f.fieldKey === key);\n if (!filter) return;\n value.forEach(v => {\n params.append(filter.fieldId, v);\n });\n });\n updateUrl(params);\n },\n [filterBy, search, updateUrl]\n );\n\n const clearFilters = useCallback(() => {\n setIsLoading(true);\n setSearchBoxValue('');\n if (searchDebounceRef.current) {\n clearTimeout(searchDebounceRef.current);\n }\n window.history.pushState({}, '', pathname);\n setUrlParams(getSearchParamsFromUrl(window.location.href));\n }, [pathname]);\n\n const formatResultsSummary = useCallback(\n (template: string) => {\n if (!template) return '';\n const vars: Record<string, number | undefined> = {\n page: entries.page,\n perPage: entries.perPage,\n totalItems: entries.total,\n totalPages: entries.totalPages,\n };\n return template.replace(/{(\\w+)}/g, (match, key) => {\n const val = vars[key];\n return val != null ? String(val) : match;\n });\n },\n [entries]\n );\n\n const value: UseSearchReturn = useMemo(\n () => ({\n results: entries,\n facets,\n isLoading,\n collectionResults,\n\n searchBoxValue,\n setSearchQuery,\n\n page,\n setPage,\n pageSize: perPage,\n setPageSize,\n pageSizes: pageSizesFlat,\n\n orderByOptions,\n selectedOrderBy: (urlParams?.[UNIFORM_SEARCH_ORDER_BY_KEY] as string) || defaultOrderByQuery,\n setOrderBy,\n\n filterOptions: filterBy,\n selectedFilters,\n setSelectedFilters,\n clearFilters,\n\n selectedCollections,\n setSelectedCollections,\n\n formatResultsSummary,\n }),\n [\n clearFilters,\n collectionResults,\n defaultOrderByQuery,\n entries,\n facets,\n filterBy,\n formatResultsSummary,\n isLoading,\n orderByOptions,\n page,\n pageSizesFlat,\n perPage,\n searchBoxValue,\n selectedCollections,\n selectedFilters,\n setOrderBy,\n setPage,\n setPageSize,\n setSearchQuery,\n setSelectedFilters,\n urlParams,\n ]\n );\n\n return <SearchContext.Provider value={value}>{children}</SearchContext.Provider>;\n};\n","import { useContext } from 'react';\nimport { SearchContext } from './SearchProvider';\nimport type { UseSearchReturn } from './SearchProvider';\n\nexport function useSearch(): UseSearchReturn {\n const context = useContext(SearchContext);\n if (!context) {\n throw new Error('useSearch must be used within a <SearchProvider>');\n }\n return context;\n}\n","import { useMemo } from 'react';\n\nexport const DOTS = '...';\n\ninterface UsePaginationParams {\n currentPage: number;\n totalCount: number;\n perPage: number;\n siblingCount?: number;\n}\n\nconst range = (start: number, end: number) => {\n const length = end - start + 1;\n return Array.from({ length }, (_, idx) => idx + start);\n};\n\nexport const usePagination = ({ totalCount, perPage, siblingCount = 1, currentPage }: UsePaginationParams) =>\n useMemo(() => {\n const totalPageCount = Math.ceil(totalCount / perPage);\n const totalPageNumbers = siblingCount + 5;\n\n if (totalPageNumbers >= totalPageCount) {\n return range(1, totalPageCount);\n }\n\n const leftSiblingIndex = Math.max(currentPage - siblingCount, 1);\n const rightSiblingIndex = Math.min(currentPage + siblingCount, totalPageCount);\n\n const shouldShowLeftDots = leftSiblingIndex > 2;\n const shouldShowRightDots = rightSiblingIndex < totalPageCount - 2;\n\n const firstPageIndex = 1;\n const lastPageIndex = totalPageCount;\n\n if (!shouldShowLeftDots && shouldShowRightDots) {\n const leftItemCount = 2 + 2 * siblingCount;\n const leftRange = range(1, leftItemCount);\n return [...leftRange, DOTS, totalPageCount];\n }\n\n if (shouldShowLeftDots && !shouldShowRightDots) {\n const rightItemCount = 2 + 2 * siblingCount;\n const rightRange = range(totalPageCount - rightItemCount + 1, totalPageCount);\n return [firstPageIndex, DOTS, ...rightRange];\n }\n\n if (shouldShowLeftDots && shouldShowRightDots) {\n const middleRange = range(leftSiblingIndex, rightSiblingIndex);\n return [firstPageIndex, DOTS, ...middleRange, DOTS, lastPageIndex];\n }\n }, [totalCount, perPage, siblingCount, currentPage]);\n","import { useMemo, useCallback } from 'react';\nimport { useSearch } from './useSearch';\nimport { usePagination, DOTS } from './usePagination';\n\nexport interface UseSearchPaginationReturn {\n pages: (number | string)[];\n currentPage: number;\n hasPrev: boolean;\n hasNext: boolean;\n goToPage: (page: number) => void;\n goToPrev: () => void;\n goToNext: () => void;\n isLoading: boolean;\n}\n\nexport function useSearchPagination(siblingCount?: number): UseSearchPaginationReturn {\n const { page, pageSize, results, setPage, isLoading } = useSearch();\n\n const pages = usePagination({\n currentPage: page,\n totalCount: results.total,\n perPage: pageSize,\n siblingCount,\n }) || [];\n\n const lastPage = useMemo(\n () => Number(pages[pages.length - 1]) || 0,\n [pages]\n );\n\n const goToPage = useCallback(\n (p: number) => { if (!isLoading) setPage(p); },\n [isLoading, setPage]\n );\n\n const goToPrev = useCallback(\n () => { if (page > 0 && !isLoading) setPage(page - 1); },\n [page, isLoading, setPage]\n );\n\n const goToNext = useCallback(\n () => { if (page < lastPage && !isLoading) setPage(page + 1); },\n [page, lastPage, isLoading, setPage]\n );\n\n return {\n pages,\n currentPage: page,\n hasPrev: page > 0,\n hasNext: page < lastPage,\n goToPage,\n goToPrev,\n goToNext,\n isLoading,\n };\n}\n\nexport { DOTS };\n"],"mappings":"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","names":["value","_a","useMemo","useMemo","useCallback","useMemo","useCallback"]}
package/package.json ADDED
@@ -0,0 +1,45 @@
1
+ {
2
+ "name": "@uniformdev/search",
3
+ "version": "0.0.1",
4
+ "description": "Uniform Search client with optional React bindings",
5
+ "main": "dist/index.js",
6
+ "module": "dist/index.mjs",
7
+ "types": "dist/index.d.ts",
8
+ "exports": {
9
+ ".": {
10
+ "types": "./dist/index.d.ts",
11
+ "import": "./dist/index.mjs",
12
+ "require": "./dist/index.js"
13
+ },
14
+ "./react": {
15
+ "types": "./dist/react.d.ts",
16
+ "import": "./dist/react.mjs",
17
+ "require": "./dist/react.js"
18
+ }
19
+ },
20
+ "files": [
21
+ "dist"
22
+ ],
23
+ "publishConfig": {
24
+ "access": "public"
25
+ },
26
+ "scripts": {
27
+ "build": "tsup",
28
+ "dev": "tsup --watch",
29
+ "prepublishOnly": "tsup"
30
+ },
31
+ "peerDependencies": {
32
+ "react": ">=18"
33
+ },
34
+ "peerDependenciesMeta": {
35
+ "react": {
36
+ "optional": true
37
+ }
38
+ },
39
+ "devDependencies": {
40
+ "@types/react": "^19.2.3",
41
+ "react": "^19.2.3",
42
+ "tsup": "^8.0.0",
43
+ "typescript": "^5"
44
+ }
45
+ }