import { memo, useCallback, useEffect, useState, useMemo } from 'react' import * as eventTracking from '../../../infrastructure/event-tracking' import { useDetachCompileContext } from '../../../shared/context/detach-compile-context' import usePersistedState from '../../../shared/hooks/use-persisted-state' import Notification from '../../../shared/components/notification' import { Trans, useTranslation } from 'react-i18next' import StartFreeTrialButton from '@/shared/components/start-free-trial-button' function CompileTimeoutMessages() { const { showNewCompileTimeoutUI, isProjectOwner, deliveryLatencies, compiling, showLogs, error, } = useDetachCompileContext() const { t } = useTranslation() const [showWarning, setShowWarning] = useState(false) const [showChangingSoon, setShowChangingSoon] = useState(false) const [dismissedUntilWarning, setDismissedUntilWarning] = usePersistedState< Date | undefined >(`has-dismissed-10s-compile-time-warning-until`) const segmentation = useMemo(() => { return { newCompileTimeout: showNewCompileTimeoutUI, isProjectOwner, } }, [showNewCompileTimeoutUI, isProjectOwner]) const handleNewCompile = useCallback( compileTime => { setShowWarning(false) setShowChangingSoon(false) if (compileTime > 20000) { if (showNewCompileTimeoutUI === 'changing') { setShowChangingSoon(true) eventTracking.sendMB('compile-time-warning-displayed', { time: 20, ...segmentation, }) } } else if (compileTime > 10000) { setShowChangingSoon(false) if ( (isProjectOwner && showNewCompileTimeoutUI === 'active') || showNewCompileTimeoutUI === 'changing' ) { if ( !dismissedUntilWarning || new Date(dismissedUntilWarning) < new Date() ) { setShowWarning(true) eventTracking.sendMB('compile-time-warning-displayed', { time: 10, ...segmentation, }) } } } }, [ isProjectOwner, showNewCompileTimeoutUI, dismissedUntilWarning, segmentation, ] ) const handleDismissWarning = useCallback(() => { eventTracking.sendMB('compile-time-warning-dismissed', { time: 10, ...segmentation, }) setShowWarning(false) const until = new Date() until.setDate(until.getDate() + 1) // 1 day setDismissedUntilWarning(until) }, [setDismissedUntilWarning, segmentation]) const handleDismissChangingSoon = useCallback(() => { eventTracking.sendMB('compile-time-warning-dismissed', { time: 20, ...segmentation, }) }, [segmentation]) useEffect(() => { if (compiling || error || showLogs) return handleNewCompile(deliveryLatencies.compileTimeServerE2E) }, [compiling, error, showLogs, deliveryLatencies, handleNewCompile]) if (!window.ExposedSettings.enableSubscriptions) { return null } if (compiling || error || showLogs) { return null } if (!showWarning && !showChangingSoon) { return null } function sendInfoClickEvent() { eventTracking.sendMB('paywall-info-click', { 'paywall-type': 'compile-time-warning', content: 'blog', }) } const compileTimeoutBlogLinks = [ /* eslint-disable-next-line jsx-a11y/anchor-has-content, react/jsx-key */ , /* eslint-disable-next-line jsx-a11y/anchor-has-content, react/jsx-key */ , ] // if showWarning is true then the 10s warning is shown // and if showChangingSoon is true then the 20s-60s should show return (
{showWarning && isProjectOwner && ( {t('start_free_trial_without_exclamation')} } ariaLive="polite" content={
{t('your_project_near_compile_timeout_limit')}
{showNewCompileTimeoutUI === 'active' ? ( <> {t('upgrade_for_12x_more_compile_time')} {'. '} ) : ( {t('upgrade_for_plenty_more_compile_time')} )}
} type="warning" title={t('took_a_while')} isActionBelowContent isDismissible onDismiss={handleDismissWarning} /> )} {showChangingSoon && (isProjectOwner ? ( {t('start_free_trial_without_exclamation')} } ariaLive="polite" content={

{' '} {t('and_you_can_upgrade_for_plenty_more_compile_time')}

} title={t('your_project_compiled_but_soon_might_not')} type="warning" isActionBelowContent isDismissible onDismiss={handleDismissChangingSoon} /> ) : (

{t( 'tell_the_project_owner_to_upgrade_plan_for_more_compile_time' )}

} title={t('this_project_compiled_but_soon_might_not')} type="warning" isDismissible onDismiss={handleDismissChangingSoon} /> ))} ) } export default memo(CompileTimeoutMessages)