notifications-service.ts 1.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142
  1. export async function saveNotificationRegistration(channel, destination, accessToken) {
  2. console.log('saveNotificationRegistration');
  3. const URL_REGISTER_NOTIFICATION = `/api/notifications/register`;
  4. const options = {
  5. method: 'POST',
  6. headers: {
  7. 'Content-Type': 'application/json',
  8. },
  9. body: JSON.stringify({ channel, destination }),
  10. };
  11. await fetch(`${URL_REGISTER_NOTIFICATION}?accessToken=${accessToken}`, options);
  12. }
  13. function urlBase64ToUint8Array(base64String: string) {
  14. const padding = '='.repeat((4 - (base64String.length % 4)) % 4);
  15. const base64 = (base64String + padding).replace(/-/g, '+').replace(/_/g, '/');
  16. const rawData = window.atob(base64);
  17. const outputArray = new Uint8Array(rawData.length);
  18. // eslint-disable-next-line no-plusplus
  19. for (let i = 0; i < rawData.length; ++i) {
  20. outputArray[i] = rawData.charCodeAt(i);
  21. }
  22. return outputArray;
  23. }
  24. export async function registerWebPushNotifications(vapidPublicKey) {
  25. const registration = await navigator.serviceWorker.ready;
  26. let subscription = await registration.pushManager.getSubscription();
  27. if (!subscription) {
  28. subscription = await registration.pushManager.subscribe({
  29. userVisibleOnly: true,
  30. applicationServerKey: urlBase64ToUint8Array(vapidPublicKey),
  31. });
  32. }
  33. return JSON.stringify(subscription);
  34. }