socios-comerciales.skyballo.../src/lib/pwa-install.ts

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 };
}