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 | |
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 | |
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 | `<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 | |
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 | |
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 | |
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> |