import axios, { AxiosError } from "axios"; import Link from "next/link"; import { useRouter } from "next/router"; import { FC, useEffect } from "react"; import { useInView } from "react-intersection-observer/"; import { useQuery } from "react-query"; import Avatar from "@mui/material/Avatar"; import Box from "@mui/material/Box"; import Card from "@mui/material/Card"; import CardActionArea from "@mui/material/CardActionArea"; import CardContent from "@mui/material/CardContent"; import CardMedia from "@mui/material/CardMedia"; import CircularProgress from "@mui/material/CircularProgress"; import Tooltip from "@mui/material/Tooltip"; import Typography from "@mui/material/Typography"; import { abbreviateNumber } from "@src/utils"; import { Video as VideoModel } from "@interfaces/video"; interface Channel { authorThumbnails: { url: string; width: number; height: number }[]; } const Video: FC = ({ thumbnail, title, id, author, views, published }) => { const requestFields = ["authorThumbnails"]; const { isLoading, error, data, refetch, isFetched } = useQuery< Channel, AxiosError >( ["channelData", author.id], () => axios .get(`https://invidious.privacy.gd/api/v1/channels/${author.id}`, { params: { fields: requestFields.join(",") } }) .then((res) => res.data), { enabled: false } ); const { ref, inView } = useInView({ threshold: 0 }); const router = useRouter(); useEffect(() => { if (inView && !isFetched) refetch(); }, [inView, isFetched, refetch]); return ( router.push({ pathname: "/watch", query: { v: id } })} > {title} {isLoading && } {data && ( thumbnail.width == 100 )?.url as string } /> )} {author.name} {abbreviateNumber(views)} Views • Published {published.text} ); }; export default Video;