UNPKG

tb-react-live-chat-loader

Version:

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

94 lines (84 loc) 10.9 kB
import { useContext, useCallback, useEffect } from 'react'; import { LiveChatLoaderContext } from "../context"; import * as Providers from "../providers"; const requestIdleCallback = typeof window !== 'undefined' ? window.requestIdleCallback : null; const connection = typeof window !== 'undefined' ? // eslint-disable-next-line @typescript-eslint/no-explicit-any window.navigator && window.navigator.connection : null; const useChat = ({ loadWhenIdle } = { loadWhenIdle: false }) => { const { provider, providerKey, idlePeriod, state, setState, appID, locale, baseUrl, beforeInit, onReady } = useContext(LiveChatLoaderContext); useEffect(() => { // 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 let elapsedIdlePeriod = 0; let previousTimeRemaining = 0; const scheduleLoadChat = deadline => { if (elapsedIdlePeriod > idlePeriod) return loadChat({ open: false }); const 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 ? void 0 : requestIdleCallback(scheduleLoadChat); }; if (requestIdleCallback) { requestIdleCallback(scheduleLoadChat); } else { setTimeout(() => loadChat({ open: false }), idlePeriod); } }, []); const chatProvider = Providers[provider]; const loadChat = useCallback(({ open = true } = { open: true }) => { 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, setState, appID, locale, baseUrl, beforeInit, 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,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9ob29rcy91c2VDaGF0LnRzIl0sIm5hbWVzIjpbInVzZUNvbnRleHQiLCJ1c2VDYWxsYmFjayIsInVzZUVmZmVjdCIsIkxpdmVDaGF0TG9hZGVyQ29udGV4dCIsIlByb3ZpZGVycyIsInJlcXVlc3RJZGxlQ2FsbGJhY2siLCJ3aW5kb3ciLCJjb25uZWN0aW9uIiwibmF2aWdhdG9yIiwidXNlQ2hhdCIsImxvYWRXaGVuSWRsZSIsInByb3ZpZGVyIiwicHJvdmlkZXJLZXkiLCJpZGxlUGVyaW9kIiwic3RhdGUiLCJzZXRTdGF0ZSIsImFwcElEIiwibG9jYWxlIiwiYmFzZVVybCIsImJlZm9yZUluaXQiLCJvblJlYWR5Iiwic2F2ZURhdGEiLCJ0ZXN0IiwiZWZmZWN0aXZlVHlwZSIsImlzTmFOIiwiZWxhcHNlZElkbGVQZXJpb2QiLCJwcmV2aW91c1RpbWVSZW1haW5pbmciLCJzY2hlZHVsZUxvYWRDaGF0IiwiZGVhZGxpbmUiLCJsb2FkQ2hhdCIsIm9wZW4iLCJ0aW1lUmVtYWluaW5nIiwic2V0VGltZW91dCIsImNoYXRQcm92aWRlciIsImNvbnNvbGUiLCJlcnJvciIsImxvYWQiXSwibWFwcGluZ3MiOiJBQUFBLFNBQVNBLFVBQVQsRUFBcUJDLFdBQXJCLEVBQWtDQyxTQUFsQyxRQUFtRCxPQUFuRDtBQUdBLFNBQVNDLHFCQUFUO0FBQ0EsT0FBTyxLQUFLQyxTQUFaO0FBRUEsTUFBTUMsbUJBQW1CLEdBQ3ZCLE9BQU9DLE1BQVAsS0FBa0IsV0FBbEIsR0FBZ0NBLE1BQU0sQ0FBQ0QsbUJBQXZDLEdBQTZELElBRC9EO0FBRUEsTUFBTUUsVUFBVSxHQUNkLE9BQU9ELE1BQVAsS0FBa0IsV0FBbEIsR0FDSTtBQUNBQSxNQUFNLENBQUNFLFNBQVAsSUFBcUJGLE1BQU0sQ0FBQ0UsU0FBUixDQUEwQkQsVUFGbEQsR0FHSSxJQUpOOztBQU1BLE1BQU1FLE9BQU8sR0FBRyxDQUNkO0FBQ0VDLEVBQUFBO0FBREYsSUFJSTtBQUFFQSxFQUFBQSxZQUFZ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QjBCLENBQTVCO0FBZ0NBLFNBQU8sQ0FBQ0EsS0FBRCxFQUFRZSxRQUFSLENBQVA7QUFDRCxDQTdGRDs7QUErRkEsZUFBZXBCLE9BQWYiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyB1c2VDb250ZXh0LCB1c2VDYWxsYmFjaywgdXNlRWZmZWN0IH0gZnJvbSAncmVhY3QnXG5cbmltcG9ydCB7IFN0YXRlIH0gZnJvbSAnLi4vdHlwZXMnXG5pbXBvcnQgeyBMaXZlQ2hhdExvYWRlckNvbnRleHQgfSBmcm9tICcuLi9jb250ZXh0J1xuaW1wb3J0ICogYXMgUHJvdmlkZXJzIGZyb20gJy4uL3Byb3ZpZGVycydcblxuY29uc3QgcmVxdWVzdElkbGVDYWxsYmFjayA9XG4gIHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnID8gd2luZG93LnJlcXVlc3RJZGxlQ2FsbGJhY2sgOiBudWxsXG5jb25zdCBjb25uZWN0aW9uID1cbiAgdHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCdcbiAgICA/IC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgICB3aW5kb3cubmF2aWdhdG9yICYmICh3aW5kb3cubmF2aWdhdG9yIGFzIGFueSkuY29ubmVjdGlvblxuICAgIDogbnVsbFxuXG5jb25zdCB1c2VDaGF0ID0gKFxuICB7XG4gICAgbG9hZFdoZW5JZGxlXG4gIH06IHtcbiAgICBsb2FkV2hlbklkbGU6IGJvb2xlYW5cbiAgfSA9IHsgbG9hZFdoZW5JZGxlOiBmYWxzZSB9XG4pOiBbU3RhdGUsICh7IG9wZW4gfTogeyBvcGVuOiBib29sZWFuIH0pID0+IHZvaWRdID0+IHtcbiAgY29uc3Qge1xuICAgIHByb3ZpZGVyLFxuICAgIHByb3ZpZGVyS2V5LFxuICAgIGlkbGVQZXJpb2QsXG4gICAgc3RhdGUsXG4gICAgc2V0U3RhdGUsXG4gICAgYXBwSUQsXG4gICAgbG9jYWxlLFxuICAgIGJhc2VVcmwsXG4gICAgYmVmb3JlSW5pdCxcbiAgICBvblJlYWR5XG4gIH0gPSB1c2VDb250ZXh0KExpdmVDaGF0TG9hZGVyQ29udGV4dClcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIC8vIERvbid0IGxvYWQgaWYgaWRsZVBlcmlvZCBpcyAwLCBudWxsIG9yIHVuZGVmaW5lZFxuICAgIGlmICh0eXBlb2Ygd2luZG93ID09PSAndW5kZWZpbmVkJyB8fCAhbG9hZFdoZW5JZGxlIHx8ICFpZGxlUGVyaW9kKSByZXR1cm5cblxuICAgIC8vIERvbid0IGxvYWQgaWYgMmcgY29ubmVjdGlvbiBvciBzYXZlLWRhdGEgaXMgZW5hYmxlZFxuICAgIGlmIChcbiAgICAgIGNvbm5lY3Rpb24gJiZcbiAgICAgIChjb25uZWN0aW9uLnNhdmVEYXRhIHx8IC8yZy8udGVzdChjb25uZWN0aW9uLmVmZmVjdGl2ZVR5cGUpKVxuICAgIClcbiAgICAgIHJldHVyblxuXG4gICAgaWYgKGlzTmFOKGlkbGVQZXJpb2QpKSByZXR1cm5cblxuICAgIC8vIGRlYWRsaW5lLnRpbWVSZW1haW5pbmcoKSBoYXMgYW4gdXBwZXIgbGltaXQgb2YgNTAgbWlsbGlzZWNvbmRzXG4gICAgLy8gV2Ugd2FudCB0byBlbnN1cmUgdGhlIHBhZ2UgaGFzIGJlZW4gaWRsZSBmb3IgYSBzaWduaWZpY2FudCBwZXJpb2Qgb2YgdGltZVxuICAgIC8vIFRoZXJlZm9yZSB3ZSBjb3VudCBjb25zZWN1dGl2ZSBtYXhpbXVtIHRpbWVSZW1haW5pbmcgY291bnRzIGFuZCBsb2FkIGNoYXQgd2hlbiB3ZSByZWFjaCBvdXIgdGhyZXNob2xkXG4gICAgbGV0IGVsYXBzZWRJZGxlUGVyaW9kID0gMFxuICAgIGxldCBwcmV2aW91c1RpbWVSZW1haW5pbmcgPSAwXG4gICAgY29uc3Qgc2NoZWR1bGVMb2FkQ2hhdCA9IChkZWFkbGluZTogSWRsZURlYWRsaW5lKSA9PiB7XG4gICAgICBpZiAoZWxhcHNlZElkbGVQZXJpb2QgPiBpZGxlUGVyaW9kKSByZXR1cm4gbG9hZENoYXQoeyBvcGVuOiBmYWxzZSB9KVxuXG4gICAgICBjb25zdCB0aW1lUmVtYWluaW5nID0gZGVhZGxpbmUudGltZVJlbWFpbmluZygpXG4gICAgICAvLyBUbyBlbnN1cmUgYnJvd3NlciBpcyBpZGxlLCBvbmx5IGFjY3VtYWx0ZSBlbGFwc2VkSWRsZVBlcmlvZCB3aGVuXG4gICAgICAvLyB0d28gY29uc2VjdXRpdmUgbWF4aW11bSB0aW1lUmVtYWluaW5nJ3MgaGF2ZSBiZWVuIG9ic2VydmVkXG4gICAgICBpZiAocHJldmlvdXNUaW1lUmVtYWluaW5nID4gNDkgJiYgdGltZVJlbWFpbmluZyA+IDQ5KVxuICAgICAgICBlbGFwc2VkSWRsZVBlcmlvZCArPSB0aW1lUmVtYWluaW5nXG5cbiAgICAgIHByZXZpb3VzVGltZVJlbWFpbmluZyA9IHRpbWVSZW1haW5pbmdcbiAgICAgIHJlcXVlc3RJZGxlQ2FsbGJhY2s/LihzY2hlZHVsZUxvYWRDaGF0KVxuICAgIH1cblxuICAgIGlmIChyZXF1ZXN0SWRsZUNhbGxiYWNrKSB7XG4gICAgICByZXF1ZXN0SWRsZUNhbGxiYWNrKHNjaGVkdWxlTG9hZENoYXQpXG4gICAgfSBlbHNlIHtcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4gbG9hZENoYXQoeyBvcGVuOiBmYWxzZSB9KSwgaWRsZVBlcmlvZClcbiAgICB9XG4gIH0sIFtdKVxuXG4gIGNvbnN0IGNoYXRQcm92aWRlciA9IFByb3ZpZGVyc1twcm92aWRlcl1cblxuICBjb25zdCBsb2FkQ2hhdCA9IHVzZUNhbGxiYWNrPChhcmdzOiB7IG9wZW46IGJvb2xlYW4gfSkgPT4gdm9pZD4oXG4gICAgKHsgb3BlbiA9IHRydWUgfSA9IHsgb3BlbjogdHJ1ZSB9KSA9PiB7XG4gICAgICBpZiAoIXByb3ZpZGVyS2V5KSB7XG4gICAgICAgIC8vZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnNvbGVcbiAgICAgICAgY29uc29sZS5lcnJvcignTm8gYXBpIGtleSBnaXZlbiB0byByZWFjdC1saXZlLWNoYXQtbG9hZGVyJylcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG5cbiAgICAgIGlmICghcHJvdmlkZXIpIHtcbiAgICAgICAgLy9lc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29uc29sZVxuICAgICAgICBjb25zb2xlLmVycm9yKCdObyBwcm92aWRlciBnaXZlbiB0byByZWFjdC1saXZlLWNoYXQtbG9hZGVyJylcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG5cbiAgICAgIGNoYXRQcm92aWRlci5sb2FkKHtcbiAgICAgICAgcHJvdmlkZXJLZXksXG4gICAgICAgIHNldFN0YXRlLFxuICAgICAgICBhcHBJRCxcbiAgICAgICAgbG9jYWxlLFxuICAgICAgICBiYXNlVXJsLFxuICAgICAgICBiZWZvcmVJbml0LFxuICAgICAgICBvblJlYWR5XG4gICAgICB9KVxuXG4gICAgICBpZiAob3Blbikge1xuICAgICAgICBjaGF0UHJvdmlkZXIub3BlbigpXG4gICAgICAgIGlmIChzdGF0ZSAhPT0gJ2NvbXBsZXRlJykgc2V0U3RhdGUoJ29wZW4nKVxuICAgICAgfVxuICAgIH0sXG4gICAgW3N0YXRlXVxuICApXG5cbiAgcmV0dXJuIFtzdGF0ZSwgbG9hZENoYXRdXG59XG5cbmV4cG9ydCBkZWZhdWx0IHVzZUNoYXRcbiJdfQ==