Web Push Notifications in Next.js: A Step-by-Step Guide to Engaging Users

Web Push Notifications in Next.js: A Step-by-Step Guide to Engaging Users
Photo by jonasleupe on Unsplash
5 mins read
11 Likes
1.1K Views

Implementing Web Push Notifications in Next.js

Web push notifications are a powerful tool for engaging users directly through their browsers, even when they are not actively using your website. With Next.js, you can create a seamless web push notification service that delivers content directly to users in real time. This guide covers the basics of web push notifications and provides a step-by-step tutorial on how to set them up in a Next.js application.

Table of Contents

  1. Introduction to Web Push Notifications
  2. Key Components of Web Push Notifications
  3. Setting Up Web Push Notifications in Next.js
  4. Handling Push Subscriptions on the Client Side
  5. Configuring Push Notifications on the Server Side
  6. Testing Web Push Notifications
  7. Security Considerations
  8. Conclusion

1. Introduction to Web Push Notifications

Web push notifications are messages sent from a server to users through their web browsers. Unlike traditional notifications, web push notifications can reach users even when they are not on your site. They are a great way to re-engage users, provide timely updates, or notify them of significant events in your app.

Prerequisites

To follow along, you should be familiar with:

  • Basics of Next.js and React
  • Fundamentals of service workers
  • Basic knowledge of push notifications and web API

2. Key Components of Web Push Notifications

Web push notifications consist of three main parts:

  • Service Worker: A script that runs in the background, allowing your app to receive push notifications even when the browser is closed.
  • Push Subscription: A subscription object linking the browser to the server to receive notifications.
  • Notification Payload: The message data that gets delivered to the user.

3. Setting Up Web Push Notifications in Next.js

To implement web push notifications in Next.js, follow these steps:

Step 1: Install Required Packages

To handle push notifications on the server, use the web-push package.

npm install web-push

Step 2: Generate VAPID Keys

VAPID (Voluntary Application Server Identification for Web Push) keys authenticate your server with the browser to send notifications. Generate VAPID keys using web-push:

npx web-push generate-vapid-keys

Save the generated keys somewhere secure. You’ll use the public key in the client, and both keys on the server.

Step 3: Configure Environment Variables

Create a .env.local file in your Next.js project root and add the VAPID keys.

NEXT_PUBLIC_VAPID_PUBLIC_KEY=<Your_Public_Key>
VAPID_PRIVATE_KEY=<Your_Private_Key>

Step 4: Add the Service Worker

Next.js requires a custom setup for service workers. Create a file public/service-worker.js for the service worker:

self.addEventListener('push', function(event) {
  const data = event.data.json();
  self.registration.showNotification(data.title, {
    body: data.message,
    icon: '/icon.png'
  });
});

self.addEventListener('notificationclick', function(event) {
  event.notification.close();
  if (event.action === 'view') {
    clients.openWindow(data.url);
  }
});

4. Handling Push Subscriptions on the Client Side

Create a helper function in utils/push.js to handle subscription logic:

export async function subscribeUser() {
  if ('serviceWorker' in navigator && 'PushManager' in window) {
    const swRegistration = await navigator.serviceWorker.register('/service-worker.js');
    const subscription = await swRegistration.pushManager.subscribe({
      userVisibleOnly: true,
      applicationServerKey: process.env.NEXT_PUBLIC_VAPID_PUBLIC_KEY
    });

    // Send subscription to the server
    await fetch('/api/subscribe', {
      method: 'POST',
      body: JSON.stringify(subscription),
      headers: { 'Content-Type': 'application/json' }
    });
  }
}

5. Configuring Push Notifications on the Server Side

Step 1: Create API Route for Subscription

Create an API route in pages/api/subscribe.js to save the subscription details:

import webpush from 'web-push';

webpush.setVapidDetails(
  'mailto:example@example.com',
  process.env.NEXT_PUBLIC_VAPID_PUBLIC_KEY,
  process.env.VAPID_PRIVATE_KEY
);

export default async function handler(req, res) {
  if (req.method === 'POST') {
    const subscription = req.body;
    // Save subscription to your database or storage here

    res.status(201).json({});
  } else {
    res.setHeader('Allow', ['POST']);
    res.status(405).end(`Method ${req.method} Not Allowed`);
  }
}

Step 2: Create API Route to Send Notifications

Create another route to trigger the notifications. This could be a manual action or automated based on your app logic.

import webpush from 'web-push';

export default async function handler(req, res) {
  if (req.method === 'POST') {
    const { subscription, title, message } = req.body;

    const payload = JSON.stringify({ title, message });

    try {
      await webpush.sendNotification(subscription, payload);
      res.status(200).json({ success: true });
    } catch (error) {
      console.error('Error sending notification:', error);
      res.status(500).json({ error: 'Failed to send notification' });
    }
  } else {
    res.setHeader('Allow', ['POST']);
    res.status(405).end(`Method ${req.method} Not Allowed`);
  }
}

6. Testing Web Push Notifications

Step 1: Subscribe the User

Call subscribeUser() when your component mounts or after a user action.

import { useEffect } from 'react';
import { subscribeUser } from '../utils/push';

export default function HomePage() {
  useEffect(() => {
    subscribeUser();
  }, []);

  return <div>Welcome to Web Push Notifications with Next.js</div>;
}

Step 2: Trigger a Notification

Send a POST request to the /api/send-notification endpoint to test notification delivery. You could set up a button to trigger this call in development mode.

7. Security Considerations

  • HTTPS Requirement: Web push notifications require HTTPS. Ensure you are running your Next.js application in a secure environment in production.
  • VAPID Key Security: Store your private VAPID key securely on the server side, as it authenticates your notifications with browsers.

8. Conclusion

By following this guide, you’ve successfully implemented web push notifications in your Next.js application. You can now engage users by sending timely notifications directly to their browsers.

Share:

Comments

0

Join the conversation

Sign in to share your thoughts and connect with other readers

No comments yet

Be the first to share your thoughts!