react-player
Version:
A React component for playing a variety of URLs, including file paths, YouTube, Facebook, Twitch, SoundCloud, Streamable, Vimeo, Wistia and DailyMotion
110 lines (109 loc) • 3.46 kB
JavaScript
var __defProp = Object.defineProperty;
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
var __publicField = (obj, key, value) => {
__defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
return value;
};
import React, { Component } from "react";
const ICON_SIZE = "64px";
const cache = {};
class Preview extends Component {
constructor() {
super(...arguments);
__publicField(this, "mounted", false);
__publicField(this, "state", {
image: null
});
__publicField(this, "handleKeyPress", (e) => {
if (e.key === "Enter" || e.key === " ") {
this.props.onClick();
}
});
}
componentDidMount() {
this.mounted = true;
this.fetchImage(this.props);
}
componentDidUpdate(prevProps) {
const { url, light } = this.props;
if (prevProps.url !== url || prevProps.light !== light) {
this.fetchImage(this.props);
}
}
componentWillUnmount() {
this.mounted = false;
}
fetchImage({ url, light, oEmbedUrl }) {
if (React.isValidElement(light)) {
return;
}
if (typeof light === "string") {
this.setState({ image: light });
return;
}
if (cache[url]) {
this.setState({ image: cache[url] });
return;
}
this.setState({ image: null });
return window.fetch(oEmbedUrl.replace("{url}", url)).then((response) => response.json()).then((data) => {
if (data.thumbnail_url && this.mounted) {
const image = data.thumbnail_url.replace("height=100", "height=480").replace("-d_295x166", "-d_640");
this.setState({ image });
cache[url] = image;
}
});
}
render() {
const { light, onClick, playIcon, previewTabIndex, previewAriaLabel } = this.props;
const { image } = this.state;
const isElement = React.isValidElement(light);
const flexCenter = {
display: "flex",
alignItems: "center",
justifyContent: "center"
};
const styles = {
preview: {
width: "100%",
height: "100%",
backgroundImage: image && !isElement ? `url(${image})` : void 0,
backgroundSize: "cover",
backgroundPosition: "center",
cursor: "pointer",
...flexCenter
},
shadow: {
background: "radial-gradient(rgb(0, 0, 0, 0.3), rgba(0, 0, 0, 0) 60%)",
borderRadius: ICON_SIZE,
width: ICON_SIZE,
height: ICON_SIZE,
position: isElement ? "absolute" : void 0,
...flexCenter
},
playIcon: {
borderStyle: "solid",
borderWidth: "16px 0 16px 26px",
borderColor: "transparent transparent transparent white",
marginLeft: "7px"
}
};
const defaultPlayIcon = /* @__PURE__ */ React.createElement("div", { style: styles.shadow, className: "react-player__shadow" }, /* @__PURE__ */ React.createElement("div", { style: styles.playIcon, className: "react-player__play-icon" }));
return /* @__PURE__ */ React.createElement(
"div",
{
style: styles.preview,
className: "react-player__preview",
onClick,
tabIndex: previewTabIndex,
onKeyPress: this.handleKeyPress,
...previewAriaLabel ? { "aria-label": previewAriaLabel } : {}
},
isElement ? light : null,
playIcon || defaultPlayIcon
);
}
}
export {
Preview as default
};