algolia-experiences 1.8.17 → 1.8.19

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/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  <!-- START doctoc generated TOC please keep comment here to allow auto update -->
2
2
  <!-- DON'T EDIT THIS SECTION, INSTEAD RE-RUN doctoc TO UPDATE -->
3
- **Table of Contents** *generated with [DocToc](https://github.com/thlorenz/doctoc)*
3
+
4
4
  - [`algolia-experiences`](#algolia-experiences)
5
5
  - [Usage](#usage)
6
6
 
@@ -1,4 +1,4 @@
1
- /*! algolia-experiences 1.8.17 | © Algolia, Inc. and contributors; MIT License | https://github.com/algolia/instantsearch */
1
+ /*! algolia-experiences 1.8.19 | © Algolia, Inc. and contributors; MIT License | https://github.com/algolia/instantsearch */
2
2
  (function (factory) {
3
3
  typeof define === 'function' && define.amd ? define(factory) :
4
4
  factory();
@@ -4987,7 +4987,7 @@
4987
4987
  function requireVersion() {
4988
4988
  if (hasRequiredVersion) return version$1;
4989
4989
  hasRequiredVersion = 1;
4990
- version$1 = '3.29.2';
4990
+ version$1 = '3.29.3';
4991
4991
  return version$1;
4992
4992
  }
4993
4993
 
@@ -6886,7 +6886,7 @@
6886
6886
  });
6887
6887
  }
6888
6888
 
6889
- var version = '4.108.0';
6889
+ var version = '4.110.0';
6890
6890
 
6891
6891
  var ANONYMOUS_TOKEN_COOKIE_KEY = '_ALGOLIA';
6892
6892
  function getCookie(name) {
@@ -7374,7 +7374,8 @@
7374
7374
  helper.overrideStateWithoutTriggeringChangeEvent(_object_spread_props(_object_spread({}, helper.state), {
7375
7375
  userToken: normalizedUserToken
7376
7376
  }));
7377
- if (existingToken && existingToken !== userToken) {
7377
+ if (existingToken && existingToken !== normalizedUserToken) {
7378
+ helper._recommendCache = {};
7378
7379
  instantSearchInstance.scheduleSearch();
7379
7380
  }
7380
7381
  }
@@ -7463,14 +7464,17 @@
7463
7464
  } else if (event.insightsMethod) {
7464
7465
  if (event.insightsMethod === 'viewedObjectIDs') {
7465
7466
  var payload = event.payload;
7467
+ var getViewEventKey = function getViewEventKey(objectID) {
7468
+ return payload.queryID ? "".concat(payload.queryID, ":").concat(objectID) : objectID;
7469
+ };
7466
7470
  var difference = payload.objectIDs.filter(function(objectID) {
7467
- return !viewedObjectIDs.has(objectID);
7471
+ return !viewedObjectIDs.has(getViewEventKey(objectID));
7468
7472
  });
7469
7473
  if (difference.length === 0) {
7470
7474
  return;
7471
7475
  }
7472
7476
  difference.forEach(function(objectID) {
7473
- return viewedObjectIDs.add(objectID);
7477
+ return viewedObjectIDs.add(getViewEventKey(objectID));
7474
7478
  });
7475
7479
  payload.objectIDs = difference;
7476
7480
  }
@@ -7578,10 +7582,10 @@
7578
7582
  * and the ability to set credentials via extra parameters when sending events.
7579
7583
  */ function isModernInsightsClient(client) {
7580
7584
  var _split_map = _sliced_to_array((client.version || '').split('.').map(Number), 2), major = _split_map[0], minor = _split_map[1];
7581
- /* eslint-disable instantsearch/naming-convention */ var v3 = major >= 3;
7585
+ /* oxlint-disable instantsearch/naming-convention */ var v3 = major >= 3;
7582
7586
  var v2_6 = major === 2 && minor >= 6;
7583
7587
  var v1_10 = major === 1 && minor >= 10;
7584
- /* eslint-enable instantsearch/naming-convention */ return v3 || v2_6 || v1_10;
7588
+ /* oxlint-enable instantsearch/naming-convention */ return v3 || v2_6 || v1_10;
7585
7589
  }
7586
7590
  /**
7587
7591
  * While `search-insights` supports both string and number user tokens,
@@ -9040,6 +9044,45 @@
9040
9044
  return states;
9041
9045
  }
9042
9046
 
9047
+ /**
9048
+ * Forwards the insights-related search parameters to every Recommend query.
9049
+ *
9050
+ * The insights middleware writes `userToken` and `clickAnalytics` on the main
9051
+ * helper's search state, which only feeds search queries: Recommend queries are
9052
+ * built from their own parameters and never read the search state. Without this,
9053
+ * recommendations can't be personalized, and their responses carry no `queryID`
9054
+ * for the connectors to attribute click and conversion events with.
9055
+ *
9056
+ * Parameters set on a widget win, so an explicit `queryParameters.userToken`
9057
+ * keeps overriding the middleware.
9058
+ *
9059
+ * The fallback query is a regular search, so it gets the same treatment — but
9060
+ * only merged into a `fallbackParameters` the widget already set. See below.
9061
+ */ function addInsightsToRecommendParameters(recommendParameters, param) {
9062
+ var userToken = param.userToken, clickAnalytics = param.clickAnalytics;
9063
+ if (userToken === undefined && clickAnalytics === undefined) {
9064
+ return recommendParameters;
9065
+ }
9066
+ var insightsParameters = _object_spread({}, clickAnalytics === undefined ? {} : {
9067
+ clickAnalytics: clickAnalytics
9068
+ }, userToken === undefined ? {} : {
9069
+ userToken: userToken
9070
+ });
9071
+ return new algoliasearchHelper.RecommendParameters({
9072
+ params: recommendParameters.params.map(function(params) {
9073
+ // v4 `TrendingFacetsQuery` doesn't include `queryParameters` or
9074
+ // `fallbackParameters`, but the v5 API and the helper support them, like
9075
+ // `connectTrendingFacets` does.
9076
+ var queryParameters = params.queryParameters, fallbackParameters = params.fallbackParameters;
9077
+ return _object_spread(_object_spread_props(_object_spread({}, params), {
9078
+ queryParameters: _object_spread({}, insightsParameters, queryParameters)
9079
+ }), fallbackParameters && {
9080
+ fallbackParameters: _object_spread({}, insightsParameters, fallbackParameters)
9081
+ });
9082
+ })
9083
+ });
9084
+ }
9085
+
9043
9086
  function createDocumentationLink(param) {
9044
9087
  var name = param.name, _param_connector = param.connector, connector = _param_connector === void 0 ? false : _param_connector;
9045
9088
  return [
@@ -9618,7 +9661,7 @@
9618
9661
  mainHelper.state
9619
9662
  ].concat(_to_consumable_array(resolveSearchParameters(_this))));
9620
9663
  }, function() {
9621
- return _this.getHelper().recommendState;
9664
+ return addInsightsToRecommendParameters(_this.getHelper().recommendState, mainHelper.state);
9622
9665
  });
9623
9666
  var indexInitialResults = (_instantSearchInstance__initialResults = instantSearchInstance._initialResults) === null || _instantSearchInstance__initialResults === void 0 ? void 0 : _instantSearchInstance__initialResults[this.getIndexId()];
9624
9667
  if (indexInitialResults === null || indexInitialResults === void 0 ? void 0 : indexInitialResults.results) {
@@ -11411,6 +11454,22 @@
11411
11454
  };
11412
11455
  }
