playback-rate

PreviousNext
Docs
limeplayui

Preview

Loading preview…
registry/default/ui/playback-rate.tsx
"use client"

import * as React from "react"

import {
  SelectGroup as SelectGroupPrimitive,
  SelectItem,
  Select as SelectPrimitive,
  SelectTrigger as SelectTriggerPrimitive,
  SelectValue,
} from "@/components/ui/select"
import { usePlaybackRate } from "@/registry/default/hooks/use-playback-rate"
import { useMediaStore } from "@/registry/default/ui/media-provider"

export function SelectRoot(
  props: React.ComponentProps<typeof SelectPrimitive>
) {
  const playbackRate = useMediaStore((state) => state.playbackRate)
  const { setPlaybackRate } = usePlaybackRate()

  return (
    <SelectPrimitive
      onValueChange={(value) => setPlaybackRate(Number(value))}
      value={playbackRate.toString()}
      {...props}
    />
  )
}

SelectRoot.displayName = "PlaybackRateSelectRoot"

export function SelectTrigger(
  props: React.ComponentProps<typeof SelectTriggerPrimitive>
) {
  return (
    <SelectTriggerPrimitive {...props}>
      <SelectValue />
    </SelectTriggerPrimitive>
  )
}

SelectTrigger.displayName = "PlaybackRateSelectTrigger"

interface SelectGroupProps
  extends React.ComponentProps<typeof SelectGroupPrimitive> {
  suffix?: string
}

export function SelectGroup(props: SelectGroupProps) {
  const playbackRates = useMediaStore((state) => state.playbackRates)
  const { children, suffix = "x", ...etc } = props

  return (
    <SelectGroupPrimitive {...etc}>
      {children}
      {playbackRates.map((rate) => (
        <SelectItem key={rate} value={rate.toString()}>
          {rate}
          {suffix && <span className="text-xs">{suffix}</span>}
        </SelectItem>
      ))}
    </SelectGroupPrimitive>
  )
}

SelectGroup.displayName = "PlaybackRateSelectGroup"

Installation

npx shadcn@latest add @limeplay/playback-rate

Usage

import { PlaybackRate } from "@/components/ui/playback-rate"
<PlaybackRate />