lbry-desktop/web/component/adsSticky/view.jsx

81 lines
2.3 KiB
React
Raw Normal View History

// @flow
import React from 'react';
import { useHistory } from 'react-router-dom';
import * as PAGES from 'constants/pages';
import useShouldShowAds from 'effects/use-should-show-ads';
// ****************************************************************************
// AdsSticky
// ****************************************************************************
const PATH_BLACKLIST = [
// Don't show sticky in these paths:
{ path: `/`, exact: true },
{ path: `/$/${PAGES.AUTH}`, exact: false },
{ path: `/$/${PAGES.AUTH_SIGNIN}`, exact: false },
{ path: `/$/${PAGES.AUTH_VERIFY}`, exact: false },
{ path: `/$/${PAGES.SETTINGS}`, exact: false },
];
const OUTBRAIN_CONTAINER_KEY = 'outbrainSizeDiv';
let gScript;
type Props = {
isAdBlockerFound: ?boolean,
userHasPremiumPlus: boolean,
userCountry: string,
currentTheme: string,
doSetAdBlockerFound: (boolean) => void,
};
export default function AdsSticky(props: Props) {
const { isAdBlockerFound, userHasPremiumPlus, userCountry, doSetAdBlockerFound } = props;
const shouldShowAds = useShouldShowAds(userHasPremiumPlus, userCountry, isAdBlockerFound, doSetAdBlockerFound);
const {
location: { pathname },
} = useHistory();
// -- Mount script; 1 per session.
React.useEffect(() => {
if (shouldShowAds && !gScript && !inIFrame()) {
gScript = document.createElement('script');
gScript.src = 'https://adncdnend.azureedge.net/adtags/odysee.adn.js';
gScript.async = true;
// $FlowFixMe
document.body.appendChild(gScript);
}
}, [shouldShowAds]);
// -- Update visibility per pathname
React.useEffect(() => {
const container = window[OUTBRAIN_CONTAINER_KEY];
if (container) {
for (const x of PATH_BLACKLIST) {
const found = (x.exact && pathname === x.path) || (!x.exact && pathname.startsWith(x.path));
if (found) {
container.style.display = 'none';
return;
}
}
container.style.display = '';
}
}, [pathname]);
// Nothing for us to mount; the ad script will handle everything.
return null;
}
// ****************************************************************************
// Helpers
// ****************************************************************************
function inIFrame() {
try {
return window.self !== window.top;
} catch (e) {
return true;
}
}