import { Button } from "@repo/ui/components/button"; import { Download, Share, X } from "lucide-react"; import { AnimatePresence, motion } from "motion/react"; import { useEffect, useState } from "react"; export function InstallPrompt() { const [isIOS, setIsIOS] = useState(false); const [showPrompt, setShowPrompt] = useState(false); const [deferredPrompt, setDeferredPrompt] = useState(null); useEffect(() => { const isIOSDevice = /iPad|iPhone|iPod/.test(navigator.userAgent) && !(window as any).MSStream; const isInStandaloneMode = window.matchMedia( "(display-mode: standalone)", ).matches; const hasSeenPrompt = localStorage.getItem("install-prompt-dismissed") === "true"; setIsIOS(isIOSDevice); const isDevelopment = process.env.NODE_ENV === "development"; setShowPrompt( !hasSeenPrompt && (isDevelopment || (!isInStandaloneMode && (isIOSDevice || "serviceWorker" in navigator))), ); const handleBeforeInstallPrompt = (e: Event) => { e.preventDefault(); setDeferredPrompt(e); if (!hasSeenPrompt) { setShowPrompt(true); } }; window.addEventListener("beforeinstallprompt", handleBeforeInstallPrompt); return () => { window.removeEventListener( "beforeinstallprompt", handleBeforeInstallPrompt, ); }; }, []); const handleInstall = async () => { if (deferredPrompt) { deferredPrompt.prompt(); const { outcome } = await deferredPrompt.userChoice; if (outcome === "accepted") { localStorage.setItem("install-prompt-dismissed", "true"); setShowPrompt(false); } setDeferredPrompt(null); } }; const handleDismiss = () => { localStorage.setItem("install-prompt-dismissed", "true"); setShowPrompt(false); }; if (!showPrompt) { return null; } return (

Install Supermemory

Add Supermemory to your home screen for quick access and a better experience.

{isIOS ? (

1. Tap the Share button in Safari

2. Select "Add to Home Screen" ➕

) : ( )}
); }