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