@cometchat/chat-uikit-react
Version:
Ready-to-use Chat UI Components for React
131 lines (128 loc) • 3.93 kB
JavaScript
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 };