botframework-webchat-component
Version:
React component of botframework-webchat
90 lines (70 loc) • 12.8 kB
JavaScript
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = useAcknowledgedActivity;
var _botframeworkWebchatApi = require("botframework-webchat-api");
var _react = require("react");
var _reactScrollToBottom = require("react-scroll-to-bottom");
var _findLastIndex = _interopRequireDefault(require("../../Utils/findLastIndex"));
var _getActivityUniqueId = _interopRequireDefault(require("../../Utils/getActivityUniqueId"));
var _useChanged = _interopRequireDefault(require("./useChanged"));
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }
function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }
function _iterableToArrayLimit(arr, i) { if (typeof Symbol === "undefined" || !(Symbol.iterator in Object(arr))) return; var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; }
function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
var useActivities = _botframeworkWebchatApi.hooks.useActivities; // Acknowledged means either:
// 1. The user sent a message
// - We don't need a condition here. When Web Chat sends the user's message, it will scroll to bottom, and it will trigger condition 2 below.
// 2. The user scroll to the bottom of the transcript, from a non-bottom scroll position
// - If the transcript is already at the bottom, the user needs to scroll up and then go back down
// - What happens if we are relaxing "scrolled from a non-bottom scroll position":
// 1. The condition will become solely "at the bottom of the transcript"
// 2. Auto-scroll will always scroll the transcript to the bottom
// 3. Web Chat will always acknowledge all activities as it is at the bottom
// 4. Acknowledge flag become useless
// 5. Therefore, even the developer set "pause after 3 activities", if activities are coming in at a slow pace (not batched in a single render)
// Web Chat will keep scrolling and not snapped/paused
// Note: When Web Chat is loaded, there are no activities acknowledged. We need to assume all arriving activities are acknowledged until end-user sends their first activity.
// Activities loaded initially could be from conversation history. Without assuming acknowledgement, Web Chat will not scroll initially (as everything is not acknowledged).
// It would be better if the chat adapter should let Web Chat know if the activity is loaded from history or not.
// TODO: [P2] #3670 Move the "conversation history acknowledgement" logic mentioned above to polyfill of chat adapters.
// 1. Chat adapter should send "acknowledged" as part of "channelData"
// 2. If "acknowledged" is "undefined", we set it to:
// a. true, if there are no egress activities yet
// b. Otherwise, false
function useAcknowledgedActivity() {
var _useActivities = useActivities(),
_useActivities2 = _slicedToArray(_useActivities, 1),
activities = _useActivities2[0];
var _useSticky = (0, _reactScrollToBottom.useSticky)(),
_useSticky2 = _slicedToArray(_useSticky, 1),
sticky = _useSticky2[0];
var lastStickyActivityIDRef = (0, _react.useRef)();
var stickyChanged = (0, _useChanged.default)(sticky);
var stickyChangedToSticky = stickyChanged && sticky;
var lastStickyActivityID = (0, _react.useMemo)(function () {
if (stickyChangedToSticky) {
lastStickyActivityIDRef.current = (0, _getActivityUniqueId.default)(activities[activities.length - 1] || {});
}
return lastStickyActivityIDRef.current;
}, [activities, lastStickyActivityIDRef, stickyChangedToSticky]);
return (0, _react.useMemo)(function () {
var lastStickyActivityIndex = activities.findIndex(function (activity) {
return (0, _getActivityUniqueId.default)(activity) === lastStickyActivityID;
});
var lastEgressActivityIndex = (0, _findLastIndex.default)(activities, function (_ref) {
var _ref$from = _ref.from;
_ref$from = _ref$from === void 0 ? {} : _ref$from;
var role = _ref$from.role;
return role === 'user';
}); // As described above, if no activities were acknowledged through egress activity, we will assume everything is acknowledged.
var lastAcknowledgedActivityIndex = !~lastEgressActivityIndex ? activities.length - 1 : Math.max(lastStickyActivityIndex, lastEgressActivityIndex);
var lastAcknowledgedActivity = activities[lastAcknowledgedActivityIndex];
return [lastAcknowledgedActivity];
}, [activities, lastStickyActivityID]);
}
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9ob29rcy9pbnRlcm5hbC91c2VBY2tub3dsZWRnZWRBY3Rpdml0eS5qcyJdLCJuYW1lcyI6WyJ1c2VBY3Rpdml0aWVzIiwiaG9va3MiLCJ1c2VBY2tub3dsZWRnZWRBY3Rpdml0eSIsImFjdGl2aXRpZXMiLCJzdGlja3kiLCJsYXN0U3RpY2t5QWN0aXZpdHlJRFJlZiIsInN0aWNreUNoYW5nZWQiLCJzdGlja3lDaGFuZ2VkVG9TdGlja3kiLCJsYXN0U3RpY2t5QWN0aXZpdHlJRCIsImN1cnJlbnQiLCJsZW5ndGgiLCJsYXN0U3RpY2t5QWN0aXZpdHlJbmRleCIsImZpbmRJbmRleCIsImFjdGl2aXR5IiwibGFzdEVncmVzc0FjdGl2aXR5SW5kZXgiLCJmcm9tIiwicm9sZSIsImxhc3RBY2tub3dsZWRnZWRBY3Rpdml0eUluZGV4IiwiTWF0aCIsIm1heCIsImxhc3RBY2tub3dsZWRnZWRBY3Rpdml0eSJdLCJtYXBwaW5ncyI6Ijs7Ozs7OztBQUFBOztBQUNBOztBQUNBOztBQUVBOztBQUNBOztBQUNBOzs7Ozs7Ozs7Ozs7Ozs7O0lBRVFBLGEsR0FBa0JDLDZCLENBQWxCRCxhLEVBRVI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFDZSxTQUFTRSx1QkFBVCxHQUFtQztBQUFBLHVCQUMzQkYsYUFBYSxFQURjO0FBQUE7QUFBQSxNQUN6Q0csVUFEeUM7O0FBQUEsbUJBRS9CLHFDQUYrQjtBQUFBO0FBQUEsTUFFekNDLE1BRnlDOztBQUdoRCxNQUFNQyx1QkFBdUIsR0FBRyxvQkFBaEM7QUFFQSxNQUFNQyxhQUFhLEdBQUcseUJBQVdGLE1BQVgsQ0FBdEI7QUFDQSxNQUFNRyxxQkFBcUIsR0FBR0QsYUFBYSxJQUFJRixNQUEvQztBQUVBLE1BQU1JLG9CQUFvQixHQUFHLG9CQUFRLFlBQU07QUFDekMsUUFBSUQscUJBQUosRUFBMkI7QUFDekJGLE1BQUFBLHVCQUF1QixDQUFDSSxPQUF4QixHQUFrQyxrQ0FBb0JOLFVBQVUsQ0FBQ0EsVUFBVSxDQUFDTyxNQUFYLEdBQW9CLENBQXJCLENBQVYsSUFBcUMsRUFBekQsQ0FBbEM7QUFDRDs7QUFFRCxXQUFPTCx1QkFBdUIsQ0FBQ0ksT0FBL0I7QUFDRCxHQU40QixFQU0xQixDQUFDTixVQUFELEVBQWFFLHVCQUFiLEVBQXNDRSxxQkFBdEMsQ0FOMEIsQ0FBN0I7QUFRQSxTQUFPLG9CQUFRLFlBQU07QUFDbkIsUUFBTUksdUJBQXVCLEdBQUdSLFVBQVUsQ0FBQ1MsU0FBWCxDQUM5QixVQUFBQyxRQUFRO0FBQUEsYUFBSSxrQ0FBb0JBLFFBQXBCLE1BQWtDTCxvQkFBdEM7QUFBQSxLQURzQixDQUFoQztBQUlBLFFBQU1NLHVCQUF1QixHQUFHLDRCQUFjWCxVQUFkLEVBQTBCO0FBQUEsMkJBQUdZLElBQUg7QUFBQSx5Q0FBb0IsRUFBcEI7QUFBQSxVQUFXQyxJQUFYLGFBQVdBLElBQVg7QUFBQSxhQUE2QkEsSUFBSSxLQUFLLE1BQXRDO0FBQUEsS0FBMUIsQ0FBaEMsQ0FMbUIsQ0FPbkI7O0FBQ0EsUUFBTUMsNkJBQTZCLEdBQUcsQ0FBQyxDQUFDSCx1QkFBRixHQUNsQ1gsVUFBVSxDQUFDTyxNQUFYLEdBQW9CLENBRGMsR0FFbENRLElBQUksQ0FBQ0MsR0FBTCxDQUFTUix1QkFBVCxFQUFrQ0csdUJBQWxDLENBRko7QUFJQSxRQUFNTSx3QkFBd0IsR0FBR2pCLFVBQVUsQ0FBQ2MsNkJBQUQsQ0FBM0M7QUFFQSxXQUFPLENBQUNHLHdCQUFELENBQVA7QUFDRCxHQWZNLEVBZUosQ0FBQ2pCLFVBQUQsRUFBYUssb0JBQWIsQ0FmSSxDQUFQO0FBZ0JEIiwic291cmNlUm9vdCI6ImNvbXBvbmVudDovLy8iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBob29rcyB9IGZyb20gJ2JvdGZyYW1ld29yay13ZWJjaGF0LWFwaSc7XG5pbXBvcnQgeyB1c2VNZW1vLCB1c2VSZWYgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyB1c2VTdGlja3kgfSBmcm9tICdyZWFjdC1zY3JvbGwtdG8tYm90dG9tJztcblxuaW1wb3J0IGZpbmRMYXN0SW5kZXggZnJvbSAnLi4vLi4vVXRpbHMvZmluZExhc3RJbmRleCc7XG5pbXBvcnQgZ2V0QWN0aXZpdHlVbmlxdWVJZCBmcm9tICcuLi8uLi9VdGlscy9nZXRBY3Rpdml0eVVuaXF1ZUlkJztcbmltcG9ydCB1c2VDaGFuZ2VkIGZyb20gJy4vdXNlQ2hhbmdlZCc7XG5cbmNvbnN0IHsgdXNlQWN0aXZpdGllcyB9ID0gaG9va3M7XG5cbi8vIEFja25vd2xlZGdlZCBtZWFucyBlaXRoZXI6XG4vLyAxLiBUaGUgdXNlciBzZW50IGEgbWVzc2FnZVxuLy8gICAgLSBXZSBkb24ndCBuZWVkIGEgY29uZGl0aW9uIGhlcmUuIFdoZW4gV2ViIENoYXQgc2VuZHMgdGhlIHVzZXIncyBtZXNzYWdlLCBpdCB3aWxsIHNjcm9sbCB0byBib3R0b20sIGFuZCBpdCB3aWxsIHRyaWdnZXIgY29uZGl0aW9uIDIgYmVsb3cuXG4vLyAyLiBUaGUgdXNlciBzY3JvbGwgdG8gdGhlIGJvdHRvbSBvZiB0aGUgdHJhbnNjcmlwdCwgZnJvbSBhIG5vbi1ib3R0b20gc2Nyb2xsIHBvc2l0aW9uXG4vLyAgICAtIElmIHRoZSB0cmFuc2NyaXB0IGlzIGFscmVhZHkgYXQgdGhlIGJvdHRvbSwgdGhlIHVzZXIgbmVlZHMgdG8gc2Nyb2xsIHVwIGFuZCB0aGVuIGdvIGJhY2sgZG93blxuLy8gICAgLSBXaGF0IGhhcHBlbnMgaWYgd2UgYXJlIHJlbGF4aW5nIFwic2Nyb2xsZWQgZnJvbSBhIG5vbi1ib3R0b20gc2Nyb2xsIHBvc2l0aW9uXCI6XG4vLyAgICAgIDEuIFRoZSBjb25kaXRpb24gd2lsbCBiZWNvbWUgc29sZWx5IFwiYXQgdGhlIGJvdHRvbSBvZiB0aGUgdHJhbnNjcmlwdFwiXG4vLyAgICAgIDIuIEF1dG8tc2Nyb2xsIHdpbGwgYWx3YXlzIHNjcm9sbCB0aGUgdHJhbnNjcmlwdCB0byB0aGUgYm90dG9tXG4vLyAgICAgIDMuIFdlYiBDaGF0IHdpbGwgYWx3YXlzIGFja25vd2xlZGdlIGFsbCBhY3Rpdml0aWVzIGFzIGl0IGlzIGF0IHRoZSBib3R0b21cbi8vICAgICAgNC4gQWNrbm93bGVkZ2UgZmxhZyBiZWNvbWUgdXNlbGVzc1xuLy8gICAgICA1LiBUaGVyZWZvcmUsIGV2ZW4gdGhlIGRldmVsb3BlciBzZXQgXCJwYXVzZSBhZnRlciAzIGFjdGl2aXRpZXNcIiwgaWYgYWN0aXZpdGllcyBhcmUgY29taW5nIGluIGF0IGEgc2xvdyBwYWNlIChub3QgYmF0Y2hlZCBpbiBhIHNpbmdsZSByZW5kZXIpXG4vLyAgICAgICAgIFdlYiBDaGF0IHdpbGwga2VlcCBzY3JvbGxpbmcgYW5kIG5vdCBzbmFwcGVkL3BhdXNlZFxuXG4vLyBOb3RlOiBXaGVuIFdlYiBDaGF0IGlzIGxvYWRlZCwgdGhlcmUgYXJlIG5vIGFjdGl2aXRpZXMgYWNrbm93bGVkZ2VkLiBXZSBuZWVkIHRvIGFzc3VtZSBhbGwgYXJyaXZpbmcgYWN0aXZpdGllcyBhcmUgYWNrbm93bGVkZ2VkIHVudGlsIGVuZC11c2VyIHNlbmRzIHRoZWlyIGZpcnN0IGFjdGl2aXR5LlxuLy8gICAgICAgQWN0aXZpdGllcyBsb2FkZWQgaW5pdGlhbGx5IGNvdWxkIGJlIGZyb20gY29udmVyc2F0aW9uIGhpc3RvcnkuIFdpdGhvdXQgYXNzdW1pbmcgYWNrbm93bGVkZ2VtZW50LCBXZWIgQ2hhdCB3aWxsIG5vdCBzY3JvbGwgaW5pdGlhbGx5IChhcyBldmVyeXRoaW5nIGlzIG5vdCBhY2tub3dsZWRnZWQpLlxuLy8gICAgICAgSXQgd291bGQgYmUgYmV0dGVyIGlmIHRoZSBjaGF0IGFkYXB0ZXIgc2hvdWxkIGxldCBXZWIgQ2hhdCBrbm93IGlmIHRoZSBhY3Rpdml0eSBpcyBsb2FkZWQgZnJvbSBoaXN0b3J5IG9yIG5vdC5cblxuLy8gVE9ETzogW1AyXSAjMzY3MCBNb3ZlIHRoZSBcImNvbnZlcnNhdGlvbiBoaXN0b3J5IGFja25vd2xlZGdlbWVudFwiIGxvZ2ljIG1lbnRpb25lZCBhYm92ZSB0byBwb2x5ZmlsbCBvZiBjaGF0IGFkYXB0ZXJzLlxuLy8gICAgICAgMS4gQ2hhdCBhZGFwdGVyIHNob3VsZCBzZW5kIFwiYWNrbm93bGVkZ2VkXCIgYXMgcGFydCBvZiBcImNoYW5uZWxEYXRhXCJcbi8vICAgICAgIDIuIElmIFwiYWNrbm93bGVkZ2VkXCIgaXMgXCJ1bmRlZmluZWRcIiwgd2Ugc2V0IGl0IHRvOlxuLy8gICAgICAgICAgYS4gdHJ1ZSwgaWYgdGhlcmUgYXJlIG5vIGVncmVzcyBhY3Rpdml0aWVzIHlldFxuLy8gICAgICAgICAgYi4gT3RoZXJ3aXNlLCBmYWxzZVxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gdXNlQWNrbm93bGVkZ2VkQWN0aXZpdHkoKSB7XG4gIGNvbnN0IFthY3Rpdml0aWVzXSA9IHVzZUFjdGl2aXRpZXMoKTtcbiAgY29uc3QgW3N0aWNreV0gPSB1c2VTdGlja3koKTtcbiAgY29uc3QgbGFzdFN0aWNreUFjdGl2aXR5SURSZWYgPSB1c2VSZWYoKTtcblxuICBjb25zdCBzdGlja3lDaGFuZ2VkID0gdXNlQ2hhbmdlZChzdGlja3kpO1xuICBjb25zdCBzdGlja3lDaGFuZ2VkVG9TdGlja3kgPSBzdGlja3lDaGFuZ2VkICYmIHN0aWNreTtcblxuICBjb25zdCBsYXN0U3RpY2t5QWN0aXZpdHlJRCA9IHVzZU1lbW8oKCkgPT4ge1xuICAgIGlmIChzdGlja3lDaGFuZ2VkVG9TdGlja3kpIHtcbiAgICAgIGxhc3RTdGlja3lBY3Rpdml0eUlEUmVmLmN1cnJlbnQgPSBnZXRBY3Rpdml0eVVuaXF1ZUlkKGFjdGl2aXRpZXNbYWN0aXZpdGllcy5sZW5ndGggLSAxXSB8fCB7fSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGxhc3RTdGlja3lBY3Rpdml0eUlEUmVmLmN1cnJlbnQ7XG4gIH0sIFthY3Rpdml0aWVzLCBsYXN0U3RpY2t5QWN0aXZpdHlJRFJlZiwgc3RpY2t5Q2hhbmdlZFRvU3RpY2t5XSk7XG5cbiAgcmV0dXJuIHVzZU1lbW8oKCkgPT4ge1xuICAgIGNvbnN0IGxhc3RTdGlja3lBY3Rpdml0eUluZGV4ID0gYWN0aXZpdGllcy5maW5kSW5kZXgoXG4gICAgICBhY3Rpdml0eSA9PiBnZXRBY3Rpdml0eVVuaXF1ZUlkKGFjdGl2aXR5KSA9PT0gbGFzdFN0aWNreUFjdGl2aXR5SURcbiAgICApO1xuXG4gICAgY29uc3QgbGFzdEVncmVzc0FjdGl2aXR5SW5kZXggPSBmaW5kTGFzdEluZGV4KGFjdGl2aXRpZXMsICh7IGZyb206IHsgcm9sZSB9ID0ge30gfSkgPT4gcm9sZSA9PT0gJ3VzZXInKTtcblxuICAgIC8vIEFzIGRlc2NyaWJlZCBhYm92ZSwgaWYgbm8gYWN0aXZpdGllcyB3ZXJlIGFja25vd2xlZGdlZCB0aHJvdWdoIGVncmVzcyBhY3Rpdml0eSwgd2Ugd2lsbCBhc3N1bWUgZXZlcnl0aGluZyBpcyBhY2tub3dsZWRnZWQuXG4gICAgY29uc3QgbGFzdEFja25vd2xlZGdlZEFjdGl2aXR5SW5kZXggPSAhfmxhc3RFZ3Jlc3NBY3Rpdml0eUluZGV4XG4gICAgICA/IGFjdGl2aXRpZXMubGVuZ3RoIC0gMVxuICAgICAgOiBNYXRoLm1heChsYXN0U3RpY2t5QWN0aXZpdHlJbmRleCwgbGFzdEVncmVzc0FjdGl2aXR5SW5kZXgpO1xuXG4gICAgY29uc3QgbGFzdEFja25vd2xlZGdlZEFjdGl2aXR5ID0gYWN0aXZpdGllc1tsYXN0QWNrbm93bGVkZ2VkQWN0aXZpdHlJbmRleF07XG5cbiAgICByZXR1cm4gW2xhc3RBY2tub3dsZWRnZWRBY3Rpdml0eV07XG4gIH0sIFthY3Rpdml0aWVzLCBsYXN0U3RpY2t5QWN0aXZpdHlJRF0pO1xufVxuIl19
;