@xapp/chat-widget 1.54.0 → 1.54.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/dist/index.js CHANGED
@@ -2590,10 +2590,15 @@ function getItemsLength(result) {
2590
2590
 
2591
2591
  var SuggestionsList = function (props) {
2592
2592
  var suggestions = props.suggestions, itemActions = props.itemActions, className = props.className;
2593
- var length = React.useMemo(function () { return getItemsLength(suggestions); }, [suggestions]);
2593
+ var length = React.useMemo(function () {
2594
+ if (suggestions) {
2595
+ return getItemsLength(suggestions);
2596
+ }
2597
+ return 0;
2598
+ }, [suggestions]);
2594
2599
  var currentIndex = length >= 0 ? props.index : NaN;
2595
2600
  var indexWalker = 0;
2596
- return (React__default["default"].createElement("div", { className: "xappw-suggestions-list ".concat(className || "") }, suggestions.map(function (group, index) {
2601
+ return (React__default["default"].createElement("div", { className: "xappw-suggestions-list ".concat(className || "") }, suggestions === null || suggestions === void 0 ? void 0 : suggestions.map(function (group, index) {
2597
2602
  var res = (React__default["default"].createElement(SuggestionsGroup, { key: index, group: group, currentIndex: currentIndex - indexWalker, itemActions: itemActions, onItemClick: props.onItemClick, onItemHover: props.onItemHover, onSpanClick: props.onSpanClick }));
2598
2603
  indexWalker += group.items.length;
2599
2604
  return res;
@@ -8870,10 +8875,19 @@ function createActions(onItemUse) {
8870
8875
  };
8871
8876
  }
8872
8877
  var Suggestions = function (props) {
8873
- var data = props.data, onItemUse = props.onItemUse;
8874
- var len = data.length;
8878
+ var data = props.data, onItemUse = props.onItemUse, searchTerms = props.searchTerms;
8879
+ var _a = React$1.useState(), fixedSuggestions = _a[0], setFixedSuggestions = _a[1];
8880
+ React$1.useEffect(function () {
8881
+ if (data) {
8882
+ setFixedSuggestions(data);
8883
+ }
8884
+ if (!searchTerms) {
8885
+ setFixedSuggestions(undefined);
8886
+ }
8887
+ }, [data, searchTerms]);
8888
+ var len = data === null || data === void 0 ? void 0 : data.length;
8875
8889
  var currentIndex = len > 0 ? props.index : NaN;
8876
- var _a = React$1.useState(), activeItem = _a[0], setActiveItem = _a[1];
8890
+ var _b = React$1.useState(), activeItem = _b[0], setActiveItem = _b[1];
8877
8891
  var item = React$1.useMemo(function () { return findItemByIndex_1(data, currentIndex); }, [data, currentIndex]);
8878
8892
  var handleSpanClick = React$1.useCallback(function (target, span) {
8879
8893
  if (span.type === "inputText") {
@@ -8888,8 +8902,8 @@ var Suggestions = function (props) {
8888
8902
  var actions = React$1.useMemo(function () { return createActions(onItemUse); }, [onItemUse]);
8889
8903
  return (React__default$1["default"].createElement("div", { className: "xappw-suggestions ".concat(props.className || "") },
8890
8904
  (activeItem === null || activeItem === void 0 ? void 0 : activeItem.content) && React__default$1["default"].createElement("div", { className: "xappw-suggestions__answer" }, activeItem.content),
8891
- !!data.length &&
8892
- React__default$1["default"].createElement(SuggestionsList_1, { suggestions: data, index: currentIndex, className: "xappw-suggestions__groups", itemActions: actions, onItemClick: props.onItemClick, onItemHover: setActiveItem, onSpanClick: handleSpanClick })));
8905
+ fixedSuggestions && fixedSuggestions.length > 0 &&
8906
+ React__default$1["default"].createElement(SuggestionsList_1, { suggestions: fixedSuggestions, index: currentIndex, className: "xappw-suggestions__groups", itemActions: actions, onItemClick: props.onItemClick, onItemHover: setActiveItem, onSpanClick: handleSpanClick })));
8893
8907
  };
8894
8908
 
8895
8909
  var ChatFooter = function (props) {
@@ -32348,7 +32362,10 @@ function storeHandler(state, action) {
32348
32362
  }
32349
32363
  }
32350
32364
 
32365
+ var ADMIN_STORE_KEY = "AdminAccessTimes";
32366
+ var ADMIN_STORE_MAX = 20;
32351
32367
  function createChatStore(config, dataStorage) {
32368
+ var _a;
32352
32369
  if (!dataStorage) {
32353
32370
  if (typeof window !== "undefined") {
32354
32371
  dataStorage = localStorage;
@@ -32358,7 +32375,39 @@ function createChatStore(config, dataStorage) {
32358
32375
  }
32359
32376
  }
32360
32377
  var connection = config.connection;
32361
- var storage = new BrowserStateStorage(dataStorage, "xappchat.".concat(connection.serverUrl, ".").concat(connection.accountKey));
32378
+ var joinSessionId = (_a = new URL(window.location.href).searchParams) === null || _a === void 0 ? void 0 : _a.get("sessionId");
32379
+ var dataStorageKey;
32380
+ var now = new Date().getTime();
32381
+ if (joinSessionId) {
32382
+ var adminTimesData = dataStorage.getItem(ADMIN_STORE_KEY);
32383
+ // Create
32384
+ var adminTimes = adminTimesData ? JSON.parse(adminTimesData) : {};
32385
+ // if exists, use it. If not, check if we are maxed out. evict one session if we are.
32386
+ if (adminTimes[joinSessionId]) {
32387
+ log("ChatStore: reusing session: ".concat(joinSessionId));
32388
+ adminTimes[joinSessionId].lastAccessMs = now;
32389
+ dataStorageKey = adminTimes[joinSessionId].dataStorageKey;
32390
+ }
32391
+ else {
32392
+ if (Object.keys(adminTimes).length >= ADMIN_STORE_MAX) {
32393
+ var evictedSessionId = evictAdminSession(adminTimes);
32394
+ log("ChatStore: evicting session: ".concat(evictedSessionId));
32395
+ dataStorage.removeItem(adminTimes[evictedSessionId].dataStorageKey);
32396
+ adminTimes[evictedSessionId] = undefined;
32397
+ }
32398
+ // We now have room
32399
+ dataStorageKey = generateKey(connection, joinSessionId);
32400
+ adminTimes[joinSessionId] = {
32401
+ lastAccessMs: now,
32402
+ dataStorageKey: dataStorageKey,
32403
+ };
32404
+ }
32405
+ dataStorage.setItem(ADMIN_STORE_KEY, JSON.stringify(adminTimes));
32406
+ }
32407
+ else {
32408
+ dataStorageKey = generateKey(connection);
32409
+ }
32410
+ var storage = new BrowserStateStorage(dataStorage, dataStorageKey);
32362
32411
  var defaultState = createDefaultState({
32363
32412
  accessToken: config.accessToken,
32364
32413
  userId: config.userId,
@@ -32372,6 +32421,36 @@ function createChatStore(config, dataStorage) {
32372
32421
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
32373
32422
  var composeEnhancers = globalThis.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__ || redux.compose;
32374
32423
  return redux.createStore(chatReducer, composeEnhancers(redux.applyMiddleware.apply(void 0, middlewares)));
32424
+ }
32425
+ /**
32426
+ * Pick one admin session for eviction
32427
+ *
32428
+ * @param adminTimes
32429
+ * @returns
32430
+ */
32431
+ function evictAdminSession(adminTimes) {
32432
+ // Find the oldest
32433
+ var minTimeTs = Number.MAX_VALUE;
32434
+ var minSessionId;
32435
+ for (var _i = 0, _a = Object.keys(adminTimes); _i < _a.length; _i++) {
32436
+ var sessionId = _a[_i];
32437
+ if (adminTimes[sessionId].lastAccessMs < minTimeTs) {
32438
+ minSessionId = sessionId;
32439
+ minTimeTs = adminTimes[sessionId].lastAccessMs;
32440
+ }
32441
+ }
32442
+ return minSessionId;
32443
+ }
32444
+ function generateKey(connection, sessionId) {
32445
+ var base = "xappchat.".concat(connection.serverUrl);
32446
+ if (sessionId) {
32447
+ return connection.accountKey
32448
+ ? "".concat(base, ".").concat(connection.accountKey, ".").concat(sessionId)
32449
+ : "".concat(base, ".").concat(sessionId);
32450
+ }
32451
+ else {
32452
+ return connection.accountKey ? "".concat(base, ".").concat(connection.accountKey) : base;
32453
+ }
32375
32454
  }
32376
32455
 
32377
32456
  var ChatWidgetContainer = function (props) {