mirror of
https://github.com/Radiquum/AniX.git
synced 2025-04-05 07:44:38 +00:00
172 lines
6.2 KiB
TypeScript
172 lines
6.2 KiB
TypeScript
"use client";
|
||
|
||
import useSWR from "swr";
|
||
import { Spinner } from "#/components/Spinner/Spinner";
|
||
import { useSWRfetcher } from "#/api/utils";
|
||
import { useUserStore } from "#/store/auth";
|
||
import { useEffect, useState } from "react";
|
||
|
||
import { ReleaseInfoBasics } from "#/components/ReleaseInfo/ReleaseInfo.Basics";
|
||
import { ReleaseInfoInfo } from "#/components/ReleaseInfo/ReleaseInfo.Info";
|
||
import { ReleasePlayer } from "#/components/ReleasePlayer/ReleasePlayer";
|
||
import { ReleasePlayerCustom } from "#/components/ReleasePlayer/ReleasePlayerCustom";
|
||
import { ReleaseInfoUserList } from "#/components/ReleaseInfo/ReleaseInfo.UserList";
|
||
import { ReleaseInfoRating } from "#/components/ReleaseInfo/ReleaseInfo.Rating";
|
||
import { ReleaseInfoRelated } from "#/components/ReleaseInfo/ReleaseInfo.Related";
|
||
import { ReleaseInfoScreenshots } from "#/components/ReleaseInfo/ReleaseInfo.Screenshots";
|
||
import { CommentsMain } from "#/components/Comments/Comments.Main";
|
||
import { InfoLists } from "#/components/InfoLists/InfoLists";
|
||
import { ENDPOINTS } from "#/api/config";
|
||
import { usePreferencesStore } from "#/store/preferences";
|
||
|
||
export const ReleasePage = (props: any) => {
|
||
const userStore = useUserStore();
|
||
const preferenceStore = usePreferencesStore();
|
||
const [userList, setUserList] = useState(0);
|
||
const [userFavorite, setUserFavorite] = useState(false);
|
||
|
||
function useFetch(id: number) {
|
||
let url: string;
|
||
|
||
url = `${ENDPOINTS.release.info}/${id}`;
|
||
if (userStore.token) {
|
||
url += `?token=${userStore.token}`;
|
||
}
|
||
const { data, isLoading, error } = useSWR(url, useSWRfetcher);
|
||
return [data, isLoading, error];
|
||
}
|
||
const [data, isLoading, error] = useFetch(props.id);
|
||
|
||
useEffect(() => {
|
||
if (data) {
|
||
const el = document.getElementById("note");
|
||
if (el) {
|
||
el.innerHTML = data.release.note;
|
||
}
|
||
setUserList(data.release.profile_list_status || 0);
|
||
setUserFavorite(data.release.is_favorite);
|
||
}
|
||
}, [data]);
|
||
|
||
if (isLoading) {
|
||
return (
|
||
<main className="flex items-center justify-center min-h-screen">
|
||
<Spinner />
|
||
</main>
|
||
);
|
||
}
|
||
|
||
if (error) {
|
||
return (
|
||
<main className="flex items-center justify-center min-h-screen">
|
||
<div className="flex flex-col gap-2">
|
||
<h1 className="text-2xl font-bold">Ошибка</h1>
|
||
<p className="text-lg">
|
||
Произошла ошибка при загрузке релиза. Попробуйте обновить страницу
|
||
или зайдите позже.
|
||
</p>
|
||
</div>
|
||
</main>
|
||
);
|
||
}
|
||
|
||
return (
|
||
<div className="flex flex-col gap-2">
|
||
<div className="grid grid-cols-1 lg:grid-cols-[70%_30%] gap-2 grid-flow-row-dense">
|
||
<ReleaseInfoBasics
|
||
image={data.release.image}
|
||
title={{
|
||
ru: data.release.title_ru,
|
||
original: data.release.title_original,
|
||
}}
|
||
description={data.release.description}
|
||
note={data.release.note}
|
||
release_id={data.release.id}
|
||
/>
|
||
<ReleaseInfoInfo
|
||
country={data.release.country}
|
||
aired_on_date={data.release.aired_on_date}
|
||
year={data.release.year}
|
||
episodes={{
|
||
total: data.release.episodes_total,
|
||
released: data.release.episodes_released,
|
||
}}
|
||
season={data.release.season}
|
||
status={data.release.status ? data.release.status.name : "Анонс"}
|
||
duration={data.release.duration}
|
||
category={data.release.category.name}
|
||
broadcast={data.release.broadcast}
|
||
studio={data.release.studio}
|
||
author={data.release.author}
|
||
director={data.release.director}
|
||
genres={data.release.genres}
|
||
/>
|
||
<ReleaseInfoUserList
|
||
userList={userList}
|
||
isFavorite={userFavorite}
|
||
release_id={data.release.id}
|
||
token={userStore.token}
|
||
profile_id={userStore.user ? userStore.user.id : null}
|
||
setUserList={setUserList}
|
||
setIsFavorite={setUserFavorite}
|
||
collection_count={data.release.collection_count}
|
||
/>
|
||
</div>
|
||
<div className="grid grid-cols-1 lg:grid-cols-[70%_30%] gap-2 grid-flow-row-dense">
|
||
<div className="flex flex-col gap-2">
|
||
{data.release.status &&
|
||
data.release.status.name.toLowerCase() != "анонс" && (
|
||
<>
|
||
{preferenceStore.params.experimental.newPlayer ?
|
||
<ReleasePlayerCustom id={props.id} token={userStore.token} />
|
||
: <ReleasePlayer id={props.id} />}
|
||
</>
|
||
)}
|
||
<CommentsMain
|
||
release_id={props.id}
|
||
token={userStore.token}
|
||
comments={data.release.comments}
|
||
/>
|
||
</div>
|
||
<div className="flex flex-col gap-2">
|
||
{data.release.status &&
|
||
data.release.status.name.toLowerCase() != "анонс" && (
|
||
<div className="[grid-column:2]">
|
||
<ReleaseInfoRating
|
||
release_id={props.id}
|
||
grade={data.release.grade}
|
||
token={userStore.token}
|
||
votes={{
|
||
1: data.release.vote_1_count,
|
||
2: data.release.vote_2_count,
|
||
3: data.release.vote_3_count,
|
||
4: data.release.vote_4_count,
|
||
5: data.release.vote_5_count,
|
||
total: data.release.vote_count,
|
||
user: data.release.your_vote,
|
||
}}
|
||
/>
|
||
</div>
|
||
)}
|
||
<InfoLists
|
||
completed={data.release.completed_count}
|
||
planned={data.release.plan_count}
|
||
abandoned={data.release.dropped_count}
|
||
delayed={data.release.hold_on_count}
|
||
watching={data.release.watching_count}
|
||
/>
|
||
{data.release.screenshot_images.length > 0 && (
|
||
<ReleaseInfoScreenshots images={data.release.screenshot_images} />
|
||
)}
|
||
{data.release.related_releases.length > 0 && (
|
||
<ReleaseInfoRelated
|
||
release_id={props.id}
|
||
related={data.release.related}
|
||
related_releases={data.release.related_releases}
|
||
/>
|
||
)}
|
||
</div>
|
||
</div>
|
||
</div>
|
||
);
|
||
};
|