@usereactify/search 3.10.1 → 3.10.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/provider.js CHANGED
@@ -63,11 +63,29 @@ const ConfiguredProvider = (props) => {
63
63
  const urlParams = new URLSearchParams(window.location.search);
64
64
  return (_a = urlParams.get("q")) !== null && _a !== void 0 ? _a : undefined;
65
65
  }, [window.location.search]);
66
+ const searchSortFromURL = react_1.default.useMemo(() => {
67
+ var _a;
68
+ if (typeof window === "undefined")
69
+ return undefined;
70
+ const urlParams = new URLSearchParams(window.location.search);
71
+ return (_a = urlParams.get("sort")) !== null && _a !== void 0 ? _a : undefined;
72
+ }, [window.location.search]);
66
73
  const [searchQuery, setSearchQuery] = react_1.default.useState(searchQueryFromURL);
74
+ const { sortOption, sortOptions, setSortOption } = useSortState(config, collection);
67
75
  react_1.default.useEffect(() => {
68
- if (searchQuery !== searchQueryFromURL)
76
+ if (searchQueryFromURL && searchQuery !== searchQueryFromURL)
69
77
  setSearchQuery(searchQueryFromURL);
70
78
  }, [searchQueryFromURL]);
79
+ react_1.default.useEffect(() => {
80
+ if (searchSortFromURL && (sortOption === null || sortOption === void 0 ? void 0 : sortOption.id) !== searchSortFromURL) {
81
+ setSortOption(searchSortFromURL, true);
82
+ }
83
+ }, [searchSortFromURL]);
84
+ react_1.default.useEffect(() => {
85
+ if (window.location.search === "" && (sortOption === null || sortOption === void 0 ? void 0 : sortOption.id)) {
86
+ setSortOption(sortOption.id, true);
87
+ }
88
+ }, [window.location.href]);
71
89
  const [showInstantSearchResults, setShowInstantSearchResults] = react_1.default.useState(false);
72
90
  const submitSearch = react_1.default.useCallback((localSearchQuery) => {
73
91
  const actualSearchQuery = localSearchQuery !== null && localSearchQuery !== void 0 ? localSearchQuery : searchQuery;
@@ -86,7 +104,6 @@ const ConfiguredProvider = (props) => {
86
104
  window.location.href = `/search?q=${actualSearchQuery}`;
87
105
  }
88
106
  }, [searchQuery]);
89
- const { sortOption, sortOptions, setSortOption } = useSortState(config, collection);
90
107
  // do not attempt to resolve a filter stack if in instantSearch mode
91
108
  const filterStack = instantSearch
92
109
  ? undefined
@@ -152,9 +169,16 @@ const useSortState = (config, collection) => {
152
169
  }, [config, collection]);
153
170
  const [sortOptionState, setSortOptionState] = react_1.default.useState((_a = sortOptions[0]) === null || _a === void 0 ? void 0 : _a.id);
154
171
  const sortOption = react_1.default.useMemo(() => sortOptions.find(({ id }) => id === sortOptionState) || sortOptions[0], [sortOptions, sortOptionState]);
155
- const setSortOption = react_1.default.useCallback((sortOptionId) => {
172
+ const setSortOption = react_1.default.useCallback((sortOptionId, ignoreHistoryState = false) => {
156
173
  setSortOptionState(sortOptionId);
157
- }, []);
174
+ if (!ignoreHistoryState) {
175
+ const url = new URL(window.location.href);
176
+ url.searchParams.has("sort")
177
+ ? url.searchParams.set("sort", sortOptionId)
178
+ : url.searchParams.append("sort", sortOptionId);
179
+ window.history.pushState({}, "", url.toString());
180
+ }
181
+ }, [window.location.href]);
158
182
  return react_1.default.useMemo(() => ({ sortOptions, sortOption, setSortOption }), [sortOption, sortOptions, setSortOption]);
159
183
  };
160
184
  // resolve the "filter" in use for this view
@@ -171,6 +195,12 @@ const useFilterStack = (config, collection, filterStackId) => react_1.default.us
171
195
  if (filterStack)
172
196
  return filterStack;
173
197
  }
198
+ // automatically select filter stack by collection if provided
199
+ if (collection === null || collection === void 0 ? void 0 : collection.handle) {
200
+ const filterStack = config.filters.find((filter) => { var _a; return (_a = filter.collections) === null || _a === void 0 ? void 0 : _a.includes(collection.handle); });
201
+ if (filterStack)
202
+ return filterStack;
203
+ }
174
204
  const type = !!collection ? "collection" : "search";
175
205
  return ((_a = config.filters.find((filter) => type === filter.type)) !== null && _a !== void 0 ? _a : config.filters[0]);
176
206
  }, [config, collection]);
@@ -120,6 +120,7 @@ export interface Filter {
120
120
  pageSize: number;
121
121
  keywords: string[];
122
122
  defaultSort: string;
123
+ collections: string[];
123
124
  type: "search" | "collection";
124
125
  paginationType: "pagination" | "load_more" | "next_prev" | "infinite_scroll";
125
126
  inventoryVisibility: "show_all" | "hide_products" | "hide_variants" | "hide_all";
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@usereactify/search",
3
3
  "description": "React UI library for Reactify Search",
4
- "version": "3.10.1",
4
+ "version": "3.10.4",
5
5
  "license": "MIT",
6
6
  "main": "dist/index.js",
7
7
  "types": "dist/index.d.ts",