import {useAuth} from '../../auth/use-auth'; import {memo, useEffect, useId, useMemo, useRef} from 'react'; import lazyLoader from '../../utils/http/lazy-loader'; import clsx from 'clsx'; import {useSettings} from '../../core/settings/use-settings'; import dot from 'dot-object'; import {Settings} from '@common/core/settings/settings'; import {getScrollParent} from '@react-aria/utils'; interface AdHostProps { slot: keyof Omit, 'disable'>; className?: string; } export function AdHost({slot, className}: AdHostProps) { const settings = useSettings(); const {isSubscribed} = useAuth(); const adCode = useMemo(() => { return dot.pick(`ads.${slot}`, settings); }, [slot, settings]); if (settings.ads?.disable || isSubscribed || !adCode) return null; return ; } interface InvariantAdProps { slot: string; adCode: string; className?: string; } const InvariantAd = memo( ({slot, adCode, className}: InvariantAdProps) => { const ref = useRef(null); const id = useId(); useEffect(() => { if (ref.current) { loadAdScripts(adCode, ref.current).then(() => { executeAdJavascript(adCode, id); }); } return () => { // @ts-ignore delete window['google_ad_modifications']; }; }, [adCode, id]); // remove height modifications added by adsense useEffect(() => { if (ref.current) { const scrollParent = getScrollParent(ref.current) as HTMLElement; if (scrollParent) { const observer = new MutationObserver(function () { scrollParent.style.height = ''; scrollParent.style.minHeight = ''; }); observer.observe(scrollParent, { attributes: true, attributeFilter: ['style'], }); return () => observer.disconnect(); } } }, []); return (
); }, () => { // never re-render return false; }, ); function getAdHtml(adCode: string) { // strip out all script tags from ad code and leave only html return adCode ?.replace(/)<[^<]*)*<\/script>/gi, '') .trim(); } // Load any external scripts needed by ad. function loadAdScripts(adCode: string, parentEl: HTMLDivElement): Promise { const promises = []; // load ad code script const pattern = /]*>([\s\S]*?)<\/script>/g; let content; while ((content = pattern.exec(adCode))) { if (content[1]) { const r = `var d = document.createElement('div'); d.innerHTML = $1; document.getElementById('${id}').appendChild(d.firstChild);`; const toEval = content[1].replace(/document.write\((.+?)\);/, r); eval(toEval); } } }