useDesktop.tsx 2.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. /**
  2. * @description 自定义pwa 安装hooks
  3. */
  4. import { isIOS } from "@/utils/methods";
  5. import { Dialog } from "antd-mobile";
  6. import { useEffect, useRef, useState } from "react";
  7. const useDesktop = (source: "page" | "components") => {
  8. const prompt = useRef<Event | null>(null);
  9. // const router = useRouter();
  10. const [isHasDesktop, setHasDesktop] = useState(false);
  11. const downloadHandler = () => {
  12. sessionStorage.setItem("pwa_install", "cancel");
  13. if (prompt.current) {
  14. // @ts-ignore
  15. prompt.current?.prompt();
  16. } else {
  17. Dialog.show({
  18. closeOnMaskClick: true,
  19. header: (
  20. <div className={"text-[white]"} onClick={Dialog.clear}>
  21. <i className={"iconfont icon-guanbi"}></i>
  22. </div>
  23. ),
  24. image: isIOS() ? "/store/ios.webp" : "/store/android.webp",
  25. actions: [],
  26. });
  27. }
  28. // 不判断是否真的包含
  29. setHasDesktop(false);
  30. };
  31. const initDesktop = (e: Event) => {
  32. if (window.matchMedia("(display-mode: standalone)").matches) {
  33. setHasDesktop(false);
  34. return;
  35. }
  36. // 有pwa 则不会触发
  37. prompt.current = e;
  38. //sessionStorage.getItem("pwa_install") === null
  39. if (source === "page" && !window?.isShowInstallAPK) {
  40. setHasDesktop(true);
  41. }
  42. };
  43. // 取消
  44. const cancel = () => {
  45. sessionStorage.setItem("pwa_install", "cancel");
  46. setHasDesktop(false);
  47. };
  48. useEffect(() => {
  49. if (window?.PwaEvent) {
  50. prompt.current = window.PwaEvent;
  51. }
  52. window.addEventListener("beforeinstallprompt", (evt) => {
  53. evt.preventDefault();
  54. initDesktop(evt);
  55. sessionStorage.setItem("can_installPwa", "true");
  56. });
  57. // @ts-ignore
  58. window.onappinstalled = function (ev) {
  59. // 安装完成
  60. window.nextRouter.replace("/");
  61. };
  62. return () => window.removeEventListener("beforeinstallprompt", initDesktop);
  63. }, []);
  64. return {
  65. cancel,
  66. isHasDesktop,
  67. downloadHandler,
  68. setHasDesktop,
  69. };
  70. };
  71. export default useDesktop;