From 737344a72d23dc97b0d0e73cc4ab7fdffd0fbf49 Mon Sep 17 00:00:00 2001 From: Brendan F Date: Sun, 14 May 2023 23:12:27 -0700 Subject: Merge in react app code From sluchajfun and youtube-heardle-template --- src/components/Player/index.tsx | 97 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 97 insertions(+) create mode 100644 src/components/Player/index.tsx (limited to 'src/components/Player/index.tsx') diff --git a/src/components/Player/index.tsx b/src/components/Player/index.tsx new file mode 100644 index 0000000..82f600e --- /dev/null +++ b/src/components/Player/index.tsx @@ -0,0 +1,97 @@ +import React from "react"; +import YouTube from "react-youtube"; +import { IoPlay } from "react-icons/io5"; +import { event } from "react-ga"; + +import { playTimes } from "../../constants"; + +import * as Styled from "./index.styled"; + +interface Props { + id: string; + currentTry: number; +} + +export function Player({ id, currentTry }: Props) { + const opts = { + width: "0", + height: "0", + }; + + // react-youtube doesn't export types for this + // eslint-disable-next-line @typescript-eslint/no-explicit-any + const playerRef = React.useRef(null); + + const currentPlayTime = playTimes[currentTry]; + + const [play, setPlay] = React.useState(false); + + const [currentTime, setCurrentTime] = React.useState(0); + + const [isReady, setIsReady] = React.useState(false); + + React.useEffect(() => { + setInterval(() => { + playerRef.current?.internalPlayer + .getCurrentTime() + .then((time: number) => { + setCurrentTime(time); + }); + }, 250); + }, []); + + React.useEffect(() => { + if (play) { + if (currentTime * 1000 >= currentPlayTime) { + playerRef.current?.internalPlayer.pauseVideo(); + playerRef.current?.internalPlayer.seekTo(0); + setPlay(false); + } + } + }, [play, currentTime]); + + // don't call play video each time currentTime changes + const startPlayback = React.useCallback(() => { + playerRef.current?.internalPlayer.playVideo(); + setPlay(true); + event({ + category: "Player", + action: "Played song", + }); + }, []); + + const setReady = React.useCallback(() => { + setIsReady(true); + }, []); + + return ( + <> + + {isReady ? ( + <> + + {currentTime !== 0 && } + {playTimes.map((playTime) => ( + + ))} + + + 1s + 16s + + + + ) : ( +

Loading player...

+ )} + + ); +} -- cgit v1.2.3