UNPKG

@cometchat/chat-uikit-react

Version:

Ready-to-use Chat UI Components for React

131 lines (128 loc) 3.93 kB
import './index.css'; import { createContext, useContext, useState, useEffect } from 'react'; import { jsx } from 'react/jsx-runtime'; var CometChatFrameContext = createContext({ iframeDocument: null, iframeWindow: null, iframe: null }); var useCometChatFrameContext = () => { const context = useContext(CometChatFrameContext); return context; }; var CometChatFrameProvider = ({ children, iframeId }) => { const [iframeDocument, setIframeDocument] = useState(null); const [iframeWindow, setIframeWindow] = useState(null); const [iframe, setIframe] = useState(null); 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__ */ jsx(CometChatFrameContext.Provider, { value: contextValue, children }); }; export { CometChatFrameProvider, useCometChatFrameContext };