media

PreviousNext
Docs
limeplayui

Preview

Loading preview…
registry/default/ui/media.tsx
import { composeRefs } from "@radix-ui/react-compose-refs"
import * as React from "react"

import { useMediaStore } from "@/registry/default/ui/media-provider"

export type MediaProps =
  | (React.AudioHTMLAttributes<HTMLAudioElement> & { as: "audio" })
  | (React.VideoHTMLAttributes<HTMLVideoElement> & {
      /**
       * Type of Media Element to Render
       *
       * @default video
       */
      as: "video"
    })

export type MediaPropsDocs = Pick<MediaProps, "as">

export const Media = React.forwardRef<HTMLMediaElement, MediaProps>(
  (props, forwardedRef) => {
    const { as: Element = "video", ...etc } = props
    const mediaRef = React.useRef<HTMLMediaElement>(null)
    const setMediaRef = useMediaStore((state) => state.setMediaRef)
    const status = useMediaStore((state) => state.status)

    React.useLayoutEffect(() => {
      if (!mediaRef.current) {
        return
      }

      setMediaRef(mediaRef as React.RefObject<HTMLMediaElement>)
    }, [setMediaRef])

    return (
      <Element
        aria-busy={status === "buffering"}
        controls={false}
        ref={composeRefs(forwardedRef, mediaRef)}
        {...etc}
      />
    )
  }
)

Media.displayName = "Media"

Installation

npx shadcn@latest add @limeplay/media

Usage

import { Media } from "@/components/ui/media"
<Media />