declare global { interface Window { Goftino?: { open?: () => void; }; } } const isGoftinoAvailable = () => { return ( typeof window !== "undefined" && typeof window.Goftino?.open === "function" ); }; const LEGACY_HIDE_STYLE_IDS = [ "mori-hide-goftino-launcher", "mori-page-hide-goftino-launcher", ]; const GOFTINO_FOREGROUND_Z_INDEX = "2000000002"; const GOFTINO_BACKGROUND_Z_INDEX = "1"; const removeLegacyHideStyles = () => { LEGACY_HIDE_STYLE_IDS.forEach((id) => { document.getElementById(id)?.remove(); }); }; let launcherSyncTimer: number | null = null; let shouldKeepLauncherHidden = false; let goftinoOpenOverrideUntil = 0; const clearLauncherSyncTimer = () => { if (launcherSyncTimer !== null) { window.clearInterval(launcherSyncTimer); launcherSyncTimer = null; } }; const isIframeOpen = (iframe: HTMLIFrameElement) => { const rect = iframe.getBoundingClientRect(); return rect.width > 120 || rect.height > 120; }; const setIframeVisibilityHidden = ( iframe: HTMLIFrameElement, hidden: boolean, ) => { iframe.style.visibility = hidden ? "hidden" : ""; iframe.style.opacity = hidden ? "0" : ""; iframe.style.pointerEvents = hidden ? "none" : ""; iframe.style.zIndex = hidden ? GOFTINO_BACKGROUND_Z_INDEX : GOFTINO_FOREGROUND_Z_INDEX; }; const setIframeVisible = () => { const iframe = document.getElementById( "goftino_w", ) as HTMLIFrameElement | null; if (!iframe) { return; } setIframeVisibilityHidden(iframe, false); }; const setIframeLauncherHidden = (hidden: boolean) => { try { const iframe = document.getElementById( "goftino_w", ) as HTMLIFrameElement | null; if (!iframe) { return false; } const frameDocument = iframe?.contentWindow?.document; const shouldHideIframe = hidden && Date.now() >= goftinoOpenOverrideUntil && !isIframeOpen(iframe); if (!frameDocument) { setIframeVisibilityHidden(iframe, shouldHideIframe); return true; } const launcher = frameDocument.getElementById( "box-widget-icon", ) as HTMLElement | null; const newMessage = frameDocument.querySelector( ".box-new-message", ) as HTMLElement | null; if (!launcher && !newMessage) { setIframeVisibilityHidden(iframe, shouldHideIframe); return true; } if (launcher) { launcher.style.display = hidden ? "none" : ""; } if (newMessage) { newMessage.style.display = hidden ? "none" : ""; } setIframeVisibilityHidden(iframe, shouldHideIframe); return true; } catch { return false; } }; export const openGoftinoChat = () => { if (!isGoftinoAvailable()) { console.debug("[mori-widget] Goftino is not available"); return; } goftinoOpenOverrideUntil = Date.now() + 1500; removeLegacyHideStyles(); setIframeVisible(); console.debug("[mori-widget] Opening Goftino chat"); window.Goftino!.open!(); }; export const setGoftinoLauncherHidden = (hidden: boolean) => { if (typeof document === "undefined") { return; } shouldKeepLauncherHidden = hidden; removeLegacyHideStyles(); if (!hidden) { goftinoOpenOverrideUntil = 0; clearLauncherSyncTimer(); setIframeLauncherHidden(false); return; } setIframeLauncherHidden(true); if (launcherSyncTimer !== null) { return; } launcherSyncTimer = window.setInterval(() => { if (!shouldKeepLauncherHidden) { clearLauncherSyncTimer(); return; } removeLegacyHideStyles(); setIframeLauncherHidden(true); }, 300); }; export {};