6. index.html

1<!DOCTYPE html>
2<html lang="es">
3
4<head>
5
6 <meta charset="UTF-8">
7 <meta name="viewport" content="width=device-width">
8
9 <title>Notificaciones Push</title>
10
11</head>
12
13<body onload="preparaVista()">
14
15 <h1>Notificaciones Push</h1>
16
17 <menu style="display: flex; list-style: none; flex-wrap: wrap; gap: 0.5rem;">
18 <li>
19 <button id="btnSuscribe" type="button" hidden onclick="suscribe()">
20 Suscríbete
21 </button>
22 </li>
23 <li>
24 <button id="btnCancela" type="button" hidden onclick="cancela()">
25 Cancela suscripción
26 </button>
27 </li>
28 <li>
29 <button id="btnNotifica" type="button" hidden
30 onclick="notificaDesdeElServidor()">
31 Notifica
32 </button>
33 </li>
34 <li>
35 <a href="srv/genera-llaves.php" target="_blank">Genera llaves</a>
36 </li>
37 </menu>
38
39 <p>
40 <output id="outEstado">
41 <progress max="100">Cargando…</progress>
42 </output>
43 </p>
44
45 <fieldset>
46 <legend>Reporte de envío a endpoints</legend>
47
48 <dl id="reporte"></dl>
49
50 </fieldset>
51
52 <script type="module">
53
54 import { exportaAHtml } from "./lib/js/exportaAHtml.js"
55 import {
56 activaNotificacionesPush
57 } from "./lib/js/activaNotificacionesPush.js"
58 import { getSuscripcionPush } from "./lib/js/getSuscripcionPush.js"
59 import { suscribeAPush } from "./lib/js/suscribeAPush.js"
60 import { cancelaSuscripcionPush } from "./lib/js/cancelaSuscripcionPush.js"
61 import { consumeJson } from "./lib/js/consumeJson.js"
62 import { enviaJson } from "./lib/js/enviaJson.js"
63 import { muestraError } from "./lib/js/muestraError.js"
64 import { muestraObjeto } from "./lib/js/muestraObjeto.js"
65 import { urlBase64ToUint8Array } from "./lib/js/urlBase64ToUint8Array.js"
66 import {
67 calculaDtoParaSuscripcion
68 } from "./lib/js/calculaDtoParaSuscripcion.js"
69
70 const applicationServerKey = urlBase64ToUint8Array(
71 "BMBlr6YznhYMX3NgcWIDRxZXs0sh7tCv7_YCsWcww0ZCv9WGg-tRCXfMEHTiBPCksSqeve1twlbmVAZFv7GSuj0")
72 /** @enum {string} */
73 const Estado = {
74 CALCULANDO: "Calculando…",
75 SUSCRITO: "Suscrito",
76 DESUSCRITO: "Sin suscripción",
77 INCOMPATIBLE: "Incompatible"
78 }
79
80 async function preparaVista() {
81 try {
82 await activaNotificacionesPush("sw.js")
83 const suscripcion = await getSuscripcionPush()
84 if (suscripcion === null) {
85 muestraEstado(Estado.DESUSCRITO)
86 } else {
87 // Modifica la suscripción en el servidor,
88 const dto = calculaDtoParaSuscripcion(suscripcion)
89 await enviaJson("srv/suscripcion-modifica.php", dto)
90 muestraEstado(Estado.SUSCRITO)
91 }
92 } catch (error) {
93 muestraEstado(Estado.INCOMPATIBLE)
94 muestraError(error)
95 }
96 }
97 exportaAHtml(preparaVista)
98
99 async function notificaDesdeElServidor() {
100 try {
101 reporte.innerHTML =
102 /* html */ `<progress max="100">Cargando…</progress>`
103 const render = await consumeJson("srv/notifica.php")
104 await muestraObjeto(document, render.body)
105 } catch (error) {
106 muestraError(error)
107 }
108 }
109 exportaAHtml(notificaDesdeElServidor)
110
111 async function suscribe() {
112 try {
113 muestraEstado(Estado.CALCULANDO)
114 const suscripcion = await suscribeAPush(applicationServerKey)
115 // Agrega la suscripción al servidor,
116 const dto = calculaDtoParaSuscripcion(suscripcion)
117 await enviaJson("srv/suscripcion-modifica.php", dto)
118 muestraEstado(Estado.SUSCRITO)
119 } catch (error) {
120 muestraError(error)
121 }
122 }
123 exportaAHtml(suscribe)
124
125 async function cancela() {
126 try {
127 muestraEstado(Estado.CALCULANDO)
128 const suscripcion = await cancelaSuscripcionPush()
129 if (suscripcion !== null) {
130 // Elimina la suscripción en el servidor,
131 const dto = calculaDtoParaSuscripcion(suscripcion)
132 await enviaJson("srv/suscripcion-elimina.php", dto)
133 muestraEstado(Estado.DESUSCRITO)
134 }
135 } catch (error) {
136 muestraError(error)
137 }
138 }
139 exportaAHtml(cancela)
140
141 /** @param {Estado} estado */
142 function muestraEstado(estado) {
143 outEstado.value = estado
144 if (estado === Estado.INCOMPATIBLE || estado === Estado.CALCULANDO) {
145 btnSuscribe.hidden = true
146 btnCancela.hidden = true
147 btnNotifica.hidden = true
148 } else if (estado === Estado.SUSCRITO) {
149 btnSuscribe.hidden = true
150 btnCancela.hidden = false
151 btnNotifica.hidden = false
152 } else if (estado === Estado.DESUSCRITO) {
153 btnSuscribe.hidden = false
154 btnCancela.hidden = true
155 btnNotifica.hidden = true
156 }
157 }
158
159 </script>
160
161</body>
162
163</html>
skip_previous skip_next