react-live-chat-loader
Version:
Implement live chat in your react app without taking a performance hit.
107 lines (104 loc) • 15.6 kB
JavaScript
function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); }
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = void 0;
var _react = require("react");
var _context = require("../context");
var Providers = _interopRequireWildcard(require("../providers"));
function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(e) { return e ? t : r; })(e); }
function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != _typeof(e) && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
var requestIdleCallback = typeof window !== 'undefined' ? window.requestIdleCallback : null;
var connection = typeof window !== 'undefined' ?
// eslint-disable-next-line @typescript-eslint/no-explicit-any
window.navigator && window.navigator.connection : null;
var useChat = function useChat() {
var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {
loadWhenIdle: false
},
loadWhenIdle = _ref.loadWhenIdle;
var _useContext = (0, _react.useContext)(_context.LiveChatLoaderContext),
provider = _useContext.provider,
providerKey = _useContext.providerKey,
idlePeriod = _useContext.idlePeriod,
state = _useContext.state,
setState = _useContext.setState,
appID = _useContext.appID,
locale = _useContext.locale,
baseUrl = _useContext.baseUrl,
instanceId = _useContext.instanceId,
env = _useContext.env,
geo = _useContext.geo,
beforeInit = _useContext.beforeInit,
onReady = _useContext.onReady;
(0, _react.useEffect)(function () {
// Don't load if idlePeriod is 0, null or undefined
if (typeof window === 'undefined' || !loadWhenIdle || !idlePeriod) return;
// Don't load if 2g connection or save-data is enabled
if (connection && (connection.saveData || /2g/.test(connection.effectiveType))) return;
if (isNaN(idlePeriod)) return;
// deadline.timeRemaining() has an upper limit of 50 milliseconds
// We want to ensure the page has been idle for a significant period of time
// Therefore we count consecutive maximum timeRemaining counts and load chat when we reach our threshold
var elapsedIdlePeriod = 0;
var previousTimeRemaining = 0;
var _scheduleLoadChat = function scheduleLoadChat(deadline) {
if (elapsedIdlePeriod > idlePeriod) return loadChat({
open: false
});
var timeRemaining = deadline.timeRemaining();
// To ensure browser is idle, only accumalte elapsedIdlePeriod when
// two consecutive maximum timeRemaining's have been observed
if (previousTimeRemaining > 49 && timeRemaining > 49) elapsedIdlePeriod += timeRemaining;
previousTimeRemaining = timeRemaining;
requestIdleCallback === null || requestIdleCallback === void 0 || requestIdleCallback(_scheduleLoadChat);
};
if (requestIdleCallback) {
requestIdleCallback(_scheduleLoadChat);
} else {
setTimeout(function () {
return loadChat({
open: false
});
}, idlePeriod);
}
}, []);
var chatProvider = Providers[provider];
var loadChat = (0, _react.useCallback)(function () {
var _ref2 = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {
open: true
},
_ref2$open = _ref2.open,
open = _ref2$open === void 0 ? true : _ref2$open;
if (!providerKey) {
//eslint-disable-next-line no-console
console.error('No api key given to react-live-chat-loader');
return;
}
if (!provider) {
//eslint-disable-next-line no-console
console.error('No provider given to react-live-chat-loader');
return;
}
chatProvider.load({
providerKey: providerKey,
setState: setState,
appID: appID,
locale: locale,
baseUrl: baseUrl,
instanceId: instanceId,
env: env,
geo: geo,
beforeInit: beforeInit,
onReady: onReady
});
if (open) {
chatProvider.open();
if (state !== 'complete') setState('open');
}
}, [state]);
return [state, loadChat];
};
var _default = exports.default = useChat;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcmVhY3QiLCJyZXF1aXJlIiwiX2NvbnRleHQiLCJQcm92aWRlcnMiLCJfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCIsIl9nZXRSZXF1aXJlV2lsZGNhcmRDYWNoZSIsImUiLCJXZWFrTWFwIiwiciIsInQiLCJfX2VzTW9kdWxlIiwiX3R5cGVvZiIsImRlZmF1bHQiLCJoYXMiLCJnZXQiLCJuIiwiX19wcm90b19fIiwiYSIsIk9iamVjdCIsImRlZmluZVByb3BlcnR5IiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yIiwidSIsImhhc093blByb3BlcnR5IiwiY2FsbCIsImkiLCJzZXQiLCJyZXF1ZXN0SWRsZUNhbGxiYWNrIiwid2luZG93IiwiY29ubmVjdGlvbiIsIm5hdmlnYXRvciIsInVzZUNoYXQiLCJfcmVmIiwiYXJndW1lbnRzIiwibGVuZ3RoIiwidW5kZWZpbmVkIiwibG9hZFdoZW5JZGxlIiwiX3VzZUNvbnRleHQiLCJ1c2VDb250ZXh0IiwiTGl2ZUNoYXRMb2FkZXJDb250ZXh0IiwicHJvdmlkZXIiLCJwcm92aWRlcktleSIsImlkbGVQZXJpb2QiLCJzdGF0ZSIsInNldFN0YXRlIiwiYXBwSUQiLCJsb2NhbGUiLCJiYXNlVXJsIiwiaW5zdGFuY2VJZCIsImVudiIsImdlbyIsImJlZm9yZUluaXQiLCJvblJlYWR5IiwidXNlRWZmZWN0Iiwic2F2ZURhdGEiLCJ0ZXN0IiwiZWZmZWN0aXZlVHlwZSIsImlzTmFOIiwiZWxhcHNlZElkbGVQZXJpb2QiLCJwcmV2aW91c1RpbWVSZW1haW5pbmciLCJzY2hlZHVsZUxvYWRDaGF0IiwiZGVhZGxpbmUiLCJsb2FkQ2hhdCIsIm9wZW4iLCJ0aW1lUmVtYWluaW5nIiwic2V0VGltZW91dCIsImNoYXRQcm92aWRlciIsInVzZUNhbGxiYWNrIiwiX3JlZjIiLCJfcmVmMiRvcGVuIiwiY29uc29sZSIsImVycm9yIiwibG9hZCIsIl9kZWZhdWx0IiwiZXhwb3J0cyJdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9ob29rcy91c2VDaGF0LnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHVzZUNvbnRleHQsIHVzZUNhbGxiYWNrLCB1c2VFZmZlY3QgfSBmcm9tICdyZWFjdCdcblxuaW1wb3J0IHsgU3RhdGUgfSBmcm9tICcuLi90eXBlcydcbmltcG9ydCB7IExpdmVDaGF0TG9hZGVyQ29udGV4dCB9IGZyb20gJy4uL2NvbnRleHQnXG5pbXBvcnQgKiBhcyBQcm92aWRlcnMgZnJvbSAnLi4vcHJvdmlkZXJzJ1xuXG5jb25zdCByZXF1ZXN0SWRsZUNhbGxiYWNrID1cbiAgdHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgPyB3aW5kb3cucmVxdWVzdElkbGVDYWxsYmFjayA6IG51bGxcbmNvbnN0IGNvbm5lY3Rpb24gPVxuICB0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJ1xuICAgID8gLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICAgIHdpbmRvdy5uYXZpZ2F0b3IgJiYgKHdpbmRvdy5uYXZpZ2F0b3IgYXMgYW55KS5jb25uZWN0aW9uXG4gICAgOiBudWxsXG5cbmNvbnN0IHVzZUNoYXQgPSAoXG4gIHtcbiAgICBsb2FkV2hlbklkbGVcbiAgfToge1xuICAgIGxvYWRXaGVuSWRsZTogYm9vbGVhblxuICB9ID0geyBsb2FkV2hlbklkbGU6IGZhbHNlIH1cbik6IFtTdGF0ZSwgKHsgb3BlbiB9OiB7IG9wZW46IGJvb2xlYW4gfSkgPT4gdm9pZF0gPT4ge1xuICBjb25zdCB7XG4gICAgcHJvdmlkZXIsXG4gICAgcHJvdmlkZXJLZXksXG4gICAgaWRsZVBlcmlvZCxcbiAgICBzdGF0ZSxcbiAgICBzZXRTdGF0ZSxcbiAgICBhcHBJRCxcbiAgICBsb2NhbGUsXG4gICAgYmFzZVVybCxcbiAgICAvLyBpbnN0YW5jZUlkLCBlbnYgYW5kIGdlbyBhcmUgb25seSByZWxldmFudCBmb3IgQWRvYmUgRHluYW1pYyBDaGF0XG4gICAgaW5zdGFuY2VJZCxcbiAgICBlbnYsXG4gICAgZ2VvLFxuICAgIGJlZm9yZUluaXQsXG4gICAgb25SZWFkeVxuICB9ID0gdXNlQ29udGV4dChMaXZlQ2hhdExvYWRlckNvbnRleHQpXG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICAvLyBEb24ndCBsb2FkIGlmIGlkbGVQZXJpb2QgaXMgMCwgbnVsbCBvciB1bmRlZmluZWRcbiAgICBpZiAodHlwZW9mIHdpbmRvdyA9PT0gJ3VuZGVmaW5lZCcgfHwgIWxvYWRXaGVuSWRsZSB8fCAhaWRsZVBlcmlvZCkgcmV0dXJuXG5cbiAgICAvLyBEb24ndCBsb2FkIGlmIDJnIGNvbm5lY3Rpb24gb3Igc2F2ZS1kYXRhIGlzIGVuYWJsZWRcbiAgICBpZiAoXG4gICAgICBjb25uZWN0aW9uICYmXG4gICAgICAoY29ubmVjdGlvbi5zYXZlRGF0YSB8fCAvMmcvLnRlc3QoY29ubmVjdGlvbi5lZmZlY3RpdmVUeXBlKSlcbiAgICApXG4gICAgICByZXR1cm5cblxuICAgIGlmIChpc05hTihpZGxlUGVyaW9kKSkgcmV0dXJuXG5cbiAgICAvLyBkZWFkbGluZS50aW1lUmVtYWluaW5nKCkgaGFzIGFuIHVwcGVyIGxpbWl0IG9mIDUwIG1pbGxpc2Vjb25kc1xuICAgIC8vIFdlIHdhbnQgdG8gZW5zdXJlIHRoZSBwYWdlIGhhcyBiZWVuIGlkbGUgZm9yIGEgc2lnbmlmaWNhbnQgcGVyaW9kIG9mIHRpbWVcbiAgICAvLyBUaGVyZWZvcmUgd2UgY291bnQgY29uc2VjdXRpdmUgbWF4aW11bSB0aW1lUmVtYWluaW5nIGNvdW50cyBhbmQgbG9hZCBjaGF0IHdoZW4gd2UgcmVhY2ggb3VyIHRocmVzaG9sZFxuICAgIGxldCBlbGFwc2VkSWRsZVBlcmlvZCA9IDBcbiAgICBsZXQgcHJldmlvdXNUaW1lUmVtYWluaW5nID0gMFxuICAgIGNvbnN0IHNjaGVkdWxlTG9hZENoYXQgPSAoZGVhZGxpbmU6IElkbGVEZWFkbGluZSkgPT4ge1xuICAgICAgaWYgKGVsYXBzZWRJZGxlUGVyaW9kID4gaWRsZVBlcmlvZCkgcmV0dXJuIGxvYWRDaGF0KHsgb3BlbjogZmFsc2UgfSlcblxuICAgICAgY29uc3QgdGltZVJlbWFpbmluZyA9IGRlYWRsaW5lLnRpbWVSZW1haW5pbmcoKVxuICAgICAgLy8gVG8gZW5zdXJlIGJyb3dzZXIgaXMgaWRsZSwgb25seSBhY2N1bWFsdGUgZWxhcHNlZElkbGVQZXJpb2Qgd2hlblxuICAgICAgLy8gdHdvIGNvbnNlY3V0aXZlIG1heGltdW0gdGltZVJlbWFpbmluZydzIGhhdmUgYmVlbiBvYnNlcnZlZFxuICAgICAgaWYgKHByZXZpb3VzVGltZVJlbWFpbmluZyA+IDQ5ICYmIHRpbWVSZW1haW5pbmcgPiA0OSlcbiAgICAgICAgZWxhcHNlZElkbGVQZXJpb2QgKz0gdGltZVJlbWFpbmluZ1xuXG4gICAgICBwcmV2aW91c1RpbWVSZW1haW5pbmcgPSB0aW1lUmVtYWluaW5nXG4gICAgICByZXF1ZXN0SWRsZUNhbGxiYWNrPy4oc2NoZWR1bGVMb2FkQ2hhdClcbiAgICB9XG5cbiAgICBpZiAocmVxdWVzdElkbGVDYWxsYmFjaykge1xuICAgICAgcmVxdWVzdElkbGVDYWxsYmFjayhzY2hlZHVsZUxvYWRDaGF0KVxuICAgIH0gZWxzZSB7XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IGxvYWRDaGF0KHsgb3BlbjogZmFsc2UgfSksIGlkbGVQZXJpb2QpXG4gICAgfVxuICB9LCBbXSlcblxuICBjb25zdCBjaGF0UHJvdmlkZXIgPSBQcm92aWRlcnNbcHJvdmlkZXJdXG5cbiAgY29uc3QgbG9hZENoYXQgPSB1c2VDYWxsYmFjazwoYXJnczogeyBvcGVuOiBib29sZWFuIH0pID0+IHZvaWQ+KFxuICAgICh7IG9wZW4gPSB0cnVlIH0gPSB7IG9wZW46IHRydWUgfSkgPT4ge1xuICAgICAgaWYgKCFwcm92aWRlcktleSkge1xuICAgICAgICAvL2VzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25zb2xlXG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ05vIGFwaSBrZXkgZ2l2ZW4gdG8gcmVhY3QtbGl2ZS1jaGF0LWxvYWRlcicpXG4gICAgICAgIHJldHVyblxuICAgICAgfVxuXG4gICAgICBpZiAoIXByb3ZpZGVyKSB7XG4gICAgICAgIC8vZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnNvbGVcbiAgICAgICAgY29uc29sZS5lcnJvcignTm8gcHJvdmlkZXIgZ2l2ZW4gdG8gcmVhY3QtbGl2ZS1jaGF0LWxvYWRlcicpXG4gICAgICAgIHJldHVyblxuICAgICAgfVxuXG4gICAgICBjaGF0UHJvdmlkZXIubG9hZCh7XG4gICAgICAgIHByb3ZpZGVyS2V5LFxuICAgICAgICBzZXRTdGF0ZSxcbiAgICAgICAgYXBwSUQsXG4gICAgICAgIGxvY2FsZSxcbiAgICAgICAgYmFzZVVybCxcbiAgICAgICAgaW5zdGFuY2VJZCxcbiAgICAgICAgZW52LFxuICAgICAgICBnZW8sXG4gICAgICAgIGJlZm9yZUluaXQsXG4gICAgICAgIG9uUmVhZHlcbiAgICAgIH0pXG5cbiAgICAgIGlmIChvcGVuKSB7XG4gICAgICAgIGNoYXRQcm92aWRlci5vcGVuKClcbiAgICAgICAgaWYgKHN0YXRlICE9PSAnY29tcGxldGUnKSBzZXRTdGF0ZSgnb3BlbicpXG4gICAgICB9XG4gICAgfSxcbiAgICBbc3RhdGVdXG4gIClcblxuICByZXR1cm4gW3N0YXRlLCBsb2FkQ2hhdF1cbn1cblxuZXhwb3J0IGRlZmF1bHQgdXNlQ2hhdFxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7O0FBQUEsSUFBQUEsTUFBQSxHQUFBQyxPQUFBO0FBR0EsSUFBQUMsUUFBQSxHQUFBRCxPQUFBO0FBQ0EsSUFBQUUsU0FBQSxHQUFBQyx1QkFBQSxDQUFBSCxPQUFBO0FBQXlDLFNBQUFJLHlCQUFBQyxDQUFBLDZCQUFBQyxPQUFBLG1CQUFBQyxDQUFBLE9BQUFELE9BQUEsSUFBQUUsQ0FBQSxPQUFBRixPQUFBLFlBQUFGLHdCQUFBLFlBQUFBLHlCQUFBQyxDQUFBLFdBQUFBLENBQUEsR0FBQUcsQ0FBQSxHQUFBRCxDQUFBLEtBQUFGLENBQUE7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
;