// @flow import React from 'react'; import { withRouter } from 'react-router'; import { formatWebUrlIntoLbryUrl } from 'util/url'; import Nag from 'component/common/nag'; import usePersistedState from 'effects/use-persisted-state'; const userAgent = navigator.userAgent.toLowerCase(); const isAndroidDevice = userAgent.includes('android'); const isDesktopDevice = typeof window.orientation === 'undefined'; const addDaysToMs = (initialNumberInMs: number, daysToAdd: number) => { return initialNumberInMs + daysToAdd * 1000 * 60 * 60 * 24; }; type Props = { history: { replace: string => void, push: string => void }, location: { search: string, pathname: string }, uri: string, user: ?User, }; function OpenInAppLink(props: Props) { const { history: { replace }, location, uri, user, } = props; const [showNag, setShowNag] = React.useState(false); const [closeNagClicksCount, setCloseNagClicksCount] = usePersistedState('open-in-app-close-count', 0); const [closeNagLastDate, setCloseNagLastDate] = usePersistedState('open-in-app-close-date', 0); const { pathname, search } = location; let params = new URLSearchParams(search); const hasSrcParam = params.get('src'); let isAndroidUser = false; let isDesktopUser = false; user && user.device_types && user.device_types.forEach(usedDevice => { if (usedDevice === 'mobile') { isAndroidUser = true; } else if (usedDevice === 'desktop') { isDesktopUser = true; } }); const isWebUserOnly = !isAndroidUser && !isDesktopUser; let appLink = uri; if (!appLink) { appLink = formatWebUrlIntoLbryUrl(pathname, search); } function handleClose() { setShowNag(false); setCloseNagClicksCount(closeNagClicksCount + 1); setCloseNagLastDate(Date.now()); } React.useEffect(() => { if (hasSrcParam) { params.delete('src'); const newParams = params.toString(); const newUrl = `${pathname}?${newParams}`; replace(newUrl); } }, [hasSrcParam, search, pathname, replace]); React.useEffect(() => { const isOnDeviceToPrompt = (isAndroidUser && isAndroidDevice) || (isDesktopUser && isDesktopDevice); const dateRightNow = Date.now(); const daysToAddToDate = Math.min(30, Math.pow(2, closeNagClicksCount)); const startDateForAnotherOpenNag = closeNagLastDate + addDaysToMs(closeNagLastDate, daysToAddToDate); const hasWaitedEnoughTime = dateRightNow > startDateForAnotherOpenNag; if (isOnDeviceToPrompt && hasWaitedEnoughTime) { setShowNag(true); } // Don't pass showNag into this effect because we only want the initial value // If the param is removed from the url, the nag should still be shown }, [setShowNag, isAndroidUser, isDesktopUser, closeNagLastDate, closeNagClicksCount]); if (!showNag || isWebUserOnly) { return null; } return ( ); } export default withRouter(OpenInAppLink);