useDesktop.tsx 2.1 KB

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