Skip to content

useMediaControls ​

that provides controls for HTML media elements (audio/video)

browser
test coverage
Last changed: 3 days ago

Installation ​

Library
CLI
Manual
typescript
import { useMediaControls } from '@siberiacancode/reactuse';

Usage ​

typescript
const { playing, play, pause } = useMediaControls(videoRef, 'video.mp4');
// or
const { playing, play, pause } = useMediaControls(audioRef, { src: 'audio.mp3', type: 'audio/mp3' });
// or
const { ref, playing, play, pause } = useMediaControls<HTMLVideoElement>('video.mp4');
// or
const { ref, playing, play, pause } = useMediaControls<HTMLVideoElement>({ src: 'video.mp4', type: 'video/mp4' });

Demo ​

Api ​

Parameters

NameTypeDefaultNote
targetHookTarget-The target media element
srcstring-The source URL of the media

Returns

UseMediaControlsReturn

Parameters

NameTypeDefaultNote
targetHookTarget-The target media element
optionsUseMediaSource-The media source configuration

Returns

UseMediaControlsReturn

Parameters

NameTypeDefaultNote
srcstring-The source URL of the media

Returns

UseMediaControlsReturn & { ref: StateRef<Target> }

Parameters

NameTypeDefaultNote
optionsUseMediaSource-The media source configuration

Returns

UseMediaControlsReturn & { ref: StateRef<Target> }

Type declaration ​

typescript
import type { HookTarget } from '@/utils/helpers';

import type { StateRef } from '../useRefState/useRefState';

export interface UseMediaSource {
  /** The media attribute of the media */
  media?: string;
  /** The source URL of the media */
  src: string;
  /** The MIME type of the media */
  type?: string;
}

export interface UseMediaControlsReturn {
  /** Whether the media is currently buffering */
  buffered: [number, number][];
  /** The current playback position in seconds */
  currentTime: number;
  /** The total duration of the media in seconds */
  duration: number;
  /** Whether the media has ended */
  ended: boolean;
  /** Whether the media is currently muted */
  muted: boolean;
  /** The current playback rate (1.0 is normal speed) */
  playbackRate: number;
  /** Whether the media is currently playing */
  playing: boolean;
  /** Whether the media is currently seeking */
  seeking: boolean;
  /** Whether the media is currently stalled */
  stalled: boolean;
  /** The current volume level (0.0 to 1.0) */
  volume: number;
  /** Whether the media is currently waiting */
  waiting: boolean;

  /** Set the playback rate */
  changePlaybackRate: (rate: number) => void;
  /** Set the volume level (0.0 to 1.0) */
  changeVolume: (volume: number) => void;
  /** Set the muted state */
  mute: () => void;
  /** Pause the media */
  pause: () => void;
  /** Start playing the media */
  play: () => Promise<void>;
  /** Seek to a specific time in seconds */
  seek: (time: number) => void;
  /** Toggle between play and pause */
  toggle: () => Promise<void>;
  /** Set the unmuted state */
  unmute: () => void;
}

export interface UseMediaControls {
  (target: HookTarget, src: string): UseMediaControlsReturn;

  (target: HookTarget, options: UseMediaSource): UseMediaControlsReturn;

  <Target extends HTMLMediaElement>(
    src: string
  ): UseMediaControlsReturn & {
    ref: StateRef<Target>;
  };

  <Target extends HTMLMediaElement>(
    options: UseMediaSource
  ): UseMediaControlsReturn & { ref: StateRef<Target> };
}

Source ​

Source • Demo

Contributors ​

D
debabin
debabin

Released under the MIT License.