New Research: Supply Chain Attack on Axios Pulls Malicious Dependency from npm.Details →
Socket
Book a DemoSign in
Socket

react-waveform-visualizer

Package Overview
Dependencies
Maintainers
0
Versions
7
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install
Package was removed
Sorry, it seems this package was removed from the registry

react-waveform-visualizer

The `react-waveform-visualizer` package has been moved to [@notross/react-waveform](https://npmjs.com/package/@notross/react-waveform). This one will not continue to be maintained. >These packages are currently identical as of **August 6, 2024**, but the

latest
Source
npmnpm
Version
0.0.16
Version published
Maintainers
0
Created
Source

The react-waveform-visualizer package has been moved to @notross/react-waveform. This one will not continue to be maintained.

These packages are currently identical as of August 6, 2024, but the version numbers are different. react-waveform-visualizer@0.0.16 and @notross/react-waveform@0.0.12 are equivalent. The Github repository remains the same.

This package has been deprecated in favor of @notross/react-waveform. Exact same package, newer more exciting (or boring or whatever) name!

Switching from react-waveform-visualizer to @notross/react-waveform:

First, install @notross/react-waveform

npmyarn
npm i @notross/react-waveformyarn add @notross/react-waveform

Next, remove react-waveform-visualizer

npmyarn
npm uninstall react-waveform-visualizeryarn remove react-waveform-visualizer

Finally, change all your imports from react-waveform-visualizer to @notross/react-waveform

import { WaveformProvider } from '@notross/react-waveform'
import { Waveform, useWaveform } from '@notross/react-waveform'

...you get it. Same exact project, same repo, new name.



Installation

npmyarn
npm i react-waveform-visualizeryarn add react-waveform-visualizer

Types

AudioTrack

interface AudioTrack {
  id: number | string
  src: string
}

ConfigOptions

type ConfigColors = {
  default: string
  active: string
  past: string
}

interface ConfigOptions {
  colors: ConfigColors
  radius: string
  activeHeight: string
  gap: string
}

Components

WaveformProvider

import React from 'react'
import { WaveformProvider } from 'react-waveform-visualizer'

export default function App({ children }: {
  children: React.ReactNode,
}) {
  return (
    <WaveformProvider>
      {children}
    </WaveformProvider>
  )
}

WaveformProvider takes an optional argument of options: ConfigOptions. These options will apply to every <Waveform /> component that does not have its own ConfigOptions set.

import React from 'react'
import { WaveformProvider, ConfigOptions } from 'react-waveform-visualizer'

const options: ConfigOptions = {
  colors: {
    active: 'rgba(255, 0, 0, 1)',
    default: 'rgba(255, 0, 0, 0.75)',
    past: 'rgba(255, 0, 0, 0.5)',
  },
  activeHeight: '0.375rem',
  gap: '2px',
  radius: '4px',
}

export default function App(props: React.ComponentProps) {
  return (
    <WaveformProvider options={options}>
      {props.children}
    </WaveformProvider>
  )
}

Waveform

// audio-player.tsx
import { AudioTrack, Waveform } from 'react-waveform-visualizer'

export function AudioPlayer({ track }: {
  track: AudioTrack
}) {
  return (
    <Waveform track={track} />
  )
}

<Waveform /> can take three arguments:

  • track: AudioTrack
  • columns: number (optional)
  • options: ConfigOptions (optional)
argumentdescriptiontype
trackAn object containing the id and src of the trackAudioTrack
columnsSpecifies the number of segments in the rendered audio wave. Default value is 60number
optionsOptional styling specifications. These options will override any default options or options set in the WaveformProviderConfigOptions
// custom-audio-player.tsx
import { AudioTrack, ConfigOptions, Waveform } from 'react-waveform-visualizer'

export function AudioPlayer({ track, activeColor, gap }: {
  activeColor: string,
  gap: string,
  track: AudioTrack
}) {
  const options: Partial<ConfigOptions> = {
    colors: {
      active: activeColor,
    },
    gap: gap,
  }

  return (
    <Waveform track={track} options={options} />
  )
}

Hooks

useWaveform

The useWaveform hook exposes the following variables and functions:

namedescriptiontypearguments
armTrackPlays an audio track from the tracks arrayFunctionid: number | string
currentThe currently armed trackObject: AudioTrack
loadingStatus of track array populationboolean
loadTracksPopulates the tracks array with a list of audio sources, either replacing the array's contents or appending the passed items to the current arrayFunctiontracks: AudioTrack[], reset: boolean
metadataData about the currently armed track, such as track duration, time elapsed (while playing)Object: Metadata
tracksArray of tracks that have been loadedObject: AudioTrack[]

loadTracks

The loadTracks function takes the following arguments:

  • tracks: AudioTrack[]
  • reset: boolean
argumentdescriptiontype
tracksTakes an array of objects specifying the audio tracks to be loaded and rendered as waveformsAudioTrack[]
resetIndicates whether the passed tracks will replace or be appended to the existing array. Default value is falseboolean

tracks (argument)

Each track in the tracks array is of type AudioTrack, which includes two properties:

  • id: string | number
  • src: string
keydescriptiontype
idThe id must be unique, as it is used to synchronize waveforms throughout the application (e.g. if a track's waveform is playing in a list of tracks and is being displayed simultaneously in a separate component)string or number
srcThe src specifies the location of the audio file.string
import { useEffect } from 'react'
import { useWaveform, AudioTrack, Waveform } from 'react-waveform-visualizer'

// Audio track URLs
const TRACK_LIST = [
  'https://demo3.bigfishaudio.net/demo/free11_1.mp3',
  'https://s3-us-west-2.amazonaws.com/s.cdpn.io/254249/break.ogg',
  'https://free-loops.com/data/mp3/d0/b8/bc44c037a3dfdb90838c13513e58.mp3',
  'https://free-loops.com/data/mp3/68/c0/af53529e97d928a43d8dd7272ae3.mp3',
]

// URLs mapped to an AudioTrack array
const TRACKS = TRACK_LIST.map((url, index: number) => ({
  id: index,
  src: url,
}))

export function Tracks() {
  const { loadTracks } = useWaveform()

  useEffect(() => {
    loadTracks(TRACKS) // Load the tracks into the Waveform state
  }, [loadTracks])
}

armTrack

armTrack plays the specified track through an <audio> element in <WaveformProvider>. Once a track is armed, any <Waveform /> whose track id matches the armTrack id will render the audio waveform.

The armTrack function takes only one argument:

  • id: string | number
argumentdescriptiontype
idThe id comes from the tracks array, specifying a loaded track for playback and visualizationstring or number
// play-button.tsx
import { useWaveform } from 'react-waveform-visualizer'

export function PlayButton({ id }: { id: string }) {
  const { armTrack } = useWaveform()

  return (
    <button onClick={() => armTrack(id)}>{'▶️'}</button>
  )
}

current

current is the currently armed/playing track. If no track is armed, current will evaluate to null.

import { useWaveform } from 'react-waveform-visualizer'
import { AudioPlayer } from './audio-player.tsx'

export function AudioPlayer() {
  const { current } useWaveform()

  return (
    <>

      {/* current is not null */}
      {current && (
        <div>
          <AudioPlayer track={current} />
          <p>{`Currently playing track #${current.id}`}</p>
        </div>
      )}

      {/* current is null */}
      {!current && <p>No tracks are playing at this time.</p>}
    </>
  )
}

tracks

tracks is an array of all loaded tracks. tracks are of type AudioTrack.

import { useWaveform } from 'react-waveform-visualizer'
import { AudioPlayer } from './audio-player'
import { PlayButton } from './play-button'

export function TrackList() {
  const { tracks } useWaveform()

  return (
    <ul>
      {tracks.map((track) => (
        <li key={track.id}>
          <PlayButton id={track.id} />
          <span>{`Track ID #${track.id}`}</span>
          <AudioPlayer track={track} />
        </li>
      ))}
    </li>
  )
}

metadata

metadata returns an object (type Metadata) containing information about the currently armed track, including track duration and playthrough progress (milliseconds/seconds/minutes). metadata includes four properties:

keydescriptiontype
durationThe length of the track in seconds (decimal)number
minutesThe number of minutes elapsed since playback startednumber
secondsThe number of seconds elapsed since playback startednumber
msThe number of milliseconds elapsed since playback startednumber

WaveformProvider (React Context API )

The WaveformProvider maintains the state for all loaded audio tracks, as well as play state.


Usage

First, import the WaveformProvider to the root of your application:

import { WaveformProvider } from 'react-waveform-visualizer';

Next, wrap the provider around the your root component, so that all child components will have access to the WaveformProvider state:

root.render(
  <WaveformProvider>
    <App />
  </WaveformProvider>
);

Any child component of WaveformProvider can utilize the useWaveform hook and the <Waveform /> component.

Finally, load tracks, arm tracks, and render waveforms using the useWaveform hook and the <Waveform /> component:

// audio-tracks.json

[
  {
    "id": "1",
    "src": "https://demo3.bigfishaudio.net/demo/free11_1.mp3"
  },
  {
    "id": "1",
    "src": "https://s3-us-west-2.amazonaws.com/s.cdpn.io/254249/break.ogg"
  },
  {
    "id": "1",
    "src": "https://free-loops.com/data/mp3/d0/b8/bc44c037a3dfdb90838c13513e58.mp3"
  },
  {
    "id": "1",
    "src": "https://free-loops.com/data/mp3/68/c0/af53529e97d928a43d8dd7272ae3.mp3"
  }
]

import { useEffect } from 'react';
import { useWaveform, AudioTrack, Waveform } from 'react-waveform-visualizer';

// import audio tracks
import audioTracks from './track-data.json'

function TrackLibrary() {
  const { armTrack, current, loadTracks, tracks } = useWaveform();

  // load the tracks into the WaveformProvider context
  useEffect(() => {
    loadTracks(audioTracks as AudioTrack[])
  }, [loadTracks])

  return (
    <>
      <main>
        <ul>
          {/* List each track with a "play" button and its respective Waveform */}
          {tracks.map((track) => (
            <li key={track.id}>
              <button onClick={() => armTrack(track.id)}>{'▶️'}</button>
              <Waveform track={track} />
            </li>
          ))}
        </ul>
      </main>
      <footer>
        {/* Render the footer Waveform if a track is currently armed */}
        {current && (
          <Waveform
            track={current}
            columns={120}
            options={{
              colors: {
                default: '#ffffff',
              },
              gap: '1px',
              radius: '8px',
            }}
          />
        )}
      </footer>
    </>
  );
}

FAQs

Package last updated on 06 Aug 2024

Did you know?

Socket

Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.

Install

Related posts