mirror of
https://github.com/jakejarvis/jarv.is.git
synced 2025-04-26 15:28:28 -04:00
48 lines
1.2 KiB
TypeScript
48 lines
1.2 KiB
TypeScript
import ReactPlayer from "react-player/youtube";
|
|
import { useHasMounted } from "../../hooks/use-has-mounted";
|
|
import { styled } from "../../lib/styles/stitches.config";
|
|
import type { YouTubePlayerProps } from "react-player/youtube";
|
|
|
|
const Wrapper = styled("div", {
|
|
position: "relative",
|
|
paddingTop: "56.25%",
|
|
});
|
|
|
|
const Player = styled(ReactPlayer, {
|
|
position: "absolute",
|
|
top: 0,
|
|
left: 0,
|
|
|
|
// target both the lazy thumbnail preview *and* the actual YouTube embed
|
|
".react-player__preview, iframe": {
|
|
borderRadius: "$rounded",
|
|
},
|
|
});
|
|
|
|
export type YouTubeEmbedProps = Partial<YouTubePlayerProps> & {
|
|
id: string;
|
|
className?: string;
|
|
};
|
|
|
|
const YouTubeEmbed = ({ id, className, ...rest }: YouTubeEmbedProps) => {
|
|
// fix hydration issues: https://github.com/cookpete/react-player/issues/1428
|
|
const hasMounted = useHasMounted();
|
|
|
|
return (
|
|
<Wrapper className={className}>
|
|
{hasMounted && (
|
|
<Player
|
|
width="100%"
|
|
height="100%"
|
|
url={`https://www.youtube-nocookie.com/watch?v=${id}`}
|
|
light={`https://i.ytimg.com/vi/${id}/hqdefault.jpg`}
|
|
controls
|
|
{...rest}
|
|
/>
|
|
)}
|
|
</Wrapper>
|
|
);
|
|
};
|
|
|
|
export default YouTubeEmbed;
|