useMediaControls
hookas/use-media-controlsFreeHook
A hook to control media elements
Install it
npx shadcn@latest add https://hookas.letstri.dev/r/use-media-controls.jsonSource
1'use client'23import * as React from 'react'45interface MediaControls {6 play: () => Promise<void>7 pause: () => void8 toggle: () => Promise<void>9 stop: () => void10 toggleMute: (isMuted?: boolean) => void11 setVolume: (volume: number) => void12 setCurrentTime: (time: number) => void13 isPlaying: boolean14 isMuted: boolean15 volume: number16 currentTime: number17 duration: number18}1920export function useMediaControls(21 mediaRef: React.RefObject<HTMLMediaElement | null>,22): MediaControls {23 const [state, setState] = React.useState({24 isPlaying: false,25 isMuted: false,26 volume: 1,27 currentTime: 0,28 duration: 0,29 })3031 React.useEffect(() => {32 const media = mediaRef.current3334 if (!media)35 return3637 const abortController = new AbortController()3839 media.addEventListener('play', () => setState(s => ({ ...s, isPlaying: true })), { signal: abortController.signal })40 media.addEventListener('pause', () => setState(s => ({ ...s, isPlaying: false })), { signal: abortController.signal })41 media.addEventListener('volumechange', () => setState(s => ({42 ...s,43 volume: media.volume,44 isMuted: media.muted,45 })), { signal: abortController.signal })46 media.addEventListener('timeupdate', () => setState(s => ({ ...s, currentTime: media.currentTime })), { signal: abortController.signal })47 media.addEventListener('durationchange', () => setState(s => ({ ...s, duration: media.duration })), { signal: abortController.signal })48 media.addEventListener('ended', () => setState(s => ({ ...s, isPlaying: false })), { signal: abortController.signal })4950 setState({51 isPlaying: !media.paused,52 isMuted: media.muted,53 volume: media.volume,54 currentTime: media.currentTime,55 duration: media.duration || 0,56 })5758 return () => {59 abortController.abort()60 }61 }, [mediaRef])6263 const play = React.useCallback(async () => {64 if (mediaRef.current) {65 await mediaRef.current.play()66 }67 }, [mediaRef])6869 const pause = React.useCallback(() => {70 if (mediaRef.current) {71 mediaRef.current.pause()72 }73 }, [mediaRef])7475 const toggle = React.useCallback(async () => {76 if (mediaRef.current) {77 if (state.isPlaying) {78 mediaRef.current.pause()79 }80 else {81 await mediaRef.current.play()82 }83 }84 }, [mediaRef, state.isPlaying])8586 const stop = React.useCallback(() => {87 if (mediaRef.current) {88 mediaRef.current.pause()89// … truncated
Files it writes
More from hookas
All 30 items| Component | Registry | Kind | Access | Installs | Command |
|---|---|---|---|---|---|
| useAsyncEffectuse-async-effect | hookas | Hooks | Free | no deps | |
| useClickOutsideuse-click-outside | hookas | Hooks | Free | no deps | |
| useDebounceCallbackuse-debounced-callback | hookas | Hooks | Free | no deps | |
| useDebounceMemouse-debounced-memo | hookas | Hooks | Free | no deps | |
| useDebounceStateuse-debounced-state | hookas | Hooks | Free | no deps | |
| useElementSizeuse-element-size | hookas | Hooks | Free | no deps | |
| useFullscreenuse-fullscreen | hookas | Hooks | Free | no deps | |
| useIntervaluse-interval | hookas | Hooks | Free | no deps |
