Skip to content

Notifications

Notifications provide a quick way to interact with your music player, especially on mobile devices. The <Notifications /> component in this library wraps the browser's navigator.mediaSession API, enabling media controls outside your application.

For more information, visit web.dev.

How It Works

The <Notifications /> component syncs your UI with user interactions through the browser's media controls. It activates automatically in browsers that support the Media Session API.

notifications

Media Session API Overview

Behind the scenes, the component uses the browser's Media Session API. Here's how the metadata is structured:

js
navigator.mediaSession.metadata = new MediaMetadata({
    title: 'Never Gonna Give You Up',
    artist: 'Rick Astley',
    album: 'Whenever You Need Somebody',
    artwork: [
      { src: 'https://via.placeholder.com/96',   sizes: '96x96',   type: 'image/png' },
      { src: 'https://via.placeholder.com/128', sizes: '128x128', type: 'image/png' },
      { src: 'https://via.placeholder.com/192', sizes: '192x192', type: 'image/png' },
      { src: 'https://via.placeholder.com/256', sizes: '256x256', type: 'image/png' },
      { src: 'https://via.placeholder.com/384', sizes: '384x384', type: 'image/png' },
      { src: 'https://via.placeholder.com/512', sizes: '512x512', type: 'image/png' },
    ]
});

navigator.mediaSession

Basic Usage

The library exports a <Notifications /> component that you can use to create media notifications. Here's a simple example:

notification example

jsx
<Notifications
  songId="change-${id}"
  title="Change"
  artist="Diviners, November Lights"
  album="Progressive House"
  artwork={[
    {
      src: "https://ncsmusic.s3.eu-west-1.amazonaws.com/tracks/000/001/846/325x325/change-1739448053-51CaRYxW3A.jpg",
      sizes: "325x325"
    },
    {
      src: "https://linkstorage.linkfire.com/medialinks/images/370f855b-df43-40fb-9dfd-4be12f329a85/artwork-440x440.jpg",
      sizes: "440x440"
    }
  ]}
/>

Integration with Your Application

In a real application, you'll want to synchronize the notifications with your currently playing song. Here's how to create a wrapper component:

jsx
import { getMusicInfo } from "@/mocks/music-info"
import { useRequest } from "ahooks"

/* `<Notifications />` component aliased as `<MusicNotifications />` */
import { Notifications as MusicNotifications, selectActiveSong, useMusicPlayerSelector } from "react-redux-music"

export function Notifications() {
  /* Get the currently playing song from the store */
  const music = useMusicPlayerSelector(selectActiveSong)

  /* Get the data from the server for the active song */
  const { data } = useRequest(() => getMusicInfo(music?.songId), { refreshDeps: [music?.songId] })

  if (!data) return null

  return (
    <MusicNotifications
      songId={music?.songId}
      title={data.title}
      artist={data.artists}
      artwork={[{ src: data.image.url, sizes: data.image.size }]}
    />
  )
}

Setting Up in Your Application

Finally, wrap this component in the <MusicProvider /> at your application's root:

jsx
import App from "@/App"
import { Notifications } from "@/components/notifications"
import "@/index.css"
import { StrictMode } from "react"
import { createRoot } from "react-dom/client"
import { Audio, MusicProvider } from "react-redux-music"

createRoot(document.getElementById("root")!).render(
  <StrictMode>
    <MusicProvider>
      <App />
      <Audio />
      {/* This wrapper component displays notifications based on the currently active song */}
      <Notifications />
    </MusicProvider>
  </StrictMode>
)

just a timepass anyways