|  |  | @ -301,7 +301,34 @@ export default class App extends Vue { | 
			
		
	
		
			
				
					|  |  |  |     return this.askPermission() | 
			
		
	
		
			
				
					|  |  |  |       .then((permission) => { | 
			
		
	
		
			
				
					|  |  |  |         console.log("Permission granted:", permission); | 
			
		
	
		
			
				
					|  |  |  |         // Initialize notifications here | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |         // Call the function and handle promises | 
			
		
	
		
			
				
					|  |  |  |         this.subscribeToPush() | 
			
		
	
		
			
				
					|  |  |  |           .then(() => { | 
			
		
	
		
			
				
					|  |  |  |             console.log("Subscribed successfully."); | 
			
		
	
		
			
				
					|  |  |  |             // Assuming the subscription object is available | 
			
		
	
		
			
				
					|  |  |  |             return navigator.serviceWorker.ready; | 
			
		
	
		
			
				
					|  |  |  |           }) | 
			
		
	
		
			
				
					|  |  |  |           .then((registration) => { | 
			
		
	
		
			
				
					|  |  |  |             // Fetch the existing subscription object from the registration | 
			
		
	
		
			
				
					|  |  |  |             return registration.pushManager.getSubscription(); | 
			
		
	
		
			
				
					|  |  |  |           }) | 
			
		
	
		
			
				
					|  |  |  |           .then((subscription) => { | 
			
		
	
		
			
				
					|  |  |  |             if (subscription) { | 
			
		
	
		
			
				
					|  |  |  |               return this.sendSubscriptionToServer(subscription); | 
			
		
	
		
			
				
					|  |  |  |             } else { | 
			
		
	
		
			
				
					|  |  |  |               throw new Error("Subscription object is not available."); | 
			
		
	
		
			
				
					|  |  |  |             } | 
			
		
	
		
			
				
					|  |  |  |           }) | 
			
		
	
		
			
				
					|  |  |  |           .then(() => { | 
			
		
	
		
			
				
					|  |  |  |             console.log("Subscription data sent to server."); | 
			
		
	
		
			
				
					|  |  |  |           }) | 
			
		
	
		
			
				
					|  |  |  |           .catch((error) => { | 
			
		
	
		
			
				
					|  |  |  |             console.error( | 
			
		
	
		
			
				
					|  |  |  |               "Subscription or server communication failed:", | 
			
		
	
		
			
				
					|  |  |  |               error, | 
			
		
	
		
			
				
					|  |  |  |             ); | 
			
		
	
		
			
				
					|  |  |  |           }); | 
			
		
	
		
			
				
					|  |  |  |       }) | 
			
		
	
		
			
				
					|  |  |  |       .catch((error) => { | 
			
		
	
		
			
				
					|  |  |  |         console.error("An error occurred:", error); | 
			
		
	
	
		
			
				
					|  |  | @ -309,6 +336,73 @@ export default class App extends Vue { | 
			
		
	
		
			
				
					|  |  |  |       }); | 
			
		
	
		
			
				
					|  |  |  |   } | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |   // Function to convert URL base64 to Uint8Array | 
			
		
	
		
			
				
					|  |  |  |   private urlBase64ToUint8Array(base64String: string): Uint8Array { | 
			
		
	
		
			
				
					|  |  |  |     const padding = "=".repeat((4 - (base64String.length % 4)) % 4); | 
			
		
	
		
			
				
					|  |  |  |     const base64 = (base64String + padding) | 
			
		
	
		
			
				
					|  |  |  |       .replace(/-/g, "+") | 
			
		
	
		
			
				
					|  |  |  |       .replace(/_/g, "/"); | 
			
		
	
		
			
				
					|  |  |  |     const rawData = window.atob(base64); | 
			
		
	
		
			
				
					|  |  |  |     const outputArray = new Uint8Array(rawData.length); | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |     for (let i = 0; i < rawData.length; ++i) { | 
			
		
	
		
			
				
					|  |  |  |       outputArray[i] = rawData.charCodeAt(i); | 
			
		
	
		
			
				
					|  |  |  |     } | 
			
		
	
		
			
				
					|  |  |  |     return outputArray; | 
			
		
	
		
			
				
					|  |  |  |   } | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |   // The subscribeToPush method | 
			
		
	
		
			
				
					|  |  |  |   private subscribeToPush(): Promise<void> { | 
			
		
	
		
			
				
					|  |  |  |     return new Promise<void>((resolve, reject) => { | 
			
		
	
		
			
				
					|  |  |  |       if ("serviceWorker" in navigator && "PushManager" in window) { | 
			
		
	
		
			
				
					|  |  |  |         navigator.serviceWorker | 
			
		
	
		
			
				
					|  |  |  |           .register("/service-worker.js") | 
			
		
	
		
			
				
					|  |  |  |           .then((registration) => { | 
			
		
	
		
			
				
					|  |  |  |             const b64 = | 
			
		
	
		
			
				
					|  |  |  |               "BEl62iUYgUivxIkv69yViEuiBIa-Ib9-SkvMeAtA3LFgDzkrxZJjSgSnfckjBJuBkr3qBUYIHBQFLXYp5Nksh8U"; | 
			
		
	
		
			
				
					|  |  |  |             const applicationServerKey = this.urlBase64ToUint8Array(b64); | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |             const options: PushSubscriptionOptions = { | 
			
		
	
		
			
				
					|  |  |  |               userVisibleOnly: true, | 
			
		
	
		
			
				
					|  |  |  |               applicationServerKey: applicationServerKey, | 
			
		
	
		
			
				
					|  |  |  |             }; | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |             return registration.pushManager.subscribe(options); | 
			
		
	
		
			
				
					|  |  |  |           }) | 
			
		
	
		
			
				
					|  |  |  |           .then((subscription) => { | 
			
		
	
		
			
				
					|  |  |  |             console.log("Push subscription successful:", subscription); | 
			
		
	
		
			
				
					|  |  |  |             resolve(); | 
			
		
	
		
			
				
					|  |  |  |           }) | 
			
		
	
		
			
				
					|  |  |  |           .catch((error) => { | 
			
		
	
		
			
				
					|  |  |  |             console.error("Push subscription failed:", error); | 
			
		
	
		
			
				
					|  |  |  |             reject(error); | 
			
		
	
		
			
				
					|  |  |  |           }); | 
			
		
	
		
			
				
					|  |  |  |       } else { | 
			
		
	
		
			
				
					|  |  |  |         const errorMsg = "Push messaging is not supported"; | 
			
		
	
		
			
				
					|  |  |  |         console.warn(errorMsg); | 
			
		
	
		
			
				
					|  |  |  |         reject(new Error(errorMsg)); | 
			
		
	
		
			
				
					|  |  |  |       } | 
			
		
	
		
			
				
					|  |  |  |     }); | 
			
		
	
		
			
				
					|  |  |  |   } | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |   private sendSubscriptionToServer( | 
			
		
	
		
			
				
					|  |  |  |     subscription: PushSubscription, | 
			
		
	
		
			
				
					|  |  |  |   ): Promise<void> { | 
			
		
	
		
			
				
					|  |  |  |     // Simulated API call | 
			
		
	
		
			
				
					|  |  |  |     return fetch("/api/save-subscription", { | 
			
		
	
		
			
				
					|  |  |  |       method: "POST", | 
			
		
	
		
			
				
					|  |  |  |       headers: { | 
			
		
	
		
			
				
					|  |  |  |         "Content-Type": "application/json", | 
			
		
	
		
			
				
					|  |  |  |       }, | 
			
		
	
		
			
				
					|  |  |  |       body: JSON.stringify(subscription), | 
			
		
	
		
			
				
					|  |  |  |     }).then((response) => { | 
			
		
	
		
			
				
					|  |  |  |       if (!response.ok) { | 
			
		
	
		
			
				
					|  |  |  |         throw new Error("Failed to send subscription to server"); | 
			
		
	
		
			
				
					|  |  |  |       } | 
			
		
	
		
			
				
					|  |  |  |       console.log("Subscription sent to server successfully."); | 
			
		
	
		
			
				
					|  |  |  |     }); | 
			
		
	
		
			
				
					|  |  |  |   } | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |   never(ID: string) { | 
			
		
	
		
			
				
					|  |  |  |     alert(ID); | 
			
		
	
		
			
				
					|  |  |  |   } | 
			
		
	
	
		
			
				
					|  |  | 
 |