@zuude-ui/video 0.1.36 → 0.1.55
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/chunk-3LYIWCZO.js +2 -0
- package/dist/chunk-3LYIWCZO.js.map +1 -0
- package/dist/chunk-4OJ2XRGY.js +2 -0
- package/dist/chunk-4OJ2XRGY.js.map +1 -0
- package/dist/chunk-72XT2CEM.js +2 -0
- package/dist/chunk-72XT2CEM.js.map +1 -0
- package/dist/chunk-CS4V77B7.js +2 -0
- package/dist/chunk-CS4V77B7.js.map +1 -0
- package/dist/chunk-DNOJGU7F.js +2 -0
- package/dist/chunk-DNOJGU7F.js.map +1 -0
- package/dist/chunk-HEGM5TXH.js +2 -0
- package/dist/chunk-HEGM5TXH.js.map +1 -0
- package/dist/chunk-IDFSOQOU.js +2 -0
- package/dist/chunk-IDFSOQOU.js.map +1 -0
- package/dist/chunk-IQERDY45.js +2 -0
- package/dist/chunk-IQERDY45.js.map +1 -0
- package/dist/chunk-IVHP55KV.js +2 -0
- package/dist/chunk-IVHP55KV.js.map +1 -0
- package/dist/chunk-KM2LHTEJ.js +2 -0
- package/dist/chunk-KM2LHTEJ.js.map +1 -0
- package/dist/chunk-MOMKLUXO.js +2 -0
- package/dist/chunk-MOMKLUXO.js.map +1 -0
- package/dist/chunk-NPGT4WCI.js +2 -0
- package/dist/chunk-NPGT4WCI.js.map +1 -0
- package/dist/chunk-OUDZZUOB.js +2 -0
- package/dist/chunk-OUDZZUOB.js.map +1 -0
- package/dist/chunk-R372EZNW.js +2 -0
- package/dist/chunk-R372EZNW.js.map +1 -0
- package/dist/chunk-UKR5BP5U.js +2 -0
- package/dist/chunk-UKR5BP5U.js.map +1 -0
- package/dist/chunk-W6DLY3AO.js +2 -0
- package/dist/chunk-W6DLY3AO.js.map +1 -0
- package/dist/chunk-WOVLVPBO.js +2 -0
- package/dist/chunk-WOVLVPBO.js.map +1 -0
- package/dist/chunk-WY6YHDWT.js +2 -0
- package/dist/chunk-WY6YHDWT.js.map +1 -0
- package/dist/chunk-YID6OIKP.js +2 -0
- package/dist/chunk-YID6OIKP.js.map +1 -0
- package/dist/chunk-ZDOBNBGL.js +2 -0
- package/dist/chunk-ZDOBNBGL.js.map +1 -0
- package/dist/hooks/index.cjs +1 -1
- package/dist/hooks/index.cjs.map +1 -1
- package/dist/hooks/index.js +1 -1
- package/dist/index.cjs +1 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/hooks/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/hooks/index.ts","../../src/hooks/use-autoplay-by-force.tsx","../../src/hooks/use-autoplay-on-visible.tsx","../../src/hooks/use-fullscreen.tsx","../../src/hooks/use-get-duration.tsx","../../src/hooks/use-hot-keys.tsx","../../src/hooks/use-mute-unmute.tsx","../../src/hooks/use-picture-in-picture.tsx","../../src/hooks/use-play-pause.tsx","../../src/hooks/use-seek.tsx","../../src/hooks/use-speed.tsx","../../src/hooks/use-start-at.tsx","../../src/hooks/use-current-time.tsx","../../src/hooks/use-video-state.tsx","../../src/hooks/use-volume.tsx","../../src/hooks/use-buffer.tsx","../../src/hooks/use-download.tsx","../../src/hooks/use-range.tsx"],"sourcesContent":["export * from \"./use-autoplay-by-force\";\nexport * from \"./use-autoplay-on-visible\";\nexport * from \"./use-fullscreen\";\nexport * from \"./use-get-duration\";\nexport * from \"./use-hot-keys\";\nexport * from \"./use-mute-unmute\";\nexport * from \"./use-picture-in-picture\";\nexport * from \"./use-play-pause\";\nexport * from \"./use-seek\";\nexport * from \"./use-speed\";\nexport * from \"./use-start-at\";\nexport * from \"./use-current-time\";\nexport * from \"./use-video-state\";\nexport * from \"./use-volume\";\nexport * from \"./use-buffer\";\nexport * from \"./use-download\";\nexport * from \"./use-range\";\n","import React from \"react\";\nimport type { VideoRef } from \"../types\";\n\nexport const useAutoplayByForce = (\n videoRef: VideoRef,\n enabled: boolean,\n setError?: (error: string | null) => void\n) => {\n React.useEffect(() => {\n if (!videoRef?.current || !enabled) return;\n\n const playVideo = async () => {\n try {\n await videoRef.current?.play();\n } catch (error) {\n // If autoplay fails, try muting and playing again\n if (error instanceof Error && error.name === \"NotAllowedError\") {\n setError?.(\"NotAllowedError\");\n console.error(\"NotAllowedError\");\n if (videoRef?.current) {\n videoRef.current.muted = true;\n try {\n await videoRef.current.play();\n } catch (retryError) {\n console.error(retryError);\n }\n }\n } else {\n console.error(error);\n }\n }\n };\n\n playVideo();\n }, [enabled, videoRef?.current]);\n};\n","import React from \"react\";\nimport type { VideoRef } from \"../types\";\n\nexport const useAutoplayOnVisible = (\n videoRef: VideoRef,\n threshold: number | undefined,\n enabled = true\n) => {\n React.useEffect(() => {\n if (!videoRef?.current || !enabled) return;\n\n const observer = new IntersectionObserver(\n (entries) => {\n entries.forEach((entry) => {\n if (!videoRef?.current) return;\n\n if (entry.isIntersecting) {\n videoRef.current.play().catch((error) => {\n if (!videoRef.current) return;\n\n videoRef.current.pause();\n videoRef.current.muted = true;\n videoRef.current.play();\n console.error(error);\n });\n } else {\n videoRef.current?.pause();\n }\n });\n },\n { threshold: threshold ?? 0.5 }\n );\n\n observer.observe(videoRef?.current);\n\n return () => {\n observer.disconnect();\n };\n }, [videoRef?.current]);\n};\n","import React from \"react\";\nimport type { VideoRef } from \"../types\";\n\nconst useFullscreen = (videoRef: VideoRef) => {\n const [isFullscreen, setIsFullscreen] = React.useState(false);\n const previousStylesRef = React.useRef<{\n objectFit: string;\n borderRadius: string;\n width: string;\n height: string;\n maxWidth: string;\n maxHeight: string;\n margin: string;\n } | null>(null);\n\n React.useEffect(() => {\n const handleFullscreenChange = () => {\n const isCurrentlyFullscreen = !!document.fullscreenElement;\n setIsFullscreen(isCurrentlyFullscreen);\n\n // Apply styles based on fullscreen state\n const video = videoRef?.current;\n if (video) {\n if (isCurrentlyFullscreen) {\n // Store previous styles before entering fullscreen\n previousStylesRef.current = {\n objectFit: video.style.objectFit || \"cover\",\n borderRadius: video.style.borderRadius || \"\",\n width: video.style.width || \"\",\n height: video.style.height || \"\",\n maxWidth: video.style.maxWidth || \"\",\n maxHeight: video.style.maxHeight || \"\",\n margin: video.style.margin || \"\",\n };\n // Apply fullscreen styles\n video.style.objectFit = \"contain\";\n video.style.borderRadius = \"0\";\n video.style.width = \"100%\";\n video.style.height = \"100%\";\n video.style.maxWidth = \"none\";\n video.style.maxHeight = \"none\";\n video.style.margin = \"0\";\n } else {\n // Restore previous styles when exiting fullscreen\n if (previousStylesRef.current) {\n video.style.objectFit = previousStylesRef.current.objectFit;\n video.style.borderRadius = previousStylesRef.current.borderRadius;\n video.style.width = previousStylesRef.current.width;\n video.style.height = previousStylesRef.current.height;\n video.style.maxWidth = previousStylesRef.current.maxWidth;\n video.style.maxHeight = previousStylesRef.current.maxHeight;\n video.style.margin = previousStylesRef.current.margin;\n previousStylesRef.current = null;\n }\n }\n }\n };\n\n document.addEventListener(\"fullscreenchange\", handleFullscreenChange);\n return () =>\n document.removeEventListener(\"fullscreenchange\", handleFullscreenChange);\n }, [videoRef]);\n\n const toggleFullscreen = () => {\n const isSafari = /^((?!chrome|android).)*safari/i.test(navigator.userAgent);\n const video = videoRef?.current;\n\n if (video && isSafari) {\n if ((video as any).webkitEnterFullscreen) {\n (video as any).webkitEnterFullscreen();\n return;\n } else if (video.requestFullscreen) {\n video.requestFullscreen();\n return;\n }\n }\n\n const videoContainer = video?.closest(\n \"[data-zuude-video-wrapper]\"\n ) as HTMLElement;\n\n if (videoContainer) {\n if (!isFullscreen) {\n videoContainer.requestFullscreen();\n } else {\n document.exitFullscreen();\n }\n }\n };\n\n return { isFullscreen: isFullscreen ?? false, toggleFullscreen };\n};\n\nexport { useFullscreen };\n","import React from \"react\";\nimport type { VideoRef } from \"../types\";\n\nexport const useGetDuration = (videoRef: VideoRef) => {\n const [isLoading, setIsLoading] = React.useState(false);\n const [duration, setDuration] = React.useState<number | null>(null);\n\n React.useEffect(() => {\n if (!videoRef?.current) return;\n\n setIsLoading(true);\n\n const getDuration = () => {\n setDuration(videoRef.current?.duration ?? null);\n setIsLoading(false);\n };\n\n const handleError = () => {\n setIsLoading(false);\n };\n\n const video = videoRef.current;\n\n // Check if duration is already available\n if (video.duration && !isNaN(video.duration)) {\n setDuration(video.duration);\n setIsLoading(false);\n } else {\n // Add event listeners\n video.addEventListener(\"loadedmetadata\", getDuration);\n video.addEventListener(\"error\", handleError);\n video.addEventListener(\"loadeddata\", getDuration);\n\n return () => {\n video.removeEventListener(\"loadedmetadata\", getDuration);\n video.removeEventListener(\"error\", handleError);\n video.removeEventListener(\"loadeddata\", getDuration);\n };\n }\n }, [videoRef]);\n\n return { duration, isLoading };\n};\n","import { useEffect } from \"react\";\n\nexport const useHotKeys = (\n key: string,\n func: (event: KeyboardEvent) => void,\n enabled = true\n) => {\n const handleKeyDown = (event: KeyboardEvent) => {\n if (event.key === key) {\n event.preventDefault();\n func(event);\n }\n };\n\n useEffect(() => {\n if (!enabled) return;\n\n document.addEventListener(\"keydown\", handleKeyDown);\n\n return () => {\n document.removeEventListener(\"keydown\", handleKeyDown);\n };\n }, [key, func, enabled]);\n};\n","import React from \"react\";\nimport type { VideoRef } from \"../types\";\n\nexport const useMuteUnmute = (videoRef: VideoRef) => {\n const [isMuted, setIsMuted] = React.useState(false);\n\n const toggleMute = React.useCallback(() => {\n if (videoRef?.current) {\n videoRef.current.muted = !videoRef.current.muted;\n }\n }, [videoRef?.current]);\n\n const mute = React.useCallback(() => {\n if (videoRef?.current) {\n videoRef.current.muted = true;\n }\n }, [videoRef?.current]);\n\n const unmute = React.useCallback(() => {\n if (videoRef?.current) {\n videoRef.current.muted = false;\n }\n }, [videoRef?.current]);\n\n React.useEffect(() => {\n if (!videoRef?.current) return;\n\n // Set the initial state\n setIsMuted(videoRef.current.muted);\n\n const handleVolumeChange = () => {\n if (videoRef.current) {\n setIsMuted(videoRef.current.muted);\n }\n };\n\n videoRef.current.addEventListener(\"volumechange\", handleVolumeChange);\n\n return () => {\n videoRef.current?.removeEventListener(\"volumechange\", handleVolumeChange);\n };\n }, [videoRef?.current]);\n\n return { toggleMute, isMuted, mute, unmute };\n};\n","import type { VideoRef } from \"../types\";\n\nexport const usePictureInPicture = (videoRef: VideoRef) => {\n const togglePictureInPicture = async () => {\n const video = videoRef?.current;\n if (!video) return;\n\n try {\n if (document.pictureInPictureElement) {\n await document.exitPictureInPicture();\n } else {\n await video.requestPictureInPicture();\n }\n } catch (error) {\n // Fallback for browsers that don't support PiP\n const isSafari = /^((?!chrome|android).)*safari/i.test(\n navigator.userAgent\n );\n\n if (isSafari) {\n if ((video as any).webkitEnterFullscreen) {\n (video as any).webkitEnterFullscreen();\n } else if (video.requestFullscreen) {\n video.requestFullscreen();\n }\n } else {\n const videoContainer = video.closest(\n \"[data-zuude-video-wrapper]\"\n ) as HTMLElement;\n if (videoContainer) {\n if (!document.fullscreenElement) {\n await videoContainer.requestFullscreen();\n } else {\n await document.exitFullscreen();\n }\n }\n }\n }\n };\n\n const requestPictureInPicture = async () => {\n const video = videoRef?.current;\n if (!video) return;\n await video.requestPictureInPicture();\n };\n\n const exitPictureInPicture = async () => {\n const video = videoRef?.current;\n if (!video) return;\n await document.exitPictureInPicture();\n };\n\n return {\n togglePictureInPicture,\n requestPictureInPicture,\n exitPictureInPicture,\n };\n};\n","import React from \"react\";\nimport type { VideoRef } from \"../types\";\n\nexport const usePlayPause = (videoRef: VideoRef) => {\n const [isPlaying, setIsPlaying] = React.useState(false);\n\n const togglePlay = React.useCallback(() => {\n if (videoRef?.current) {\n videoRef.current.paused\n ? videoRef.current.play()\n : videoRef.current.pause();\n }\n }, [videoRef?.current]);\n\n const play = React.useCallback(() => {\n if (videoRef?.current) {\n videoRef.current.play();\n }\n }, [videoRef?.current]);\n\n const pause = React.useCallback(() => {\n if (videoRef?.current) {\n videoRef.current.pause();\n }\n }, [videoRef?.current]);\n\n React.useEffect(() => {\n if (!videoRef?.current) return;\n\n const handlePlay = () => {\n setIsPlaying(true);\n };\n const handlePause = () => {\n setIsPlaying(false);\n };\n\n setIsPlaying(!videoRef?.current.paused);\n\n if (videoRef?.current) {\n videoRef.current.addEventListener(\"play\", handlePlay);\n videoRef.current.addEventListener(\"pause\", handlePause);\n\n return () => {\n videoRef.current?.removeEventListener(\"play\", handlePlay);\n videoRef.current?.removeEventListener(\"pause\", handlePause);\n };\n }\n }, [videoRef?.current]);\n\n return { togglePlay, isPlaying, play, pause };\n};\n","import React from \"react\";\nimport type { VideoRef } from \"../types\";\n\nexport const useSeek = (videoRef: VideoRef, value = 10) => {\n const seekForward = React.useCallback(() => {\n if (videoRef?.current) {\n videoRef.current.currentTime += value;\n }\n }, [videoRef?.current]);\n\n const seekBackward = React.useCallback(() => {\n if (videoRef?.current) {\n videoRef.current.currentTime -= value;\n }\n }, [videoRef?.current]);\n\n return { seekForward, seekBackward };\n};\n","import React from \"react\";\nimport type { VideoRef } from \"../types\";\n\nexport const useSpeed = (videoRef: VideoRef) => {\n const [speed, setSpeed] = React.useState(1);\n\n const onChangeSpeed = (speed: number) => {\n setSpeed(speed);\n };\n\n // Get the speed from the video element\n React.useEffect(() => {\n if (!videoRef?.current) return;\n setSpeed(videoRef.current.playbackRate);\n }, [videoRef?.current]);\n\n React.useEffect(() => {\n if (!videoRef?.current) return;\n\n videoRef.current.playbackRate = speed;\n }, [speed, videoRef?.current]);\n\n return { speed, onChangeSpeed };\n};\n","import React from \"react\";\nimport type { VideoRef } from \"../types\";\n\nexport const useStartAt = (videoRef: VideoRef, startAt: number) => {\n React.useEffect(() => {\n if (!videoRef?.current || !startAt) return;\n\n const video = videoRef?.current;\n if (video && startAt) {\n video.currentTime = startAt;\n }\n }, [startAt, videoRef?.current]);\n};\n","import React from \"react\";\nimport type { VideoRef } from \"../types.js\";\n\nexport const useCurrentTime = (videoRef: VideoRef, interval = 10) => {\n const [isPlaying, setIsPlaying] = React.useState(false);\n const [currentTime, setCurrentTime] = React.useState(0);\n\n React.useEffect(() => {\n if (videoRef?.current && isPlaying) {\n const intervalId = setInterval(() => {\n setCurrentTime(videoRef.current?.currentTime || 0);\n }, interval);\n\n return () => clearInterval(intervalId);\n }\n }, [videoRef?.current, isPlaying]);\n\n React.useEffect(() => {\n if (!videoRef?.current) return;\n\n const video = videoRef.current;\n\n // Store handlers in variables for proper cleanup (critical for Safari memory safety)\n const handlePlay = () => setIsPlaying(true);\n const handlePause = () => setIsPlaying(false);\n\n video.addEventListener(\"play\", handlePlay);\n video.addEventListener(\"pause\", handlePause);\n\n return () => {\n video.removeEventListener(\"play\", handlePlay);\n video.removeEventListener(\"pause\", handlePause);\n };\n }, [videoRef?.current]);\n\n const onTimeUpdate = (time: number) => {\n if (videoRef?.current) {\n setCurrentTime(time);\n videoRef.current.currentTime = time;\n }\n };\n\n return {\n currentTime,\n onTimeUpdate,\n };\n};\n","import { RefObject, useEffect, useState } from \"react\";\n\nconst useVideoState = (videoRef: RefObject<HTMLVideoElement | null>) => {\n const [isPlaying, setIsPlaying] = useState(false);\n const [isMuted, setIsMuted] = useState(false);\n const [isFullscreen, setIsFullscreen] = useState(false);\n\n useEffect(() => {\n const video = videoRef.current;\n\n if (video) {\n video.addEventListener(\"play\", () => setIsPlaying(true));\n video.addEventListener(\"pause\", () => setIsPlaying(false));\n\n return () => {\n video.removeEventListener(\"play\", () => setIsPlaying(true));\n video.removeEventListener(\"pause\", () => setIsPlaying(false));\n };\n }\n }, [videoRef]);\n\n useEffect(() => {\n if (!videoRef?.current) return;\n\n // Set the initial state\n setIsMuted(videoRef.current.muted);\n\n const handleVolumeChange = () => {\n if (videoRef.current) {\n setIsMuted(videoRef.current.muted);\n }\n };\n\n videoRef.current.addEventListener(\"volumechange\", handleVolumeChange);\n\n return () => {\n videoRef.current?.removeEventListener(\"volumechange\", handleVolumeChange);\n };\n }, [videoRef]);\n\n useEffect(() => {\n if (!videoRef?.current) return;\n\n const handleFullscreenChange = () => {\n setIsFullscreen(!!document.fullscreenElement);\n };\n\n document.addEventListener(\"fullscreenchange\", handleFullscreenChange);\n return () =>\n document.removeEventListener(\"fullscreenchange\", handleFullscreenChange);\n }, [videoRef]);\n\n return { isPlaying, isMuted, isFullscreen };\n};\n\nexport { useVideoState };\n","import React from \"react\";\nimport type { VideoRef } from \"../types\";\n\nexport const useVolume = (videoRef: VideoRef, initialVolume = 100) => {\n const [volume, setVolume] = React.useState(initialVolume);\n\n const onChangeVolume = (volume: number) => {\n setVolume(volume);\n };\n\n // Get the volume from the video element\n React.useEffect(() => {\n if (!videoRef?.current) return;\n setVolume(videoRef.current.volume * 100);\n }, [videoRef?.current]);\n\n React.useEffect(() => {\n if (!videoRef?.current) return;\n\n videoRef.current.volume = volume / 100;\n }, [volume, videoRef?.current]);\n\n return { volume, onChangeVolume };\n};\n","import React from \"react\";\nimport type { VideoRef } from \"../types.js\";\n\nexport const useBuffer = (videoRef: VideoRef, duration?: number) => {\n const [isPlaying, setIsPlaying] = React.useState(false);\n const [buffered, setBuffered] = React.useState(0);\n\n React.useEffect(() => {\n if (videoRef?.current && isPlaying) {\n const intervalId = setInterval(() => {\n if (videoRef.current?.buffered.length) {\n setBuffered(\n videoRef.current.buffered.end(videoRef.current.buffered.length - 1)\n );\n }\n }, 10);\n\n return () => clearInterval(intervalId);\n }\n }, [videoRef?.current, isPlaying]);\n\n React.useEffect(() => {\n if (!videoRef?.current) return;\n\n videoRef.current.addEventListener(\"play\", () => setIsPlaying(true));\n videoRef.current.addEventListener(\"pause\", () => setIsPlaying(false));\n\n return () => {\n videoRef.current?.removeEventListener(\"play\", () => setIsPlaying(true));\n videoRef.current?.removeEventListener(\"pause\", () => setIsPlaying(false));\n };\n }, []);\n\n return {\n buffered,\n bufferedPercentage: (buffered / (duration || 0)) * 100 || 0,\n };\n};\n","import { useEffect, useState, useCallback } from \"react\";\nimport type { VideoRef } from \"../types\";\n\nexport const useDownload = (videoRef: VideoRef) => {\n const [isDownloading, setIsDownloading] = useState(false);\n const [downloadProgress, setDownloadProgress] = useState(0);\n const [error, setError] = useState<string | null>(null);\n\n const downloadVideo = useCallback(\n async (filename?: string) => {\n if (!videoRef?.current) {\n setError(\"Video element not found\");\n return;\n }\n\n const video = videoRef.current;\n const videoSrc = video.src || video.currentSrc;\n\n if (!videoSrc) {\n setError(\"No video source found\");\n return;\n }\n\n try {\n setIsDownloading(true);\n setError(null);\n setDownloadProgress(0);\n\n // Fetch the video file\n const response = await fetch(videoSrc);\n\n if (!response.ok) {\n throw new Error(`Failed to fetch video: ${response.statusText}`);\n }\n\n // Get the content length for progress tracking\n const contentLength = response.headers.get(\"content-length\");\n const total = contentLength ? parseInt(contentLength, 10) : 0;\n\n // Create a readable stream to track progress\n const reader = response.body?.getReader();\n if (!reader) {\n throw new Error(\"Failed to create download stream\");\n }\n\n const chunks: BlobPart[] = [];\n let receivedLength = 0;\n\n while (true) {\n const { done, value } = await reader.read();\n\n if (done) break;\n\n chunks.push(value);\n receivedLength += value.length;\n\n if (total > 0) {\n const progress = (receivedLength / total) * 100;\n setDownloadProgress(Math.round(progress));\n }\n }\n\n // Combine chunks into a single blob\n const blob = new Blob(chunks, {\n type: response.headers.get(\"content-type\") || \"video/mp4\",\n });\n\n // Create download link\n const url = URL.createObjectURL(blob);\n const link = document.createElement(\"a\");\n link.href = url;\n\n // Generate filename if not provided\n const defaultFilename = filename || `video-${Date.now()}.mp4`;\n link.download = defaultFilename;\n\n // Trigger download\n document.body.appendChild(link);\n link.click();\n document.body.removeChild(link);\n\n // Clean up\n URL.revokeObjectURL(url);\n\n setDownloadProgress(100);\n setIsDownloading(false);\n } catch (err) {\n setError(err instanceof Error ? err.message : \"Download failed\");\n setIsDownloading(false);\n setDownloadProgress(0);\n }\n },\n [videoRef]\n );\n\n // Alternative simple download method for direct video URLs\n const downloadDirect = useCallback(\n (filename?: string) => {\n if (!videoRef?.current) {\n setError(\"Video element not found\");\n return;\n }\n\n const video = videoRef.current;\n const videoSrc = video.src || video.currentSrc;\n\n if (!videoSrc) {\n setError(\"No video source found\");\n return;\n }\n\n try {\n setIsDownloading(true);\n setError(null);\n setDownloadProgress(0);\n\n const link = document.createElement(\"a\");\n link.href = videoSrc;\n link.download = filename || `video-${Date.now()}.mp4`;\n link.target = \"_blank\";\n\n document.body.appendChild(link);\n link.click();\n document.body.removeChild(link);\n\n setIsDownloading(false);\n setDownloadProgress(100);\n } catch (err) {\n setError(err instanceof Error ? err.message : \"Download failed\");\n setIsDownloading(false);\n setDownloadProgress(0);\n }\n },\n [videoRef]\n );\n\n // Cleanup on unmount\n useEffect(() => {\n return () => {\n setIsDownloading(false);\n setDownloadProgress(0);\n setError(null);\n };\n }, []);\n\n return {\n downloadVideo,\n downloadDirect,\n isDownloading,\n downloadProgress,\n error,\n resetError: () => setError(null),\n };\n};\n","import React from \"react\";\nimport type { VideoRef } from \"../types\";\n\nexport const useRange = (videoRef: VideoRef, range: [number, number]) => {\n React.useEffect(() => {\n if (!videoRef?.current || !range) return;\n\n const video = videoRef.current;\n\n if (video) {\n const handleTimeUpdate = () => {\n if (video.currentTime >= range[1]) {\n video.currentTime = range[0];\n } else if (video.currentTime <= range[0]) {\n video.currentTime = range[0];\n }\n };\n\n video.addEventListener(\"timeupdate\", handleTimeUpdate);\n\n return () => {\n video.removeEventListener(\"timeupdate\", handleTimeUpdate);\n };\n }\n }, [range, videoRef?.current]);\n};\n"],"mappings":"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","names":["hooks_exports","__export","useAutoplayByForce","useAutoplayOnVisible","useBuffer","useCurrentTime","useDownload","useFullscreen","useGetDuration","useHotKeys","useMuteUnmute","usePictureInPicture","usePlayPause","useRange","useSeek","useSpeed","useStartAt","useVideoState","useVolume","__toCommonJS","import_react","useAutoplayByForce","videoRef","enabled","setError","React","_a","error","retryError","import_react","useAutoplayOnVisible","videoRef","threshold","enabled","React","observer","entries","entry","_a","error","import_react","useFullscreen","videoRef","isFullscreen","setIsFullscreen","React","previousStylesRef","handleFullscreenChange","isCurrentlyFullscreen","video","toggleFullscreen","isSafari","videoContainer","import_react","useGetDuration","videoRef","isLoading","setIsLoading","React","duration","setDuration","getDuration","_a","_b","handleError","video","import_react","useHotKeys","key","func","enabled","handleKeyDown","event","import_react","useMuteUnmute","videoRef","isMuted","setIsMuted","React","toggleMute","mute","unmute","handleVolumeChange","_a","usePictureInPicture","videoRef","video","error","videoContainer","import_react","usePlayPause","videoRef","isPlaying","setIsPlaying","React","togglePlay","play","pause","handlePlay","handlePause","_a","_b","import_react","useSeek","videoRef","value","seekForward","React","seekBackward","import_react","useSpeed","videoRef","speed","setSpeed","React","onChangeSpeed","import_react","useStartAt","videoRef","startAt","React","video","import_react","useCurrentTime","videoRef","interval","isPlaying","setIsPlaying","React","currentTime","setCurrentTime","intervalId","_a","video","handlePlay","handlePause","time","import_react","useVideoState","videoRef","isPlaying","setIsPlaying","isMuted","setIsMuted","isFullscreen","setIsFullscreen","video","handleVolumeChange","_a","handleFullscreenChange","import_react","useVolume","videoRef","initialVolume","volume","setVolume","React","onChangeVolume","import_react","useBuffer","videoRef","duration","isPlaying","setIsPlaying","React","buffered","setBuffered","intervalId","_a","_b","import_react","useDownload","videoRef","isDownloading","setIsDownloading","downloadProgress","setDownloadProgress","error","setError","downloadVideo","filename","_a","video","videoSrc","response","contentLength","total","reader","chunks","receivedLength","done","value","progress","blob","url","link","defaultFilename","err","downloadDirect","import_react","useRange","videoRef","range","React","video","handleTimeUpdate"]}
|
|
1
|
+
{"version":3,"sources":["../../src/hooks/index.ts","../../src/hooks/use-autoplay-by-force.tsx","../../src/hooks/use-autoplay-on-visible.tsx","../../src/hooks/use-fullscreen.tsx","../../src/hooks/use-get-duration.tsx","../../src/hooks/use-hot-keys.tsx","../../src/hooks/use-mute-unmute.tsx","../../src/hooks/use-picture-in-picture.tsx","../../src/hooks/use-play-pause.tsx","../../src/hooks/use-seek.tsx","../../src/hooks/use-speed.tsx","../../src/hooks/use-start-at.tsx","../../src/hooks/use-current-time.tsx","../../src/hooks/use-video-state.tsx","../../src/hooks/use-volume.tsx","../../src/hooks/use-buffer.tsx","../../src/hooks/use-download.tsx","../../src/hooks/use-range.tsx"],"sourcesContent":["export * from \"./use-autoplay-by-force\";\nexport * from \"./use-autoplay-on-visible\";\nexport * from \"./use-fullscreen\";\nexport * from \"./use-get-duration\";\nexport * from \"./use-hot-keys\";\nexport * from \"./use-mute-unmute\";\nexport * from \"./use-picture-in-picture\";\nexport * from \"./use-play-pause\";\nexport * from \"./use-seek\";\nexport * from \"./use-speed\";\nexport * from \"./use-start-at\";\nexport * from \"./use-current-time\";\nexport * from \"./use-video-state\";\nexport * from \"./use-volume\";\nexport * from \"./use-buffer\";\nexport * from \"./use-download\";\nexport * from \"./use-range\";\n","import React from \"react\";\nimport type { VideoRef } from \"../types\";\n\nexport const useAutoplayByForce = (\n videoRef: VideoRef,\n enabled: boolean,\n setError?: (error: string | null) => void\n) => {\n React.useEffect(() => {\n if (!videoRef?.current || !enabled) return;\n\n const playVideo = async () => {\n try {\n await videoRef.current?.play();\n } catch (error) {\n // If autoplay fails, try muting and playing again\n if (error instanceof Error && error.name === \"NotAllowedError\") {\n setError?.(\"NotAllowedError\");\n console.error(\"NotAllowedError\");\n if (videoRef?.current) {\n videoRef.current.muted = true;\n try {\n await videoRef.current.play();\n } catch (retryError) {\n console.error(retryError);\n }\n }\n } else {\n console.error(error);\n }\n }\n };\n\n playVideo();\n }, [enabled, videoRef?.current]);\n};\n","import React from \"react\";\nimport type { VideoRef } from \"../types\";\n\nexport const useAutoplayOnVisible = (\n videoRef: VideoRef,\n threshold: number | undefined,\n enabled = true\n) => {\n React.useEffect(() => {\n if (!videoRef?.current || !enabled) return;\n\n const observer = new IntersectionObserver(\n (entries) => {\n entries.forEach((entry) => {\n if (!videoRef?.current) return;\n\n if (entry.isIntersecting) {\n videoRef.current.play().catch((error) => {\n if (!videoRef.current) return;\n\n videoRef.current.pause();\n videoRef.current.muted = true;\n videoRef.current.play();\n console.error(error);\n });\n } else {\n videoRef.current?.pause();\n }\n });\n },\n { threshold: threshold ?? 0.5 }\n );\n\n observer.observe(videoRef?.current);\n\n return () => {\n observer.disconnect();\n };\n }, [videoRef?.current]);\n};\n","import React from \"react\";\nimport type { VideoRef } from \"../types\";\n\nconst useFullscreen = (videoRef: VideoRef) => {\n const [isFullscreen, setIsFullscreen] = React.useState(false);\n\n React.useEffect(() => {\n const video = videoRef?.current;\n if (!video) return;\n\n const videoContainer = video.closest(\n \"[data-zuude-video-wrapper]\"\n ) as HTMLElement | null;\n\n // Helper to get fullscreen element with vendor prefix support\n const getFullscreenElement = (): Element | null => {\n return (\n document.fullscreenElement ||\n (document as any).webkitFullscreenElement ||\n (document as any).mozFullScreenElement ||\n (document as any).msFullscreenElement ||\n null\n );\n };\n\n const checkFullscreenState = () => {\n // Check if the container element is the fullscreen element\n const fullscreenElement = getFullscreenElement();\n const isCurrentlyFullscreen =\n !!fullscreenElement &&\n (fullscreenElement === videoContainer || fullscreenElement === video);\n\n setIsFullscreen(isCurrentlyFullscreen);\n\n // Apply styles based on fullscreen state\n if (video) {\n console.log({ isCurrentlyFullscreen });\n if (isCurrentlyFullscreen) {\n // Apply fullscreen styles\n video.style.objectFit = \"contain\";\n video.style.borderRadius = \"0\";\n video.style.width = \"100%\";\n video.style.height = \"100%\";\n video.style.maxWidth = \"none\";\n video.style.maxHeight = \"none\";\n video.style.margin = \"0\";\n } else {\n // Restore previous styles when exiting fullscreen\n video.style.objectFit = \"\";\n video.style.borderRadius = \"\";\n video.style.width = \"\";\n video.style.height = \"\";\n video.style.maxWidth = \"\";\n video.style.maxHeight = \"\";\n video.style.margin = \"\";\n }\n }\n };\n\n // Check initial state\n checkFullscreenState();\n\n // Listen for fullscreen changes\n document.addEventListener(\"fullscreenchange\", checkFullscreenState);\n\n // Also listen for vendor-prefixed events for better browser support\n document.addEventListener(\"webkitfullscreenchange\", checkFullscreenState);\n document.addEventListener(\"mozfullscreenchange\", checkFullscreenState);\n document.addEventListener(\"MSFullscreenChange\", checkFullscreenState);\n\n return () => {\n document.removeEventListener(\"fullscreenchange\", checkFullscreenState);\n document.removeEventListener(\n \"webkitfullscreenchange\",\n checkFullscreenState\n );\n document.removeEventListener(\"mozfullscreenchange\", checkFullscreenState);\n document.removeEventListener(\"MSFullscreenChange\", checkFullscreenState);\n };\n }, [videoRef]);\n\n const toggleFullscreen = () => {\n const isSafari = /^((?!chrome|android).)*safari/i.test(navigator.userAgent);\n const video = videoRef?.current;\n\n if (video && isSafari) {\n if ((video as any).webkitEnterFullscreen) {\n (video as any).webkitEnterFullscreen();\n return;\n } else if (video.requestFullscreen) {\n video.requestFullscreen();\n return;\n }\n }\n\n const videoContainer = video?.closest(\n \"[data-zuude-video-wrapper]\"\n ) as HTMLElement;\n\n if (videoContainer) {\n if (!isFullscreen) {\n console.log({ objectFit: video?.style.objectFit });\n console.log({ objectFit: video?.style });\n videoContainer.requestFullscreen();\n } else {\n document.exitFullscreen();\n }\n }\n };\n\n return { isFullscreen: isFullscreen ?? false, toggleFullscreen };\n};\n\nexport { useFullscreen };\n","import React from \"react\";\nimport type { VideoRef } from \"../types\";\n\nexport const useGetDuration = (videoRef: VideoRef) => {\n const [isLoading, setIsLoading] = React.useState(false);\n const [duration, setDuration] = React.useState<number | null>(null);\n\n React.useEffect(() => {\n if (!videoRef?.current) return;\n\n setIsLoading(true);\n\n const getDuration = () => {\n setDuration(videoRef.current?.duration ?? null);\n setIsLoading(false);\n };\n\n const handleError = () => {\n setIsLoading(false);\n };\n\n const video = videoRef.current;\n\n // Check if duration is already available\n if (video.duration && !isNaN(video.duration)) {\n setDuration(video.duration);\n setIsLoading(false);\n } else {\n // Add event listeners\n video.addEventListener(\"loadedmetadata\", getDuration);\n video.addEventListener(\"error\", handleError);\n video.addEventListener(\"loadeddata\", getDuration);\n\n return () => {\n video.removeEventListener(\"loadedmetadata\", getDuration);\n video.removeEventListener(\"error\", handleError);\n video.removeEventListener(\"loadeddata\", getDuration);\n };\n }\n }, [videoRef]);\n\n return { duration, isLoading };\n};\n","import { useEffect } from \"react\";\n\nexport const useHotKeys = (\n key: string,\n func: (event: KeyboardEvent) => void,\n enabled = true\n) => {\n const handleKeyDown = (event: KeyboardEvent) => {\n if (event.key === key) {\n event.preventDefault();\n func(event);\n }\n };\n\n useEffect(() => {\n if (!enabled) return;\n\n document.addEventListener(\"keydown\", handleKeyDown);\n\n return () => {\n document.removeEventListener(\"keydown\", handleKeyDown);\n };\n }, [key, func, enabled]);\n};\n","import React from \"react\";\nimport type { VideoRef } from \"../types\";\n\nexport const useMuteUnmute = (videoRef: VideoRef) => {\n const [isMuted, setIsMuted] = React.useState(false);\n\n const toggleMute = React.useCallback(() => {\n if (videoRef?.current) {\n videoRef.current.muted = !videoRef.current.muted;\n }\n }, [videoRef?.current]);\n\n const mute = React.useCallback(() => {\n if (videoRef?.current) {\n videoRef.current.muted = true;\n }\n }, [videoRef?.current]);\n\n const unmute = React.useCallback(() => {\n if (videoRef?.current) {\n videoRef.current.muted = false;\n }\n }, [videoRef?.current]);\n\n React.useEffect(() => {\n if (!videoRef?.current) return;\n\n // Set the initial state\n setIsMuted(videoRef.current.muted);\n\n const handleVolumeChange = () => {\n if (videoRef.current) {\n setIsMuted(videoRef.current.muted);\n }\n };\n\n videoRef.current.addEventListener(\"volumechange\", handleVolumeChange);\n\n return () => {\n videoRef.current?.removeEventListener(\"volumechange\", handleVolumeChange);\n };\n }, [videoRef?.current]);\n\n return { toggleMute, isMuted, mute, unmute };\n};\n","import type { VideoRef } from \"../types\";\n\nexport const usePictureInPicture = (videoRef: VideoRef) => {\n const togglePictureInPicture = async () => {\n const video = videoRef?.current;\n if (!video) return;\n\n try {\n if (document.pictureInPictureElement) {\n await document.exitPictureInPicture();\n } else {\n await video.requestPictureInPicture();\n }\n } catch (error) {\n // Fallback for browsers that don't support PiP\n const isSafari = /^((?!chrome|android).)*safari/i.test(\n navigator.userAgent\n );\n\n if (isSafari) {\n if ((video as any).webkitEnterFullscreen) {\n (video as any).webkitEnterFullscreen();\n } else if (video.requestFullscreen) {\n video.requestFullscreen();\n }\n } else {\n const videoContainer = video.closest(\n \"[data-zuude-video-wrapper]\"\n ) as HTMLElement;\n if (videoContainer) {\n if (!document.fullscreenElement) {\n await videoContainer.requestFullscreen();\n } else {\n await document.exitFullscreen();\n }\n }\n }\n }\n };\n\n const requestPictureInPicture = async () => {\n const video = videoRef?.current;\n if (!video) return;\n await video.requestPictureInPicture();\n };\n\n const exitPictureInPicture = async () => {\n const video = videoRef?.current;\n if (!video) return;\n await document.exitPictureInPicture();\n };\n\n return {\n togglePictureInPicture,\n requestPictureInPicture,\n exitPictureInPicture,\n };\n};\n","import React from \"react\";\nimport type { VideoRef } from \"../types\";\n\nexport const usePlayPause = (videoRef: VideoRef) => {\n const [isPlaying, setIsPlaying] = React.useState(false);\n\n const togglePlay = React.useCallback(() => {\n if (videoRef?.current) {\n videoRef.current.paused\n ? videoRef.current.play()\n : videoRef.current.pause();\n }\n }, [videoRef?.current]);\n\n const play = React.useCallback(() => {\n if (videoRef?.current) {\n videoRef.current.play();\n }\n }, [videoRef?.current]);\n\n const pause = React.useCallback(() => {\n if (videoRef?.current) {\n videoRef.current.pause();\n }\n }, [videoRef?.current]);\n\n React.useEffect(() => {\n if (!videoRef?.current) return;\n\n const handlePlay = () => {\n setIsPlaying(true);\n };\n const handlePause = () => {\n setIsPlaying(false);\n };\n\n setIsPlaying(!videoRef?.current.paused);\n\n if (videoRef?.current) {\n videoRef.current.addEventListener(\"play\", handlePlay);\n videoRef.current.addEventListener(\"pause\", handlePause);\n\n return () => {\n videoRef.current?.removeEventListener(\"play\", handlePlay);\n videoRef.current?.removeEventListener(\"pause\", handlePause);\n };\n }\n }, [videoRef?.current]);\n\n return { togglePlay, isPlaying, play, pause };\n};\n","import React from \"react\";\nimport type { VideoRef } from \"../types\";\n\nexport const useSeek = (videoRef: VideoRef, value = 10) => {\n const seekForward = React.useCallback(() => {\n if (videoRef?.current) {\n videoRef.current.currentTime += value;\n }\n }, [videoRef?.current]);\n\n const seekBackward = React.useCallback(() => {\n if (videoRef?.current) {\n videoRef.current.currentTime -= value;\n }\n }, [videoRef?.current]);\n\n return { seekForward, seekBackward };\n};\n","import React from \"react\";\nimport type { VideoRef } from \"../types\";\n\nexport const useSpeed = (videoRef: VideoRef) => {\n const [speed, setSpeed] = React.useState(1);\n\n const onChangeSpeed = (speed: number) => {\n setSpeed(speed);\n };\n\n // Get the speed from the video element\n React.useEffect(() => {\n if (!videoRef?.current) return;\n setSpeed(videoRef.current.playbackRate);\n }, [videoRef?.current]);\n\n React.useEffect(() => {\n if (!videoRef?.current) return;\n\n videoRef.current.playbackRate = speed;\n }, [speed, videoRef?.current]);\n\n return { speed, onChangeSpeed };\n};\n","import React from \"react\";\nimport type { VideoRef } from \"../types\";\n\nexport const useStartAt = (videoRef: VideoRef, startAt: number) => {\n React.useEffect(() => {\n if (!videoRef?.current || !startAt) return;\n\n const video = videoRef?.current;\n if (video && startAt) {\n video.currentTime = startAt;\n }\n }, [startAt, videoRef?.current]);\n};\n","import React from \"react\";\nimport type { VideoRef } from \"../types.js\";\n\nexport const useCurrentTime = (videoRef: VideoRef, interval = 10) => {\n const [isPlaying, setIsPlaying] = React.useState(false);\n const [currentTime, setCurrentTime] = React.useState(0);\n\n React.useEffect(() => {\n if (videoRef?.current && isPlaying) {\n const intervalId = setInterval(() => {\n setCurrentTime(videoRef.current?.currentTime || 0);\n }, interval);\n\n return () => clearInterval(intervalId);\n }\n }, [videoRef?.current, isPlaying]);\n\n React.useEffect(() => {\n if (!videoRef?.current) return;\n\n const video = videoRef.current;\n\n // Store handlers in variables for proper cleanup (critical for Safari memory safety)\n const handlePlay = () => setIsPlaying(true);\n const handlePause = () => setIsPlaying(false);\n\n video.addEventListener(\"play\", handlePlay);\n video.addEventListener(\"pause\", handlePause);\n\n return () => {\n video.removeEventListener(\"play\", handlePlay);\n video.removeEventListener(\"pause\", handlePause);\n };\n }, [videoRef?.current]);\n\n const onTimeUpdate = (time: number) => {\n if (videoRef?.current) {\n setCurrentTime(time);\n videoRef.current.currentTime = time;\n }\n };\n\n return {\n currentTime,\n onTimeUpdate,\n };\n};\n","import { RefObject, useEffect, useState } from \"react\";\n\nconst useVideoState = (videoRef: RefObject<HTMLVideoElement | null>) => {\n const [isPlaying, setIsPlaying] = useState(false);\n const [isMuted, setIsMuted] = useState(false);\n const [isFullscreen, setIsFullscreen] = useState(false);\n\n useEffect(() => {\n const video = videoRef.current;\n\n if (video) {\n video.addEventListener(\"play\", () => setIsPlaying(true));\n video.addEventListener(\"pause\", () => setIsPlaying(false));\n\n return () => {\n video.removeEventListener(\"play\", () => setIsPlaying(true));\n video.removeEventListener(\"pause\", () => setIsPlaying(false));\n };\n }\n }, [videoRef]);\n\n useEffect(() => {\n if (!videoRef?.current) return;\n\n // Set the initial state\n setIsMuted(videoRef.current.muted);\n\n const handleVolumeChange = () => {\n if (videoRef.current) {\n setIsMuted(videoRef.current.muted);\n }\n };\n\n videoRef.current.addEventListener(\"volumechange\", handleVolumeChange);\n\n return () => {\n videoRef.current?.removeEventListener(\"volumechange\", handleVolumeChange);\n };\n }, [videoRef]);\n\n useEffect(() => {\n if (!videoRef?.current) return;\n\n const handleFullscreenChange = () => {\n setIsFullscreen(!!document.fullscreenElement);\n };\n\n document.addEventListener(\"fullscreenchange\", handleFullscreenChange);\n return () =>\n document.removeEventListener(\"fullscreenchange\", handleFullscreenChange);\n }, [videoRef]);\n\n return { isPlaying, isMuted, isFullscreen };\n};\n\nexport { useVideoState };\n","import React from \"react\";\nimport type { VideoRef } from \"../types\";\n\nexport const useVolume = (videoRef: VideoRef, initialVolume = 100) => {\n const [volume, setVolume] = React.useState(initialVolume);\n\n const onChangeVolume = (volume: number) => {\n setVolume(volume);\n };\n\n // Get the volume from the video element\n React.useEffect(() => {\n if (!videoRef?.current) return;\n setVolume(videoRef.current.volume * 100);\n }, [videoRef?.current]);\n\n React.useEffect(() => {\n if (!videoRef?.current) return;\n\n videoRef.current.volume = volume / 100;\n }, [volume, videoRef?.current]);\n\n return { volume, onChangeVolume };\n};\n","import React from \"react\";\nimport type { VideoRef } from \"../types.js\";\n\nexport const useBuffer = (videoRef: VideoRef, duration?: number) => {\n const [isPlaying, setIsPlaying] = React.useState(false);\n const [buffered, setBuffered] = React.useState(0);\n\n React.useEffect(() => {\n if (videoRef?.current && isPlaying) {\n const intervalId = setInterval(() => {\n if (videoRef.current?.buffered.length) {\n setBuffered(\n videoRef.current.buffered.end(videoRef.current.buffered.length - 1)\n );\n }\n }, 10);\n\n return () => clearInterval(intervalId);\n }\n }, [videoRef?.current, isPlaying]);\n\n React.useEffect(() => {\n if (!videoRef?.current) return;\n\n videoRef.current.addEventListener(\"play\", () => setIsPlaying(true));\n videoRef.current.addEventListener(\"pause\", () => setIsPlaying(false));\n\n return () => {\n videoRef.current?.removeEventListener(\"play\", () => setIsPlaying(true));\n videoRef.current?.removeEventListener(\"pause\", () => setIsPlaying(false));\n };\n }, []);\n\n return {\n buffered,\n bufferedPercentage: (buffered / (duration || 0)) * 100 || 0,\n };\n};\n","import { useEffect, useState, useCallback } from \"react\";\nimport type { VideoRef } from \"../types\";\n\nexport const useDownload = (videoRef: VideoRef) => {\n const [isDownloading, setIsDownloading] = useState(false);\n const [downloadProgress, setDownloadProgress] = useState(0);\n const [error, setError] = useState<string | null>(null);\n\n const downloadVideo = useCallback(\n async (filename?: string) => {\n if (!videoRef?.current) {\n setError(\"Video element not found\");\n return;\n }\n\n const video = videoRef.current;\n const videoSrc = video.src || video.currentSrc;\n\n if (!videoSrc) {\n setError(\"No video source found\");\n return;\n }\n\n try {\n setIsDownloading(true);\n setError(null);\n setDownloadProgress(0);\n\n // Fetch the video file\n const response = await fetch(videoSrc);\n\n if (!response.ok) {\n throw new Error(`Failed to fetch video: ${response.statusText}`);\n }\n\n // Get the content length for progress tracking\n const contentLength = response.headers.get(\"content-length\");\n const total = contentLength ? parseInt(contentLength, 10) : 0;\n\n // Create a readable stream to track progress\n const reader = response.body?.getReader();\n if (!reader) {\n throw new Error(\"Failed to create download stream\");\n }\n\n const chunks: BlobPart[] = [];\n let receivedLength = 0;\n\n while (true) {\n const { done, value } = await reader.read();\n\n if (done) break;\n\n chunks.push(value);\n receivedLength += value.length;\n\n if (total > 0) {\n const progress = (receivedLength / total) * 100;\n setDownloadProgress(Math.round(progress));\n }\n }\n\n // Combine chunks into a single blob\n const blob = new Blob(chunks, {\n type: response.headers.get(\"content-type\") || \"video/mp4\",\n });\n\n // Create download link\n const url = URL.createObjectURL(blob);\n const link = document.createElement(\"a\");\n link.href = url;\n\n // Generate filename if not provided\n const defaultFilename = filename || `video-${Date.now()}.mp4`;\n link.download = defaultFilename;\n\n // Trigger download\n document.body.appendChild(link);\n link.click();\n document.body.removeChild(link);\n\n // Clean up\n URL.revokeObjectURL(url);\n\n setDownloadProgress(100);\n setIsDownloading(false);\n } catch (err) {\n setError(err instanceof Error ? err.message : \"Download failed\");\n setIsDownloading(false);\n setDownloadProgress(0);\n }\n },\n [videoRef]\n );\n\n // Alternative simple download method for direct video URLs\n const downloadDirect = useCallback(\n (filename?: string) => {\n if (!videoRef?.current) {\n setError(\"Video element not found\");\n return;\n }\n\n const video = videoRef.current;\n const videoSrc = video.src || video.currentSrc;\n\n if (!videoSrc) {\n setError(\"No video source found\");\n return;\n }\n\n try {\n setIsDownloading(true);\n setError(null);\n setDownloadProgress(0);\n\n const link = document.createElement(\"a\");\n link.href = videoSrc;\n link.download = filename || `video-${Date.now()}.mp4`;\n link.target = \"_blank\";\n\n document.body.appendChild(link);\n link.click();\n document.body.removeChild(link);\n\n setIsDownloading(false);\n setDownloadProgress(100);\n } catch (err) {\n setError(err instanceof Error ? err.message : \"Download failed\");\n setIsDownloading(false);\n setDownloadProgress(0);\n }\n },\n [videoRef]\n );\n\n // Cleanup on unmount\n useEffect(() => {\n return () => {\n setIsDownloading(false);\n setDownloadProgress(0);\n setError(null);\n };\n }, []);\n\n return {\n downloadVideo,\n downloadDirect,\n isDownloading,\n downloadProgress,\n error,\n resetError: () => setError(null),\n };\n};\n","import React from \"react\";\nimport type { VideoRef } from \"../types\";\n\nexport const useRange = (videoRef: VideoRef, range: [number, number]) => {\n React.useEffect(() => {\n if (!videoRef?.current || !range) return;\n\n const video = videoRef.current;\n\n if (video) {\n const handleTimeUpdate = () => {\n if (video.currentTime >= range[1]) {\n video.currentTime = range[0];\n } else if (video.currentTime <= range[0]) {\n video.currentTime = range[0];\n }\n };\n\n video.addEventListener(\"timeupdate\", handleTimeUpdate);\n\n return () => {\n video.removeEventListener(\"timeupdate\", handleTimeUpdate);\n };\n }\n }, [range, videoRef?.current]);\n};\n"],"mappings":"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","names":["hooks_exports","__export","useAutoplayByForce","useAutoplayOnVisible","useBuffer","useCurrentTime","useDownload","useFullscreen","useGetDuration","useHotKeys","useMuteUnmute","usePictureInPicture","usePlayPause","useRange","useSeek","useSpeed","useStartAt","useVideoState","useVolume","__toCommonJS","import_react","useAutoplayByForce","videoRef","enabled","setError","React","_a","error","retryError","import_react","useAutoplayOnVisible","videoRef","threshold","enabled","React","observer","entries","entry","_a","error","import_react","useFullscreen","videoRef","isFullscreen","setIsFullscreen","React","video","videoContainer","getFullscreenElement","checkFullscreenState","fullscreenElement","isCurrentlyFullscreen","toggleFullscreen","isSafari","import_react","useGetDuration","videoRef","isLoading","setIsLoading","React","duration","setDuration","getDuration","_a","_b","handleError","video","import_react","useHotKeys","key","func","enabled","handleKeyDown","event","import_react","useMuteUnmute","videoRef","isMuted","setIsMuted","React","toggleMute","mute","unmute","handleVolumeChange","_a","usePictureInPicture","videoRef","video","error","videoContainer","import_react","usePlayPause","videoRef","isPlaying","setIsPlaying","React","togglePlay","play","pause","handlePlay","handlePause","_a","_b","import_react","useSeek","videoRef","value","seekForward","React","seekBackward","import_react","useSpeed","videoRef","speed","setSpeed","React","onChangeSpeed","import_react","useStartAt","videoRef","startAt","React","video","import_react","useCurrentTime","videoRef","interval","isPlaying","setIsPlaying","React","currentTime","setCurrentTime","intervalId","_a","video","handlePlay","handlePause","time","import_react","useVideoState","videoRef","isPlaying","setIsPlaying","isMuted","setIsMuted","isFullscreen","setIsFullscreen","video","handleVolumeChange","_a","handleFullscreenChange","import_react","useVolume","videoRef","initialVolume","volume","setVolume","React","onChangeVolume","import_react","useBuffer","videoRef","duration","isPlaying","setIsPlaying","React","buffered","setBuffered","intervalId","_a","_b","import_react","useDownload","videoRef","isDownloading","setIsDownloading","downloadProgress","setDownloadProgress","error","setError","downloadVideo","filename","_a","video","videoSrc","response","contentLength","total","reader","chunks","receivedLength","done","value","progress","blob","url","link","defaultFilename","err","downloadDirect","import_react","useRange","videoRef","range","React","video","handleTimeUpdate"]}
|
package/dist/hooks/index.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q}from"../chunk-
|
|
1
|
+
import{a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q}from"../chunk-72XT2CEM.js";export{a as useAutoplayByForce,h as useAutoplayOnVisible,o as useBuffer,l as useCurrentTime,p as useDownload,f as useFullscreen,i as useGetDuration,b as useHotKeys,e as useMuteUnmute,g as usePictureInPicture,d as usePlayPause,q as useRange,c as useSeek,j as useSpeed,k as useStartAt,m as useVideoState,n as useVolume};
|
|
2
2
|
//# sourceMappingURL=index.js.map
|
package/dist/index.cjs
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";"use client";var mt=Object.create;var K=Object.defineProperty;var it=Object.getOwnPropertyDescriptor;var pt=Object.getOwnPropertyNames;var dt=Object.getPrototypeOf,yt=Object.prototype.hasOwnProperty;var Et=(t,n)=>{for(var r in n)K(t,r,{get:n[r],enumerable:!0})},Z=(t,n,r,e)=>{if(n&&typeof n=="object"||typeof n=="function")for(let s of pt(n))!yt.call(t,s)&&s!==r&&K(t,s,{get:()=>n[s],enumerable:!(e=it(n,s))||e.enumerable});return t};var P=(t,n,r)=>(r=t!=null?mt(dt(t)):{},Z(n||!t||!t.__esModule?K(r,"default",{value:t,enumerable:!0}):r,t)),ht=t=>Z(K({},"__esModule",{value:!0}),t);var Nt={};Et(Nt,{Controls:()=>wt,Download:()=>jt,ExitFullscreen:()=>At,Fullscreen:()=>Mt,Loading:()=>Dt,Mute:()=>Ct,Pause:()=>Tt,PictureInPicture:()=>Ht,Play:()=>xt,SeekBackward:()=>It,SeekForward:()=>St,Shadow:()=>Ot,Speed:()=>Ft,Unmute:()=>kt,Video:()=>X,VideoProvider:()=>R,useVideo:()=>y});module.exports=ht(Nt);var L=P(require("react"),1),J=require("react/jsx-runtime"),v=(0,L.createContext)(null),R=L.default.memo(({children:t,config:n,onError:r,...e})=>{let[s,o]=(0,L.useState)({current:null}),[u,c]=(0,L.useState)(null),[p,a]=(0,L.useState)(!1),E=(0,L.useRef)(null);return(0,L.useEffect)(()=>{r==null||r(u)},[u]),(0,L.useEffect)(()=>{let m=E.current;if(m){let l=m.querySelectorAll("[data-zuude-hide-elements]"),i=m.querySelector("[data-zuude-video]");if(l){let f=null,H=3e3,w=!1,x=()=>{f&&(clearTimeout(f),f=null),f=setTimeout(()=>{w&&i&&!i.paused&&l.forEach(C=>{C.setAttribute("data-hidden","true")}),f=null},H)},h=()=>{w=!0,l.forEach(C=>{C.removeAttribute("data-hidden")}),x()},M=()=>{w=!1,f&&(clearTimeout(f),f=null),i&&!i.paused&&l.forEach(C=>{C.setAttribute("data-hidden","true")})},k=()=>{w&&(l.forEach(C=>{C.hasAttribute("data-hidden")&&C.removeAttribute("data-hidden")}),x())},T=()=>{w||l.forEach(C=>{C.setAttribute("data-hidden","true")})};return m.addEventListener("mouseenter",h),m.addEventListener("mouseleave",M),m.addEventListener("mousemove",k),i.addEventListener("pause",h),i.addEventListener("play",T),()=>{f&&clearTimeout(f),m.removeEventListener("mouseenter",h),m.removeEventListener("mouseleave",M),m.removeEventListener("mousemove",k),i.removeEventListener("pause",h),i.removeEventListener("play",T)}}}},[]),(0,L.useEffect)(()=>{if(p){let m=l=>{var i;(i=E.current)!=null&&i.contains(l.target)||a(!1)};return document.addEventListener("click",m),()=>{document.removeEventListener("click",m)}}},[p]),(0,J.jsx)(v.Provider,{value:{videoRef:s,setVideoRef:o,config:{clickToPlay:!0,...n},error:u,setError:c,isFocused:p,setIsFocused:a},children:(0,J.jsx)("div",{ref:E,"data-zuude-video-wrapper":!0,onClick:()=>a(!0),...e,children:t})})}),y=()=>{let t=(0,L.useContext)(v);if(!t)throw new Error("useVideo must be used within a VideoProvider");return t};var I=require("react");var tt=P(require("react"),1),et=(t,n,r)=>{tt.default.useEffect(()=>{if(!(t!=null&&t.current)||!n)return;(async()=>{var s;try{await((s=t.current)==null?void 0:s.play())}catch(o){if(o instanceof Error&&o.name==="NotAllowedError"){if(r==null||r("NotAllowedError"),console.error("NotAllowedError"),t!=null&&t.current){t.current.muted=!0;try{await t.current.play()}catch(u){console.error(u)}}}else console.error(o)}})()},[n,t==null?void 0:t.current])};var rt=require("react"),j=(t,n,r=!0)=>{let e=s=>{s.key===t&&(s.preventDefault(),n(s))};(0,rt.useEffect)(()=>{if(r)return document.addEventListener("keydown",e),()=>{document.removeEventListener("keydown",e)}},[t,n,r])};var Q=P(require("react"),1),q=(t,n=10)=>{let r=Q.default.useCallback(()=>{t!=null&&t.current&&(t.current.currentTime+=n)},[t==null?void 0:t.current]),e=Q.default.useCallback(()=>{t!=null&&t.current&&(t.current.currentTime-=n)},[t==null?void 0:t.current]);return{seekForward:r,seekBackward:e}};var O=P(require("react"),1),U=t=>{let[n,r]=O.default.useState(!1),e=O.default.useCallback(()=>{t!=null&&t.current&&(t.current.paused?t.current.play():t.current.pause())},[t==null?void 0:t.current]),s=O.default.useCallback(()=>{t!=null&&t.current&&t.current.play()},[t==null?void 0:t.current]),o=O.default.useCallback(()=>{t!=null&&t.current&&t.current.pause()},[t==null?void 0:t.current]);return O.default.useEffect(()=>{if(!(t!=null&&t.current))return;let u=()=>{r(!0)},c=()=>{r(!1)};if(r(!(t!=null&&t.current.paused)),t!=null&&t.current)return t.current.addEventListener("play",u),t.current.addEventListener("pause",c),()=>{var p,a;(p=t.current)==null||p.removeEventListener("play",u),(a=t.current)==null||a.removeEventListener("pause",c)}},[t==null?void 0:t.current]),{togglePlay:e,isPlaying:n,play:s,pause:o}};var N=P(require("react"),1),B=t=>{let[n,r]=N.default.useState(!1),e=N.default.useCallback(()=>{t!=null&&t.current&&(t.current.muted=!t.current.muted)},[t==null?void 0:t.current]),s=N.default.useCallback(()=>{t!=null&&t.current&&(t.current.muted=!0)},[t==null?void 0:t.current]),o=N.default.useCallback(()=>{t!=null&&t.current&&(t.current.muted=!1)},[t==null?void 0:t.current]);return N.default.useEffect(()=>{if(!(t!=null&&t.current))return;r(t.current.muted);let u=()=>{t.current&&r(t.current.muted)};return t.current.addEventListener("volumechange",u),()=>{var c;(c=t.current)==null||c.removeEventListener("volumechange",u)}},[t==null?void 0:t.current]),{toggleMute:e,isMuted:n,mute:s,unmute:o}};var $=P(require("react"),1),W=t=>{let[n,r]=$.default.useState(!1),e=$.default.useRef(null);$.default.useEffect(()=>{let o=()=>{let u=!!document.fullscreenElement;r(u);let c=t==null?void 0:t.current;c&&(u?(e.current={objectFit:c.style.objectFit||"cover",borderRadius:c.style.borderRadius||"",width:c.style.width||"",height:c.style.height||"",maxWidth:c.style.maxWidth||"",maxHeight:c.style.maxHeight||"",margin:c.style.margin||""},c.style.objectFit="contain",c.style.borderRadius="0",c.style.width="100%",c.style.height="100%",c.style.maxWidth="none",c.style.maxHeight="none",c.style.margin="0"):e.current&&(c.style.objectFit=e.current.objectFit,c.style.borderRadius=e.current.borderRadius,c.style.width=e.current.width,c.style.height=e.current.height,c.style.maxWidth=e.current.maxWidth,c.style.maxHeight=e.current.maxHeight,c.style.margin=e.current.margin,e.current=null))};return document.addEventListener("fullscreenchange",o),()=>document.removeEventListener("fullscreenchange",o)},[t]);let s=()=>{let o=/^((?!chrome|android).)*safari/i.test(navigator.userAgent),u=t==null?void 0:t.current;if(u&&o){if(u.webkitEnterFullscreen){u.webkitEnterFullscreen();return}else if(u.requestFullscreen){u.requestFullscreen();return}}let c=u==null?void 0:u.closest("[data-zuude-video-wrapper]");c&&(n?document.exitFullscreen():c.requestFullscreen())};return{isFullscreen:n!=null?n:!1,toggleFullscreen:s}};var G=t=>({togglePictureInPicture:async()=>{let s=t==null?void 0:t.current;if(s)try{document.pictureInPictureElement?await document.exitPictureInPicture():await s.requestPictureInPicture()}catch(o){if(/^((?!chrome|android).)*safari/i.test(navigator.userAgent))s.webkitEnterFullscreen?s.webkitEnterFullscreen():s.requestFullscreen&&s.requestFullscreen();else{let c=s.closest("[data-zuude-video-wrapper]");c&&(document.fullscreenElement?await document.exitFullscreen():await c.requestFullscreen())}}},requestPictureInPicture:async()=>{let s=t==null?void 0:t.current;s&&await s.requestPictureInPicture()},exitPictureInPicture:async()=>{t!=null&&t.current&&await document.exitPictureInPicture()}});var nt=()=>{let{videoRef:t}=y(),{seekForward:n,seekBackward:r}=q(t),{togglePlay:e}=U(t),{toggleMute:s}=B(t),{toggleFullscreen:o}=W(t),{togglePictureInPicture:u}=G(t);return j("ArrowRight",()=>{n()}),j("ArrowLeft",()=>{r()}),j(" ",()=>{e()}),j("m",()=>{s()}),j("f",()=>{o()}),j("p",()=>{u()}),null};var st=P(require("react"),1),ut=(t,n,r=!0)=>{st.default.useEffect(()=>{if(!(t!=null&&t.current)||!r)return;let e=new IntersectionObserver(s=>{s.forEach(o=>{var u;t!=null&&t.current&&(o.isIntersecting?t.current.play().catch(c=>{t.current&&(t.current.pause(),t.current.muted=!0,t.current.play(),console.error(c))}):(u=t.current)==null||u.pause())})},{threshold:n!=null?n:.5});return e.observe(t==null?void 0:t.current),()=>{e.disconnect()}},[t==null?void 0:t.current])};var gt=P(require("react"),1);var _=P(require("react"),1),ct=t=>{let[n,r]=_.default.useState(1),e=s=>{r(s)};return _.default.useEffect(()=>{t!=null&&t.current&&r(t.current.playbackRate)},[t==null?void 0:t.current]),_.default.useEffect(()=>{t!=null&&t.current&&(t.current.playbackRate=n)},[n,t==null?void 0:t.current]),{speed:n,onChangeSpeed:e}};var bt=P(require("react"),1);var Pt=P(require("react"),1);var ot=require("react");var Lt=P(require("react"),1);var Vt=P(require("react"),1);var A=require("react"),at=t=>{let[n,r]=(0,A.useState)(!1),[e,s]=(0,A.useState)(0),[o,u]=(0,A.useState)(null),c=(0,A.useCallback)(async a=>{var l;if(!(t!=null&&t.current)){u("Video element not found");return}let E=t.current,m=E.src||E.currentSrc;if(!m){u("No video source found");return}try{r(!0),u(null),s(0);let i=await fetch(m);if(!i.ok)throw new Error(`Failed to fetch video: ${i.statusText}`);let f=i.headers.get("content-length"),H=f?parseInt(f,10):0,w=(l=i.body)==null?void 0:l.getReader();if(!w)throw new Error("Failed to create download stream");let x=[],h=0;for(;;){let{done:g,value:d}=await w.read();if(g)break;if(x.push(d),h+=d.length,H>0){let F=h/H*100;s(Math.round(F))}}let M=new Blob(x,{type:i.headers.get("content-type")||"video/mp4"}),k=URL.createObjectURL(M),T=document.createElement("a");T.href=k;let C=a||`video-${Date.now()}.mp4`;T.download=C,document.body.appendChild(T),T.click(),document.body.removeChild(T),URL.revokeObjectURL(k),s(100),r(!1)}catch(i){u(i instanceof Error?i.message:"Download failed"),r(!1),s(0)}},[t]),p=(0,A.useCallback)(a=>{if(!(t!=null&&t.current)){u("Video element not found");return}let E=t.current,m=E.src||E.currentSrc;if(!m){u("No video source found");return}try{r(!0),u(null),s(0);let l=document.createElement("a");l.href=m,l.download=a||`video-${Date.now()}.mp4`,l.target="_blank",document.body.appendChild(l),l.click(),document.body.removeChild(l),r(!1),s(100)}catch(l){u(l instanceof Error?l.message:"Download failed"),r(!1),s(0)}},[t]);return(0,A.useEffect)(()=>()=>{r(!1),s(0),u(null)},[]),{downloadVideo:c,downloadDirect:p,isDownloading:n,downloadProgress:e,error:o,resetError:()=>u(null)}};var ft=P(require("react"),1);var D=require("react/jsx-runtime"),X=(0,I.forwardRef)(({src:t,autoPlay:n,muteFallback:r,controls:e,preload:s="metadata",autoPlayOnVisible:o,ranges:u,...c},p)=>{let{videoRef:a,setVideoRef:E,config:m,setError:l,error:i,isFocused:f}=y(),H=(0,I.useRef)(null),w=(0,I.useRef)(!1),x=(0,I.useRef)(null),h=(0,I.useRef)(null),M=u&&u.length>=2&&typeof u[0]=="number"&&typeof u[1]=="number"&&u[0]>=0&&u[1]>u[0]&&isFinite(u[0])&&isFinite(u[1]),k=M?u[0]:void 0,T=M?u[1]:void 0;(0,I.useEffect)(()=>{let g=H.current,d=p;return d?E(d):g&&E({current:g}),()=>{w.current=!1,x.current!==null&&(cancelAnimationFrame(x.current),x.current=null),h.current!==null&&(clearTimeout(h.current),h.current=null)}},[t,p,E]),(0,I.useEffect)(()=>()=>{x.current!==null&&(cancelAnimationFrame(x.current),x.current=null),h.current!==null&&(clearTimeout(h.current),h.current=null)},[]),et(a,n==="force"&&c.muted===void 0,l),ut(a,typeof o=="number"?o:o?void 0:.5,!!o);let C=(0,I.useCallback)(()=>{var g,d,F;(g=a==null?void 0:a.current)!=null&&g.paused?(d=a.current)==null||d.play():(F=a==null?void 0:a.current)==null||F.pause()},[a]);return(0,D.jsxs)(D.Fragment,{children:[(0,D.jsx)("video",{ref:p||H,"data-zuude-video":!0,src:t,onClick:m!=null&&m.clickToPlay?C:void 0,autoPlay:n==="force"?!0:n,preload:s,playsInline:!0,onLoadedMetadata:g=>{var F;let d=g.currentTarget;M&&k!==void 0&&T!==void 0&&(d.currentTime=k),(F=c.onLoadedMetadata)==null||F.call(c,g)},onCanPlay:g=>{var F;let d=g.currentTarget;if(M&&k!==void 0&&T!==void 0){let z=d.currentTime;(z<k||z>T)&&(d.currentTime=k)}(F=c.onCanPlay)==null||F.call(c,g)},onSeeked:g=>{var d;w.current=!1,(d=c.onSeeked)==null||d.call(c,g)},onTimeUpdate:g=>{var F;let d=g.currentTarget;if(M&&k!==void 0&&T!==void 0&&!w.current){let z=d.currentTime;!d.paused&&z>=T&&(w.current=!0,d.currentTime=k,h.current!==null&&clearTimeout(h.current),x.current=requestAnimationFrame(()=>{h.current=setTimeout(()=>{w.current&&(w.current=!1),h.current=null},100),x.current=null}))}(F=c.onTimeUpdate)==null||F.call(c,g)},...c}),e&&f&&(0,D.jsx)(nt,{}),i==="NotAllowedError"&&typeof r=="function"&&r(()=>{a!=null&&a.current&&(a.current.muted=!a.current.muted),l(null)})]})});X.displayName="Video";var b=P(require("react"),1),S=require("@radix-ui/react-slot");var Y=P(require("react"),1),lt=t=>{let[n,r]=Y.default.useState(!1);return Y.default.useEffect(()=>{if(!(t!=null&&t.current))return;let e=t.current,s=()=>{r(!0)},o=()=>{},u=()=>{},c=()=>{r(!1)},p=()=>{r(!1)},a=()=>{r(!0)},E=()=>{r(!1)},m=()=>{r(!1)},l=()=>{r(!1)},i=()=>{};return e.addEventListener("loadstart",s),e.addEventListener("loadedmetadata",o),e.addEventListener("loadeddata",u),e.addEventListener("canplay",c),e.addEventListener("canplaythrough",p),e.addEventListener("waiting",a),e.addEventListener("playing",E),e.addEventListener("error",m),e.addEventListener("abort",l),e.addEventListener("suspend",i),e.readyState>=2&&r(!1),()=>{e.removeEventListener("loadstart",s),e.removeEventListener("loadedmetadata",o),e.removeEventListener("loadeddata",u),e.removeEventListener("canplay",c),e.removeEventListener("canplaythrough",p),e.removeEventListener("waiting",a),e.removeEventListener("playing",E),e.removeEventListener("error",m),e.removeEventListener("abort",l),e.removeEventListener("suspend",i)}},[t]),{isLoading:n}};var V=require("react/jsx-runtime"),wt=b.default.memo(({children:t,asChild:n,...r})=>(0,V.jsx)("div",{"data-zuude-hide-elements":!0,...r,children:t})),xt=b.default.memo(({children:t,asChild:n,...r})=>{let e=n?S.Slot:"button",{videoRef:s}=y(),{play:o}=U(s);return(0,V.jsx)(e,{...r,onClick:o,children:t})}),Tt=b.default.memo(({children:t,asChild:n,...r})=>{let e=n?S.Slot:"button",{videoRef:s}=y(),{pause:o}=U(s);return(0,V.jsx)(e,{...r,onClick:o,children:t})}),Ct=b.default.memo(({children:t,asChild:n,...r})=>{let e=n?S.Slot:"button",{videoRef:s}=y(),{mute:o}=B(s);return(0,V.jsx)(e,{...r,onClick:o,children:t})}),kt=b.default.memo(({children:t,asChild:n,...r})=>{let e=n?S.Slot:"button",{videoRef:s}=y(),{unmute:o}=B(s);return(0,V.jsx)(e,{...r,onClick:o,children:t})}),Ft=b.default.memo(({children:t,asChild:n,value:r,onClick:e,...s})=>{let o=n?S.Slot:"button",{videoRef:u}=y(),{speed:c,onChangeSpeed:p}=ct(u);return(0,V.jsx)(o,{...s,value:r,onClick:()=>{p(r),e==null||e()},children:t})}),St=b.default.memo(({children:t,asChild:n,...r})=>{let e=n?S.Slot:"button",{videoRef:s}=y(),{seekForward:o}=q(s,10);return(0,V.jsx)(e,{...r,onClick:o,children:t})}),It=b.default.memo(({children:t,asChild:n,...r})=>{let e=n?S.Slot:"button",{videoRef:s}=y(),{seekBackward:o}=q(s,10);return(0,V.jsx)(e,{...r,onClick:o,children:t})}),Mt=b.default.memo(({children:t,asChild:n,...r})=>{let e=n?S.Slot:"button",{videoRef:s}=y(),{toggleFullscreen:o}=W(s);return(0,V.jsx)(e,{...r,onClick:o,children:t})}),At=b.default.memo(({children:t,asChild:n,...r})=>{let e=n?S.Slot:"button",{videoRef:s}=y(),{toggleFullscreen:o}=W(s);return(0,V.jsx)(e,{...r,onClick:o,children:t})}),Ht=b.default.memo(({children:t,asChild:n,...r})=>{let e=n?S.Slot:"button",{videoRef:s}=y(),{togglePictureInPicture:o}=G(s);return(0,V.jsx)(e,{...r,onClick:o,children:t})}),jt=b.default.memo(({children:t,asChild:n,...r})=>{let e=n?S.Slot:"button",{videoRef:s}=y(),{downloadDirect:o}=at(s);return(0,V.jsx)(e,{...r,onClick:()=>o(),children:t})}),Dt=b.default.memo(({children:t,asChild:n,...r})=>{let e=n?S.Slot:"div",{videoRef:s}=y(),{isLoading:o}=lt(s);return(0,V.jsx)(e,{...r,style:{...r.style,pointerEvents:"none"},"data-loading":o,children:t})}),Ot=({...t})=>{let{videoRef:n}=y(),r=(0,b.useRef)(null);return b.default.useEffect(()=>{let e=n==null?void 0:n.current;if(r.current&&e){let s=0,o=!1,u=null,c=()=>{u&&clearInterval(u),u=setInterval(()=>{s=e.currentTime,r.current&&(r.current.currentTime=s)},100)},p=()=>{u&&(clearInterval(u),u=null)},a=()=>{o=!0,c()},E=()=>{o=!1,p()};return e.addEventListener("play",a),e.addEventListener("pause",E),()=>{p(),e.removeEventListener("play",a),e.removeEventListener("pause",E)}}},[n==null?void 0:n.current]),n!=null&&n.current?(0,V.jsx)("div",{...t,style:{...t.style,position:"absolute",top:0,left:0,width:"100%",height:"100%",pointerEvents:"none"},children:(0,V.jsx)("video",{ref:r,src:n.current.src,muted:!0,playsInline:!0,style:{width:"100%",height:"100%",objectFit:"cover"}})}):null};0&&(module.exports={Controls,Download,ExitFullscreen,Fullscreen,Loading,Mute,Pause,PictureInPicture,Play,SeekBackward,SeekForward,Shadow,Speed,Unmute,Video,VideoProvider,useVideo});
|
|
1
|
+
"use strict";"use client";var pt=Object.create;var W=Object.defineProperty;var dt=Object.getOwnPropertyDescriptor;var Et=Object.getOwnPropertyNames;var yt=Object.getPrototypeOf,ht=Object.prototype.hasOwnProperty;var gt=(t,n)=>{for(var r in n)W(t,r,{get:n[r],enumerable:!0})},R=(t,n,r,s)=>{if(n&&typeof n=="object"||typeof n=="function")for(let e of Et(n))!ht.call(t,e)&&e!==r&&W(t,e,{get:()=>n[e],enumerable:!(s=dt(n,e))||s.enumerable});return t};var V=(t,n,r)=>(r=t!=null?pt(yt(t)):{},R(n||!t||!t.__esModule?W(r,"default",{value:t,enumerable:!0}):r,t)),Lt=t=>R(W({},"__esModule",{value:!0}),t);var Ut={};gt(Ut,{Controls:()=>xt,Download:()=>Ot,ExitFullscreen:()=>jt,Fullscreen:()=>Ht,Loading:()=>Nt,Mute:()=>Ft,Pause:()=>kt,PictureInPicture:()=>Dt,Play:()=>Ct,SeekBackward:()=>At,SeekForward:()=>Mt,Shadow:()=>qt,Speed:()=>It,Unmute:()=>St,Video:()=>Z,VideoProvider:()=>et,useVideo:()=>h});module.exports=Lt(Ut);var f=V(require("react"),1),Q=require("react/jsx-runtime"),tt=(0,f.createContext)(null),et=f.default.memo(({children:t,config:n,onError:r,...s})=>{let[e,u]=(0,f.useState)({current:null}),[c,a]=(0,f.useState)(null),[o,d]=(0,f.useState)(!1),l=(0,f.useRef)(null);return(0,f.useEffect)(()=>{r==null||r(c)},[c]),(0,f.useEffect)(()=>{let p=l.current;if(p){let m=p.querySelectorAll("[data-zuude-hide-elements]"),i=p.querySelector("[data-zuude-video]");if(m){let T=null,D=3e3,C=!1,S=()=>{T&&(clearTimeout(T),T=null),T=setTimeout(()=>{C&&i&&!i.paused&&m.forEach(g=>{g.setAttribute("data-hidden","true")}),T=null},D)},b=()=>{C=!0,m.forEach(g=>{g.removeAttribute("data-hidden")}),S()},x=()=>{C=!1,T&&(clearTimeout(T),T=null),i&&!i.paused&&m.forEach(g=>{g.setAttribute("data-hidden","true")})},I=()=>{C&&(m.forEach(g=>{g.hasAttribute("data-hidden")&&g.removeAttribute("data-hidden")}),S())},P=()=>{C||m.forEach(g=>{g.setAttribute("data-hidden","true")})};return p.addEventListener("mouseenter",b),p.addEventListener("mouseleave",x),p.addEventListener("mousemove",I),i.addEventListener("pause",b),i.addEventListener("play",P),()=>{T&&clearTimeout(T),p.removeEventListener("mouseenter",b),p.removeEventListener("mouseleave",x),p.removeEventListener("mousemove",I),i.removeEventListener("pause",b),i.removeEventListener("play",P)}}}},[]),(0,f.useEffect)(()=>{if(o){let p=m=>{var i;(i=l.current)!=null&&i.contains(m.target)||d(!1)};return document.addEventListener("click",p),()=>{document.removeEventListener("click",p)}}},[o]),(0,Q.jsx)(tt.Provider,{value:{videoRef:e,setVideoRef:u,config:{clickToPlay:!0,...n},error:c,setError:a,isFocused:o,setIsFocused:d},children:(0,Q.jsx)("div",{ref:l,"data-zuude-video-wrapper":!0,onClick:()=>d(!0),...s,children:t})})}),h=()=>{let t=(0,f.useContext)(tt);if(!t)throw new Error("useVideo must be used within a VideoProvider");return t};var k=require("react");var rt=V(require("react"),1),nt=(t,n,r)=>{rt.default.useEffect(()=>{if(!(t!=null&&t.current)||!n)return;(async()=>{var e;try{await((e=t.current)==null?void 0:e.play())}catch(u){if(u instanceof Error&&u.name==="NotAllowedError"){if(r==null||r("NotAllowedError"),console.error("NotAllowedError"),t!=null&&t.current){t.current.muted=!0;try{await t.current.play()}catch(c){console.error(c)}}}else console.error(u)}})()},[n,t==null?void 0:t.current])};var st=require("react"),H=(t,n,r=!0)=>{let s=e=>{e.key===t&&(e.preventDefault(),n(e))};(0,st.useEffect)(()=>{if(r)return document.addEventListener("keydown",s),()=>{document.removeEventListener("keydown",s)}},[t,n,r])};var X=V(require("react"),1),U=(t,n=10)=>{let r=X.default.useCallback(()=>{t!=null&&t.current&&(t.current.currentTime+=n)},[t==null?void 0:t.current]),s=X.default.useCallback(()=>{t!=null&&t.current&&(t.current.currentTime-=n)},[t==null?void 0:t.current]);return{seekForward:r,seekBackward:s}};var O=V(require("react"),1),z=t=>{let[n,r]=O.default.useState(!1),s=O.default.useCallback(()=>{t!=null&&t.current&&(t.current.paused?t.current.play():t.current.pause())},[t==null?void 0:t.current]),e=O.default.useCallback(()=>{t!=null&&t.current&&t.current.play()},[t==null?void 0:t.current]),u=O.default.useCallback(()=>{t!=null&&t.current&&t.current.pause()},[t==null?void 0:t.current]);return O.default.useEffect(()=>{if(!(t!=null&&t.current))return;let c=()=>{r(!0)},a=()=>{r(!1)};if(r(!(t!=null&&t.current.paused)),t!=null&&t.current)return t.current.addEventListener("play",c),t.current.addEventListener("pause",a),()=>{var o,d;(o=t.current)==null||o.removeEventListener("play",c),(d=t.current)==null||d.removeEventListener("pause",a)}},[t==null?void 0:t.current]),{togglePlay:s,isPlaying:n,play:e,pause:u}};var N=V(require("react"),1),B=t=>{let[n,r]=N.default.useState(!1),s=N.default.useCallback(()=>{t!=null&&t.current&&(t.current.muted=!t.current.muted)},[t==null?void 0:t.current]),e=N.default.useCallback(()=>{t!=null&&t.current&&(t.current.muted=!0)},[t==null?void 0:t.current]),u=N.default.useCallback(()=>{t!=null&&t.current&&(t.current.muted=!1)},[t==null?void 0:t.current]);return N.default.useEffect(()=>{if(!(t!=null&&t.current))return;r(t.current.muted);let c=()=>{t.current&&r(t.current.muted)};return t.current.addEventListener("volumechange",c),()=>{var a;(a=t.current)==null||a.removeEventListener("volumechange",c)}},[t==null?void 0:t.current]),{toggleMute:s,isMuted:n,mute:e,unmute:u}};var Y=V(require("react"),1),K=t=>{let[n,r]=Y.default.useState(!1);Y.default.useEffect(()=>{let e=t==null?void 0:t.current;if(!e)return;let u=e.closest("[data-zuude-video-wrapper]"),c=()=>document.fullscreenElement||document.webkitFullscreenElement||document.mozFullScreenElement||document.msFullscreenElement||null,a=()=>{let o=c(),d=!!o&&(o===u||o===e);r(d),e&&(console.log({isCurrentlyFullscreen:d}),d?(e.style.objectFit="contain",e.style.borderRadius="0",e.style.width="100%",e.style.height="100%",e.style.maxWidth="none",e.style.maxHeight="none",e.style.margin="0"):(e.style.objectFit="",e.style.borderRadius="",e.style.width="",e.style.height="",e.style.maxWidth="",e.style.maxHeight="",e.style.margin=""))};return a(),document.addEventListener("fullscreenchange",a),document.addEventListener("webkitfullscreenchange",a),document.addEventListener("mozfullscreenchange",a),document.addEventListener("MSFullscreenChange",a),()=>{document.removeEventListener("fullscreenchange",a),document.removeEventListener("webkitfullscreenchange",a),document.removeEventListener("mozfullscreenchange",a),document.removeEventListener("MSFullscreenChange",a)}},[t]);let s=()=>{let e=/^((?!chrome|android).)*safari/i.test(navigator.userAgent),u=t==null?void 0:t.current;if(u&&e){if(u.webkitEnterFullscreen){u.webkitEnterFullscreen();return}else if(u.requestFullscreen){u.requestFullscreen();return}}let c=u==null?void 0:u.closest("[data-zuude-video-wrapper]");c&&(n?document.exitFullscreen():(console.log({objectFit:u==null?void 0:u.style.objectFit}),console.log({objectFit:u==null?void 0:u.style}),c.requestFullscreen()))};return{isFullscreen:n!=null?n:!1,toggleFullscreen:s}};var $=t=>({togglePictureInPicture:async()=>{let e=t==null?void 0:t.current;if(e)try{document.pictureInPictureElement?await document.exitPictureInPicture():await e.requestPictureInPicture()}catch(u){if(/^((?!chrome|android).)*safari/i.test(navigator.userAgent))e.webkitEnterFullscreen?e.webkitEnterFullscreen():e.requestFullscreen&&e.requestFullscreen();else{let a=e.closest("[data-zuude-video-wrapper]");a&&(document.fullscreenElement?await document.exitFullscreen():await a.requestFullscreen())}}},requestPictureInPicture:async()=>{let e=t==null?void 0:t.current;e&&await e.requestPictureInPicture()},exitPictureInPicture:async()=>{t!=null&&t.current&&await document.exitPictureInPicture()}});var ut=()=>{let{videoRef:t}=h(),{seekForward:n,seekBackward:r}=U(t),{togglePlay:s}=z(t),{toggleMute:e}=B(t),{toggleFullscreen:u}=K(t),{togglePictureInPicture:c}=$(t);return H("ArrowRight",()=>{n()}),H("ArrowLeft",()=>{r()}),H(" ",()=>{s()}),H("m",()=>{e()}),H("f",()=>{u()}),H("p",()=>{c()}),null};var ct=V(require("react"),1),ot=(t,n,r=!0)=>{ct.default.useEffect(()=>{if(!(t!=null&&t.current)||!r)return;let s=new IntersectionObserver(e=>{e.forEach(u=>{var c;t!=null&&t.current&&(u.isIntersecting?t.current.play().catch(a=>{t.current&&(t.current.pause(),t.current.muted=!0,t.current.play(),console.error(a))}):(c=t.current)==null||c.pause())})},{threshold:n!=null?n:.5});return s.observe(t==null?void 0:t.current),()=>{s.disconnect()}},[t==null?void 0:t.current])};var bt=V(require("react"),1);var G=V(require("react"),1),at=t=>{let[n,r]=G.default.useState(1),s=e=>{r(e)};return G.default.useEffect(()=>{t!=null&&t.current&&r(t.current.playbackRate)},[t==null?void 0:t.current]),G.default.useEffect(()=>{t!=null&&t.current&&(t.current.playbackRate=n)},[n,t==null?void 0:t.current]),{speed:n,onChangeSpeed:s}};var Pt=V(require("react"),1);var Vt=V(require("react"),1);var lt=require("react");var ft=V(require("react"),1);var wt=V(require("react"),1);var A=require("react"),mt=t=>{let[n,r]=(0,A.useState)(!1),[s,e]=(0,A.useState)(0),[u,c]=(0,A.useState)(null),a=(0,A.useCallback)(async d=>{var m;if(!(t!=null&&t.current)){c("Video element not found");return}let l=t.current,p=l.src||l.currentSrc;if(!p){c("No video source found");return}try{r(!0),c(null),e(0);let i=await fetch(p);if(!i.ok)throw new Error(`Failed to fetch video: ${i.statusText}`);let T=i.headers.get("content-length"),D=T?parseInt(T,10):0,C=(m=i.body)==null?void 0:m.getReader();if(!C)throw new Error("Failed to create download stream");let S=[],b=0;for(;;){let{done:_,value:q}=await C.read();if(_)break;if(S.push(q),b+=q.length,D>0){let y=b/D*100;e(Math.round(y))}}let x=new Blob(S,{type:i.headers.get("content-type")||"video/mp4"}),I=URL.createObjectURL(x),P=document.createElement("a");P.href=I;let g=d||`video-${Date.now()}.mp4`;P.download=g,document.body.appendChild(P),P.click(),document.body.removeChild(P),URL.revokeObjectURL(I),e(100),r(!1)}catch(i){c(i instanceof Error?i.message:"Download failed"),r(!1),e(0)}},[t]),o=(0,A.useCallback)(d=>{if(!(t!=null&&t.current)){c("Video element not found");return}let l=t.current,p=l.src||l.currentSrc;if(!p){c("No video source found");return}try{r(!0),c(null),e(0);let m=document.createElement("a");m.href=p,m.download=d||`video-${Date.now()}.mp4`,m.target="_blank",document.body.appendChild(m),m.click(),document.body.removeChild(m),r(!1),e(100)}catch(m){c(m instanceof Error?m.message:"Download failed"),r(!1),e(0)}},[t]);return(0,A.useEffect)(()=>()=>{r(!1),e(0),c(null)},[]),{downloadVideo:a,downloadDirect:o,isDownloading:n,downloadProgress:s,error:u,resetError:()=>c(null)}};var Tt=V(require("react"),1);var j=require("react/jsx-runtime"),Z=(0,k.forwardRef)(({src:t,autoPlay:n,muteFallback:r,controls:s,preload:e="metadata",autoPlayOnVisible:u,ranges:c,getDuration:a,...o},d)=>{var q;let{videoRef:l,setVideoRef:p,config:m,setError:i,error:T,isFocused:D}=h(),C=(0,k.useRef)(null),S=(0,k.useRef)(!1),b=(0,k.useRef)(null),x=(0,k.useRef)(null),I=c&&c.length>=2&&typeof c[0]=="number"&&typeof c[1]=="number"&&c[0]>=0&&c[1]>c[0]&&isFinite(c[0])&&isFinite(c[1]),P=I?c[0]:void 0,g=I?c[1]:void 0;(0,k.useEffect)(()=>{let y=C.current,E=d;return E?p(E):y&&p({current:y}),()=>{S.current=!1,b.current!==null&&(cancelAnimationFrame(b.current),b.current=null),x.current!==null&&(clearTimeout(x.current),x.current=null)}},[t,d,p]),(0,k.useEffect)(()=>()=>{b.current!==null&&(cancelAnimationFrame(b.current),b.current=null),x.current!==null&&(clearTimeout(x.current),x.current=null)},[]),(0,k.useEffect)(()=>{var y,E;a&&a((E=(y=C.current)==null?void 0:y.duration)!=null?E:0)},[a,(q=C.current)==null?void 0:q.duration]),nt(l,n==="force"&&o.muted===void 0,i),ot(l,typeof u=="number"?u:u?void 0:.5,!!u);let _=(0,k.useCallback)(()=>{var y,E,M;(y=l==null?void 0:l.current)!=null&&y.paused?(E=l.current)==null||E.play():(M=l==null?void 0:l.current)==null||M.pause()},[l]);return(0,j.jsxs)(j.Fragment,{children:[(0,j.jsx)("video",{ref:d||C,"data-zuude-video":!0,src:t,onClick:m!=null&&m.clickToPlay?_:void 0,autoPlay:n==="force"?!0:n,preload:e,playsInline:!0,onLoadedMetadata:y=>{var M;let E=y.currentTarget;I&&P!==void 0&&g!==void 0&&E.currentTime<.1&&(E.currentTime=P),(M=o.onLoadedMetadata)==null||M.call(o,y)},onCanPlay:y=>{var M;let E=y.currentTarget;if(I&&P!==void 0&&g!==void 0&&!E.seeking){let J=E.currentTime;J<.1&&J<P&&(E.currentTime=P)}(M=o.onCanPlay)==null||M.call(o,y)},onSeeked:y=>{var E;S.current=!1,(E=o.onSeeked)==null||E.call(o,y)},onTimeUpdate:y=>{var M;let E=y.currentTarget;I&&P!==void 0&&g!==void 0&&!S.current&&!E.paused&&!E.seeking&&E.readyState>=2&&E.currentTime>=g&&(S.current=!0,E.currentTime=P,x.current!==null&&clearTimeout(x.current),b.current=requestAnimationFrame(()=>{x.current=setTimeout(()=>{S.current&&(S.current=!1),x.current=null},100),b.current=null})),(M=o.onTimeUpdate)==null||M.call(o,y)},...o}),s&&D&&(0,j.jsx)(ut,{}),T==="NotAllowedError"&&typeof r=="function"&&r(()=>{l!=null&&l.current&&(l.current.muted=!l.current.muted),i(null)})]})});Z.displayName="Video";var L=V(require("react"),1),F=require("@radix-ui/react-slot");var v=V(require("react"),1),it=t=>{let[n,r]=v.default.useState(!1);return v.default.useEffect(()=>{if(!(t!=null&&t.current))return;let s=t.current,e=()=>{r(!0)},u=()=>{},c=()=>{},a=()=>{r(!1)},o=()=>{r(!1)},d=()=>{r(!0)},l=()=>{r(!1)},p=()=>{r(!1)},m=()=>{r(!1)},i=()=>{};return s.addEventListener("loadstart",e),s.addEventListener("loadedmetadata",u),s.addEventListener("loadeddata",c),s.addEventListener("canplay",a),s.addEventListener("canplaythrough",o),s.addEventListener("waiting",d),s.addEventListener("playing",l),s.addEventListener("error",p),s.addEventListener("abort",m),s.addEventListener("suspend",i),s.readyState>=2&&r(!1),()=>{s.removeEventListener("loadstart",e),s.removeEventListener("loadedmetadata",u),s.removeEventListener("loadeddata",c),s.removeEventListener("canplay",a),s.removeEventListener("canplaythrough",o),s.removeEventListener("waiting",d),s.removeEventListener("playing",l),s.removeEventListener("error",p),s.removeEventListener("abort",m),s.removeEventListener("suspend",i)}},[t]),{isLoading:n}};var w=require("react/jsx-runtime"),xt=L.default.memo(({children:t,asChild:n,...r})=>(0,w.jsx)("div",{"data-zuude-hide-elements":!0,...r,children:t})),Ct=L.default.memo(({children:t,asChild:n,...r})=>{let s=n?F.Slot:"button",{videoRef:e}=h(),{play:u}=z(e);return(0,w.jsx)(s,{...r,onClick:u,children:t})}),kt=L.default.memo(({children:t,asChild:n,...r})=>{let s=n?F.Slot:"button",{videoRef:e}=h(),{pause:u}=z(e);return(0,w.jsx)(s,{...r,onClick:u,children:t})}),Ft=L.default.memo(({children:t,asChild:n,...r})=>{let s=n?F.Slot:"button",{videoRef:e}=h(),{mute:u}=B(e);return(0,w.jsx)(s,{...r,onClick:u,children:t})}),St=L.default.memo(({children:t,asChild:n,...r})=>{let s=n?F.Slot:"button",{videoRef:e}=h(),{unmute:u}=B(e);return(0,w.jsx)(s,{...r,onClick:u,children:t})}),It=L.default.memo(({children:t,asChild:n,value:r,onClick:s,...e})=>{let u=n?F.Slot:"button",{videoRef:c}=h(),{speed:a,onChangeSpeed:o}=at(c);return(0,w.jsx)(u,{...e,value:r,onClick:()=>{o(r),s==null||s()},children:t})}),Mt=L.default.memo(({children:t,asChild:n,...r})=>{let s=n?F.Slot:"button",{videoRef:e}=h(),{seekForward:u}=U(e,10);return(0,w.jsx)(s,{...r,onClick:u,children:t})}),At=L.default.memo(({children:t,asChild:n,...r})=>{let s=n?F.Slot:"button",{videoRef:e}=h(),{seekBackward:u}=U(e,10);return(0,w.jsx)(s,{...r,onClick:u,children:t})}),Ht=L.default.memo(({children:t,asChild:n,...r})=>{let s=n?F.Slot:"button",{videoRef:e}=h(),{toggleFullscreen:u}=K(e);return(0,w.jsx)(s,{...r,onClick:u,children:t})}),jt=L.default.memo(({children:t,asChild:n,...r})=>{let s=n?F.Slot:"button",{videoRef:e}=h(),{toggleFullscreen:u}=K(e);return(0,w.jsx)(s,{...r,onClick:u,children:t})}),Dt=L.default.memo(({children:t,asChild:n,...r})=>{let s=n?F.Slot:"button",{videoRef:e}=h(),{togglePictureInPicture:u}=$(e);return(0,w.jsx)(s,{...r,onClick:u,children:t})}),Ot=L.default.memo(({children:t,asChild:n,...r})=>{let s=n?F.Slot:"button",{videoRef:e}=h(),{downloadDirect:u}=mt(e);return(0,w.jsx)(s,{...r,onClick:()=>u(),children:t})}),Nt=L.default.memo(({children:t,asChild:n,...r})=>{let s=n?F.Slot:"div",{videoRef:e}=h(),{isLoading:u}=it(e);return(0,w.jsx)(s,{...r,style:{...r.style,pointerEvents:"none"},"data-loading":u,children:t})}),qt=({...t})=>{let{videoRef:n}=h(),r=(0,L.useRef)(null);return L.default.useEffect(()=>{let s=n==null?void 0:n.current;if(r.current&&s){let e=0,u=!1,c=null,a=()=>{c&&clearInterval(c),c=setInterval(()=>{e=s.currentTime,r.current&&(r.current.currentTime=e)},100)},o=()=>{c&&(clearInterval(c),c=null)},d=()=>{u=!0,a()},l=()=>{u=!1,o()};return s.addEventListener("play",d),s.addEventListener("pause",l),()=>{o(),s.removeEventListener("play",d),s.removeEventListener("pause",l)}}},[n==null?void 0:n.current]),n!=null&&n.current?(0,w.jsx)("div",{...t,style:{...t.style,position:"absolute",top:0,left:0,width:"100%",height:"100%",pointerEvents:"none"},children:(0,w.jsx)("video",{ref:r,src:n.current.src,muted:!0,playsInline:!0,style:{width:"100%",height:"100%",objectFit:"cover"}})}):null};0&&(module.exports={Controls,Download,ExitFullscreen,Fullscreen,Loading,Mute,Pause,PictureInPicture,Play,SeekBackward,SeekForward,Shadow,Speed,Unmute,Video,VideoProvider,useVideo});
|
|
2
2
|
//# sourceMappingURL=index.cjs.map
|