mirror of
https://github.com/zoriya/v10.git
synced 2026-08-13 01:19:44 +00:00
59 lines
1.7 KiB
JavaScript
59 lines
1.7 KiB
JavaScript
"use client";
|
|
import { usePlayer } from "../../player/context.js";
|
|
import { renderElement } from "../../utils/use-render.js";
|
|
import { logMissingFeature, selectPlayback } from "@videojs/core/dom";
|
|
import { forwardRef, useCallback, useEffect, useRef, useState } from "react";
|
|
import { PosterCore, PosterDataAttrs } from "@videojs/core";
|
|
//#region src/ui/poster/poster.tsx
|
|
/**
|
|
* Displays the video poster image. Shows before playback starts, hides after.
|
|
*
|
|
* @example
|
|
* ```tsx
|
|
* <Poster src="poster.jpg" alt="Video description" />
|
|
*
|
|
* <Poster
|
|
* src="poster.jpg"
|
|
* alt="Video description"
|
|
* className={(state) => state.visible ? 'visible' : 'hidden'}
|
|
* />
|
|
* ```
|
|
*/
|
|
const Poster = forwardRef(function Poster(componentProps, forwardedRef) {
|
|
const { render, className, style, ...elementProps } = componentProps;
|
|
const playback = usePlayer(selectPlayback);
|
|
const [core] = useState(() => new PosterCore());
|
|
const src = elementProps.src;
|
|
const [loadedSrc, setLoadedSrc] = useState(void 0);
|
|
const loaded = loadedSrc === src;
|
|
const imgRef = useRef(null);
|
|
useEffect(() => {
|
|
const img = imgRef.current;
|
|
if (img?.complete && img.naturalWidth > 0 && img.getAttribute("src") === src) setLoadedSrc(src);
|
|
}, [src]);
|
|
const handleLoad = useCallback((event) => {
|
|
setLoadedSrc(event.currentTarget.getAttribute("src") ?? void 0);
|
|
}, []);
|
|
if (!playback) {
|
|
logMissingFeature("Poster", "playback");
|
|
return null;
|
|
}
|
|
core.setMedia(playback);
|
|
return renderElement("img", {
|
|
render,
|
|
className,
|
|
style
|
|
}, {
|
|
state: core.getState(),
|
|
stateAttrMap: PosterDataAttrs,
|
|
ref: [forwardedRef, imgRef],
|
|
props: [elementProps, {
|
|
"data-loaded": loaded ? "" : void 0,
|
|
onLoad: handleLoad
|
|
}]
|
|
});
|
|
});
|
|
//#endregion
|
|
export { Poster };
|
|
|
|
//# sourceMappingURL=poster.js.map
|