@uniformdev/search 0.0.1 → 0.0.2
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/LICENSE +1 -1
- package/README.md +129 -0
- package/dist/{chunk-ZABEFR2D.mjs → chunk-RMUYFKZO.mjs} +11 -4
- package/dist/chunk-RMUYFKZO.mjs.map +1 -0
- package/dist/{client-DrL-8TfY.d.mts → client-CtTcEJUy.d.mts} +14 -12
- package/dist/{client-DrL-8TfY.d.ts → client-CtTcEJUy.d.ts} +14 -12
- package/dist/index.d.mts +2 -2
- package/dist/index.d.ts +2 -2
- package/dist/index.js +18 -6
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +9 -4
- package/dist/index.mjs.map +1 -1
- package/dist/react.d.mts +40 -13
- package/dist/react.d.ts +40 -13
- package/dist/react.js +162 -116
- package/dist/react.js.map +1 -1
- package/dist/react.mjs +148 -121
- package/dist/react.mjs.map +1 -1
- package/package.json +23 -2
- package/dist/chunk-ZABEFR2D.mjs.map +0 -1
package/dist/react.js
CHANGED
|
@@ -21,10 +21,15 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
|
|
|
21
21
|
var react_exports = {};
|
|
22
22
|
__export(react_exports, {
|
|
23
23
|
DOTS: () => DOTS,
|
|
24
|
+
SearchContext: () => SearchContext,
|
|
25
|
+
SearchItemDefaultUrlResolverProvider: () => SearchItemDefaultUrlResolverProvider,
|
|
26
|
+
SearchItemUrlResolverProvider: () => SearchItemUrlResolverProvider,
|
|
24
27
|
SearchProvider: () => SearchProvider,
|
|
28
|
+
createDefaultUrlResolver: () => createDefaultUrlResolver,
|
|
25
29
|
usePagination: () => usePagination,
|
|
26
30
|
useSearch: () => useSearch,
|
|
27
|
-
useSearchPagination: () => useSearchPagination
|
|
31
|
+
useSearchPagination: () => useSearchPagination,
|
|
32
|
+
useUrlResolver: () => useUrlResolver
|
|
28
33
|
});
|
|
29
34
|
module.exports = __toCommonJS(react_exports);
|
|
30
35
|
|
|
@@ -41,7 +46,14 @@ var DEFAULT_PAGE_SIZE = 10;
|
|
|
41
46
|
|
|
42
47
|
// src/utils.ts
|
|
43
48
|
var buildOrderByQuery = (orderBy) => {
|
|
44
|
-
|
|
49
|
+
var _a;
|
|
50
|
+
const field = orderBy.field;
|
|
51
|
+
if (field && typeof field === "object" && "field" in field) {
|
|
52
|
+
const sv = field;
|
|
53
|
+
return `${sv.field}_${sv.direction.toUpperCase()}`;
|
|
54
|
+
}
|
|
55
|
+
if (!field || field === "relevance") return "";
|
|
56
|
+
return `${field}_${(_a = orderBy.direction) != null ? _a : "ASC"}`;
|
|
45
57
|
};
|
|
46
58
|
var getSearchParamsFromUrl = (urlString) => {
|
|
47
59
|
if (!urlString) {
|
|
@@ -61,13 +73,13 @@ var getSearchParamsFromUrl = (urlString) => {
|
|
|
61
73
|
|
|
62
74
|
// src/flattenBlockParams.ts
|
|
63
75
|
function resolveFieldValue(field, locale = "en-us") {
|
|
64
|
-
var _a
|
|
76
|
+
var _a;
|
|
65
77
|
if (!field || typeof field !== "object") return field;
|
|
66
78
|
if (field.type === "$block" && Array.isArray(field.value)) {
|
|
67
79
|
return flattenBlockParams(field.value, locale);
|
|
68
80
|
}
|
|
69
81
|
if (field.locales && typeof field.locales === "object") {
|
|
70
|
-
return (
|
|
82
|
+
return (_a = field.locales[locale]) != null ? _a : field.value;
|
|
71
83
|
}
|
|
72
84
|
return field.value;
|
|
73
85
|
}
|
|
@@ -87,44 +99,31 @@ function flattenBlockParams(items, locale = "en-us") {
|
|
|
87
99
|
|
|
88
100
|
// src/react/SearchProvider.tsx
|
|
89
101
|
var import_jsx_runtime = require("react/jsx-runtime");
|
|
90
|
-
var ALL_COLLECTIONS = ["entries", "compositions", "assets"];
|
|
91
102
|
var SearchContext = (0, import_react.createContext)(null);
|
|
92
103
|
var SearchProvider = ({
|
|
93
104
|
children,
|
|
94
105
|
performSearch,
|
|
95
|
-
contentType,
|
|
96
|
-
filterBy: filterByRaw,
|
|
97
106
|
orderBy: orderByRaw,
|
|
98
|
-
|
|
107
|
+
baseFilterString,
|
|
99
108
|
pageSizes: pageSizesRaw,
|
|
100
|
-
|
|
101
|
-
searchDebounceMs = 300
|
|
109
|
+
queryBy,
|
|
110
|
+
searchDebounceMs = 300,
|
|
111
|
+
locale,
|
|
112
|
+
maxFacetValues = 100
|
|
102
113
|
}) => {
|
|
103
114
|
var _a;
|
|
104
|
-
const filterBy = (0, import_react.
|
|
105
|
-
const
|
|
115
|
+
const [filterBy, setFilterOptions] = (0, import_react.useState)([]);
|
|
116
|
+
const registerFilterOption = (0, import_react.useCallback)((filter) => {
|
|
117
|
+
if (!(filter == null ? void 0 : filter.fieldKey)) return;
|
|
118
|
+
setFilterOptions((prev) => [...prev.filter((f) => f.fieldKey !== filter.fieldKey), filter]);
|
|
119
|
+
}, []);
|
|
120
|
+
const unregisterFilterOption = (0, import_react.useCallback)((fieldKey) => {
|
|
121
|
+
setFilterOptions((prev) => prev.filter((f) => f.fieldKey !== fieldKey));
|
|
122
|
+
}, []);
|
|
106
123
|
const orderByFlat = (0, import_react.useMemo)(() => flattenBlockParams(orderByRaw), [orderByRaw]);
|
|
107
124
|
const pageSizesFlat = (0, import_react.useMemo)(() => flattenBlockParams(pageSizesRaw), [pageSizesRaw]);
|
|
108
|
-
const initCollections = (0, import_react.useMemo)(() => {
|
|
109
|
-
if (!collectionsRaw) return void 0;
|
|
110
|
-
const items = Array.isArray(collectionsRaw) ? collectionsRaw : collectionsRaw.split(",").map((s) => s.trim());
|
|
111
|
-
const valid = items.filter(
|
|
112
|
-
(c) => ["entries", "compositions", "assets"].includes(c)
|
|
113
|
-
);
|
|
114
|
-
return valid.length > 0 ? valid : void 0;
|
|
115
|
-
}, [collectionsRaw]);
|
|
116
|
-
const baseFilterQuery = (0, import_react.useMemo)(
|
|
117
|
-
() => baseFiltersFlat.reduce((acc, filter) => {
|
|
118
|
-
if (!(filter == null ? void 0 : filter.fieldKey) || !Array.isArray(filter.values)) return acc;
|
|
119
|
-
return {
|
|
120
|
-
...acc,
|
|
121
|
-
[`${filter.fieldKey}[eq]`]: filter.values.map((v) => v.value)
|
|
122
|
-
};
|
|
123
|
-
}, {}),
|
|
124
|
-
[baseFiltersFlat]
|
|
125
|
-
);
|
|
126
125
|
const facetBy = (0, import_react.useMemo)(
|
|
127
|
-
() => filterBy.filter((f) =>
|
|
126
|
+
() => filterBy.filter((f) => f == null ? void 0 : f.fieldKey).map((f) => f.fieldKey).join(","),
|
|
128
127
|
[filterBy]
|
|
129
128
|
);
|
|
130
129
|
const defaultOrderByQuery = (0, import_react.useMemo)(
|
|
@@ -136,18 +135,13 @@ var SearchProvider = ({
|
|
|
136
135
|
[orderByFlat]
|
|
137
136
|
);
|
|
138
137
|
const initPerPage = ((_a = pageSizesFlat[0]) == null ? void 0 : _a.size) || DEFAULT_PAGE_SIZE;
|
|
139
|
-
const hasFetchedInitial = (0, import_react.useRef)(false);
|
|
140
138
|
const searchDebounceRef = (0, import_react.useRef)(null);
|
|
141
|
-
const
|
|
142
|
-
initCollections || ALL_COLLECTIONS
|
|
143
|
-
);
|
|
139
|
+
const searchRequestIdRef = (0, import_react.useRef)(0);
|
|
144
140
|
const [urlParams, setUrlParams] = (0, import_react.useState)(() => {
|
|
145
141
|
if (typeof window === "undefined") return {};
|
|
146
142
|
return getSearchParamsFromUrl(window.location.href);
|
|
147
143
|
});
|
|
148
|
-
const [searchBoxValue, setSearchBoxValue] = (0, import_react.useState)(
|
|
149
|
-
(urlParams == null ? void 0 : urlParams[UNIFORM_SEARCH_QUERY_KEY]) || ""
|
|
150
|
-
);
|
|
144
|
+
const [searchBoxValue, setSearchBoxValue] = (0, import_react.useState)((urlParams == null ? void 0 : urlParams[UNIFORM_SEARCH_QUERY_KEY]) || "");
|
|
151
145
|
const [isLoading, setIsLoading] = (0, import_react.useState)(true);
|
|
152
146
|
const [entries, setEntries] = (0, import_react.useState)({
|
|
153
147
|
items: [],
|
|
@@ -157,17 +151,16 @@ var SearchProvider = ({
|
|
|
157
151
|
totalPages: 0
|
|
158
152
|
});
|
|
159
153
|
const [facets, setFacets] = (0, import_react.useState)({});
|
|
160
|
-
const [collectionResults, setCollectionResults] = (0, import_react.useState)({});
|
|
161
154
|
const pathname = (0, import_react.useMemo)(() => {
|
|
162
155
|
if (typeof window === "undefined") return "/";
|
|
163
156
|
return window.location.pathname;
|
|
164
157
|
}, []);
|
|
165
|
-
const page = Number(urlParams == null ? void 0 : urlParams[UNIFORM_SEARCH_PAGE_KEY]) - 1
|
|
158
|
+
const page = 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;
|
|
166
159
|
const search = (urlParams == null ? void 0 : urlParams[UNIFORM_SEARCH_QUERY_KEY]) || "";
|
|
167
160
|
const perPage = Number(urlParams == null ? void 0 : urlParams[UNIFORM_SEARCH_PAGE_SIZE_KEY]) || initPerPage;
|
|
168
161
|
const selectedFilters = (0, import_react.useMemo)(
|
|
169
162
|
() => filterBy.reduce((acc, filter) => {
|
|
170
|
-
const value2 = urlParams == null ? void 0 : urlParams[filter.
|
|
163
|
+
const value2 = urlParams == null ? void 0 : urlParams[filter.fieldKey];
|
|
171
164
|
if (value2) {
|
|
172
165
|
acc[filter.fieldKey] = Array.isArray(value2) ? value2 : [value2];
|
|
173
166
|
}
|
|
@@ -176,10 +169,13 @@ var SearchProvider = ({
|
|
|
176
169
|
[filterBy, urlParams]
|
|
177
170
|
);
|
|
178
171
|
(0, import_react.useEffect)(() => {
|
|
172
|
+
const requestId = ++searchRequestIdRef.current;
|
|
179
173
|
const doFetch = async () => {
|
|
180
|
-
var _a2;
|
|
181
|
-
const
|
|
174
|
+
var _a2, _b;
|
|
175
|
+
const currentOrderByQuery = (urlParams == null ? void 0 : urlParams[UNIFORM_SEARCH_ORDER_BY_KEY]) || defaultOrderByQuery;
|
|
176
|
+
const buildFilters = (excludeField) => Object.entries(selectedFilters).reduce((acc, [fieldKey, values]) => {
|
|
182
177
|
var _a3;
|
|
178
|
+
if (excludeField && fieldKey === excludeField) return acc;
|
|
183
179
|
if (!values || values.length === 0) return acc;
|
|
184
180
|
const filterType = (_a3 = filterBy.find((f) => f.fieldKey === fieldKey)) == null ? void 0 : _a3.type;
|
|
185
181
|
if (filterType === "range") {
|
|
@@ -188,65 +184,69 @@ var SearchProvider = ({
|
|
|
188
184
|
}
|
|
189
185
|
return { ...acc, [`${fieldKey}[in]`]: values };
|
|
190
186
|
}, {});
|
|
191
|
-
const
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
...filterQuery
|
|
195
|
-
};
|
|
196
|
-
if (contentType) {
|
|
197
|
-
filters["contentType[eq]"] = contentType;
|
|
198
|
-
}
|
|
199
|
-
const { results } = await performSearch({
|
|
200
|
-
page,
|
|
201
|
-
perPage,
|
|
202
|
-
filters,
|
|
203
|
-
facetBy,
|
|
204
|
-
search,
|
|
205
|
-
orderBy: currentOrderByQuery,
|
|
206
|
-
collections: selectedCollections
|
|
187
|
+
const selectedFacetFields = Object.keys(selectedFilters).filter((k) => {
|
|
188
|
+
var _a3;
|
|
189
|
+
return ((_a3 = selectedFilters[k]) == null ? void 0 : _a3.length) > 0;
|
|
207
190
|
});
|
|
208
|
-
|
|
209
|
-
const
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
191
|
+
const queryByString = (queryBy == null ? void 0 : queryBy.length) ? queryBy.join(",") : void 0;
|
|
192
|
+
const [mainResult, ...disjunctiveResults] = await Promise.all([
|
|
193
|
+
performSearch({
|
|
194
|
+
page,
|
|
195
|
+
perPage,
|
|
196
|
+
filters: buildFilters(),
|
|
197
|
+
baseFilterBy: baseFilterString,
|
|
198
|
+
facetBy,
|
|
199
|
+
queryBy: queryByString,
|
|
200
|
+
search,
|
|
201
|
+
orderBy: currentOrderByQuery,
|
|
202
|
+
locale,
|
|
203
|
+
maxFacetValues
|
|
204
|
+
}),
|
|
205
|
+
...selectedFacetFields.map(
|
|
206
|
+
(field) => performSearch({
|
|
207
|
+
page: 0,
|
|
208
|
+
perPage: 0,
|
|
209
|
+
filters: buildFilters(field),
|
|
210
|
+
baseFilterBy: baseFilterString,
|
|
211
|
+
facetBy: field,
|
|
212
|
+
queryBy: queryByString,
|
|
213
|
+
search,
|
|
214
|
+
orderBy: currentOrderByQuery,
|
|
215
|
+
locale,
|
|
216
|
+
maxFacetValues
|
|
217
|
+
})
|
|
218
|
+
)
|
|
219
|
+
]);
|
|
220
|
+
if (requestId !== searchRequestIdRef.current) return;
|
|
221
|
+
const mergedFacets = { ...(_a2 = mainResult.facets) != null ? _a2 : {} };
|
|
222
|
+
selectedFacetFields.forEach((field, i) => {
|
|
223
|
+
var _a3, _b2;
|
|
224
|
+
const counts = (_b2 = (_a3 = disjunctiveResults[i]) == null ? void 0 : _a3.facets) == null ? void 0 : _b2[field];
|
|
225
|
+
if (counts) mergedFacets[field] = counts;
|
|
228
226
|
});
|
|
227
|
+
setEntries((_b = mainResult.data) != null ? _b : { items: [], total: 0, page, perPage, totalPages: 0 });
|
|
229
228
|
setFacets(mergedFacets);
|
|
230
229
|
};
|
|
231
230
|
setIsLoading(true);
|
|
232
|
-
doFetch().catch((error) => console.error("[alex] Search fetch error:", error)).finally(() =>
|
|
233
|
-
setIsLoading(false);
|
|
234
|
-
hasFetchedInitial.current = true;
|
|
235
|
-
});
|
|
231
|
+
doFetch().catch((error) => console.error("[alex] Search fetch error:", error)).finally(() => setIsLoading(false));
|
|
236
232
|
}, [
|
|
237
|
-
|
|
238
|
-
contentType,
|
|
233
|
+
baseFilterString,
|
|
239
234
|
defaultOrderByQuery,
|
|
240
235
|
facetBy,
|
|
241
236
|
filterBy,
|
|
237
|
+
locale,
|
|
242
238
|
urlParams,
|
|
243
239
|
page,
|
|
244
240
|
perPage,
|
|
245
241
|
performSearch,
|
|
246
242
|
search,
|
|
247
|
-
selectedCollections,
|
|
248
243
|
selectedFilters
|
|
249
244
|
]);
|
|
245
|
+
(0, import_react.useEffect)(() => {
|
|
246
|
+
return () => {
|
|
247
|
+
if (searchDebounceRef.current) clearTimeout(searchDebounceRef.current);
|
|
248
|
+
};
|
|
249
|
+
}, []);
|
|
250
250
|
const updateUrl = (0, import_react.useCallback)(
|
|
251
251
|
(params, { replace = false } = {}) => {
|
|
252
252
|
const qs = params.toString();
|
|
@@ -276,26 +276,15 @@ var SearchProvider = ({
|
|
|
276
276
|
const setSearchQuery = (0, import_react.useCallback)(
|
|
277
277
|
(value2) => {
|
|
278
278
|
setSearchBoxValue(value2);
|
|
279
|
-
if (searchDebounceRef.current)
|
|
280
|
-
clearTimeout(searchDebounceRef.current);
|
|
281
|
-
}
|
|
279
|
+
if (searchDebounceRef.current) clearTimeout(searchDebounceRef.current);
|
|
282
280
|
if (!value2) {
|
|
283
281
|
commitSearchToUrl(value2);
|
|
284
282
|
} else {
|
|
285
|
-
searchDebounceRef.current = setTimeout(() =>
|
|
286
|
-
commitSearchToUrl(value2);
|
|
287
|
-
}, searchDebounceMs);
|
|
283
|
+
searchDebounceRef.current = setTimeout(() => commitSearchToUrl(value2), searchDebounceMs);
|
|
288
284
|
}
|
|
289
285
|
},
|
|
290
286
|
[commitSearchToUrl, searchDebounceMs]
|
|
291
287
|
);
|
|
292
|
-
(0, import_react.useEffect)(() => {
|
|
293
|
-
return () => {
|
|
294
|
-
if (searchDebounceRef.current) {
|
|
295
|
-
clearTimeout(searchDebounceRef.current);
|
|
296
|
-
}
|
|
297
|
-
};
|
|
298
|
-
}, []);
|
|
299
288
|
const setPage = (0, import_react.useCallback)(
|
|
300
289
|
(p) => {
|
|
301
290
|
const params = new URLSearchParams(window.location.search);
|
|
@@ -328,28 +317,22 @@ var SearchProvider = ({
|
|
|
328
317
|
);
|
|
329
318
|
const setSelectedFilters = (0, import_react.useCallback)(
|
|
330
319
|
(nextSelected) => {
|
|
331
|
-
const params = new URLSearchParams();
|
|
320
|
+
const params = new URLSearchParams(window.location.search);
|
|
332
321
|
params.delete(UNIFORM_SEARCH_PAGE_KEY);
|
|
333
|
-
|
|
334
|
-
params.set(UNIFORM_SEARCH_QUERY_KEY, search);
|
|
335
|
-
}
|
|
322
|
+
filterBy.forEach((f) => params.delete(f.fieldKey));
|
|
336
323
|
Object.entries(nextSelected).forEach(([key, value2]) => {
|
|
337
324
|
const filter = filterBy.find((f) => f.fieldKey === key);
|
|
338
325
|
if (!filter) return;
|
|
339
|
-
value2.forEach((v) =>
|
|
340
|
-
params.append(filter.fieldId, v);
|
|
341
|
-
});
|
|
326
|
+
value2.forEach((v) => params.append(key, v));
|
|
342
327
|
});
|
|
343
328
|
updateUrl(params);
|
|
344
329
|
},
|
|
345
|
-
[filterBy,
|
|
330
|
+
[filterBy, updateUrl]
|
|
346
331
|
);
|
|
347
332
|
const clearFilters = (0, import_react.useCallback)(() => {
|
|
348
333
|
setIsLoading(true);
|
|
349
334
|
setSearchBoxValue("");
|
|
350
|
-
if (searchDebounceRef.current)
|
|
351
|
-
clearTimeout(searchDebounceRef.current);
|
|
352
|
-
}
|
|
335
|
+
if (searchDebounceRef.current) clearTimeout(searchDebounceRef.current);
|
|
353
336
|
window.history.pushState({}, "", pathname);
|
|
354
337
|
setUrlParams(getSearchParamsFromUrl(window.location.href));
|
|
355
338
|
}, [pathname]);
|
|
@@ -374,7 +357,6 @@ var SearchProvider = ({
|
|
|
374
357
|
results: entries,
|
|
375
358
|
facets,
|
|
376
359
|
isLoading,
|
|
377
|
-
collectionResults,
|
|
378
360
|
searchBoxValue,
|
|
379
361
|
setSearchQuery,
|
|
380
362
|
page,
|
|
@@ -386,20 +368,23 @@ var SearchProvider = ({
|
|
|
386
368
|
selectedOrderBy: (urlParams == null ? void 0 : urlParams[UNIFORM_SEARCH_ORDER_BY_KEY]) || defaultOrderByQuery,
|
|
387
369
|
setOrderBy,
|
|
388
370
|
filterOptions: filterBy,
|
|
371
|
+
setFilterOptions,
|
|
372
|
+
registerFilterOption,
|
|
373
|
+
unregisterFilterOption,
|
|
389
374
|
selectedFilters,
|
|
390
375
|
setSelectedFilters,
|
|
391
376
|
clearFilters,
|
|
392
|
-
selectedCollections,
|
|
393
|
-
setSelectedCollections,
|
|
394
377
|
formatResultsSummary
|
|
395
378
|
}),
|
|
396
379
|
[
|
|
397
380
|
clearFilters,
|
|
398
|
-
collectionResults,
|
|
399
381
|
defaultOrderByQuery,
|
|
400
382
|
entries,
|
|
401
383
|
facets,
|
|
402
384
|
filterBy,
|
|
385
|
+
setFilterOptions,
|
|
386
|
+
registerFilterOption,
|
|
387
|
+
unregisterFilterOption,
|
|
403
388
|
formatResultsSummary,
|
|
404
389
|
isLoading,
|
|
405
390
|
orderByOptions,
|
|
@@ -407,7 +392,6 @@ var SearchProvider = ({
|
|
|
407
392
|
pageSizesFlat,
|
|
408
393
|
perPage,
|
|
409
394
|
searchBoxValue,
|
|
410
|
-
selectedCollections,
|
|
411
395
|
selectedFilters,
|
|
412
396
|
setOrderBy,
|
|
413
397
|
setPage,
|
|
@@ -508,12 +492,74 @@ function useSearchPagination(siblingCount) {
|
|
|
508
492
|
isLoading
|
|
509
493
|
};
|
|
510
494
|
}
|
|
495
|
+
|
|
496
|
+
// src/react/SearchItemUrlResolver.tsx
|
|
497
|
+
var import_react5 = require("react");
|
|
498
|
+
var import_jsx_runtime2 = require("react/jsx-runtime");
|
|
499
|
+
var NOOP_RESOLVER = () => void 0;
|
|
500
|
+
var UserUrlResolverContext = (0, import_react5.createContext)(null);
|
|
501
|
+
var DefaultUrlResolverContext = (0, import_react5.createContext)(NOOP_RESOLVER);
|
|
502
|
+
var SearchItemUrlResolverProvider = ({
|
|
503
|
+
resolver,
|
|
504
|
+
children
|
|
505
|
+
}) => /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(UserUrlResolverContext.Provider, { value: resolver, children });
|
|
506
|
+
var SearchItemDefaultUrlResolverProvider = ({
|
|
507
|
+
resolver,
|
|
508
|
+
children
|
|
509
|
+
}) => /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(DefaultUrlResolverContext.Provider, { value: resolver, children });
|
|
510
|
+
function useUrlResolver() {
|
|
511
|
+
const user = (0, import_react5.useContext)(UserUrlResolverContext);
|
|
512
|
+
const def = (0, import_react5.useContext)(DefaultUrlResolverContext);
|
|
513
|
+
return user != null ? user : def;
|
|
514
|
+
}
|
|
515
|
+
function resolveField(obj, path) {
|
|
516
|
+
return path.split(".").reduce((current, key) => {
|
|
517
|
+
if (current == null) {
|
|
518
|
+
return void 0;
|
|
519
|
+
}
|
|
520
|
+
if (Array.isArray(current)) {
|
|
521
|
+
current = current[0];
|
|
522
|
+
}
|
|
523
|
+
return current == null ? void 0 : current[key];
|
|
524
|
+
}, obj);
|
|
525
|
+
}
|
|
526
|
+
function createDefaultUrlResolver(configs, options = {}) {
|
|
527
|
+
const { pathsByNodeId = {}, locale } = options;
|
|
528
|
+
return (hit) => {
|
|
529
|
+
var _a;
|
|
530
|
+
const hitSource = typeof hit.source === "string" ? hit.source : "";
|
|
531
|
+
const hitType = typeof hit.type === "string" ? hit.type : "";
|
|
532
|
+
const config = configs.find((c) => c.source === hitSource && c.type === hitType);
|
|
533
|
+
if (config) {
|
|
534
|
+
const template = (_a = config.nodeId ? pathsByNodeId[config.nodeId] : void 0) != null ? _a : config.urlTemplate;
|
|
535
|
+
if (template) {
|
|
536
|
+
return template.replace(/:([a-zA-Z0-9_-]+)/g, (_, token) => {
|
|
537
|
+
var _a2, _b;
|
|
538
|
+
if (token === "locale") return locale != null ? locale : "";
|
|
539
|
+
const fieldKey = (_a2 = config.tokenMapping) == null ? void 0 : _a2[token];
|
|
540
|
+
if (!fieldKey) return "";
|
|
541
|
+
const val = resolveField(hit, fieldKey);
|
|
542
|
+
return Array.isArray(val) ? String((_b = val[0]) != null ? _b : "") : String(val != null ? val : "");
|
|
543
|
+
});
|
|
544
|
+
}
|
|
545
|
+
}
|
|
546
|
+
if (hitSource === "composition" && typeof hit.path === "string") {
|
|
547
|
+
return hit.path;
|
|
548
|
+
}
|
|
549
|
+
return void 0;
|
|
550
|
+
};
|
|
551
|
+
}
|
|
511
552
|
// Annotate the CommonJS export names for ESM import in node:
|
|
512
553
|
0 && (module.exports = {
|
|
513
554
|
DOTS,
|
|
555
|
+
SearchContext,
|
|
556
|
+
SearchItemDefaultUrlResolverProvider,
|
|
557
|
+
SearchItemUrlResolverProvider,
|
|
514
558
|
SearchProvider,
|
|
559
|
+
createDefaultUrlResolver,
|
|
515
560
|
usePagination,
|
|
516
561
|
useSearch,
|
|
517
|
-
useSearchPagination
|
|
562
|
+
useSearchPagination,
|
|
563
|
+
useUrlResolver
|
|
518
564
|
});
|
|
519
565
|
//# sourceMappingURL=react.js.map
|
package/dist/react.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/react/index.ts","../src/react/SearchProvider.tsx","../src/constants.ts","../src/utils.ts","../src/flattenBlockParams.ts","../src/react/useSearch.ts","../src/react/usePagination.ts","../src/react/useSearchPagination.ts"],"sourcesContent":["export { SearchProvider } from './SearchProvider';\nexport { useSearch } from './useSearch';\nexport { usePagination, DOTS } from './usePagination';\nexport { useSearchPagination } from './useSearchPagination';\nexport type { SearchProviderProps, UseSearchReturn } from './SearchProvider';\nexport type { UseSearchPaginationReturn } from './useSearchPagination';\n","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","export const UNIFORM_SEARCH_QUERY_KEY = 'search';\nexport const UNIFORM_SEARCH_PAGE_KEY = 'page';\nexport const UNIFORM_SEARCH_PAGE_SIZE_KEY = 'pageSize';\nexport const UNIFORM_SEARCH_ORDER_BY_KEY = 'orderBy';\nexport const FIRST_PAGE = 0;\nexport const DEFAULT_PAGE_SIZE = 10;\n","import type { OrderBy } from './types';\n\nexport const buildOrderByQuery = (orderBy: OrderBy) => {\n return `${orderBy.field}_${orderBy.direction}`;\n};\n\nexport const getSearchParamsFromUrl = (urlString: string): Record<string, string | string[]> => {\n if (!urlString) {\n return {};\n }\n\n const url = new URL(urlString);\n const params: Record<string, string | string[]> = {};\n\n url.searchParams.forEach((value, key) => {\n if (params[key]) {\n params[key] = Array.isArray(params[key])\n ? [...(params[key] as string[]), value]\n : [params[key] as string, value];\n } else {\n params[key] = value;\n }\n });\n\n return params;\n};\n","type RawField = {\n type?: string;\n value?: unknown;\n locales?: Record<string, unknown>;\n};\n\ntype RawBlockItem = {\n type?: string;\n fields?: Record<string, RawField>;\n};\n\nfunction resolveFieldValue(field: RawField, locale = 'en-us'): unknown {\n if (!field || typeof field !== 'object') return field;\n\n if (field.type === '$block' && Array.isArray(field.value)) {\n return flattenBlockParams(field.value as RawBlockItem[], locale);\n }\n\n if (field.locales && typeof field.locales === 'object') {\n return field.locales[locale] ?? Object.values(field.locales)[0] ?? field.value;\n }\n\n return field.value;\n}\n\nexport function flattenBlockParams<T = Record<string, unknown>>(\n items: unknown,\n locale = 'en-us'\n): T[] {\n if (!Array.isArray(items)) return [];\n return items.map(item => {\n const result: Record<string, unknown> = {};\n const blockItem = item as RawBlockItem;\n if (blockItem.fields) {\n for (const [key, field] of Object.entries(blockItem.fields)) {\n result[key] = resolveFieldValue(field, locale);\n }\n }\n return result as T;\n });\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","import_react","import_react","import_react"]}
|
|
1
|
+
{"version":3,"sources":["../src/react/index.ts","../src/react/SearchProvider.tsx","../src/constants.ts","../src/utils.ts","../src/flattenBlockParams.ts","../src/react/useSearch.ts","../src/react/usePagination.ts","../src/react/useSearchPagination.ts","../src/react/SearchItemUrlResolver.tsx"],"sourcesContent":["export { SearchProvider, SearchContext } from './SearchProvider';\nexport { useSearch } from './useSearch';\nexport { usePagination, DOTS } from './usePagination';\nexport { useSearchPagination } from './useSearchPagination';\nexport {\n SearchItemUrlResolverProvider,\n SearchItemDefaultUrlResolverProvider,\n useUrlResolver,\n createDefaultUrlResolver,\n} from './SearchItemUrlResolver';\nexport type { SearchProviderProps, UseSearchReturn } from './SearchProvider';\nexport type { UseSearchPaginationReturn } from './useSearchPagination';\nexport type { UrlResolver } from './SearchItemUrlResolver';\n","import { createContext, FC, useMemo, useCallback, useState, useEffect, useRef, type ReactNode } 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 SearchHit,\n FacetBy,\n FilterByItem,\n Pagination,\n Facets,\n OrderBy,\n PageSize,\n FilterQuery,\n CollectionResult,\n} from '../types';\nimport type { SearchParams } from '../client';\n\nexport interface SearchProviderProps {\n children: ReactNode;\n performSearch: (params: SearchParams) => Promise<CollectionResult>;\n orderBy?: unknown;\n baseFilterString?: string;\n pageSizes?: unknown;\n queryBy?: string[];\n searchDebounceMs?: number;\n locale?: string;\n maxFacetValues?: number;\n}\n\nexport interface UseSearchReturn {\n results: Pagination<SearchHit>;\n facets: Facets | null;\n isLoading: boolean;\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: FacetBy[];\n setFilterOptions: (filters: FacetBy[]) => void;\n /** Additive registration of a single facet option (keyed by fieldKey). Used by facet\n * components that mount independently (e.g. App Router slots) rather than being\n * enumerated by a parent. */\n registerFilterOption: (filter: FacetBy) => void;\n unregisterFilterOption: (fieldKey: string) => void;\n selectedFilters: Record<string, string[]>;\n setSelectedFilters: (filters: Record<string, string[]>) => void;\n clearFilters: () => 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 orderBy: orderByRaw,\n baseFilterString,\n pageSizes: pageSizesRaw,\n queryBy,\n searchDebounceMs = 300,\n locale,\n maxFacetValues = 100,\n}) => {\n const [filterBy, setFilterOptions] = useState<FacetBy[]>([]);\n\n const registerFilterOption = useCallback((filter: FacetBy) => {\n if (!filter?.fieldKey) return;\n setFilterOptions((prev) => [...prev.filter((f) => f.fieldKey !== filter.fieldKey), filter]);\n }, []);\n\n const unregisterFilterOption = useCallback((fieldKey: string) => {\n setFilterOptions((prev) => prev.filter((f) => f.fieldKey !== fieldKey));\n }, []);\n\n const orderByFlat = useMemo(() => flattenBlockParams<OrderBy>(orderByRaw), [orderByRaw]);\n const pageSizesFlat = useMemo(() => flattenBlockParams<PageSize>(pageSizesRaw), [pageSizesRaw]);\n\n const facetBy = useMemo(\n () =>\n filterBy\n .filter((f) => 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 searchDebounceRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n const searchRequestIdRef = useRef(0);\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((urlParams?.[UNIFORM_SEARCH_QUERY_KEY] as string) || '');\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\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 > 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.fieldKey];\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 requestId = ++searchRequestIdRef.current;\n\n const doFetch = async () => {\n const currentOrderByQuery = (urlParams?.[UNIFORM_SEARCH_ORDER_BY_KEY] as string) || defaultOrderByQuery;\n\n const buildFilters = (excludeField?: string) =>\n Object.entries(selectedFilters).reduce<Record<string, unknown>>((acc, [fieldKey, values]) => {\n if (excludeField && fieldKey === excludeField) return acc;\n if (!values || values.length === 0) return acc;\n const filterType = filterBy.find((f) => f.fieldKey === fieldKey)?.type;\n if (filterType === 'range') {\n const [min, max] = values;\n return { ...acc, [`${fieldKey}[gte]`]: min, [`${fieldKey}[lte]`]: max };\n }\n return { ...acc, [`${fieldKey}[in]`]: values };\n }, {});\n\n // Fields that have active selections need disjunctive queries so their\n // option lists stay complete (user can add more values via OR logic).\n const selectedFacetFields = Object.keys(selectedFilters).filter((k) => selectedFilters[k]?.length > 0);\n const queryByString = queryBy?.length ? queryBy.join(',') : undefined;\n const [mainResult, ...disjunctiveResults] = await Promise.all([\n performSearch({\n page,\n perPage,\n filters: buildFilters(),\n baseFilterBy: baseFilterString,\n facetBy,\n queryBy: queryByString,\n search,\n orderBy: currentOrderByQuery,\n locale,\n maxFacetValues,\n }),\n ...selectedFacetFields.map((field) =>\n performSearch({\n page: 0,\n perPage: 0,\n filters: buildFilters(field),\n baseFilterBy: baseFilterString,\n facetBy: field,\n queryBy: queryByString,\n search,\n orderBy: currentOrderByQuery,\n locale,\n maxFacetValues,\n })\n ),\n ]);\n\n if (requestId !== searchRequestIdRef.current) return;\n\n // Replace main facet counts for selected fields with their disjunctive counts.\n const mergedFacets = { ...(mainResult.facets ?? {}) };\n selectedFacetFields.forEach((field, i) => {\n const counts = disjunctiveResults[i]?.facets?.[field];\n if (counts) mergedFacets[field] = counts;\n });\n\n setEntries(mainResult.data ?? { items: [], total: 0, page, perPage, totalPages: 0 });\n setFacets(mergedFacets);\n };\n\n setIsLoading(true);\n doFetch()\n .catch((error) => console.error('[alex] Search fetch error:', error))\n .finally(() => setIsLoading(false));\n }, [\n baseFilterString,\n defaultOrderByQuery,\n facetBy,\n filterBy,\n locale,\n urlParams,\n page,\n perPage,\n performSearch,\n search,\n selectedFilters,\n ]);\n\n useEffect(() => {\n return () => {\n if (searchDebounceRef.current) clearTimeout(searchDebounceRef.current);\n };\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) clearTimeout(searchDebounceRef.current);\n if (!value) {\n commitSearchToUrl(value);\n } else {\n searchDebounceRef.current = setTimeout(() => commitSearchToUrl(value), searchDebounceMs);\n }\n },\n [commitSearchToUrl, searchDebounceMs]\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(window.location.search);\n params.delete(UNIFORM_SEARCH_PAGE_KEY);\n filterBy.forEach((f) => params.delete(f.fieldKey));\n Object.entries(nextSelected).forEach(([key, value]) => {\n const filter = filterBy.find((f) => f.fieldKey === key);\n if (!filter) return;\n value.forEach((v) => params.append(key, v));\n });\n updateUrl(params);\n },\n [filterBy, updateUrl]\n );\n\n const clearFilters = useCallback(() => {\n setIsLoading(true);\n setSearchBoxValue('');\n if (searchDebounceRef.current) clearTimeout(searchDebounceRef.current);\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\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 setFilterOptions,\n registerFilterOption,\n unregisterFilterOption,\n selectedFilters,\n setSelectedFilters,\n clearFilters,\n\n formatResultsSummary,\n }),\n [\n clearFilters,\n defaultOrderByQuery,\n entries,\n facets,\n filterBy,\n setFilterOptions,\n registerFilterOption,\n unregisterFilterOption,\n formatResultsSummary,\n isLoading,\n orderByOptions,\n page,\n pageSizesFlat,\n perPage,\n searchBoxValue,\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","export const UNIFORM_SEARCH_QUERY_KEY = 'search';\nexport const UNIFORM_SEARCH_PAGE_KEY = 'page';\nexport const UNIFORM_SEARCH_PAGE_SIZE_KEY = 'pageSize';\nexport const UNIFORM_SEARCH_ORDER_BY_KEY = 'orderBy';\nexport const FIRST_PAGE = 0;\nexport const DEFAULT_PAGE_SIZE = 10;\n","import type { OrderBy } from './types';\n\nexport const buildOrderByQuery = (orderBy: OrderBy) => {\n const field = orderBy.field as unknown;\n // sortByConfig produces an object value: { field: string; direction: 'asc' | 'desc' }\n if (field && typeof field === 'object' && 'field' in (field as object)) {\n const sv = field as { field: string; direction: string };\n return `${sv.field}_${sv.direction.toUpperCase()}`;\n }\n // Plain string \"relevance\" or missing direction → no sort\n if (!field || field === 'relevance') return '';\n return `${field}_${orderBy.direction ?? 'ASC'}`;\n};\n\nexport const getSearchParamsFromUrl = (urlString: string): Record<string, string | string[]> => {\n if (!urlString) {\n return {};\n }\n\n const url = new URL(urlString);\n const params: Record<string, string | string[]> = {};\n\n url.searchParams.forEach((value, key) => {\n if (params[key]) {\n params[key] = Array.isArray(params[key])\n ? [...(params[key] as string[]), value]\n : [params[key] as string, value];\n } else {\n params[key] = value;\n }\n });\n\n return params;\n};\n","type RawField = {\n type?: string;\n value?: unknown;\n locales?: Record<string, unknown>;\n};\n\ntype RawBlockItem = {\n type?: string;\n fields?: Record<string, RawField>;\n};\n\nfunction resolveFieldValue(field: RawField, locale = 'en-us'): unknown {\n if (!field || typeof field !== 'object') return field;\n\n if (field.type === '$block' && Array.isArray(field.value)) {\n return flattenBlockParams(field.value as RawBlockItem[], locale);\n }\n\n if (field.locales && typeof field.locales === 'object') {\n return field.locales[locale] ?? field.value;\n }\n\n return field.value;\n}\n\nexport function flattenBlockParams<T = Record<string, unknown>>(\n items: unknown,\n locale = 'en-us'\n): T[] {\n if (!Array.isArray(items)) return [];\n return items.map(item => {\n const result: Record<string, unknown> = {};\n const blockItem = item as RawBlockItem;\n if (blockItem.fields) {\n for (const [key, field] of Object.entries(blockItem.fields)) {\n result[key] = resolveFieldValue(field, locale);\n }\n }\n return result as T;\n });\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","import { createContext, useContext, type FC, type ReactNode } from 'react';\nimport type { SearchHit, SearchItemConfig } from '../types';\n\nexport type UrlResolver = (hit: SearchHit) => string | undefined;\n\nconst NOOP_RESOLVER: UrlResolver = () => undefined;\n\n// Set by the user to override URL resolution for the entire subtree.\nconst UserUrlResolverContext = createContext<UrlResolver | null>(null);\n\n// Set by SearchList to provide config-driven defaults within its subtree.\nconst DefaultUrlResolverContext = createContext<UrlResolver>(NOOP_RESOLVER);\n\n/** Wrap your search tree to override URL building for all hits. */\nexport const SearchItemUrlResolverProvider: FC<{ resolver: UrlResolver; children: ReactNode }> = ({\n resolver,\n children,\n}) => (\n <UserUrlResolverContext.Provider value={resolver}>\n {children}\n </UserUrlResolverContext.Provider>\n);\n\n/** Used internally by SearchList to register the Canvas-config-driven default. */\nexport const SearchItemDefaultUrlResolverProvider: FC<{ resolver: UrlResolver; children: ReactNode }> = ({\n resolver,\n children,\n}) => (\n <DefaultUrlResolverContext.Provider value={resolver}>\n {children}\n </DefaultUrlResolverContext.Provider>\n);\n\n/**\n * Always returns a resolver. User-provided resolver (SearchItemUrlResolverProvider)\n * takes priority over the default registered by SearchList.\n */\nexport function useUrlResolver(): UrlResolver {\n const user = useContext(UserUrlResolverContext);\n const def = useContext(DefaultUrlResolverContext);\n return user ?? def;\n}\n\nexport interface UrlResolverOptions {\n /** nodeId → resolved locale-specific path (from project map). */\n pathsByNodeId?: Record<string, string>;\n /** Current locale, used as fallback for legacy :locale token in urlTemplate. */\n locale?: string;\n}\n\n/**\n * Builds the default URL resolver from Canvas SearchItem configs.\n * Exported so custom resolvers can compose with it.\n */\nfunction resolveField<T = unknown>(obj: SearchHit, path: string): T | undefined {\n return path\n .split(\".\")\n .reduce<any>((current, key) => {\n if (current == null) {\n return undefined;\n }\n\n // If current value is an array, use first item\n if (Array.isArray(current)) {\n current = current[0];\n }\n\n return current?.[key];\n }, obj);\n\n}\n\nexport function createDefaultUrlResolver(\n configs: SearchItemConfig[],\n options: UrlResolverOptions = {}\n): UrlResolver {\n const { pathsByNodeId = {}, locale } = options;\n\n return (hit: SearchHit): string | undefined => {\n const hitSource = typeof hit.source === 'string' ? hit.source : '';\n const hitType = typeof hit.type === 'string' ? hit.type : '';\n const config = configs.find(c => c.source === hitSource && c.type === hitType);\n if (config) {\n const template =\n (config.nodeId ? pathsByNodeId[config.nodeId] : undefined) ?? config.urlTemplate;\n\n if (template) {\n return template.replace(/:([a-zA-Z0-9_-]+)/g, (_, token) => {\n if (token === 'locale') return locale ?? '';\n const fieldKey = config.tokenMapping?.[token];\n if (!fieldKey) return '';\n const val = resolveField(hit, fieldKey);\n return Array.isArray(val) ? String(val[0] ?? '') : String(val ?? '');\n });\n }\n }\n\n if (hitSource === 'composition' && typeof hit.path === 'string') {\n return hit.path;\n }\n\n return undefined;\n };\n}\n"],"mappings":"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","names":["value","_a","_b","import_react","import_react","import_react","import_react","import_jsx_runtime","_a"]}
|