import { useEffect, useState } from "react"; import { Download, X } from "./icons"; import { isStandalone } from "../lib/pwa"; /** Chrome/Edge/安卓上那个「安装」事件,TS 的 DOM 库里还没有类型。 */ interface InstallPromptEvent extends Event { prompt: () => Promise; userChoice: Promise<{ outcome: "accepted" | "dismissed" }>; } const DISMISS_KEY = "dadao.install-hint-dismissed"; function isIos(): boolean { const ua = window.navigator.userAgent; return /iPad|iPhone|iPod/.test(ua) || (ua.includes("Macintosh") && "ontouchend" in document); } /** * 把达道Task装到桌面/主屏。 * * 有安装事件就自己弹一个按钮(浏览器自己那套横幅经常被无视); * iOS 没有安装事件,只能告诉用户「分享 → 添加到主屏幕」这一步。 * 从主屏启动(standalone)或者用户关过之后就不再出现。 */ export function InstallHint() { const [promptEvent, setPromptEvent] = useState(null); const [hidden, setHidden] = useState(() => localStorage.getItem(DISMISS_KEY) === "1"); const [installing, setInstalling] = useState(false); useEffect(() => { const onPrompt = (event: Event) => { event.preventDefault(); // 拦住浏览器自带的横幅,换成我们自己的入口 setPromptEvent(event as InstallPromptEvent); }; const onInstalled = () => setPromptEvent(null); window.addEventListener("beforeinstallprompt", onPrompt); window.addEventListener("appinstalled", onInstalled); return () => { window.removeEventListener("beforeinstallprompt", onPrompt); window.removeEventListener("appinstalled", onInstalled); }; }, []); if (hidden || isStandalone()) return null; const ios = isIos(); // 桌面 Safari、Firefox 既不给安装事件,也没有添加主屏,不必打扰 if (!promptEvent && !ios) return null; function dismiss() { localStorage.setItem(DISMISS_KEY, "1"); setHidden(true); } return (

把达道Task装到桌面

{promptEvent ? "装好之后是一个独立窗口,不用再敲网址,也不会被浏览器标签页挤掉。" : "在 Safari 里点底部的「分享」,选「添加到主屏幕」,就会和 App 一样有图标。"}

{promptEvent ? ( ) : null}
); }