diff --git a/TODO.md b/TODO.md index bf1f410..9aa867b 100644 --- a/TODO.md +++ b/TODO.md @@ -18,7 +18,7 @@ - [X] Поиск аниме - [X] Выдача франшизы -- [ ] Просмотр страницы франшизы +- [X] Просмотр страницы франшизы - [ ] Фильтры поиска - [ ] История поиска - [X] Поиск по тегам со страницы тайтла @@ -58,7 +58,7 @@ - [X] Сохранение эпизода в историю просмотров - [X] Добавление \ Удаление аниме в\из списков закладок и избранных - [X] Связанные релизы -- [ ] Просмотр страницы всех вязанных релизов +- [X] Просмотр страницы всех связанных релизов - [ ] Оценка тайтла ## Баги diff --git a/app/api/config.ts b/app/api/config.ts index 0b91a5d..4ae8697 100644 --- a/app/api/config.ts +++ b/app/api/config.ts @@ -7,6 +7,7 @@ export const ENDPOINTS = { release: { info: `${API_PREFIX}/release`, episode: `${API_PREFIX}/episode`, + related: `${API_PREFIX}/related`, }, user: { profile: `${API_PREFIX}/profile`, @@ -15,15 +16,6 @@ export const ENDPOINTS = { favorite: `${API_PREFIX}/favorite`, }, filter: `${API_PREFIX}/filter`, - // user: { - // history: `${API_PREFIX}/history`, - // watching: `${API_PREFIX}/profile/list/all/1`, - // planned: `${API_PREFIX}/profile/list/all/2`, - // watched: `${API_PREFIX}/profile/list/all/3`, - // delayed: `${API_PREFIX}/profile/list/all/4`, - // abandoned: `${API_PREFIX}/profile/list/all/5`, - // favorite: `${API_PREFIX}/favorite`, - // }, search: `${API_URL}/search`, statistic: { addHistory: `${API_PREFIX}/history/add`, diff --git a/app/components/ReleaseLink/ReleaseLink.16_9.tsx b/app/components/ReleaseLink/ReleaseLink.16_9.tsx index 737d256..7e1d34b 100644 --- a/app/components/ReleaseLink/ReleaseLink.16_9.tsx +++ b/app/components/ReleaseLink/ReleaseLink.16_9.tsx @@ -48,15 +48,17 @@ export const ReleaseLink169 = (props: any) => { {props.status ? ( ) : ( - + props.status_id != 0 && ( + + ) )} { + const res = await fetch(url); + + if (!res.ok) { + const error = new Error(`An error occurred while fetching the data. status: ${res.status}`); + error.message = await res.json(); + throw error; + } + + return res.json(); +}; + +export function RelatedPage(props: {id: number|string, title: string}) { + const token = useUserStore((state) => state.token); + const [isLoadingEnd, setIsLoadingEnd] = useState(false); + + const getKey = (pageIndex: number, previousPageData: any) => { + if (previousPageData && !previousPageData.content.length) return null; + if (token) { + return `${ENDPOINTS.release.related}/${props.id}/${pageIndex}?token=${token}`; + } + return `${ENDPOINTS.release.related}/${props.id}/${pageIndex}`; + }; + + const { data, error, isLoading, size, setSize } = useSWRInfinite( + getKey, + fetcher, + { initialSize: 1 } + ); + + const [content, setContent] = useState(null); + useEffect(() => { + if (data) { + let allReleases = []; + for (let i = 0; i < data.length; i++) { + allReleases.push(...data[i].content); + } + setContent(allReleases); + setIsLoadingEnd(true); + } + }, [data]); + + const scrollPosition = useScrollPosition(); + useEffect(() => { + if (scrollPosition >= 98 && scrollPosition <= 99) { + setSize(size + 1); + } + }, [scrollPosition]); + + return ( + + + + Франшиза {props.title} + + + {content && content.length > 0 ? ( + + ) : !isLoadingEnd || isLoading ? ( + + + + ) : ( + + + В франшизе пока ничего нет... + + )} + {data && + data[data.length - 1].current_page < + data[data.length - 1].total_page_count && ( + setSize(size + 1)} + > + + Загрузить ещё + + )} + + ); +} diff --git a/app/related/[id]/page.tsx b/app/related/[id]/page.tsx new file mode 100644 index 0000000..3e391e7 --- /dev/null +++ b/app/related/[id]/page.tsx @@ -0,0 +1,19 @@ +import { RelatedPage } from "#/pages/Related"; +import { fetchDataViaGet } from "#/api/utils"; + +export async function generateMetadata({ params }) { + const id:string = params.id; + const related: any = await fetchDataViaGet(`https://api.anixart.tv/related/${id}/0`); + const firstRelease: any = await fetchDataViaGet(`https://api.anixart.tv/release/${related.content[0].id}`); + + return { + title: "Франшиза " + firstRelease.release.related.name_ru || firstRelease.release.related.name, + }; +} + +export default async function Related({ params }) { + const id: string = params.id; + const related: any = await fetchDataViaGet(`https://api.anixart.tv/related/${id}/0`); + const firstRelease: any = await fetchDataViaGet(`https://api.anixart.tv/release/${related.content[0].id}`); + return ; +}
В франшизе пока ничего нет...