Files
ColdBreeze-chat-web/src/common/component/Manifest/index.js
T
2022-05-13 17:37:40 +08:00

68 lines
2.7 KiB
JavaScript

import { useEffect, useState, useRef } from "react";
// import { useGetServerQuery } from "../../../app/services/server";
// import manifest from "./manifest.json";
import Prompt from "./Prompt";
import usePrompt from "./usePrompt";
export default function Manifest() {
const { setCanneled, prompted } = usePrompt();
const deferredPromptRef = useRef(null);
const [popup, setPopup] = useState(false);
// const { data, isSuccess } = useGetServerQuery();
useEffect(() => {
const handleInstallPromotion = (e) => {
// Prevent the mini-infobar from appearing on mobile
e.preventDefault();
// Stash the event so it can be triggered later.
deferredPromptRef.current = e;
// Update UI notify the user they can install the PWA
setPopup(true);
// Optionally, send analytics event that PWA install promo was shown.
console.log(`'beforeinstallprompt' event was fired.`);
};
const handleInstalled = () => {
deferredPromptRef.current = null;
setPopup(false);
};
// if (isSuccess && data) {
// console.log("server", data);
// manifest.name = `${data.name}'s Chat`;
// // const stringManifest = JSON.stringify(manifest);
// // const blob = new Blob([stringManifest], { type: "application/json" });
// // const manifestURL = URL.createObjectURL(blob);
// let content = encodeURIComponent(JSON.stringify(manifest));
// let manifestURL = "data:application/manifest+json," + content;
// const manifestEle = document.querySelector("#my-manifest-placeholder");
// if (manifestEle) {
// manifestEle.setAttribute("href", manifestURL);
// }
// }
window.addEventListener("beforeinstallprompt", handleInstallPromotion);
window.addEventListener("appinstalled", handleInstalled);
return () => {
window.removeEventListener("beforeinstallprompt", handleInstallPromotion);
window.removeEventListener("appinstalled", handleInstalled);
};
}, []);
const handleInstall = async () => {
// Hide the app provided install promotion
setPopup(false);
if (!deferredPromptRef.current) return;
// Show the install prompt
deferredPromptRef.current.prompt();
// Wait for the user to respond to the prompt
const { outcome } = await deferredPromptRef.current.userChoice;
// Optionally, send analytics event with outcome of user choice
console.log(`User response to the install prompt: ${outcome}`);
// We've used the prompt, and can't use it again, throw it away
deferredPromptRef.current = null;
};
const handleClose = async () => {
setCanneled();
setPopup(false);
};
if (!popup || prompted) return null;
return <Prompt handleInstall={handleInstall} closePrompt={handleClose} />;
}