@usereactify/search 3.9.1 → 3.10.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.
@@ -18,11 +18,12 @@ exports.Filter = void 0;
18
18
  const react_1 = __importDefault(require("react"));
19
19
  const MultiList_1 = __importDefault(require("@appbaseio/reactivesearch/lib/components/list/MultiList"));
20
20
  const SingleList_1 = __importDefault(require("@appbaseio/reactivesearch/lib/components/list/SingleList"));
21
- const FilterList_1 = require("./FilterList");
22
21
  const hooks_1 = require("../hooks");
22
+ const FilterList_1 = require("./FilterList");
23
+ const hooks_2 = require("../hooks");
23
24
  const Filter = (props) => {
24
25
  const { filter } = props;
25
- const reactiveFilterListProps = (0, hooks_1.useReactiveFilterListProps)(filter);
26
+ const reactiveFilterListProps = (0, hooks_2.useReactiveFilterListProps)(filter);
26
27
  if ("single" === filter.displayType) {
27
28
  return (react_1.default.createElement(SingleList_1.default, Object.assign({}, reactiveFilterListProps, { render: (reactivesearchFilterProps) => (react_1.default.createElement(FilterListInner, Object.assign({}, props, { reactivesearchFilterProps: reactivesearchFilterProps }))) })));
28
29
  }
@@ -36,18 +37,30 @@ exports.Filter = Filter;
36
37
  // inner component exists only so we can use memos in reactivesearch render functions
37
38
  const FilterListInner = (props) => {
38
39
  const { filter, noWrapper, renderFilterList, reactivesearchFilterProps } = props, otherProps = __rest(props, ["filter", "noWrapper", "renderFilterList", "reactivesearchFilterProps"]);
39
- const filterListProps = (0, hooks_1.useFilterListProps)(filter, reactivesearchFilterProps);
40
+ const { track } = (0, hooks_1.useAnalytics)();
41
+ const _a = (0, hooks_2.useFilterListProps)(filter, reactivesearchFilterProps), { handleChange } = _a, filterListProps = __rest(_a, ["handleChange"]);
42
+ const handleFilterChange = react_1.default.useCallback((value) => {
43
+ handleChange(value);
44
+ track({
45
+ eventName: "filterChange",
46
+ payload: {
47
+ name: filter.name,
48
+ value: value,
49
+ },
50
+ });
51
+ }, [filterListProps]);
52
+ const updatedFilterListProps = Object.assign(Object.assign({}, filterListProps), { handleChange: handleFilterChange });
40
53
  // hide entire filter when no options available
41
54
  if (0 === filterListProps.options.length)
42
55
  return null;
43
56
  if (renderFilterList) {
44
- return renderFilterList(Object.assign({ filterListProps, filter }, otherProps));
57
+ return renderFilterList(Object.assign({ filterListProps: updatedFilterListProps, filter }, otherProps));
45
58
  }
46
59
  if (noWrapper) {
47
- return react_1.default.createElement(FilterList_1.FilterList, Object.assign({}, filterListProps));
60
+ return react_1.default.createElement(FilterList_1.FilterList, Object.assign({}, updatedFilterListProps));
48
61
  }
49
62
  return (react_1.default.createElement(FilterWrapper, Object.assign({}, props),
50
- react_1.default.createElement(FilterList_1.FilterList, Object.assign({}, filterListProps))));
63
+ react_1.default.createElement(FilterList_1.FilterList, Object.assign({}, updatedFilterListProps))));
51
64
  };
52
65
  // wrap the filter with a clickable title
