UNPKG

@cometchat/chat-uikit-react

Version:

Ready-to-use Chat UI Components for React

134 lines (130 loc) 4.01 kB
'use strict'; var react = require('react'); var jsxRuntime = require('react/jsx-runtime'); require('./index.css'); var CometChatFrameContext = react.createContext({ iframeDocument: null, iframeWindow: null, iframe: null }); var useCometChatFrameContext = () => { const context = react.useContext(CometChatFrameContext); return context; }; var CometChatFrameProvider = ({ children, iframeId }) => { const [iframeDocument, setIframeDocument] = react.useState(null); const [iframeWindow, setIframeWindow] = react.useState(null); const [iframe, setIframe] = react.useState(null); react.useEffect(() => { let timeoutId = null; let retryCount = 0; let mutationObserver = null; const maxRetries = 10; const baseDelay = 100; const maxDelay = 5e3; const initializeIframe = () => { const iframeElement2 = document.getElementById(iframeId); if (!iframeElement2?.contentWindow) { setIframe(null); setIframeWindow(null); setIframeDocument(null); return false; } try { const win = iframeElement2.contentWindow; const doc = iframeElement2.contentDocument ?? iframeElement2.contentWindow.document; setIframe(iframeElement2); setIframeWindow(win); setIframeDocument(doc); if (mutationObserver) { mutationObserver.disconnect(); mutationObserver = null; } return true; } catch (error) { console.warn("CometChatFrameProvider: Failed to access iframe content:", error); return false; } }; const scheduleRetry = () => { if (retryCount >= maxRetries) { console.warn( `CometChatFrameProvider: Failed to initialize iframe after ${String(maxRetries)} attempts` ); return; } const delay = Math.min(baseDelay * Math.pow(2, retryCount), maxDelay); const jitter = Math.random() * 0.1 * delay; const finalDelay = delay + jitter; timeoutId = setTimeout(() => { retryCount++; if (!initializeIframe()) { scheduleRetry(); } }, finalDelay); }; const setupMutationObserver = () => { mutationObserver = new MutationObserver((mutations) => { mutations.forEach((mutation) => { if (mutation.type === "childList") { mutation.addedNodes.forEach((node) => { if (node.nodeType === Node.ELEMENT_NODE) { const element = node; if (element.id === iframeId || element.querySelector(`#${iframeId}`)) { if (timeoutId) { clearTimeout(timeoutId); timeoutId = null; } retryCount = 0; initializeIframe(); } } }); } }); }); mutationObserver.observe(document.body, { childList: true, subtree: true }); }; if (!initializeIframe()) { setupMutationObserver(); scheduleRetry(); } const handleIframeLoad = () => { if (timeoutId) { clearTimeout(timeoutId); timeoutId = null; } retryCount = 0; initializeIframe(); }; const iframeElement = document.getElementById(iframeId); if (iframeElement) { iframeElement.addEventListener("load", handleIframeLoad); } return () => { if (timeoutId) { clearTimeout(timeoutId); } if (mutationObserver) { mutationObserver.disconnect(); } if (iframeElement) { iframeElement.removeEventListener("load", handleIframeLoad); } }; }, [iframeId]); const contextValue = { iframeDocument, iframeWindow, iframe }; return /* @__PURE__ */ jsxRuntime.jsx(CometChatFrameContext.Provider, { value: contextValue, children }); }; exports.CometChatFrameProvider = CometChatFrameProvider; exports.useCometChatFrameContext = useCometChatFrameContext;