import { useEffect, useState } from 'react' import { Box, Paper, Group, Text, ActionIcon } from '@mantine/core' import { DownloadIcon, XIcon } from '@phosphor-icons/react' import { Trans, useLingui } from '@lingui/react/macro' import { useAuth } from '@/contexts/auth-context' import { useIsMobile } from '@/hooks/use-is-mobile' // Navbar geometry: 4rem height + 0.5rem margin + its safe-area bottom offset. const ABOVE_MOBILE_NAV_OFFSET = 'calc(4.5rem + env(safe-area-inset-bottom, 0px))' export function IOSInstallPrompt() { const { t } = useLingui() const { user } = useAuth() const isMobile = useIsMobile() const [show, setShow] = useState(false) const [platform, setPlatform] = useState<'ios' | 'android' | null>(null) useEffect(() => { const isIOS = /iPad|iPhone|iPod/.test(navigator.userAgent) const isAndroid = /Android/.test(navigator.userAgent) const isInStandaloneMode = window.matchMedia('(display-mode: standalone)').matches || ('standalone' in window.navigator && (window.navigator as any).standalone) const hasBeenDismissed = localStorage.getItem('pwa-install-prompt-dismissed') === 'true' if ((isIOS || isAndroid) && !isInStandaloneMode && !hasBeenDismissed) { setPlatform(isIOS ? 'ios' : 'android') const timer = setTimeout(() => setShow(true), 3000) return () => clearTimeout(timer) } }, []) const handleDismiss = () => { localStorage.setItem('pwa-install-prompt-dismissed', 'true') setShow(false) } if (!show || !platform) return null const instructions = platform === 'ios' ? t`Tap Share → Add to Home Screen` : t`Tap Menu (⋮) → Add to Home screen` // Navbar renders only under _authed, so a signed-in mobile user on a public // route has no nav to clear. const aboveBottomNav = Boolean(user) && isMobile const bottomStyle = aboveBottomNav ? { bottom: ABOVE_MOBILE_NAV_OFFSET, paddingBottom: '8px' } : { bottom: 0, paddingBottom: 'calc(8px + env(safe-area-inset-bottom, 0px))' } return ( Add FLXN to your home screen — smoother experience, always one tap away {instructions} ) }