lobe-chat
1import { pwaInstallHandler } from 'pwa-install-handler';
2import { useEffect, useState } from 'react';
3
4import { PWA_INSTALL_ID } from '@/const/layoutTokens';
5import { isOnServerSide } from '@/utils/env';
6
7import { usePlatform } from './usePlatform';
8
9export const usePWAInstall = () => {
10const [canInstall, setCanInstall] = useState(false);
11const { isSupportInstallPWA, isPWA } = usePlatform();
12
13useEffect(() => {
14if (isOnServerSide) return;
15pwaInstallHandler.addListener(setCanInstall);
16return () => {
17pwaInstallHandler.removeListener(setCanInstall);
18};
19}, []);
20
21const installCheck = () => {
22// 当在 PWA 中时,不显示安装按钮
23if (isPWA) return false;
24// 其他情况下,根据是否可以安装来显示安装按钮 (如已经安装则不显示)
25if (isSupportInstallPWA) return canInstall;
26// 当在不支持 PWA 的环境中时,安装按钮 (此时为安装教程)
27return true;
28};
29
30return {
31canInstall: installCheck(),
32install: () => {
33const pwa: any = document.querySelector(`#${PWA_INSTALL_ID}`);
34if (!pwa) return;
35pwa.externalPromptEvent = pwaInstallHandler.getEvent();
36pwa?.showDialog(true);
37},
38};
39};
40