UNPKG

botframework-webchat-component

Version:
55 lines (40 loc) 6.92 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = useForceRenderAtInterval; var _react = require("react"); var _mathRandom = _interopRequireDefault(require("math-random")); var _useTimer = _interopRequireDefault(require("./useTimer")); 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; } // The `nextTimer` function calculates the next absolute time that the timer should be fired based on the origin (original time received), interval, and current time. // If the origin is t=260, and we are currently at t=1000, nextTimer must return t=60260. // If the origin is t=260, and we are currently at t=60260 (exact landing), we must return t=120260, not t=60260. // This is for fixing bug #2103: https://github.com/microsoft/BotFramework-WebChat/issues/2103. function nextTimer(origin, interval) { var time = new Date(origin).getTime(); var now = Date.now(); return time > now ? time : now + interval - (now - time) % interval; } function useForceRenderAtInterval(origin, interval, fn) { var _useState = (0, _react.useState)(nextTimer(origin, interval)), _useState2 = _slicedToArray(_useState, 2), timer = _useState2[0], setTimer = _useState2[1]; var handler = (0, _react.useCallback)(function () { fn && fn(); // Chrome may fire the setTimeout callback 1 ms before its original schedule. // Thus, when we calculate the "next" value, it will have the same value as before. // Sending the same value to useTimer(), it will not do another schedule because the value did not change. // So, we are adding a bit randomness, so useTimer() should pick up the newer scheduled time. setTimer(nextTimer(origin, interval) + (0, _mathRandom.default)()); }, [fn, origin, interval]); (0, _useTimer.default)(timer, handler); return [timer, setTimer]; } //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9ob29rcy9pbnRlcm5hbC91c2VGb3JjZVJlbmRlckF0SW50ZXJ2YWwuanMiXSwibmFtZXMiOlsibmV4dFRpbWVyIiwib3JpZ2luIiwiaW50ZXJ2YWwiLCJ0aW1lIiwiRGF0ZSIsImdldFRpbWUiLCJub3ciLCJ1c2VGb3JjZVJlbmRlckF0SW50ZXJ2YWwiLCJmbiIsInRpbWVyIiwic2V0VGltZXIiLCJoYW5kbGVyIl0sIm1hcHBpbmdzIjoiOzs7Ozs7O0FBQUE7O0FBQ0E7O0FBRUE7Ozs7Ozs7Ozs7Ozs7Ozs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBLFNBQVNBLFNBQVQsQ0FBbUJDLE1BQW5CLEVBQTJCQyxRQUEzQixFQUFxQztBQUNuQyxNQUFNQyxJQUFJLEdBQUcsSUFBSUMsSUFBSixDQUFTSCxNQUFULEVBQWlCSSxPQUFqQixFQUFiO0FBQ0EsTUFBTUMsR0FBRyxHQUFHRixJQUFJLENBQUNFLEdBQUwsRUFBWjtBQUVBLFNBQU9ILElBQUksR0FBR0csR0FBUCxHQUFhSCxJQUFiLEdBQW9CRyxHQUFHLEdBQUdKLFFBQU4sR0FBa0IsQ0FBQ0ksR0FBRyxHQUFHSCxJQUFQLElBQWVELFFBQTVEO0FBQ0Q7O0FBRWMsU0FBU0ssd0JBQVQsQ0FBa0NOLE1BQWxDLEVBQTBDQyxRQUExQyxFQUFvRE0sRUFBcEQsRUFBd0Q7QUFBQSxrQkFDM0MscUJBQVNSLFNBQVMsQ0FBQ0MsTUFBRCxFQUFTQyxRQUFULENBQWxCLENBRDJDO0FBQUE7QUFBQSxNQUM5RE8sS0FEOEQ7QUFBQSxNQUN2REMsUUFEdUQ7O0FBRXJFLE1BQU1DLE9BQU8sR0FBRyx3QkFBWSxZQUFNO0FBQ2hDSCxJQUFBQSxFQUFFLElBQUlBLEVBQUUsRUFBUixDQURnQyxDQUdoQztBQUNBO0FBQ0E7QUFDQTs7QUFFQUUsSUFBQUEsUUFBUSxDQUFDVixTQUFTLENBQUNDLE1BQUQsRUFBU0MsUUFBVCxDQUFULEdBQThCLDBCQUEvQixDQUFSO0FBQ0QsR0FUZSxFQVNiLENBQUNNLEVBQUQsRUFBS1AsTUFBTCxFQUFhQyxRQUFiLENBVGEsQ0FBaEI7QUFXQSx5QkFBU08sS0FBVCxFQUFnQkUsT0FBaEI7QUFFQSxTQUFPLENBQUNGLEtBQUQsRUFBUUMsUUFBUixDQUFQO0FBQ0QiLCJzb3VyY2VSb290IjoiY29tcG9uZW50Oi8vLyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHVzZUNhbGxiYWNrLCB1c2VTdGF0ZSB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCByYW5kb20gZnJvbSAnbWF0aC1yYW5kb20nO1xuXG5pbXBvcnQgdXNlVGltZXIgZnJvbSAnLi91c2VUaW1lcic7XG5cbi8vIFRoZSBgbmV4dFRpbWVyYCBmdW5jdGlvbiBjYWxjdWxhdGVzIHRoZSBuZXh0IGFic29sdXRlIHRpbWUgdGhhdCB0aGUgdGltZXIgc2hvdWxkIGJlIGZpcmVkIGJhc2VkIG9uIHRoZSBvcmlnaW4gKG9yaWdpbmFsIHRpbWUgcmVjZWl2ZWQpLCBpbnRlcnZhbCwgYW5kIGN1cnJlbnQgdGltZS5cbi8vIElmIHRoZSBvcmlnaW4gaXMgdD0yNjAsIGFuZCB3ZSBhcmUgY3VycmVudGx5IGF0IHQ9MTAwMCwgbmV4dFRpbWVyIG11c3QgcmV0dXJuIHQ9NjAyNjAuXG4vLyBJZiB0aGUgb3JpZ2luIGlzIHQ9MjYwLCBhbmQgd2UgYXJlIGN1cnJlbnRseSBhdCB0PTYwMjYwIChleGFjdCBsYW5kaW5nKSwgd2UgbXVzdCByZXR1cm4gdD0xMjAyNjAsIG5vdCB0PTYwMjYwLlxuLy8gVGhpcyBpcyBmb3IgZml4aW5nIGJ1ZyAjMjEwMzogaHR0cHM6Ly9naXRodWIuY29tL21pY3Jvc29mdC9Cb3RGcmFtZXdvcmstV2ViQ2hhdC9pc3N1ZXMvMjEwMy5cblxuZnVuY3Rpb24gbmV4dFRpbWVyKG9yaWdpbiwgaW50ZXJ2YWwpIHtcbiAgY29uc3QgdGltZSA9IG5ldyBEYXRlKG9yaWdpbikuZ2V0VGltZSgpO1xuICBjb25zdCBub3cgPSBEYXRlLm5vdygpO1xuXG4gIHJldHVybiB0aW1lID4gbm93ID8gdGltZSA6IG5vdyArIGludGVydmFsIC0gKChub3cgLSB0aW1lKSAlIGludGVydmFsKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gdXNlRm9yY2VSZW5kZXJBdEludGVydmFsKG9yaWdpbiwgaW50ZXJ2YWwsIGZuKSB7XG4gIGNvbnN0IFt0aW1lciwgc2V0VGltZXJdID0gdXNlU3RhdGUobmV4dFRpbWVyKG9yaWdpbiwgaW50ZXJ2YWwpKTtcbiAgY29uc3QgaGFuZGxlciA9IHVzZUNhbGxiYWNrKCgpID0+IHtcbiAgICBmbiAmJiBmbigpO1xuXG4gICAgLy8gQ2hyb21lIG1heSBmaXJlIHRoZSBzZXRUaW1lb3V0IGNhbGxiYWNrIDEgbXMgYmVmb3JlIGl0cyBvcmlnaW5hbCBzY2hlZHVsZS5cbiAgICAvLyBUaHVzLCB3aGVuIHdlIGNhbGN1bGF0ZSB0aGUgXCJuZXh0XCIgdmFsdWUsIGl0IHdpbGwgaGF2ZSB0aGUgc2FtZSB2YWx1ZSBhcyBiZWZvcmUuXG4gICAgLy8gU2VuZGluZyB0aGUgc2FtZSB2YWx1ZSB0byB1c2VUaW1lcigpLCBpdCB3aWxsIG5vdCBkbyBhbm90aGVyIHNjaGVkdWxlIGJlY2F1c2UgdGhlIHZhbHVlIGRpZCBub3QgY2hhbmdlLlxuICAgIC8vIFNvLCB3ZSBhcmUgYWRkaW5nIGEgYml0IHJhbmRvbW5lc3MsIHNvIHVzZVRpbWVyKCkgc2hvdWxkIHBpY2sgdXAgdGhlIG5ld2VyIHNjaGVkdWxlZCB0aW1lLlxuXG4gICAgc2V0VGltZXIobmV4dFRpbWVyKG9yaWdpbiwgaW50ZXJ2YWwpICsgcmFuZG9tKCkpO1xuICB9LCBbZm4sIG9yaWdpbiwgaW50ZXJ2YWxdKTtcblxuICB1c2VUaW1lcih0aW1lciwgaGFuZGxlcik7XG5cbiAgcmV0dXJuIFt0aW1lciwgc2V0VGltZXJdO1xufVxuIl19