Skip to content

createPlayback - 1.34 KB

Basic Usage

ts
const {
  activate,
  getState,
  cleanup,
  onCleanup,
  playbackActions,
  subscribe,
  use,
} = createPlayback({
  id: "playback",
})

// activate playback when your element is available in the DOM
activate()

// getState returns the current state
const currentState = getState()

// Call cleanup when you don't need it anymore
cleanup()

// onCleanup register a callback function that will be called during cleanup phase
onCleanup(() => {
  console.log("cleanup is called")
})

// playbackActions that you can use to control the playback
playbackActions.setMuted(true)

// subscribe to state changes, it returns an unsubscribe function. It can be called manually or automatically during cleanup phase
const unsubscribe = subscribe(({ state, updatedProperties }) => {
  // do something with the state or updatedProperties
})

// use a plugin
use(plugin)

Type Declaration

ts
type PlaybackState = {
  currentTime: number
  duration: number
  seeking: boolean
  waiting: boolean
  stalled: boolean
  ended: boolean
  playbackRate: number
  paused: boolean
  muted: boolean
  volume: number
  isPictureInPicture: boolean
  buffered?: CustomTimeRanges
  textTracks?: CustomTextTrackList
  selectedTrackIndex: number
  isPictureInPictureSupported: boolean

  // Extra properties injected by plugins
}

type PlaybackActions = {
  setCurrentTime: (value: number) => void
  setPlaybackRate: (value: number) => void
  setVolume: (value: number) => void
  setMuted: (value: boolean) => void
  setPaused: (value: boolean) => void
  disableTrack: () => void
  enableTrack: (index: number) => void
  setPictureInPicture: (
    value: boolean,
  ) => Promise<void | PictureInPictureWindow>

  // Extra actions injected by plugins
}

type CleanupFunc = () => void

type OnCleanupHook = (id: string, cb: CleanupFunc) => void

type Plugin<T = unknown> = {
  install: (
    arg: {
      store: ReturnType<typeof createStore<PlaybackState>>
      onCleanup: OnCleanupHook
    },
    ...options: T[]
  ) => CustomPlaybackActions
}

type PluginFunc = <T>(plugin: Plugin<T>, ...options: T[]) => void

function createPlayback(id: string): {
  activate: () => void
  getState: () => PlaybackState
  cleanup: () => void
  onCleanup: (callback: () => void) => void
  playbackActions: PlaybackActions
  subscribe: (
    callback: (arg: {
      state: PlaybackState
      updatedProperties: Partial<PlaybackState>
    }) => void,
  ) => () => void
  use: <T>(plugin: Plugin<T>, ...options: T[]) => PlaybackActions
}