You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

112 lines
2.9 KiB

"use client";
import { useQuery } from "@tanstack/react-query";
import { useSearchParams } from "next/navigation";
import { useMemo } from "react";
import { Chip } from "@nextui-org/chip";
import { useClient } from "@/hooks/useClient";
import formatBigNumber from "@/utils/formatBigNumber";
import { Author } from "@/components/Author";
import { Container } from "@/components/Container";
import { LoadingPage } from "@/components/LoadingPage";
import { Comments } from "./Comments";
import { Description } from "./Description";
import { Player } from "./Player";
import { Related } from "./Related";
import { Component } from "@/typings/component";
export const Watch: Component = () => {
const client = useClient();
const searchParams = useSearchParams();
const videoId = searchParams.get("v") as string;
const videoIdIsInvalid = useMemo(() => videoId === null, [videoId]);
const { data, isLoading, error } = useQuery({
queryKey: ["watch", videoId],
queryFn: () => {
return client.getStream(videoId);
},
enabled: !videoIdIsInvalid
});
const {
data: comments,
isLoading: isLoadingComments,
refetch: refetchComments,
error: commentsError
} = useQuery({
queryKey: ["comments", videoId],
queryFn: () => {
return client.getComments(videoId);
},
enabled: !videoIdIsInvalid
});
if (error) console.log(error);
return (
<Container>
{isLoading && <LoadingPage />}
{data && !isLoading && (
<div className="flex flex-col">
<Player />
<div className="flex flex-col xl:flex-row gap-4">
<div className="xl:w-2/3 flex flex-col gap-4">
<div className="flex flex-col">
<h1 className="text-2xl">{data.video.title}</h1>
<div className="flex flex-row gap-4 text-lg tracking-tight text-default-500">
<h2>{formatBigNumber(data.video.views)} views</h2>
<h2>{formatBigNumber(data.likes)} likes</h2>
<h2>{formatBigNumber(data.dislikes)} dislikes</h2>
</div>
</div>
<Author data={data.video.author} />
<Description data={data.video.description ?? ""} />
<div className="flex flex-row gap-2">
<h1>Category:</h1>
<h1 className="font-semibold">{data.category}</h1>
</div>
{data.keywords.length !== 0 && (
<div className="flex flex-row gap-2">
<p>Keywords:</p>
<div className="flex flex-row gap-2 whitespace-nowrap overflow-x-scroll">
{data.keywords.map((keyword) => (
<Chip key={keyword}>{keyword}</Chip>
))}
</div>
</div>
)}
<Comments
data={comments}
error={commentsError}
refetch={refetchComments}
isLoading={isLoadingComments}
videoId={data.video.id}
videoUploader={data.video.author}
/>
</div>
<div className="xl:w-1/3 flex justify-center">
<Related data={data.related} />
</div>
</div>
</div>
)}
</Container>
);
};