UNPKG

react-live-chat-loader

Version:

Implement live chat in your react app without taking a performance hit.

98 lines (96 loc) 12.7 kB
import { useContext, useCallback, useEffect } from 'react'; import { LiveChatLoaderContext } from "../context"; import * as Providers from "../providers"; 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 = useContext(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; 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 = 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]; }; export default useChat; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJ1c2VDb250ZXh0IiwidXNlQ2FsbGJhY2siLCJ1c2VFZmZlY3QiLCJMaXZlQ2hhdExvYWRlckNvbnRleHQiLCJQcm92aWRlcnMiLCJyZXF1ZXN0SWRsZUNhbGxiYWNrIiwid2luZG93IiwiY29ubmVjdGlvbiIsIm5hdmlnYXRvciIsInVzZUNoYXQiLCJfcmVmIiwiYXJndW1lbnRzIiwibGVuZ3RoIiwidW5kZWZpbmVkIiwibG9hZFdoZW5JZGxlIiwiX3VzZUNvbnRleHQiLCJwcm92aWRlciIsInByb3ZpZGVyS2V5IiwiaWRsZVBlcmlvZCIsInN0YXRlIiwic2V0U3RhdGUiLCJhcHBJRCIsImxvY2FsZSIsImJhc2VVcmwiLCJpbnN0YW5jZUlkIiwiZW52IiwiZ2VvIiwiYmVmb3JlSW5pdCIsIm9uUmVhZHkiLCJzYXZlRGF0YSIsInRlc3QiLCJlZmZlY3RpdmVUeXBlIiwiaXNOYU4iLCJlbGFwc2VkSWRsZVBlcmlvZCIsInByZXZpb3VzVGltZVJlbWFpbmluZyIsInNjaGVkdWxlTG9hZENoYXQiLCJkZWFkbGluZSIsImxvYWRDaGF0Iiwib3BlbiIsInRpbWVSZW1haW5pbmciLCJzZXRUaW1lb3V0IiwiY2hhdFByb3ZpZGVyIiwiX3JlZjIiLCJfcmVmMiRvcGVuIiwiY29uc29sZSIsImVycm9yIiwibG9hZCJdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9ob29rcy91c2VDaGF0LnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHVzZUNvbnRleHQsIHVzZUNhbGxiYWNrLCB1c2VFZmZlY3QgfSBmcm9tICdyZWFjdCdcblxuaW1wb3J0IHsgU3RhdGUgfSBmcm9tICcuLi90eXBlcydcbmltcG9ydCB7IExpdmVDaGF0TG9hZGVyQ29udGV4dCB9IGZyb20gJy4uL2NvbnRleHQnXG5pbXBvcnQgKiBhcyBQcm92aWRlcnMgZnJvbSAnLi4vcHJvdmlkZXJzJ1xuXG5jb25zdCByZXF1ZXN0SWRsZUNhbGxiYWNrID1cbiAgdHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgPyB3aW5kb3cucmVxdWVzdElkbGVDYWxsYmFjayA6IG51bGxcbmNvbnN0IGNvbm5lY3Rpb24gPVxuICB0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJ1xuICAgID8gLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICAgIHdpbmRvdy5uYXZpZ2F0b3IgJiYgKHdpbmRvdy5uYXZpZ2F0b3IgYXMgYW55KS5jb25uZWN0aW9uXG4gICAgOiBudWxsXG5cbmNvbnN0IHVzZUNoYXQgPSAoXG4gIHtcbiAgICBsb2FkV2hlbklkbGVcbiAgfToge1xuICAgIGxvYWRXaGVuSWRsZTogYm9vbGVhblxuICB9ID0geyBsb2FkV2hlbklkbGU6IGZhbHNlIH1cbik6IFtTdGF0ZSwgKHsgb3BlbiB9OiB7IG9wZW46IGJvb2xlYW4gfSkgPT4gdm9pZF0gPT4ge1xuICBjb25zdCB7XG4gICAgcHJvdmlkZXIsXG4gICAgcHJvdmlkZXJLZXksXG4gICAgaWRsZVBlcmlvZCxcbiAgICBzdGF0ZSxcbiAgICBzZXRTdGF0ZSxcbiAgICBhcHBJRCxcbiAgICBsb2NhbGUsXG4gICAgYmFzZVVybCxcbiAgICAvLyBpbnN0YW5jZUlkLCBlbnYgYW5kIGdlbyBhcmUgb25seSByZWxldmFudCBmb3IgQWRvYmUgRHluYW1pYyBDaGF0XG4gICAgaW5zdGFuY2VJZCxcbiAgICBlbnYsXG4gICAgZ2VvLFxuICAgIGJlZm9yZUluaXQsXG4gICAgb25SZWFkeVxuICB9ID0gdXNlQ29udGV4dChMaXZlQ2hhdExvYWRlckNvbnRleHQpXG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICAvLyBEb24ndCBsb2FkIGlmIGlkbGVQZXJpb2QgaXMgMCwgbnVsbCBvciB1bmRlZmluZWRcbiAgICBpZiAodHlwZW9mIHdpbmRvdyA9PT0gJ3VuZGVmaW5lZCcgfHwgIWxvYWRXaGVuSWRsZSB8fCAhaWRsZVBlcmlvZCkgcmV0dXJuXG5cbiAgICAvLyBEb24ndCBsb2FkIGlmIDJnIGNvbm5lY3Rpb24gb3Igc2F2ZS1kYXRhIGlzIGVuYWJsZWRcbiAgICBpZiAoXG4gICAgICBjb25uZWN0aW9uICYmXG4gICAgICAoY29ubmVjdGlvbi5zYXZlRGF0YSB8fCAvMmcvLnRlc3QoY29ubmVjdGlvbi5lZmZlY3RpdmVUeXBlKSlcbiAgICApXG4gICAgICByZXR1cm5cblxuICAgIGlmIChpc05hTihpZGxlUGVyaW9kKSkgcmV0dXJuXG5cbiAgICAvLyBkZWFkbGluZS50aW1lUmVtYWluaW5nKCkgaGFzIGFuIHVwcGVyIGxpbWl0IG9mIDUwIG1pbGxpc2Vjb25kc1xuICAgIC8vIFdlIHdhbnQgdG8gZW5zdXJlIHRoZSBwYWdlIGhhcyBiZWVuIGlkbGUgZm9yIGEgc2lnbmlmaWNhbnQgcGVyaW9kIG9mIHRpbWVcbiAgICAvLyBUaGVyZWZvcmUgd2UgY291bnQgY29uc2VjdXRpdmUgbWF4aW11bSB0aW1lUmVtYWluaW5nIGNvdW50cyBhbmQgbG9hZCBjaGF0IHdoZW4gd2UgcmVhY2ggb3VyIHRocmVzaG9sZFxuICAgIGxldCBlbGFwc2VkSWRsZVBlcmlvZCA9IDBcbiAgICBsZXQgcHJldmlvdXNUaW1lUmVtYWluaW5nID0gMFxuICAgIGNvbnN0IHNjaGVkdWxlTG9hZENoYXQgPSAoZGVhZGxpbmU6IElkbGVEZWFkbGluZSkgPT4ge1xuICAgICAgaWYgKGVsYXBzZWRJZGxlUGVyaW9kID4gaWRsZVBlcmlvZCkgcmV0dXJuIGxvYWRDaGF0KHsgb3BlbjogZmFsc2UgfSlcblxuICAgICAgY29uc3QgdGltZVJlbWFpbmluZyA9IGRlYWRsaW5lLnRpbWVSZW1haW5pbmcoKVxuICAgICAgLy8gVG8gZW5zdXJlIGJyb3dzZXIgaXMgaWRsZSwgb25seSBhY2N1bWFsdGUgZWxhcHNlZElkbGVQZXJpb2Qgd2hlblxuICAgICAgLy8gdHdvIGNvbnNlY3V0aXZlIG1heGltdW0gdGltZVJlbWFpbmluZydzIGhhdmUgYmVlbiBvYnNlcnZlZFxuICAgICAgaWYgKHByZXZpb3VzVGltZVJlbWFpbmluZyA+IDQ5ICYmIHRpbWVSZW1haW5pbmcgPiA0OSlcbiAgICAgICAgZWxhcHNlZElkbGVQZXJpb2QgKz0gdGltZVJlbWFpbmluZ1xuXG4gICAgICBwcmV2aW91c1RpbWVSZW1haW5pbmcgPSB0aW1lUmVtYWluaW5nXG4gICAgICByZXF1ZXN0SWRsZUNhbGxiYWNrPy4oc2NoZWR1bGVMb2FkQ2hhdClcbiAgICB9XG5cbiAgICBpZiAocmVxdWVzdElkbGVDYWxsYmFjaykge1xuICAgICAgcmVxdWVzdElkbGVDYWxsYmFjayhzY2hlZHVsZUxvYWRDaGF0KVxuICAgIH0gZWxzZSB7XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IGxvYWRDaGF0KHsgb3BlbjogZmFsc2UgfSksIGlkbGVQZXJpb2QpXG4gICAgfVxuICB9LCBbXSlcblxuICBjb25zdCBjaGF0UHJvdmlkZXIgPSBQcm92aWRlcnNbcHJvdmlkZXJdXG5cbiAgY29uc3QgbG9hZENoYXQgPSB1c2VDYWxsYmFjazwoYXJnczogeyBvcGVuOiBib29sZWFuIH0pID0+IHZvaWQ+KFxuICAgICh7IG9wZW4gPSB0cnVlIH0gPSB7IG9wZW46IHRydWUgfSkgPT4ge1xuICAgICAgaWYgKCFwcm92aWRlcktleSkge1xuICAgICAgICAvL2VzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25zb2xlXG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ05vIGFwaSBrZXkgZ2l2ZW4gdG8gcmVhY3QtbGl2ZS1jaGF0LWxvYWRlcicpXG4gICAgICAgIHJldHVyblxuICAgICAgfVxuXG4gICAgICBpZiAoIXByb3ZpZGVyKSB7XG4gICAgICAgIC8vZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnNvbGVcbiAgICAgICAgY29uc29sZS5lcnJvcignTm8gcHJvdmlkZXIgZ2l2ZW4gdG8gcmVhY3QtbGl2ZS1jaGF0LWxvYWRlcicpXG4gICAgICAgIHJldHVyblxuICAgICAgfVxuXG4gICAgICBjaGF0UHJvdmlkZXIubG9hZCh7XG4gICAgICAgIHByb3ZpZGVyS2V5LFxuICAgICAgICBzZXRTdGF0ZSxcbiAgICAgICAgYXBwSUQsXG4gICAgICAgIGxvY2FsZSxcbiAgICAgICAgYmFzZVVybCxcbiAgICAgICAgaW5zdGFuY2VJZCxcbiAgICAgICAgZW52LFxuICAgICAgICBnZW8sXG4gICAgICAgIGJlZm9yZUluaXQsXG4gICAgICAgIG9uUmVhZHlcbiAgICAgIH0pXG5cbiAgICAgIGlmIChvcGVuKSB7XG4gICAgICAgIGNoYXRQcm92aWRlci5vcGVuKClcbiAgICAgICAgaWYgKHN0YXRlICE9PSAnY29tcGxldGUnKSBzZXRTdGF0ZSgnb3BlbicpXG4gICAgICB9XG4gICAgfSxcbiAgICBbc3RhdGVdXG4gIClcblxuICByZXR1cm4gW3N0YXRlLCBsb2FkQ2hhdF1cbn1cblxuZXhwb3J0IGRlZmF1bHQgdXNlQ2hhdFxuIl0sIm1hcHBpbmdzIjoiQUFBQSxTQUFTQSxVQUFVLEVBQUVDLFdBQVcsRUFBRUMsU0FBUyxRQUFRLE9BQU87QUFHMUQsU0FBU0MscUJBQXFCO0FBQzlCLE9BQU8sS0FBS0MsU0FBUztBQUVyQixJQUFNQyxtQkFBbUIsR0FDdkIsT0FBT0MsTUFBTSxLQUFLLFdBQVcsR0FBR0EsTUFBTSxDQUFDRCxtQkFBbUIsR0FBRyxJQUFJO0FBQ25FLElBQU1FLFVBQVUsR0FDZCxPQUFPRCxNQUFNLEtBQUssV0FBVztBQUN6QjtBQUNBQSxNQUFNLENBQUNFLFNBQVMsSUFBS0YsTUFBTSxDQUFDRSxTQUFTLENBQVNELFVBQVUsR0FDeEQsSUFBSTtBQUVWLElBQU1FLE9BQU8sR0FBRyxTQUFWQSxPQUFPQSxDQUFBLEVBTXdDO0VBQUEsSUFBQUMsSUFBQSxHQUFBQyxTQUFBLENBQUFDLE1BQUEsUUFBQUQsU0FBQSxRQUFBRSxTQUFBLEdBQUFGLFNBQUEsTUFEL0M7TUFBRUcsWUFBWSxFQUFFO0lBQU0sQ0FBQztJQUh6QkEsWUFBWSxHQUFBSixJQUFBLENBQVpJLFlBQVk7RUFLZCxJQUFBQyxXQUFBLEdBZUlmLFVBQVUsQ0FBQ0cscUJBQXFCLENBQUM7SUFkbkNhLFFBQVEsR0FBQUQsV0FBQSxDQUFS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