53
66
  const FilterWrapper = ({ filter, children, collapsed, shouldRender, collapsedToggle }) => {
@@ -7,7 +7,7 @@ exports.FilterList = void 0;
7
7
  const react_1 = __importDefault(require("react"));
8
8
  const FilterList = ({ options, handleChange }) => (react_1.default.createElement("ul", null, options.map(({ key, doc_count, checked }) => (react_1.default.createElement("li", { key: key },
9
9
  react_1.default.createElement("label", null,
10
- react_1.default.createElement("input", { value: key, type: "checkbox", checked: checked, onChange: handleChange }),
10
+ react_1.default.createElement("input", { value: key, type: "checkbox", checked: checked, onChange: ({ target: { value } }) => handleChange(value) }),
11
11
  key,
12
12
  " (",
13
13
  doc_count,
@@ -35,7 +35,7 @@ const useReactiveDataSearchProps = (props = {}) => {
35
35
  }, [submitSearch]);
36
36
  const { track } = (0, __1.useAnalytics)();
37
37
  const trackQuery = react_1.default.useCallback(() => {
38
- if (!searchQuery)
38
+ if (!searchQuery || (searchQuery && searchQuery.length < 3))
39
39
  return;
40
40
  track({ eventName: "search", payload: { searchTerm: searchQuery } });
41
41
  }, [searchQuery, track]);
@@ -1,7 +1,7 @@
1
1
  export declare const useAnalytics: () => {
2
2
  track: (event: TrackEvent) => Promise<import("axios").AxiosResponse<any, any> | undefined>;
3
3
  };
4
- export declare type TrackEvent = TrackEvent.SearchEvent | TrackEvent.ZeroResultsEvent | TrackEvent.ViewProductEvent | TrackEvent.ClickProductEvent;
4
+ export declare type TrackEvent = TrackEvent.SearchEvent | TrackEvent.ZeroResultsEvent | TrackEvent.ViewProductEvent | TrackEvent.ClickProductEvent | TrackEvent.ViewPromotionEvent | TrackEvent.ClickPromotionEvent | TrackEvent.PaginationChangeEvent | TrackEvent.SortChangeEvent | TrackEvent.FilterChangeEvent;
5
5
  export declare namespace TrackEvent {
6
6
  interface SearchEvent {
7
7
  eventName: "search";
@@ -39,6 +39,55 @@ export declare namespace TrackEvent {
39
39
  elasticProduct: ElasticProduct;
40
40
  }
41
41
  }
42
+ interface ViewPromotionEvent {
43
+ eventName: "viewPromotion";
44
+ payload: ViewPromotionEvent.Payload;
45
+ }
46
+ namespace ViewPromotionEvent {
47
+ interface Payload {
48
+ link: string;
49
+ title: string;
50
+ }
51
+ }
52
+ interface ClickPromotionEvent {
53
+ eventName: "clickPromotion";
54
+ payload: ClickPromotionEvent.Payload;
55
+ }
56
+ namespace ClickPromotionEvent {
57
+ interface Payload {
58
+ link: string;
59
+ title: string;
60
+ }
61
+ }
62
+ interface PaginationChangeEvent {
63
+ eventName: "paginationChange";
64
+ payload: PaginationChangeEvent.Payload;
65
+ }
66
+ namespace PaginationChangeEvent {
67
+ interface Payload {
68
+ page: number;
69
+ source: "search" | "collection";
70
+ }
71
+ }
72
+ interface SortChangeEvent {
73
+ eventName: "sortChange";
74
+ payload: SortChangeEvent.Payload;
75
+ }
76
+ namespace SortChangeEvent {
77
+ interface Payload {
78
+ type: string;
79
+ }
80
+ }
81
+ interface FilterChangeEvent {
82
+ eventName: "filterChange";
83
+ payload: FilterChangeEvent.Payload;
84
+ }
85
+ namespace FilterChangeEvent {
86
+ interface Payload {
87
+ name: string;
88
+ value: string;
89
+ }
90
+ }
42
91
  interface ElasticProduct {
43
92
  id: number;
44
93
  title: string;
@@ -41,6 +41,14 @@ function getTrackEvents(event) {
41
41
  },
42
42
  ];
43
43
  break;
44
+ case "zeroResults":
45
+ events = [
46
+ {
47
+ eventName,
48
+ payload: event.payload,
49
+ },
50
+ ];
51
+ break;
44
52
  case "viewProduct":
45
53
  events = [
46
54
  {
@@ -57,7 +65,39 @@ function getTrackEvents(event) {
57
65
  },
58
66
  ];
59
67
  break;
60
- case "zeroResults":
68
+ case "viewPromotion":
69
+ events = [
70
+ {
71
+ eventName,
72
+ payload: event.payload,
73
+ },
74
+ ];
75
+ break;
76
+ case "clickPromotion":
77
+ events = [
78
+ {
79
+ eventName,
80
+ payload: event.payload,
81
+ },
82
+ ];
83
+ break;
84
+ case "paginationChange":
85
+ events = [
86
+ {
87
+ eventName,
88
+ payload: event.payload,
89
+ },
90
+ ];
91
+ break;
92
+ case "sortChange":
93
+ events = [
94
+ {
95
+ eventName,
96
+ payload: event.payload,
97
+ },
98
+ ];
99
+ break;
100
+ case "filterChange":
61
101
  events = [
62
102
  {
63
103
  eventName,
@@ -11,7 +11,7 @@ export declare const useFilterListProps: (filter: ConfigFilterOption, reactivese
11
11
  totalSelected: number;
12
12
  loading: boolean;
13
13
  error: Error | null;
14
- handleChange: () => void;
14
+ handleChange: (value: string) => void;
15
15
  data: {
16
16
  doc_count: number;
17
17
  key: string;
@@ -5,8 +5,10 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
6
  exports.usePages = void 0;
7
7
  const react_1 = __importDefault(require("react"));
8
+ const hooks_1 = require("../hooks");
8
9
  const usePages = (props) => {
9
10
  const { pages, setPage, totalPages, currentPage } = props;
11
+ const { track } = (0, hooks_1.useAnalytics)();
10
12
  const buildPagePath = react_1.default.useCallback((page) => {
11
13
  const currentPath = window.location.pathname;
12
14
  return currentPath.includes("page=")
@@ -22,6 +24,15 @@ const usePages = (props) => {
22
24
  if (!hasNextPage)
23
25
  return;
24
26
  setPage(currentPage + 1);
27
+ track({
28
+ eventName: "paginationChange",
29
+ payload: {
30
+ page: currentPage + 1,
31
+ source: window.location.pathname.includes("/search")
32
+ ? "search"
33
+ : "collection",
34
+ },
35
+ });
25
36
  }, [hasNextPage, currentPage, setPage]);
26
37
  const hasPreviousPage = react_1.default.useMemo(() => actualCurrentPage > 1, [actualCurrentPage]);
27
38
  const handlePreviousPage = react_1.default.useCallback((event) => {
@@ -29,6 +40,15 @@ const usePages = (props) => {
29
40
  if (!hasPreviousPage)
30
41
  return;
31
42
  setPage(currentPage - 1);
43
+ track({
44
+ eventName: "paginationChange",
45
+ payload: {
46
+ page: currentPage - 1,
47
+ source: window.location.pathname.includes("/search")
48
+ ? "search"
49
+ : "collection",
50
+ },
51
+ });
32
52
  }, [hasPreviousPage, currentPage, setPage]);
33
53
  return react_1.default.useMemo(() => ({
34
54
  pagesToShow,
@@ -1,9 +1,24 @@
1
1
  "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
2
5
  Object.defineProperty(exports, "__esModule", { value: true });
3
6
  exports.useSort = void 0;
7
+ const react_1 = __importDefault(require("react"));
4
8
  const provider_1 = require("../provider");
9
+ const hooks_1 = require("../hooks");
5
10
  const useSort = () => {
11
+ const { track } = (0, hooks_1.useAnalytics)();
6
12
  const { sortOption, sortOptions, setSortOption } = (0, provider_1.useContext)();
7
- return { sortOption, sortOptions, setSortOption };
13
+ const handleSortChange = react_1.default.useCallback((sortOptionId) => {
14
+ setSortOption(sortOptionId);
15
+ track({
16
+ eventName: "sortChange",
17
+ payload: {
18
+ type: sortOptionId,
19
+ },
20
+ });
21
+ }, [track, setSortOption]);
22
+ return { sortOption, sortOptions, setSortOption: handleSortChange };
8
23
  };
9
24
  exports.useSort = useSort;
@@ -11,6 +11,7 @@ declare type Context = {
11
11
  collection?: Collection;
12
12
  instantSearch: boolean;
13
13
  credentials: Credentials;
14
+ onRedirect?: (type: "redirect" | "search", url: string) => void;
14
15
  submitSearch: (localSearchQuery?: string) => void;
15
16
  setSearchQuery: (searchQuery: string) => void;
16
17
  setSortOption: (sortOptionId: string) => void;
@@ -29,6 +30,7 @@ declare type Props = {
29
30
  collection?: Collection;
30
31
  noReactiveBase?: boolean;
31
32
  instantSearch?: boolean;
33
+ onRedirect?: (type: "redirect" | "search", url: string) => void;
32
34
  credentials?: Credentials;
33
35
  theme?: Theme;
34
36
  /** Array of additional component IDs managed outside of Reactify Search */
package/dist/provider.js CHANGED
@@ -16,8 +16,8 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
16
16
  Object.defineProperty(exports, "__esModule", { value: true });
17
17
  exports.useContext = exports.ConfiguredProvider = exports.Provider = void 0;
18
18
  const react_1 = __importDefault(require("react"));
19
- const UtilityAuthenticatedReactiveBase_1 = require("./utility/UtilityAuthenticatedReactiveBase");
20
19
  const hooks_1 = require("./hooks");
20
+ const UtilityAuthenticatedReactiveBase_1 = require("./utility/UtilityAuthenticatedReactiveBase");
21
21
  const debug = require("debug")("reactify-search:Provider");
22
22
  const Context = react_1.default.createContext(undefined);
23
23
  const defaultCredentials = {
@@ -38,7 +38,7 @@ const Provider = (_a) => {
38
38
  exports.Provider = Provider;
39
39
  const ConfiguredProvider = (props) => {
40
40
  var _a, _b;
41
- const { index, config, children, collection, instantSearch, filterStackId, noReactiveBase, shopifyPermanentDomain, additionalComponentIds, } = props;
41
+ const { index, config, children, collection, instantSearch, filterStackId, noReactiveBase, shopifyPermanentDomain, additionalComponentIds, onRedirect, } = props;
42
42
  const credentials = (_a = props.credentials) !== null && _a !== void 0 ? _a : defaultCredentials;
43
43
  const theme = (_b = props.theme) !== null && _b !== void 0 ? _b : {
44
44
  typography: {
@@ -56,16 +56,36 @@ const ConfiguredProvider = (props) => {
56
56
  react_1.default.useEffect(() => {
57
57
  debug("props", props);
58
58
  }, [props]);
59
- // @todo make this hackable with a prop
60
- // https://gitlab.com/reactifyapps/reactify-search-frontend/-/issues/1
61
59
  const searchQueryFromURL = react_1.default.useMemo(() => {
62
60
  var _a;
63
61
  if (typeof window === "undefined")
64
62
  return undefined;
65
63
  const urlParams = new URLSearchParams(window.location.search);
66
64
  return (_a = urlParams.get("q")) !== null && _a !== void 0 ? _a : undefined;
67
- }, []);
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]);
68
73
  const [searchQuery, setSearchQuery] = react_1.default.useState(searchQueryFromURL);
74
+ const { sortOption, sortOptions, setSortOption } = useSortState(config, collection);
75
+ react_1.default.useEffect(() => {
76
+ if (searchQueryFromURL && searchQuery !== searchQueryFromURL)
77
+ setSearchQuery(searchQueryFromURL);
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(sortOptions[0].id, true);
87
+ }
88
+ }, [window.location.href]);
69
89
  const [showInstantSearchResults, setShowInstantSearchResults] = react_1.default.useState(false);
70
90
  const submitSearch = react_1.default.useCallback((localSearchQuery) => {
71
91
  const actualSearchQuery = localSearchQuery !== null && localSearchQuery !== void 0 ? localSearchQuery : searchQuery;
@@ -73,12 +93,17 @@ const ConfiguredProvider = (props) => {
73
93
  return;
74
94
  const redirect = config.redirects.find((redirect) => redirect.query.trim().toLowerCase() ===
75
95
  actualSearchQuery.trim().toLowerCase());
76
- if (redirect)
96
+ setShowInstantSearchResults(false);
97
+ if (onRedirect) {
98
+ onRedirect(redirect ? "redirect" : "search", redirect ? redirect.url : `/search?q=${actualSearchQuery}`);
99
+ }
100
+ else if (redirect) {
77
101
  window.location.href = redirect.url;
78
- else
102
+ }
103
+ else {
79
104
  window.location.href = `/search?q=${actualSearchQuery}`;
105
+ }
80
106
  }, [searchQuery]);
81
- const { sortOption, sortOptions, setSortOption } = useSortState(config, collection);
82
107
  // do not attempt to resolve a filter stack if in instantSearch mode
83
108
  const filterStack = instantSearch
84
109
  ? undefined
@@ -94,6 +119,7 @@ const ConfiguredProvider = (props) => {
94
119
  filterStack,
95
120
  sortOption,
96
121
  sortOptions,
122
+ onRedirect,
97
123
  submitSearch,
98
124
  setSortOption,
99
125
  setSearchQuery,
@@ -114,6 +140,7 @@ const ConfiguredProvider = (props) => {
114
140
  filterStack,
115
141
  sortOption,
116
142
  sortOptions,
143
+ onRedirect,
117
144
  submitSearch,
118
145
  instantSearch,
119
146
  additionalComponentIds,
@@ -142,7 +169,16 @@ const useSortState = (config, collection) => {
142
169
  }, [config, collection]);
143
170
  const [sortOptionState, setSortOptionState] = react_1.default.useState((_a = sortOptions[0]) === null || _a === void 0 ? void 0 : _a.id);
144
171
  const sortOption = react_1.default.useMemo(() => sortOptions.find(({ id }) => id === sortOptionState) || sortOptions[0], [sortOptions, sortOptionState]);
145
- const setSortOption = react_1.default.useCallback((sortOptionId) => setSortOptionState(sortOptionId), []);
172
+ const setSortOption = react_1.default.useCallback((sortOptionId, ignoreHistoryState = false) => {
173
+ setSortOptionState(sortOptionId);
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]);
146
182
  return react_1.default.useMemo(() => ({ sortOptions, sortOption, setSortOption }), [sortOption, sortOptions, setSortOption]);
147
183
  };
148
184
  // resolve the "filter" in use for this view
@@ -4,7 +4,10 @@ declare type Props = {
4
4
  pagePosition: number;
5
5
  document: ElasticCallout;
6
6
  callout: ElasticCallout["callout"];
7
- render?: (props: Omit<Props, "render">) => JSX.Element;
7
+ render?: (props: Omit<Props, "render"> & {
8
+ itemRef: (node?: Element | null) => void;
9
+ handleClick: () => void;
10
+ }) => JSX.Element;
8
11
  };
9
12
  export declare const ResultCardCallout: React.FC<Props>;
10
13
  export {};
@@ -1,23 +1,41 @@
1
1
  "use strict";
2
- var __rest = (this && this.__rest) || function (s, e) {
3
- var t = {};
4
- for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
5
- t[p] = s[p];
6
- if (s != null && typeof Object.getOwnPropertySymbols === "function")
7
- for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
8
- if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
9
- t[p[i]] = s[p[i]];
10
- }
11
- return t;
12
- };
13
2
  var __importDefault = (this && this.__importDefault) || function (mod) {
14
3
  return (mod && mod.__esModule) ? mod : { "default": mod };
15
4
  };
16
5
  Object.defineProperty(exports, "__esModule", { value: true });
17
6
  exports.ResultCardCallout = void 0;
18
7
  const react_1 = __importDefault(require("react"));
8
+ const react_intersection_observer_1 = require("react-intersection-observer");
9
+ const hooks_1 = require("../hooks");
19
10
  const ResultCardCallout = (props) => {
20
- const { callout } = props;
11
+ const { callout, render } = props;
12
+ const { track } = (0, hooks_1.useAnalytics)();
13
+ const { ref, inView } = (0, react_intersection_observer_1.useInView)({
14
+ threshold: 0.5,
15
+ triggerOnce: true,
16
+ });
17
+ const handleClick = react_1.default.useCallback(() => {
18
+ track({
19
+ eventName: "clickPromotion",
20
+ payload: {
21
+ link: callout.link,
22
+ title: callout.title,
23
+ },
24
+ });
25
+ }, [track, callout]);
26
+ const handleView = react_1.default.useCallback(() => {
27
+ track({
28
+ eventName: "viewPromotion",
29
+ payload: {
30
+ link: callout.link,
31
+ title: callout.title,
32
+ },
33
+ });
34
+ }, [track, callout]);
35
+ react_1.default.useEffect(() => {
36
+ if (inView)
37
+ handleView();
38
+ }, [inView]);
21
39
  const styleProp = react_1.default.useMemo(() => {
22
40
  var _a, _b;
23
41
  return ({
@@ -25,14 +43,11 @@ const ResultCardCallout = (props) => {
25
43
  gridColumn: `span ${(_b = callout.displayColumns) !== null && _b !== void 0 ? _b : 1}`,
26
44
  });
27
45
  }, [callout]);
28
- return (react_1.default.createElement("article", { style: styleProp },
29
- react_1.default.createElement(ResultCardCalloutInner, Object.assign({}, props))));
30
- };
31
- exports.ResultCardCallout = ResultCardCallout;
32
- const ResultCardCalloutInner = (_a) => {
33
- var { render } = _a, props = __rest(_a, ["render"]);
34
- const { callout } = props;
35
46
  if (render)
36
- return render(props);
37
- return react_1.default.createElement("p", null, callout.title);
47
+ return render(Object.assign(Object.assign({}, props), { itemRef: ref, handleClick }));
48
+ return (react_1.default.createElement("article", { ref: ref, style: styleProp },
49
+ react_1.default.createElement("a", { href: callout.link, onClick: handleClick },
50
+ callout.desktopImage && (react_1.default.createElement("img", { src: callout.desktopImage, width: "100%" })),
51
+ callout.title)));
38
52
  };
53
+ exports.ResultCardCallout = ResultCardCallout;
@@ -3,6 +3,7 @@ import { ReactivesearchResultProps } from "../types/reactivesearch";
3
3
  declare type Props = ReactivesearchResultProps & {
4
4
  render?: (props: Omit<Props, "render"> & {
5
5
  hasMore: boolean;
6
+ handleLoadMore: () => void;
6
7
  }) => JSX.Element;
7
8
  };
8
9
  export declare const ResultLoadMoreButton: React.FC<Props>;
@@ -1,4 +1,23 @@
1
1
  "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
5
+ }) : (function(o, m, k, k2) {
6
+ if (k2 === undefined) k2 = k;
7
+ o[k2] = m[k];
8
+ }));
9
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
10
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
11
+ }) : function(o, v) {
12
+ o["default"] = v;
13
+ });
14
+ var __importStar = (this && this.__importStar) || function (mod) {
15
+ if (mod && mod.__esModule) return mod;
16
+ var result = {};
17
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
18
+ __setModuleDefault(result, mod);
19
+ return result;
20
+ };
2
21
  var __rest = (this && this.__rest) || function (s, e) {
3
22
  var t = {};
4
23
  for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
@@ -10,18 +29,33 @@ var __rest = (this && this.__rest) || function (s, e) {
10
29
  }
11
30
  return t;
12
31
  };
13
- var __importDefault = (this && this.__importDefault) || function (mod) {
14
- return (mod && mod.__esModule) ? mod : { "default": mod };
15
- };
16
32
  Object.defineProperty(exports, "__esModule", { value: true });
17
33
  exports.ResultLoadMoreButton = void 0;
18
- const react_1 = __importDefault(require("react"));
34
+ const react_1 = __importStar(require("react"));
35
+ const hooks_1 = require("../hooks");
36
+ const hooks_2 = require("../hooks");
19
37
  const ResultLoadMoreButton = (_a) => {
20
- var { render } = _a, props = __rest(_a, ["render"]);
21
- const { resultStats, loadMore } = props;
38
+ var { render, loadMore } = _a, props = __rest(_a, ["render", "loadMore"]);
39
+ const { track } = (0, hooks_1.useAnalytics)();
40
+ const filterStack = (0, hooks_2.useFilterStack)();
41
+ const { resultStats } = props;
22
42
  const hasMore = react_1.default.useMemo(() => resultStats.displayedResults !== resultStats.numberOfResults, [resultStats]);
43
+ const handleLoadMore = (0, react_1.useCallback)(() => {
44
+ loadMore();
45
+ track({
46
+ eventName: "paginationChange",
47
+ payload: {
48
+ page: Math.ceil(resultStats.displayedResults / ((filterStack === null || filterStack === void 0 ? void 0 : filterStack.pageSize) || 20)) + 1,
49
+ source: window.location.pathname.includes("/search")
50
+ ? "search"
51
+ : "collection",
52
+ },
53
+ });
54
+ }, [loadMore, track, resultStats, filterStack]);
23
55
  if (render)
24
- return render(Object.assign(Object.assign({}, props), { hasMore }));
56
+ return render(Object.assign(Object.assign({}, props), { hasMore,
57
+ // @todo: remove legacy loadMore prop in future versions
58
+ loadMore: handleLoadMore, handleLoadMore }));
25
59
  return react_1.default.createElement("button", { onClick: () => loadMore() }, "Load more");
26
60
  };
27
61
  exports.ResultLoadMoreButton = ResultLoadMoreButton;
@@ -2,7 +2,9 @@ import React from "react";
2
2
  import { usePages } from "../hooks";
3
3
  import { ReactivesearchPaginationProps } from "../types/reactivesearch";
4
4
  declare type Props = ReactivesearchPaginationProps & {
5
- render?: (props: Omit<Props, "render"> & ReturnType<typeof usePages>) => JSX.Element;
5
+ render?: (props: Omit<Props, "render"> & ReturnType<typeof usePages> & {
6
+ handlePageChange: (event: any, page: number) => void;
7
+ }) => JSX.Element;
6
8
  };
7
9
  export declare const ResultPagination: React.FC<Props>;
8
10
  export {};
@@ -19,15 +19,25 @@ const react_1 = __importDefault(require("react"));
19
19
  const hooks_1 = require("../hooks");
20
20
  const ResultPagination = (_a) => {
21
21
  var { render } = _a, props = __rest(_a, ["render"]);
22
+ const { track } = (0, hooks_1.useAnalytics)();
22
23
  const pageProps = (0, hooks_1.usePages)(props);
23
- if (render)
24
- return render(Object.assign(Object.assign({}, props), pageProps));
25
24
  const { pagesToShow, buildPagePath } = pageProps;
26
25
  const { currentPage, totalPages, setPage } = props;
27
26
  const handlePageChange = react_1.default.useCallback((event, newPage) => {
28
27
  event.preventDefault();
29
28
  setPage(newPage);
30
- }, [setPage]);
29
+ track({
30
+ eventName: "paginationChange",
31
+ payload: {
32
+ page: newPage + 1,
33
+ source: window.location.pathname.includes("/search")
34
+ ? "search"
35
+ : "collection",
36
+ },
37
+ });
38
+ }, [setPage, track]);
39
+ if (render)
40
+ return render(Object.assign(Object.assign(Object.assign({}, props), pageProps), { handlePageChange }));
31
41
  if (!totalPages)
32
42
  return null;
33
43
  return (react_1.default.createElement("nav", null,
@@ -3,3 +3,4 @@ export * from "./ResultCard";
3
3
  export * from "./ResultPagination";
4
4
  export * from "./ResultStateProvider";
5
5
  export * from "./ResultLoadMoreButton";
6
+ export * from "./ResultPaginationNextPrev";
@@ -15,3 +15,4 @@ __exportStar(require("./ResultCard"), exports);
15
15
  __exportStar(require("./ResultPagination"), exports);
16
16
  __exportStar(require("./ResultStateProvider"), exports);
17
17
  __exportStar(require("./ResultLoadMoreButton"), exports);
18
+ __exportStar(require("./ResultPaginationNextPrev"), exports);
@@ -2,7 +2,7 @@ import { ElasticDocument, ElasticHit } from "./elastic";
2
2
  export interface ReactivesearchFilterProps {
3
3
  loading: boolean;
4
4
  error: Error | null;
5
- handleChange: () => void;
5
+ handleChange: (value: string) => void;
6
6
  data: {
7
7
  doc_count: number;
8
8
  key: string;
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.9.1",
4
+ "version": "3.10.2",
5
5
  "license": "MIT",
6
6
  "main": "dist/index.js",
7
7
  "types": "dist/index.d.ts",