MediaSession.js 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051
  1. import React from 'react';
  2. export default class MediaSession extends React.Component {
  3. updateMetadata() {
  4. if (!('mediaSession' in navigator)) {
  5. return;
  6. }
  7. const {title, artist, album, cover} = this.props;
  8. const artwork = cover ? [{src: cover}] : undefined;
  9. navigator.mediaSession.metadata = new window.MediaMetadata({title, artist, album, artwork});
  10. }
  11. updateEvents() {
  12. if (!('mediaSession' in navigator)) {
  13. return;
  14. }
  15. const {mediaSession} = navigator;
  16. const {onPlay, onPause, onSeekBackward, onSeekForward, onPreviousTrack, onNextTrack} = this.props;
  17. mediaSession.setActionHandler('play', onPlay);
  18. mediaSession.setActionHandler('pause', onPause);
  19. mediaSession.setActionHandler('seekbackward', onSeekBackward);
  20. mediaSession.setActionHandler('seekforward', onSeekForward);
  21. mediaSession.setActionHandler('previoustrack', onPreviousTrack);
  22. mediaSession.setActionHandler('nexttrack', onNextTrack);
  23. }
  24. componentDidMount() {
  25. this.updateMetadata();
  26. this.updateEvents();
  27. }
  28. componentDidUpdate(prevProps) {
  29. this.updateMetadata();
  30. this.updateEvents();
  31. }
  32. componentWillUnmount() {
  33. if (!('mediaSession' in navigator)) {
  34. return;
  35. }
  36. const {mediaSession} = navigator;
  37. mediaSession.metadata = null;
  38. mediaSession.setActionHandler('play', null);
  39. mediaSession.setActionHandler('pause', null);
  40. mediaSession.setActionHandler('seekbackward', null);
  41. mediaSession.setActionHandler('seekforward', null);
  42. mediaSession.setActionHandler('previoustrack', null);
  43. mediaSession.setActionHandler('nexttrack', null);
  44. }
  45. render() {
  46. return null;
  47. }
  48. }