import { Button } from '@/components/ui/button' import { MEDIA_AUTO_LOAD_POLICY } from '@/constants' import { useContentPolicyOptional } from '@/providers/ContentPolicyProvider' import storage from '@/services/local-storage.service' import { WifiOff, X } from 'lucide-react' import { useEffect, useState } from 'react' import { useTranslation } from 'react-i18next' const SLOW_DISMISSED_KEY = 'slowConnectionHintDismissed' function detectConnectionStatus(): { poor: boolean; offline: boolean } { const offline = !navigator.onLine const conn = (navigator as any).connection if (!conn) return { poor: offline, offline } if (conn.saveData === true) return { poor: true, offline } if (conn.type === 'none') return { poor: true, offline: true } const eff: string | undefined = conn.effectiveType return { poor: offline || eff === 'slow-2g' || eff === '2g', offline } } export default function SlowConnectionHint() { const { t } = useTranslation() const contentPolicy = useContentPolicyOptional() const autoplay = contentPolicy?.autoplay ?? storage.getAutoplay() const mediaAutoLoadPolicy = contentPolicy?.mediaAutoLoadPolicy ?? storage.getMediaAutoLoadPolicy() const setAutoplay = contentPolicy?.setAutoplay ?? ((v: boolean) => storage.setAutoplay(v)) const setMediaAutoLoadPolicy = contentPolicy?.setMediaAutoLoadPolicy ?? ((p) => storage.setMediaAutoLoadPolicy(p)) const [status, setStatus] = useState(detectConnectionStatus) const [slowDismissed, setSlowDismissed] = useState( () => sessionStorage.getItem(SLOW_DISMISSED_KEY) === 'true' ) useEffect(() => { const refresh = () => setStatus(detectConnectionStatus()) window.addEventListener('online', refresh) window.addEventListener('offline', refresh) const conn = (navigator as any).connection conn?.addEventListener('change', refresh) return () => { window.removeEventListener('online', refresh) window.removeEventListener('offline', refresh) conn?.removeEventListener('change', refresh) } }, []) // Reset slow-connection dismissal when coming back online so the hint can // re-appear on the next slow-connection episode. useEffect(() => { if (!status.offline && !status.poor) { sessionStorage.removeItem(SLOW_DISMISSED_KEY) setSlowDismissed(false) } }, [status.offline, status.poor]) if (status.offline) { return (
{t('Slow connection detected')}
{changesDescription ? t('Turn on low-bandwidth mode? This will set: {{changes}}.', { changes: changesDescription }) : t('Turn on low-bandwidth mode to reduce data usage.')}