45 lines
1.2 KiB
TypeScript
45 lines
1.2 KiB
TypeScript
// Detección y disparo del prompt de instalación (PWA).
|
|
import { useEffect, useState } from "react";
|
|
|
|
type PromptEvent = Event & { prompt: () => Promise<void>; userChoice?: Promise<unknown> };
|
|
|
|
let guardado: PromptEvent | null = null;
|
|
|
|
export function useInstalarPWA() {
|
|
const [disponible, setDisponible] = useState(false);
|
|
const [instalada, setInstalada] = useState(false);
|
|
|
|
useEffect(() => {
|
|
setDisponible(Boolean(guardado));
|
|
setInstalada(window.matchMedia("(display-mode: standalone)").matches);
|
|
|
|
const onPrompt = (e: Event) => {
|
|
e.preventDefault();
|
|
guardado = e as PromptEvent;
|
|
setDisponible(true);
|
|
};
|
|
const onInstalada = () => {
|
|
guardado = null;
|
|
setDisponible(false);
|
|
setInstalada(true);
|
|
};
|
|
|
|
window.addEventListener("beforeinstallprompt", onPrompt);
|
|
window.addEventListener("appinstalled", onInstalada);
|
|
return () => {
|
|
window.removeEventListener("beforeinstallprompt", onPrompt);
|
|
window.removeEventListener("appinstalled", onInstalada);
|
|
};
|
|
}, []);
|
|
|
|
const instalar = async () => {
|
|
if (!guardado) return false;
|
|
await guardado.prompt();
|
|
guardado = null;
|
|
setDisponible(false);
|
|
return true;
|
|
};
|
|
|
|
return { disponible, instalada, instalar };
|
|
}
|