"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> ); };