11413
11456
 
11457
+ function updateNavigationButtonsProps(param) {
11458
+ var listRef = param.listRef, nextButtonRef = param.nextButtonRef, previousButtonRef = param.previousButtonRef, setCanScrollLeft = param.setCanScrollLeft, setCanScrollRight = param.setCanScrollRight;
11459
+ if (!listRef.current) {
11460
+ return;
11461
+ }
11462
+ var isLeftHidden = listRef.current.scrollLeft <= 0;
11463
+ var isRightHidden = listRef.current.scrollLeft + listRef.current.clientWidth >= listRef.current.scrollWidth;
11464
+ setCanScrollLeft(!isLeftHidden);
11465
+ setCanScrollRight(!isRightHidden);
11466
+ if (previousButtonRef.current) {
11467
+ previousButtonRef.current.hidden = isLeftHidden;
11468
+ }
11469
+ if (nextButtonRef.current) {
11470
+ nextButtonRef.current.hidden = isRightHidden;
11471
+ }
11472
+ }
11414
11473
  var lastCarouselId = 0;
11415
11474
  function generateCarouselId() {
11416
11475
  return "ais-Carousel-".concat(lastCarouselId++);
@@ -11444,7 +11503,7 @@
11444
11503
  }));
11445
11504
  }
11446
11505
  function createCarouselComponent(param) {
11447
- var createElement = param.createElement, Fragment = param.Fragment;
11506
+ var createElement = param.createElement, Fragment = param.Fragment, useEffect = param.useEffect, useRef = param.useRef;
11448
11507
  return function Carousel(userProps) {
11449
11508
  var listRef = userProps.listRef, nextButtonRef = userProps.nextButtonRef, previousButtonRef = userProps.previousButtonRef, carouselIdRef = userProps.carouselIdRef, canScrollLeft = userProps.canScrollLeft, canScrollRight = userProps.canScrollRight, setCanScrollLeft = userProps.setCanScrollLeft, setCanScrollRight = userProps.setCanScrollRight, _userProps_classNames = userProps.classNames, classNames = _userProps_classNames === void 0 ? {} : _userProps_classNames, tmp = userProps.itemComponent, ItemComponent = tmp === void 0 ? createDefaultItemComponent({
11450
11509
  createElement: createElement,
@@ -11475,6 +11534,7 @@
11475
11534
  previousButtonLabel: 'Previous',
11476
11535
  previousButtonTitle: 'Previous'
11477
11536
  }, userTranslations);
11537
+ var previousItemsLengthRef = useRef(items.length);
11478
11538
  var cssClasses = {
11479
11539
  root: cx('ais-Carousel', classNames.root),
11480
11540
  list: cx('ais-Carousel-list', classNames.list),
@@ -11493,27 +11553,33 @@
11493
11553
  listRef.current.scrollLeft += listRef.current.offsetWidth * 0.75;
11494
11554
  }
11495
11555
  }
11496
- function updateNavigationButtonsProps() {
11497
- if (!listRef.current) {
11498
- return;
11499
- }
11500
- var isLeftHidden = listRef.current.scrollLeft <= 0;
11501
- var isRightHidden = listRef.current.scrollLeft + listRef.current.clientWidth >= listRef.current.scrollWidth;
11502
- setCanScrollLeft(!isLeftHidden);
11503
- setCanScrollRight(!isRightHidden);
11504
- if (previousButtonRef.current) {
11505
- previousButtonRef.current.hidden = isLeftHidden;
11506
- }
11507
- if (nextButtonRef.current) {
11508
- nextButtonRef.current.hidden = isRightHidden;
11556
+ useEffect(function() {
11557
+ if (previousItemsLengthRef.current !== items.length) {
11558
+ updateNavigationButtonsProps({
11559
+ listRef: listRef,
11560
+ nextButtonRef: nextButtonRef,
11561
+ previousButtonRef: previousButtonRef,
11562
+ setCanScrollLeft: setCanScrollLeft,
11563
+ setCanScrollRight: setCanScrollRight
11564
+ });
11565
+ previousItemsLengthRef.current = items.length;
11509
11566
  }
11510
- }
11567
+ }, [
11568
+ items.length,
11569
+ listRef,
11570
+ nextButtonRef,
11571
+ previousButtonRef,
11572
+ setCanScrollLeft,
11573
+ setCanScrollRight
11574
+ ]);
11511
11575
  if (items.length === 0) {
11512
11576
  return null;
11513
11577
  }
11578
+ var itemOccurrences = new Map();
11514
11579
  return /*#__PURE__*/ createElement("div", _object_spread_props(_object_spread({}, props), {
11515
11580
  className: cx(cssClasses.root)
11516
11581
  }), HeaderComponent && /*#__PURE__*/ createElement(HeaderComponent, {
11582
+ nbItems: items.length,
11517
11583
  canScrollLeft: canScrollLeft,
11518
11584
  canScrollRight: canScrollRight,
11519
11585
  scrollLeft: scrollLeft,
@@ -11539,7 +11605,15 @@
11539
11605
  "aria-roledescription": "carousel",
11540
11606
  "aria-label": translations.listLabel,
11541
11607
  "aria-live": "polite",
11542
- onScroll: updateNavigationButtonsProps,
11608
+ onScroll: function onScroll() {
11609
+ return updateNavigationButtonsProps({
11610
+ listRef: listRef,
11611
+ nextButtonRef: nextButtonRef,
11612
+ previousButtonRef: previousButtonRef,
11613
+ setCanScrollLeft: setCanScrollLeft,
11614
+ setCanScrollRight: setCanScrollRight
11615
+ });
11616
+ },
11543
11617
  onKeyDown: function onKeyDown(event) {
11544
11618
  if (event.key === 'ArrowLeft') {
11545
11619
  event.preventDefault();
@@ -11550,8 +11624,14 @@
11550
11624
  }
11551
11625
  }
11552
11626
  }, items.map(function(item, index) {
11627
+ var _itemOccurrences_get;
11628
+ var occurrence = (_itemOccurrences_get = itemOccurrences.get(item.objectID)) !== null && _itemOccurrences_get !== void 0 ? _itemOccurrences_get : 0;
11629
+ itemOccurrences.set(item.objectID, occurrence + 1);
11553
11630
  return /*#__PURE__*/ createElement("li", {
11554
- key: item.objectID,
11631
+ key: JSON.stringify([
11632
+ item.objectID,
11633
+ occurrence
11634
+ ]),
11555
11635
  className: cx(cssClasses.item),
11556
11636
  "aria-roledescription": "slide",
11557
11637
  "aria-label": "".concat(index + 1, " of ").concat(items.length),
@@ -11979,7 +12059,9 @@
11979
12059
 
11980
12060
  var Carousel = createCarouselComponent({
11981
12061
  createElement: h$1,
11982
- Fragment: p$1
12062
+ Fragment: p$1,
12063
+ useEffect: s,
12064
+ useRef: A
11983
12065
  });
11984
12066
  function CarouselWithRefs(props) {
11985
12067
  var _useState = _sliced_to_array(y(false), 2), canScrollLeft = _useState[0], setCanScrollLeft = _useState[1];
@@ -11998,28 +12080,31 @@
11998
12080
  }
11999
12081
  function carousel() {
12000
12082
  var _ref = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : {}, cssClasses = _ref.cssClasses, _ref_templates = _ref.templates, templates = _ref_templates === void 0 ? {} : _ref_templates, _ref_showNavigation = _ref.showNavigation, showNavigation = _ref_showNavigation === void 0 ? true : _ref_showNavigation;
12083
+ var previous = templates.previous, next = templates.next, header = templates.header;
12084
+ var HeaderComponent = header ? function(props) {
12085
+ return header(_object_spread({
12086
+ html: m$1
12087
+ }, props));
12088
+ } : undefined;
12089
+ var PreviousIconComponent = previous ? function() {
12090
+ return previous({
12091
+ html: m$1
12092
+ });
12093
+ } : undefined;
12094
+ var NextIconComponent = next ? function() {
12095
+ return next({
12096
+ html: m$1
12097
+ });
12098
+ } : undefined;
12001
12099
  return function CarouselTemplate(param) {
12002
12100
  var items = param.items, widgetTemplates = param.templates, tmp = param.cssClasses, widgetCssClasses = tmp === void 0 ? {} : tmp, _param_sendEvent = param.sendEvent, sendEvent = _param_sendEvent === void 0 ? function() {} : _param_sendEvent;
12003
- var previous = templates.previous, next = templates.next, header = templates.header;
12004
12101
  return /*#__PURE__*/ h$1(CarouselWithRefs, {
12005
12102
  items: items,
12006
12103
  sendEvent: sendEvent,
12007
12104
  itemComponent: widgetTemplates.item,
12008
- headerComponent: header ? function(props) {
12009
- return header(_object_spread({
12010
- html: m$1
12011
- }, props));
12012
- } : undefined,
12013
- previousIconComponent: previous ? function() {
12014
- return previous({
12015
- html: m$1
12016
- });
12017
- } : undefined,
12018
- nextIconComponent: next ? function() {
12019
- return next({
12020
- html: m$1
12021
- });
12022
- } : undefined,
12105
+ headerComponent: HeaderComponent,
12106
+ previousIconComponent: PreviousIconComponent,
12107
+ nextIconComponent: NextIconComponent,
12023
12108
  classNames: _object_spread({}, cssClasses, {
12024
12109
  list: cx(cssClasses === null || cssClasses === void 0 ? void 0 : cssClasses.list, widgetCssClasses === null || widgetCssClasses === void 0 ? void 0 : widgetCssClasses.list),
12025
12110
  item: cx(cssClasses === null || cssClasses === void 0 ? void 0 : cssClasses.item, widgetCssClasses === null || widgetCssClasses === void 0 ? void 0 : widgetCssClasses.item)
@@ -13281,25 +13366,33 @@
13281
13366
  // it is non-empty and the chat is not already processing a message.
13282
13367
  // Returns true when a message was submitted, so callers can clear their input.
13283
13368
  function openChat(chatRenderState) {
13284
- var _ref = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : {}, message = _ref.message, referer = _ref.referer;
13369
+ var _ref = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : {}, message = _ref.message, referer = _ref.referer, turnContext = _ref.turnContext;
13285
13370
  var _ref1;
13286
13371
  var _chatRenderState_setOpen;
13287
13372
  if (!chatRenderState) {
13288
13373
  return false;
13289
13374
  }
13290
- (_chatRenderState_setOpen = chatRenderState.setOpen) === null || _chatRenderState_setOpen === void 0 ? void 0 : _chatRenderState_setOpen.call(chatRenderState, true);
13291
13375
  var trimmed = (_ref1 = message === null || message === void 0 ? void 0 : message.trim()) !== null && _ref1 !== void 0 ? _ref1 : '';
13292
13376
  if (!trimmed) {
13293
- var _chatRenderState_focusInput;
13294
- (_chatRenderState_focusInput = chatRenderState.focusInput) === null || _chatRenderState_focusInput === void 0 ? void 0 : _chatRenderState_focusInput.call(chatRenderState);
13377
+ if (chatRenderState.focusInput) {
13378
+ chatRenderState.focusInput();
13379
+ } else {
13380
+ var _chatRenderState_setOpen1;
13381
+ (_chatRenderState_setOpen1 = chatRenderState.setOpen) === null || _chatRenderState_setOpen1 === void 0 ? void 0 : _chatRenderState_setOpen1.call(chatRenderState, true);
13382
+ }
13295
13383
  return false;
13296
13384
  }
13385
+ (_chatRenderState_setOpen = chatRenderState.setOpen) === null || _chatRenderState_setOpen === void 0 ? void 0 : _chatRenderState_setOpen.call(chatRenderState, true);
13297
13386
  if (isChatBusy(chatRenderState) || !chatRenderState.sendMessage) {
13298
13387
  return false;
13299
13388
  }
13300
- chatRenderState.sendMessage({
13389
+ chatRenderState.sendMessage(_object_spread({
13301
13390
  text: trimmed
13302
- }, referer ? {
13391
+ }, turnContext ? {
13392
+ metadata: {
13393
+ turnContext: turnContext
13394
+ }
13395
+ } : {}), referer ? {
13303
13396
  headers: {
13304
13397
  'x-algolia-referer': referer
13305
13398
  }