@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/LICENSE +21 -0
- package/dist/chunk-ZABEFR2D.mjs +66 -0
- package/dist/chunk-ZABEFR2D.mjs.map +1 -0
- package/dist/client-DrL-8TfY.d.mts +71 -0
- package/dist/client-DrL-8TfY.d.ts +71 -0
- package/dist/index.d.mts +16 -0
- package/dist/index.d.ts +16 -0
- package/dist/index.js +135 -0
- package/dist/index.js.map +1 -0
- package/dist/index.mjs +57 -0
- package/dist/index.mjs.map +1 -0
- package/dist/react.d.mts +68 -0
- package/dist/react.d.ts +68 -0
- package/dist/react.js +519 -0
- package/dist/react.js.map +1 -0
- package/dist/react.mjs +451 -0
- package/dist/react.mjs.map +1 -0
- package/package.json +45 -0
package/dist/react.js
ADDED
|
@@ -0,0 +1,519 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __export = (target, all) => {
|
|
7
|
+
for (var name in all)
|
|
8
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
9
|
+
};
|
|
10
|
+
var __copyProps = (to, from, except, desc) => {
|
|
11
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
12
|
+
for (let key of __getOwnPropNames(from))
|
|
13
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
14
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
15
|
+
}
|
|
16
|
+
return to;
|
|
17
|
+
};
|
|
18
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
|
+
|
|
20
|
+
// src/react/index.ts
|
|
21
|
+
var react_exports = {};
|
|
22
|
+
__export(react_exports, {
|
|
23
|
+
DOTS: () => DOTS,
|
|
24
|
+
SearchProvider: () => SearchProvider,
|
|
25
|
+
usePagination: () => usePagination,
|
|
26
|
+
useSearch: () => useSearch,
|
|
27
|
+
useSearchPagination: () => useSearchPagination
|
|
28
|
+
});
|
|
29
|
+
module.exports = __toCommonJS(react_exports);
|
|
30
|
+
|
|
31
|
+
// src/react/SearchProvider.tsx
|
|
32
|
+
var import_react = require("react");
|
|
33
|
+
|
|
34
|
+
// src/constants.ts
|
|
35
|
+
var UNIFORM_SEARCH_QUERY_KEY = "search";
|
|
36
|
+
var UNIFORM_SEARCH_PAGE_KEY = "page";
|
|
37
|
+
var UNIFORM_SEARCH_PAGE_SIZE_KEY = "pageSize";
|
|
38
|
+
var UNIFORM_SEARCH_ORDER_BY_KEY = "orderBy";
|
|
39
|
+
var FIRST_PAGE = 0;
|
|
40
|
+
var DEFAULT_PAGE_SIZE = 10;
|
|
41
|
+
|
|
42
|
+
// src/utils.ts
|
|
43
|
+
var buildOrderByQuery = (orderBy) => {
|
|
44
|
+
return `${orderBy.field}_${orderBy.direction}`;
|
|
45
|
+
};
|
|
46
|
+
var getSearchParamsFromUrl = (urlString) => {
|
|
47
|
+
if (!urlString) {
|
|
48
|
+
return {};
|
|
49
|
+
}
|
|
50
|
+
const url = new URL(urlString);
|
|
51
|
+
const params = {};
|
|
52
|
+
url.searchParams.forEach((value, key) => {
|
|
53
|
+
if (params[key]) {
|
|
54
|
+
params[key] = Array.isArray(params[key]) ? [...params[key], value] : [params[key], value];
|
|
55
|
+
} else {
|
|
56
|
+
params[key] = value;
|
|
57
|
+
}
|
|
58
|
+
});
|
|
59
|
+
return params;
|
|
60
|
+
};
|
|
61
|
+
|
|
62
|
+
// src/flattenBlockParams.ts
|
|
63
|
+
function resolveFieldValue(field, locale = "en-us") {
|
|
64
|
+
var _a, _b;
|
|
65
|
+
if (!field || typeof field !== "object") return field;
|
|
66
|
+
if (field.type === "$block" && Array.isArray(field.value)) {
|
|
67
|
+
return flattenBlockParams(field.value, locale);
|
|
68
|
+
}
|
|
69
|
+
if (field.locales && typeof field.locales === "object") {
|
|
70
|
+
return (_b = (_a = field.locales[locale]) != null ? _a : Object.values(field.locales)[0]) != null ? _b : field.value;
|
|
71
|
+
}
|
|
72
|
+
return field.value;
|
|
73
|
+
}
|
|
74
|
+
function flattenBlockParams(items, locale = "en-us") {
|
|
75
|
+
if (!Array.isArray(items)) return [];
|
|
76
|
+
return items.map((item) => {
|
|
77
|
+
const result = {};
|
|
78
|
+
const blockItem = item;
|
|
79
|
+
if (blockItem.fields) {
|
|
80
|
+
for (const [key, field] of Object.entries(blockItem.fields)) {
|
|
81
|
+
result[key] = resolveFieldValue(field, locale);
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
return result;
|
|
85
|
+
});
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
// src/react/SearchProvider.tsx
|
|
89
|
+
var import_jsx_runtime = require("react/jsx-runtime");
|
|
90
|
+
var ALL_COLLECTIONS = ["entries", "compositions", "assets"];
|
|
91
|
+
var SearchContext = (0, import_react.createContext)(null);
|
|
92
|
+
var SearchProvider = ({
|
|
93
|
+
children,
|
|
94
|
+
performSearch,
|
|
95
|
+
contentType,
|
|
96
|
+
filterBy: filterByRaw,
|
|
97
|
+
orderBy: orderByRaw,
|
|
98
|
+
baseFilters: baseFiltersRaw,
|
|
99
|
+
pageSizes: pageSizesRaw,
|
|
100
|
+
collections: collectionsRaw,
|
|
101
|
+
searchDebounceMs = 300
|
|
102
|
+
}) => {
|
|
103
|
+
var _a;
|
|
104
|
+
const filterBy = (0, import_react.useMemo)(() => flattenBlockParams(filterByRaw), [filterByRaw]);
|
|
105
|
+
const baseFiltersFlat = (0, import_react.useMemo)(() => flattenBlockParams(baseFiltersRaw), [baseFiltersRaw]);
|
|
106
|
+
const orderByFlat = (0, import_react.useMemo)(() => flattenBlockParams(orderByRaw), [orderByRaw]);
|
|
107
|
+
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
|
+
const facetBy = (0, import_react.useMemo)(
|
|
127
|
+
() => filterBy.filter((f) => (f == null ? void 0 : f.enableFaceting) && (f == null ? void 0 : f.fieldKey)).map((f) => f.fieldKey).join(","),
|
|
128
|
+
[filterBy]
|
|
129
|
+
);
|
|
130
|
+
const defaultOrderByQuery = (0, import_react.useMemo)(
|
|
131
|
+
() => orderByFlat[0] ? buildOrderByQuery(orderByFlat[0]) : "created_at_DESC",
|
|
132
|
+
[orderByFlat]
|
|
133
|
+
);
|
|
134
|
+
const orderByOptions = (0, import_react.useMemo)(
|
|
135
|
+
() => orderByFlat.map((o) => ({ title: o.title, value: buildOrderByQuery(o) })),
|
|
136
|
+
[orderByFlat]
|
|
137
|
+
);
|
|
138
|
+
const initPerPage = ((_a = pageSizesFlat[0]) == null ? void 0 : _a.size) || DEFAULT_PAGE_SIZE;
|
|
139
|
+
const hasFetchedInitial = (0, import_react.useRef)(false);
|
|
140
|
+
const searchDebounceRef = (0, import_react.useRef)(null);
|
|
141
|
+
const [selectedCollections, setSelectedCollections] = (0, import_react.useState)(
|
|
142
|
+
initCollections || ALL_COLLECTIONS
|
|
143
|
+
);
|
|
144
|
+
const [urlParams, setUrlParams] = (0, import_react.useState)(() => {
|
|
145
|
+
if (typeof window === "undefined") return {};
|
|
146
|
+
return getSearchParamsFromUrl(window.location.href);
|
|
147
|
+
});
|
|
148
|
+
const [searchBoxValue, setSearchBoxValue] = (0, import_react.useState)(
|
|
149
|
+
(urlParams == null ? void 0 : urlParams[UNIFORM_SEARCH_QUERY_KEY]) || ""
|
|
150
|
+
);
|
|
151
|
+
const [isLoading, setIsLoading] = (0, import_react.useState)(true);
|
|
152
|
+
const [entries, setEntries] = (0, import_react.useState)({
|
|
153
|
+
items: [],
|
|
154
|
+
page: FIRST_PAGE,
|
|
155
|
+
perPage: initPerPage,
|
|
156
|
+
total: 0,
|
|
157
|
+
totalPages: 0
|
|
158
|
+
});
|
|
159
|
+
const [facets, setFacets] = (0, import_react.useState)({});
|
|
160
|
+
const [collectionResults, setCollectionResults] = (0, import_react.useState)({});
|
|
161
|
+
const pathname = (0, import_react.useMemo)(() => {
|
|
162
|
+
if (typeof window === "undefined") return "/";
|
|
163
|
+
return window.location.pathname;
|
|
164
|
+
}, []);
|
|
165
|
+
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;
|
|
166
|
+
const search = (urlParams == null ? void 0 : urlParams[UNIFORM_SEARCH_QUERY_KEY]) || "";
|
|
167
|
+
const perPage = Number(urlParams == null ? void 0 : urlParams[UNIFORM_SEARCH_PAGE_SIZE_KEY]) || initPerPage;
|
|
168
|
+
const selectedFilters = (0, import_react.useMemo)(
|
|
169
|
+
() => filterBy.reduce((acc, filter) => {
|
|
170
|
+
const value2 = urlParams == null ? void 0 : urlParams[filter.fieldId];
|
|
171
|
+
if (value2) {
|
|
172
|
+
acc[filter.fieldKey] = Array.isArray(value2) ? value2 : [value2];
|
|
173
|
+
}
|
|
174
|
+
return acc;
|
|
175
|
+
}, {}),
|
|
176
|
+
[filterBy, urlParams]
|
|
177
|
+
);
|
|
178
|
+
(0, import_react.useEffect)(() => {
|
|
179
|
+
const doFetch = async () => {
|
|
180
|
+
var _a2;
|
|
181
|
+
const filterQuery = Object.entries(selectedFilters).reduce((acc, [fieldKey, values]) => {
|
|
182
|
+
var _a3;
|
|
183
|
+
if (!values || values.length === 0) return acc;
|
|
184
|
+
const filterType = (_a3 = filterBy.find((f) => f.fieldKey === fieldKey)) == null ? void 0 : _a3.type;
|
|
185
|
+
if (filterType === "range") {
|
|
186
|
+
const [min, max] = values;
|
|
187
|
+
return { ...acc, [`${fieldKey}[gte]`]: min, [`${fieldKey}[lte]`]: max };
|
|
188
|
+
}
|
|
189
|
+
return { ...acc, [`${fieldKey}[in]`]: values };
|
|
190
|
+
}, {});
|
|
191
|
+
const currentOrderByQuery = (urlParams == null ? void 0 : urlParams[UNIFORM_SEARCH_ORDER_BY_KEY]) || defaultOrderByQuery;
|
|
192
|
+
const filters = {
|
|
193
|
+
...baseFilterQuery,
|
|
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
|
|
207
|
+
});
|
|
208
|
+
setCollectionResults(results || {});
|
|
209
|
+
const allItems = [];
|
|
210
|
+
let totalCount = 0;
|
|
211
|
+
let mergedFacets = {};
|
|
212
|
+
for (const col of selectedCollections) {
|
|
213
|
+
const colResult = results == null ? void 0 : results[col];
|
|
214
|
+
if ((_a2 = colResult == null ? void 0 : colResult.data) == null ? void 0 : _a2.items) {
|
|
215
|
+
allItems.push(...colResult.data.items);
|
|
216
|
+
totalCount += colResult.data.total || 0;
|
|
217
|
+
}
|
|
218
|
+
if (colResult == null ? void 0 : colResult.facets) {
|
|
219
|
+
mergedFacets = { ...mergedFacets, ...colResult.facets };
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
setEntries({
|
|
223
|
+
items: allItems,
|
|
224
|
+
total: totalCount,
|
|
225
|
+
page,
|
|
226
|
+
perPage,
|
|
227
|
+
totalPages: Math.ceil(totalCount / perPage)
|
|
228
|
+
});
|
|
229
|
+
setFacets(mergedFacets);
|
|
230
|
+
};
|
|
231
|
+
setIsLoading(true);
|
|
232
|
+
doFetch().catch((error) => console.error("[alex] Search fetch error:", error)).finally(() => {
|
|
233
|
+
setIsLoading(false);
|
|
234
|
+
hasFetchedInitial.current = true;
|
|
235
|
+
});
|
|
236
|
+
}, [
|
|
237
|
+
baseFilterQuery,
|
|
238
|
+
contentType,
|
|
239
|
+
defaultOrderByQuery,
|
|
240
|
+
facetBy,
|
|
241
|
+
filterBy,
|
|
242
|
+
urlParams,
|
|
243
|
+
page,
|
|
244
|
+
perPage,
|
|
245
|
+
performSearch,
|
|
246
|
+
search,
|
|
247
|
+
selectedCollections,
|
|
248
|
+
selectedFilters
|
|
249
|
+
]);
|
|
250
|
+
const updateUrl = (0, import_react.useCallback)(
|
|
251
|
+
(params, { replace = false } = {}) => {
|
|
252
|
+
const qs = params.toString();
|
|
253
|
+
const url = qs ? `${pathname}?${qs}` : pathname;
|
|
254
|
+
if (replace) {
|
|
255
|
+
window.history.replaceState({}, "", url);
|
|
256
|
+
} else {
|
|
257
|
+
window.history.pushState({}, "", url);
|
|
258
|
+
}
|
|
259
|
+
setUrlParams(getSearchParamsFromUrl(window.location.href));
|
|
260
|
+
},
|
|
261
|
+
[pathname]
|
|
262
|
+
);
|
|
263
|
+
const commitSearchToUrl = (0, import_react.useCallback)(
|
|
264
|
+
(value2) => {
|
|
265
|
+
const params = new URLSearchParams(window.location.search);
|
|
266
|
+
params.delete(UNIFORM_SEARCH_PAGE_KEY);
|
|
267
|
+
if (!value2) {
|
|
268
|
+
params.delete(UNIFORM_SEARCH_QUERY_KEY);
|
|
269
|
+
} else {
|
|
270
|
+
params.set(UNIFORM_SEARCH_QUERY_KEY, value2);
|
|
271
|
+
}
|
|
272
|
+
updateUrl(params, { replace: true });
|
|
273
|
+
},
|
|
274
|
+
[updateUrl]
|
|
275
|
+
);
|
|
276
|
+
const setSearchQuery = (0, import_react.useCallback)(
|
|
277
|
+
(value2) => {
|
|
278
|
+
setSearchBoxValue(value2);
|
|
279
|
+
if (searchDebounceRef.current) {
|
|
280
|
+
clearTimeout(searchDebounceRef.current);
|
|
281
|
+
}
|
|
282
|
+
if (!value2) {
|
|
283
|
+
commitSearchToUrl(value2);
|
|
284
|
+
} else {
|
|
285
|
+
searchDebounceRef.current = setTimeout(() => {
|
|
286
|
+
commitSearchToUrl(value2);
|
|
287
|
+
}, searchDebounceMs);
|
|
288
|
+
}
|
|
289
|
+
},
|
|
290
|
+
[commitSearchToUrl, searchDebounceMs]
|
|
291
|
+
);
|
|
292
|
+
(0, import_react.useEffect)(() => {
|
|
293
|
+
return () => {
|
|
294
|
+
if (searchDebounceRef.current) {
|
|
295
|
+
clearTimeout(searchDebounceRef.current);
|
|
296
|
+
}
|
|
297
|
+
};
|
|
298
|
+
}, []);
|
|
299
|
+
const setPage = (0, import_react.useCallback)(
|
|
300
|
+
(p) => {
|
|
301
|
+
const params = new URLSearchParams(window.location.search);
|
|
302
|
+
if (p === 0) {
|
|
303
|
+
params.delete(UNIFORM_SEARCH_PAGE_KEY);
|
|
304
|
+
} else {
|
|
305
|
+
params.set(UNIFORM_SEARCH_PAGE_KEY, (p + 1).toString());
|
|
306
|
+
}
|
|
307
|
+
updateUrl(params);
|
|
308
|
+
},
|
|
309
|
+
[updateUrl]
|
|
310
|
+
);
|
|
311
|
+
const setPageSize = (0, import_react.useCallback)(
|
|
312
|
+
(size) => {
|
|
313
|
+
const params = new URLSearchParams(window.location.search);
|
|
314
|
+
params.delete(UNIFORM_SEARCH_PAGE_KEY);
|
|
315
|
+
params.set(UNIFORM_SEARCH_PAGE_SIZE_KEY, size.toString());
|
|
316
|
+
updateUrl(params);
|
|
317
|
+
},
|
|
318
|
+
[updateUrl]
|
|
319
|
+
);
|
|
320
|
+
const setOrderBy = (0, import_react.useCallback)(
|
|
321
|
+
(orderByQuery) => {
|
|
322
|
+
const params = new URLSearchParams(window.location.search);
|
|
323
|
+
params.delete(UNIFORM_SEARCH_PAGE_KEY);
|
|
324
|
+
params.set(UNIFORM_SEARCH_ORDER_BY_KEY, orderByQuery);
|
|
325
|
+
updateUrl(params);
|
|
326
|
+
},
|
|
327
|
+
[updateUrl]
|
|
328
|
+
);
|
|
329
|
+
const setSelectedFilters = (0, import_react.useCallback)(
|
|
330
|
+
(nextSelected) => {
|
|
331
|
+
const params = new URLSearchParams();
|
|
332
|
+
params.delete(UNIFORM_SEARCH_PAGE_KEY);
|
|
333
|
+
if (search) {
|
|
334
|
+
params.set(UNIFORM_SEARCH_QUERY_KEY, search);
|
|
335
|
+
}
|
|
336
|
+
Object.entries(nextSelected).forEach(([key, value2]) => {
|
|
337
|
+
const filter = filterBy.find((f) => f.fieldKey === key);
|
|
338
|
+
if (!filter) return;
|
|
339
|
+
value2.forEach((v) => {
|
|
340
|
+
params.append(filter.fieldId, v);
|
|
341
|
+
});
|
|
342
|
+
});
|
|
343
|
+
updateUrl(params);
|
|
344
|
+
},
|
|
345
|
+
[filterBy, search, updateUrl]
|
|
346
|
+
);
|
|
347
|
+
const clearFilters = (0, import_react.useCallback)(() => {
|
|
348
|
+
setIsLoading(true);
|
|
349
|
+
setSearchBoxValue("");
|
|
350
|
+
if (searchDebounceRef.current) {
|
|
351
|
+
clearTimeout(searchDebounceRef.current);
|
|
352
|
+
}
|
|
353
|
+
window.history.pushState({}, "", pathname);
|
|
354
|
+
setUrlParams(getSearchParamsFromUrl(window.location.href));
|
|
355
|
+
}, [pathname]);
|
|
356
|
+
const formatResultsSummary = (0, import_react.useCallback)(
|
|
357
|
+
(template) => {
|
|
358
|
+
if (!template) return "";
|
|
359
|
+
const vars = {
|
|
360
|
+
page: entries.page,
|
|
361
|
+
perPage: entries.perPage,
|
|
362
|
+
totalItems: entries.total,
|
|
363
|
+
totalPages: entries.totalPages
|
|
364
|
+
};
|
|
365
|
+
return template.replace(/{(\w+)}/g, (match, key) => {
|
|
366
|
+
const val = vars[key];
|
|
367
|
+
return val != null ? String(val) : match;
|
|
368
|
+
});
|
|
369
|
+
},
|
|
370
|
+
[entries]
|
|
371
|
+
);
|
|
372
|
+
const value = (0, import_react.useMemo)(
|
|
373
|
+
() => ({
|
|
374
|
+
results: entries,
|
|
375
|
+
facets,
|
|
376
|
+
isLoading,
|
|
377
|
+
collectionResults,
|
|
378
|
+
searchBoxValue,
|
|
379
|
+
setSearchQuery,
|
|
380
|
+
page,
|
|
381
|
+
setPage,
|
|
382
|
+
pageSize: perPage,
|
|
383
|
+
setPageSize,
|
|
384
|
+
pageSizes: pageSizesFlat,
|
|
385
|
+
orderByOptions,
|
|
386
|
+
selectedOrderBy: (urlParams == null ? void 0 : urlParams[UNIFORM_SEARCH_ORDER_BY_KEY]) || defaultOrderByQuery,
|
|
387
|
+
setOrderBy,
|
|
388
|
+
filterOptions: filterBy,
|
|
389
|
+
selectedFilters,
|
|
390
|
+
setSelectedFilters,
|
|
391
|
+
clearFilters,
|
|
392
|
+
selectedCollections,
|
|
393
|
+
setSelectedCollections,
|
|
394
|
+
formatResultsSummary
|
|
395
|
+
}),
|
|
396
|
+
[
|
|
397
|
+
clearFilters,
|
|
398
|
+
collectionResults,
|
|
399
|
+
defaultOrderByQuery,
|
|
400
|
+
entries,
|
|
401
|
+
facets,
|
|
402
|
+
filterBy,
|
|
403
|
+
formatResultsSummary,
|
|
404
|
+
isLoading,
|
|
405
|
+
orderByOptions,
|
|
406
|
+
page,
|
|
407
|
+
pageSizesFlat,
|
|
408
|
+
perPage,
|
|
409
|
+
searchBoxValue,
|
|
410
|
+
selectedCollections,
|
|
411
|
+
selectedFilters,
|
|
412
|
+
setOrderBy,
|
|
413
|
+
setPage,
|
|
414
|
+
setPageSize,
|
|
415
|
+
setSearchQuery,
|
|
416
|
+
setSelectedFilters,
|
|
417
|
+
urlParams
|
|
418
|
+
]
|
|
419
|
+
);
|
|
420
|
+
return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(SearchContext.Provider, { value, children });
|
|
421
|
+
};
|
|
422
|
+
|
|
423
|
+
// src/react/useSearch.ts
|
|
424
|
+
var import_react2 = require("react");
|
|
425
|
+
function useSearch() {
|
|
426
|
+
const context = (0, import_react2.useContext)(SearchContext);
|
|
427
|
+
if (!context) {
|
|
428
|
+
throw new Error("useSearch must be used within a <SearchProvider>");
|
|
429
|
+
}
|
|
430
|
+
return context;
|
|
431
|
+
}
|
|
432
|
+
|
|
433
|
+
// src/react/usePagination.ts
|
|
434
|
+
var import_react3 = require("react");
|
|
435
|
+
var DOTS = "...";
|
|
436
|
+
var range = (start, end) => {
|
|
437
|
+
const length = end - start + 1;
|
|
438
|
+
return Array.from({ length }, (_, idx) => idx + start);
|
|
439
|
+
};
|
|
440
|
+
var usePagination = ({ totalCount, perPage, siblingCount = 1, currentPage }) => (0, import_react3.useMemo)(() => {
|
|
441
|
+
const totalPageCount = Math.ceil(totalCount / perPage);
|
|
442
|
+
const totalPageNumbers = siblingCount + 5;
|
|
443
|
+
if (totalPageNumbers >= totalPageCount) {
|
|
444
|
+
return range(1, totalPageCount);
|
|
445
|
+
}
|
|
446
|
+
const leftSiblingIndex = Math.max(currentPage - siblingCount, 1);
|
|
447
|
+
const rightSiblingIndex = Math.min(currentPage + siblingCount, totalPageCount);
|
|
448
|
+
const shouldShowLeftDots = leftSiblingIndex > 2;
|
|
449
|
+
const shouldShowRightDots = rightSiblingIndex < totalPageCount - 2;
|
|
450
|
+
const firstPageIndex = 1;
|
|
451
|
+
const lastPageIndex = totalPageCount;
|
|
452
|
+
if (!shouldShowLeftDots && shouldShowRightDots) {
|
|
453
|
+
const leftItemCount = 2 + 2 * siblingCount;
|
|
454
|
+
const leftRange = range(1, leftItemCount);
|
|
455
|
+
return [...leftRange, DOTS, totalPageCount];
|
|
456
|
+
}
|
|
457
|
+
if (shouldShowLeftDots && !shouldShowRightDots) {
|
|
458
|
+
const rightItemCount = 2 + 2 * siblingCount;
|
|
459
|
+
const rightRange = range(totalPageCount - rightItemCount + 1, totalPageCount);
|
|
460
|
+
return [firstPageIndex, DOTS, ...rightRange];
|
|
461
|
+
}
|
|
462
|
+
if (shouldShowLeftDots && shouldShowRightDots) {
|
|
463
|
+
const middleRange = range(leftSiblingIndex, rightSiblingIndex);
|
|
464
|
+
return [firstPageIndex, DOTS, ...middleRange, DOTS, lastPageIndex];
|
|
465
|
+
}
|
|
466
|
+
}, [totalCount, perPage, siblingCount, currentPage]);
|
|
467
|
+
|
|
468
|
+
// src/react/useSearchPagination.ts
|
|
469
|
+
var import_react4 = require("react");
|
|
470
|
+
function useSearchPagination(siblingCount) {
|
|
471
|
+
const { page, pageSize, results, setPage, isLoading } = useSearch();
|
|
472
|
+
const pages = usePagination({
|
|
473
|
+
currentPage: page,
|
|
474
|
+
totalCount: results.total,
|
|
475
|
+
perPage: pageSize,
|
|
476
|
+
siblingCount
|
|
477
|
+
}) || [];
|
|
478
|
+
const lastPage = (0, import_react4.useMemo)(
|
|
479
|
+
() => Number(pages[pages.length - 1]) || 0,
|
|
480
|
+
[pages]
|
|
481
|
+
);
|
|
482
|
+
const goToPage = (0, import_react4.useCallback)(
|
|
483
|
+
(p) => {
|
|
484
|
+
if (!isLoading) setPage(p);
|
|
485
|
+
},
|
|
486
|
+
[isLoading, setPage]
|
|
487
|
+
);
|
|
488
|
+
const goToPrev = (0, import_react4.useCallback)(
|
|
489
|
+
() => {
|
|
490
|
+
if (page > 0 && !isLoading) setPage(page - 1);
|
|
491
|
+
},
|
|
492
|
+
[page, isLoading, setPage]
|
|
493
|
+
);
|
|
494
|
+
const goToNext = (0, import_react4.useCallback)(
|
|
495
|
+
() => {
|
|
496
|
+
if (page < lastPage && !isLoading) setPage(page + 1);
|
|
497
|
+
},
|
|
498
|
+
[page, lastPage, isLoading, setPage]
|
|
499
|
+
);
|
|
500
|
+
return {
|
|
501
|
+
pages,
|
|
502
|
+
currentPage: page,
|
|
503
|
+
hasPrev: page > 0,
|
|
504
|
+
hasNext: page < lastPage,
|
|
505
|
+
goToPage,
|
|
506
|
+
goToPrev,
|
|
507
|
+
goToNext,
|
|
508
|
+
isLoading
|
|
509
|
+
};
|
|
510
|
+
}
|
|
511
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
512
|
+
0 && (module.exports = {
|
|
513
|
+
DOTS,
|
|
514
|
+
SearchProvider,
|
|
515
|
+
usePagination,
|
|
516
|
+
useSearch,
|
|
517
|
+
useSearchPagination
|
|
518
|
+
});
|
|
519
|
+
//# sourceMappingURL=react.js.map
|
|
@@ -0,0 +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"]}
|